Xử lý kết quả thanh toán
Sau khi khách hàng hoàn tất quá trình thanh toán, hệ thống AppotaPay thông báo kết quả cho hệ thống của đối tác qua 2 hình thức
- Cần kiểm tra kĩ thông số trường status, amount & signature
- Nên gọi api check trạng thái giao dịch để đảm bảo kết quả được cập nhật chính xác nhất
- IPN chỉ trả khi giao dịch thành công
Redirect
Khách hàng sẽ được điều hướng đến URL của phía đối tác đã truyền lên API qua tham số redirectUrl
, ở trang này phía đối tác kiểm tra dữ liệu, trạng thái giao dịch và hiển thị thông báo cho khách hàng.
Phương thức: GET
Các tham số (query string) được gửi kèm vào URL:
partnerCode=
TEST
&apiKey=oMhJpkz7K6HDcR6S
&amount=50000
& currency=VND
&orderId=5f61d06311019
&bankCode=SHB
&paymentMethod=ATM
&paymentType=WEB
&appotapayTransId=AP200910016654B
&errorCode=0
&message=Thành+công
&transactionTs=1600246241
&extraData=test+test
&tokenResult={\"status\":0,\"message\":\"Th\\u00e0nh c\\u00f4ng\",\"card\":{\"status\":\"active\",\"token\":\"2331123162638222\",\"card_name\":\"NGUYEN VAN A\",\"card_number\":\"970400xxxxxx0001\",\"card_date\":\"\",\"card_type\":\"ATM_CARD\"}}
&signature=9487dd169d2178b249d1503d2f2d7f01d1210517f6ae3a2703760cb218c838f3
IPN (Instant Payment Notification)
Server AppotaPay sẽ gửi thông báo giao dịch qua API URL của phía đối tác đã gửi lên API qua tham số notifyUrl
, 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 đơn hàng.
Header
{
"Content-Type": "applicaton/json"
}
***Method: *** POST
HTTP Request:
Tham số | Kiểu dữ liệu | Mô tả |
---|---|---|
errorCode | Integer | Mã lỗi |
message | String | Thông tin chi tiết mã lỗi |
partnerCode | String | Mã đối tác |
apiKey | String | Mã APIKEY gọi tới API |
amount | Integer | Số tiền thanh toán |
currency | String | Mã tiền tệ (mặc định: VND) |
orderId | String | Mã đơn hàng |
bankCode | String | Mã ngân hàng |
paymentMethod | String | Phương thức thanh toán |
paymentType | String | Loại thanh toán (mặc định: WEB) |
appotapayTransId | String | Mã giao dịch phía AppotaPay |
transactionTs | Integer | Thời gian giao dịch |
extraData | String | Thông tin bổ sung đối tác truyền sang API |
tokenResult | String | Thông tin token và thẻ được lưu |
signature | String | Chữ ký kiểm tra dữ liệu signature = HMAC_SHA256(data, secretKey) data: amount={amount}&apiKey={apiKey}&appotapayTransId={appotapayTransId}&bankCode={bankCode}& currency={currency}&errorCode={errorCode}&extraData={extraData}&message={message}&orderId={orderId}&partnerCode={partnerCode}&paymentMethod={paymentMethod}&paymentType={paymentType}&tokenResult={tokenResult}&transactionTs={transactionTs} |
Signature mẫu:
amount=2000&apiKey=FJcmF8uj2ISveL5FvvNk4pnp8xrhINz8&appotapayTransId=AP231437168954&bankCode=VCB¤cy=VND&errorCode=0&extraData=string&message=Success&orderId=11034005&partnerCode=APPOTAPAY&paymentMethod=ATM&paymentType=WEB&tokenResult={"status":0,"message":"Th\u00e0nh c\u00f4ng","card":{"status":"active","token":"2331123162638222","card_name":"NGUYEN VAN A","card_number":"970400xxxxxx0001","card_date":"","card_type":"ATM_CARD"}}&transactionTs=1679542882
Example Request:
{
"errorCode":0,
"message":"Thành công",
"partnerCode": "TEST",
"apiKey": "oMhJpkz7K6HDcR6S",
"amount":50000,
"currency":"VND",
"orderId":"5f5b46cb73fd0",
"bankCode":"SHB",
"paymentMethod":"ATM",
"paymentType":"WEB",
"appotapayTransId":"AP200910014125B",
"transactionTs":1599817433,
"extraData":"test test",
"tokenResult": "{\"status\":0,\"message\":\"Th\\u00e0nh c\\u00f4ng\",\"card\":{\"status\":\"active\",\"token\":\"4120587300058051\",\"card_name\":\"NGUYEN VAN A\",\"card_number\":\"970400xxxxxx0001\",\"card_date\":\"\",\"card_type\":\"ATM_CARD\"}}",
"signature":"d6ff2d38c2b1167c6d17b9dbb1380347b24c1bf912dc442dbd018b2e1ed74f3d"
}
HTTP Response:
HTTP Code: 200
Body:{"status": "ok"}
Request được xác định thành công khi nhận được mã
HTTP Code = 200
, request không thành công sẽ được gửi lại tối đa 3 lần, mỗi lần cách nhau 5 phút.
Trạng thái giao dịch.
Sử dụng tham số errorCode
để xác định trạng thái của giao dịch
Error Code | Trạng thái |
---|---|
= 0 | Giao dịch thành công |
!= 0 | Giao dịch không thành công |
Kiểm tra tính toàn vẹn dữ liệu
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.