Tích hợp VNPay, ZaloPay, MoMo và Stripe: Payment Flow, Webhook Retry và Đối soát
Hướng dẫn tích hợp cổng thanh toán VNPay, ZaloPay, MoMo và Stripe: payment flow, chữ ký webhook/IPN, idempotency, retry, reconciliation, refund và vận hành production.

Bài toán thật sự
VNPay, ZaloPay, MoMo và Stripe khác nhau về tên trường, thuật toán chữ ký, trạng thái và API. Tuy nhiên, merchant luôn phải giải quyết cùng một vòng đời:
- Tạo order nội bộ.
- Tạo payment intent/transaction tại provider.
- Chuyển khách sang trang/app thanh toán hoặc hiển thị SDK/QR.
- Nhận browser redirect và webhook/IPN độc lập.
- Xác minh chữ ký và cập nhật trạng thái idempotent.
- Chủ động query nếu kết quả chưa rõ.
- Fulfill đơn hàng đúng một lần.
- Xử lý refund, dispute hoặc reversal.
- Đối soát giao dịch, phí, settlement và tiền về ngân hàng.
Redirect URL không phải bằng chứng thanh toán. Trình duyệt có thể bị đóng, URL có thể bị giả mạo và khách có thể quay lại trước khi provider hoàn tất. Chỉ tin server-to-server webhook/IPN đã xác thực hoặc kết quả query trực tiếp từ provider.


