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.