Nhảy tới nội dung
Version: 1.1

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

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ành công","card":{"status":"active","token":"9704001845460018","card_name":"NGUYEN VAN A","card_number":"970400xxxxxx0018","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ệuMô tả
errorCodeIntegerMã lỗi
messageStringThông tin chi tiết mã lỗi
partnerCodeStringMã đối tác
apiKeyStringMã APIKEY gọi tới API
amountIntegerSố tiền thanh toán
currencyStringMã tiền tệ (mặc định: VND)
orderIdStringMã đơn hàng
bankCodeStringMã ngân hàng
paymentMethodStringPhương thức thanh toán
paymentTypeStringLoại thanh toán (mặc định: WEB)
appotapayTransIdStringMã giao dịch phía AppotaPay
transactionTsIntegerThời gian giao dịch
extraDataStringThông tin bổ sung đối tác truyền sang API
tokenResultJsonThông tin token và thẻ được lưu
signatureStringChữ 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}&transactionTs={transactionTs}

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ành công",        "card": {            "status": "active",            "token": "9704001845460018",            "card_name": "NGUYEN VAN A",            "card_number": "970400xxxxxx0018",            "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 CodeTrạng thái
= 0Giao dịch thành công
!= 0Giao 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.