Nhảy tới nội dung
Phiên bản: Lastest

Xử lý kết quả trả góp

Sau khi giao dịch thanh toán thẻ tín dụng được chuyển đổi sang hình thức trả góp, AppotaPay sẽ gửi thông báo kết quả qua API URL của phía đối tác đã đăng ký để đối tác cập nhật trạng thái giao dịch trả góp.

Lưu ý
  • Cần kiểm tra kĩ thông số trường transaction.status, transaction.paymentAmount & signature phải hợp lệ trước khi xác nhận giao dịch trả góp thành công
  • Sử dụng tham số signature để kiểm tra tính toàn vẹn của dữ liệu nhận được, phía đối tác tạo ra signature từ dữ liệu nhận được từ AppotaPay sau đó so sánh với tham số signature AppotaPay gửi sang
  • Chữ ký được tính trên chuỗi Base64 gốc của trường data (không phải trên JSON đã giải mã) — cần xác thực signature trước khi giải mã data
  • IPN có thể được gửi lại nhiều lần cho cùng một giao dịch
  • Trường time chỉ mang tính tham khảo thời điểm gửi, không tham gia vào việc tính signature

IPN (Instant Payment Notification)

AppotaPay sẽ gửi thông báo kết quả giao dịch trả góp qua API URL của phía đối tác đã đăng ký, server phía đối tác kiểm tra tính toàn vẹn dữ liệu qua tham số signature sau đó cập nhật trạng thái của giao dịch trả góp.

{
"Content-Type": "application/json"
}

Response params

Phương thức: POST

Tham sốKiểu dữ liệuMô tả
dataStringThông tin giao dịch ở dạng base64encode & json_encode
signatureStringChữ ký kiểm tra dữ liệu

signature = HMAC_SHA256(data, secretKey)

timeStringThời gian phản hồi

Giải mã dữ liệu

  1. Đối tác sử dụng hàm Base64Decode để giải mã dữ liệu ở dạng string
  2. Sử dụng hàm JSON_Decode để giải mã dữ liệu lần 2 ở dạng json
Tham sốYêu cầuKiểu dữ liệuMô tả
transactionrequiredObjectThông tin giao dịch trả góp
transaction.transactionIdrequiredStringMã giao dịch trả góp do AppotaPay sinh ra
transaction.partnerCoderequiredStringMã định danh partner
transaction.referenceIdrequiredStringMã đơn hàng của giao dịch thanh toán gốc (orderId)
transaction.bankCoderequiredStringMã ngân hàng phát hành thẻ
transaction.authCoderequiredStringMã chuẩn chi (approval code) của ngân hàng
transaction.paymentAmountrequiredIntegerTổng số tiền giao dịch trả góp (VND)
transaction.payPerMonthrequiredIntegerSố tiền phải trả mỗi tháng (VND)
transaction.feeConversionrequiredFloatTỷ lệ phí chuyển đổi trả góp (%) của gói vay được chọn
transaction.loanPackageIdrequiredStringID gói vay trả góp áp dụng
transaction.gracePeriodrequiredStringKỳ hạn trả góp (số tháng)
transaction.statusrequiredStringTrạng thái giao dịch trả góp
transaction.statusCanceloptionalStringTrạng thái huỷ giao dịch trả góp
transaction.errorCoderequiredIntegerMã lỗi giao dịch trả góp
transaction.errorMessagerequiredStringMô tả lỗi tương ứng với errorCode
transaction.feePartnerrequiredIntegerPhí partner phải chịu (VND)
transaction.feeUserrequiredIntegerPhí khách hàng phải chịu (VND)
transaction.reasonCanceloptionalStringLý do huỷ giao dịch trả góp
transaction.reasonUpdateoptionalStringLý do cập nhật giao dịch
transaction.completedAtoptionalIntegerThời điểm hoàn tất giao dịch trả góp (Unix timestamp (giây))
transaction.updatedAtrequiredIntegerThời điểm cập nhật gần nhất (Unix timestamp (giây))
transaction.createdAtrequiredIntegerThời điểm tạo giao dịch trả góp (Unix timestamp (giây))

Bảng mã trạng thái

Trạng tháiMô tả
pendingGiao dịch đang chờ xử lý.
successGiao dịch thành công.
errorGiao dịch thất bại.

Bảng mã trạng thái huỷ

Trạng tháiMô tả
wait_vendorĐang chờ vendor xử lý yêu cầu huỷ
wait_bankVendor đã xử lý, đang chờ ngân hàng xác nhận
bank_rejectNgân hàng từ chối yêu cầu huỷ
rejectedYêu cầu huỷ bị từ chối
cancelledGiao dịch trả góp đã được huỷ thành công

Bảng mã lỗi

Mã lỗiMô tả
2Param không hợp lệ
35Lỗi hệ thống, Vui lòng Retry
44Có lỗi xảy ra trong quá trình xử lý
45Kiểm tra thẻ không hợp lệ
46IP Webhook không hợp lệ
47Chữ ký xác thực đối tác không hợp lệ
49Lỗi hệ thống, Không cho phép retry
50Mã ngân hàng không hợp lệ
52Lỗi khi gọi sang provider
53Lỗi không có mã secret key CTT
54Lỗi Không thể hủy giao dịch
55Lỗi Giao dịch đã hủy
56Lỗi Mã Order đã tồn tại
57Số tiền không hợp lệ
100Mới tạo
101Chờ chuyển đổi (Đã gửi Provider)
102Đã chuyển sang bank
103Chuyển đổi thành công
104Chuyển đổi thất bại (Provider từ chối)
105Chuyển đổi thất bại (Ngân hàng từ chối)
108Huỷ thành công
109Khởi tạo thất bại
401Token không hợp lệ

Example Request:

{
"data": "eyJ0cmFuc2FjdGlvbiI6eyJ0cmFuc2FjdGlvbklkIjoiQVAyMDA5MTAwMTQxMjVCIiwicGFydG5lckNvZGUiOiJNRVJDSEFOVF9DT0RFIiwicmVmZXJlbmNlSWQiOiJNUkNfT1JERVJfMTIzNDUiLCJiYW5rQ29kZSI6IlZDQiIsImF1dGhDb2RlIjoiMTMxMjMzOCIsInBheW1lbnRBbW91bnQiOjEyMDAwMDAwLCJwYXlQZXJNb250aCI6MTAwMDAwMCwiZmVlQ29udmVyc2lvbiI6Mi41LCJsb2FuUGFja2FnZUlkIjoiTFBfVkNCXzEyTSIsImdyYWNlUGVyaW9kIjoiMTIiLCJzdGF0dXMiOiJzdWNjZXNzIiwic3RhdHVzQ2FuY2VsIjpudWxsLCJlcnJvckNvZGUiOjEwMywiZXJyb3JNZXNzYWdlIjoiQ2h1eeG7g24gxJHhu5VpIHRow6BuaCBjw7RuZyIsImZlZVBhcnRuZXIiOjMwMDAwMCwiZmVlVXNlciI6MCwicmVhc29uQ2FuY2VsIjpudWxsLCJyZWFzb25VcGRhdGUiOm51bGwsImNvbXBsZXRlZEF0IjoxNzgyOTkwOTAwLCJ1cGRhdGVkQXQiOjE3ODI5OTA5MDAsImNyZWF0ZWRBdCI6MTc4Mjk4NzMwMH19",
"time": 1782990900,
"signature": "171846e6962c5537c546ec5d6e6a864800db2366c330f418d7eff87661248a4c"
}

Dữ liệu sau khi giải mã

{
"transaction": {
"transactionId": "AP200910014125B",
"partnerCode": "MERCHANT_CODE",
"referenceId": "MRC_ORDER_12345",
"bankCode": "VCB",
"authCode": "1312338",
"paymentAmount": 12000000,
"payPerMonth": 1000000,
"feeConversion": 2.5,
"loanPackageId": "LP_VCB_12M",
"gracePeriod": "12",
"status": "success",
"statusCancel": null,
"errorCode": 103,
"errorMessage": "Chuyển đổi thành công",
"feePartner": 300000,
"feeUser": 0,
"reasonCancel": null,
"reasonUpdate": null,
"completedAt": 1782990900,
"updatedAt": 1782990900,
"createdAt": 1782987300
}
}

Response format

  • Khi xác nhận giao dịch trả góp thành công thông qua IPN, đối tác cần phản hồi lại cho AppotaPay xác nhận đã nhận được kết quả
  • Trường hợp phía Partner không phản hồi lại thành công, phía AppotaPay sẽ phản hồi thêm tối đa 3 lần, mỗi lần cách nhau trong khoảng 5 phút
  • Phản hồi được coi là thành công khi HTTP code = 200 và tham số status trong body response = ok

Example success response

HTTP Code: 200

Body: {"status": "ok"}