Chuyển tới nội dung chính

Bước 4 - Cập nhật trạng thái đơn hàng

Cơ chế Pull

Backend

Sau 20 phút kể từ khi yêu cầu thanh toán, chúng ta sẽ chủ động cập nhật trạng thái thanh toán nếu chưa được push. Thời điểm phù hợp nhất để đặt tác vụ này là ở Bước 3, vì khi đó chúng ta có đầy đủ thông tin về cả đơn hàng và giao dịch.

src/backend.ts
+ import axios from "axios";

.post("/link", async (req, res) => {
const { orderId, checkoutSdkOrderId, miniAppId } = req.body;
const order = db.data.orders.find((order) => order.id === orderId);
if (!order) {
res.status(404).json({ message: "Không tìm thấy đơn hàng" });
} else {
order.checkoutSdkOrderId = checkoutSdkOrderId;
db.write();
+ setTimeout(async () => {
+ if (order.info.paymentStatus === "pending") {
+ const dataMac = `appId=${miniAppId}&orderId=${checkoutSdkOrderId}&privateKey=${process.env.CHECKOUT_SDK_PRIVATE_KEY}`;
+ const mac = createHmac(
+ "sha256",
+ process.env.CHECKOUT_SDK_PRIVATE_KEY!
+ )
+ .update(dataMac)
+ .digest("hex");
+ const { data } = await axios(
+ "https://payment-mini.zalo.me/api/transaction/get-status",
+ {
+ params: {
+ orderId: checkoutSdkOrderId,
+ appId: miniAppId,
+ mac,
+ },
+ }
+ );
+ if (data.resultCode) {
+ order.info.paymentStatus =
+ data.resultCode === 1 ? "success" : "failed";
+ db.write();
+ }
+ }
+ }, 20 * 60 * 1000);
res.json({ message: "Đã liên kết đơn hàng thành công!" });
}
})
Lưu ý

Đoạn code trên sử dụng setTimeout nhằm mục đích demo. Thực tế, bạn nên sử dụng hàng đợi tác vụ như Bull queue để quản lý các tác vụ nền hiệu quả hơn.

Bước 4 - Cập nhật trạng thái đơn hàng

zi-chevron-up
miniapp-logo

Khám phá