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

Get authentication

Có thể sử dụng API này đế lấy kết quả xác thực và dựa vào trạng thái xác thực 3DS để quyết định có tiếp tục thực hiện thanh toán giao dịch hay không.

EndPoint

POST /credit-card/enrollment/validate/:authenticationId

Header Params

Tham sốYêu cầuKiểu dữ liệuMô tảLưu ý
X-APPOTAPAY-AUTHrequiredString Cách tạo JWT_TOKEN
Content-TyperequiredStringGiá trị: application/json
X-Request-IDoptionalStringĐịnh dạng UUIDv4. Request ID để kiểm tra yêu cầu khi xảy ra sự cốmax:42
LanguageoptionalStringGiá trị vi hoặc en tương ứng với link thanh toán sẽ là tiếng việt hoặc tiếng anh, (mặc định: vi)

in:vi,en

X-Account-Ref-IDoptionalString

Mã định danh của tài khoản Sub account do AppotaPay cung cấp.

Bắt buộc truyền khi thanh toán giao dịch của Sub account loại owner

{
"X-APPOTAPAY-AUTH": "JWT_TOKEN",
"Content-Type": "application/json",
"X-Request-ID": "Your_Unique_id",
"Language": "vi",
"X-Account-Ref-ID": "9723f73b-9295-4acb-884b-ab6310c2e653"
}

Request Params

Tham sốYêu cầuKiểu dữ liệuMô tảLưu ý
authenticationIdrequiredStringauthenticationId lấy từ URL query khi người dùng được điều hướng về trang của Merchant

Response Params

{
"authenticationId": "01HQHR9W32E2RDSF6KM51PSJ92",
"merchantRefId": "HJ1OsUcDI",
"status": "PENDING",
"amount": 1000000,
"currency": "VND",
"tokenId": "01hqhr8vgdw64qhqgvm2tsbpew",
"deviceDataCollectionUrl": "https://acpg.dev.appotapay.com/credit-card/authenticate?id=01HQHR9W32E2RDSF6KM51PSJ92&signature=cf6e30824b5e66e0c401701f3416e72c5b069a01c3a80a316cf9e54f9b855675",
"card": {
"number": "400000XXXXXX0010",
"expirationMonth": "12",
"expirationYear": "29",
"cardBrand": "MASTERCARD",
"cardType": "CREDIT",
"country": "VN"
}
}

Thành công

Http Status Code 200 - OK

Tham sốKiểu dữ liệuMô tảLưu ý
authenticationIdStringMã định danh authentication được gửi trong URL
merchantRefIdStringMã tham chiếuMin:1 Max:40
cardStringThông tin thẻ
card.numberStringSố thẻ16 numbers
card.expirationMonthStringTháng hết hạn của thẻ, bao gồm cả số 0 ở đầu (VD: 03)Format: MM
card.expirationYearStringNăm hết hạn của thẻ (VD.: 25)Format: YY
card.typeStringLoại thẻ, gồm:
CREDIT / DEBIT / PREPAID / UNKNOWN
card.brandStringThương hiệu thẻ, gồm:
VISA / MASTERCARD / JCB / AMEX
card.countryStringQuốc gia phát hành thẻ, bao gồm 2 chữ cái theo bảng mã ISO 3166-2 (VD: VN, US)
amountFloatSố tiền thanh toán (VD: 1000)Hỗ trợ VND
statusStringTrạng thái của xác thực có thể trả về:
CARD_ENROLLED thẻ đã check enroll và chờ xác thực từ phía người dùng
ENROLLMENT_CHECK_FAILED không thể check enroll do issuer hoặc card network
CARD_NOT_ENROLLED thẻ chưa được enroll
VERIFIED xác minh 3DS đã thành công, khi nhận trạng thái đã xác thực này, giá trị eci có thể là một trong những giá trị sau: 05, 02, 06, 01, có thể tiến hành authorization
FAILED kiểm tra 3DS thất bại
PENDING khi giao dịch thẻ có 3DS 2.0 hoặc phía xử lý là MIGS. Điều hướng user tới trang xác thực 3DS để tiếp tục quá trình thanh toán
deviceDataCollectionUrlStringNếu trạng thái là CARD_ENROLLED, có thể khách hàng đến URL này để thực hiện xác thực 3DS
eciStringElectronic Commerce Indicator (ECI) mã code cho thẻ đã enroll. ECI có thông tin khi xác thực 3DS thành công hoặc thất bại:
05 hoặc 02 - Xác thực thành công, tiến hành authorization
06 hoặc 01 - Thẻ không được enroll hoặc đã bị bỏ qua do luồng frictionless, tiến hành authorization
07 hoặc 00 - Xác thực thất bại
threeDsVersionStringPhiên bản 3DS
Ví dụ:
-2.1.0 - 3DS 2.0 / EMV 3DS:
- 1.0.2 - 3DS 1.0

Thất bại

HTTP Status Code != 200

Authentication Callback

Sau khi có kết quả xác thực 3DS, AppotaPay sẽ gửi callback đến merchant qua callback URL mà merchant đã gửi trước đó trong quá trình tích hợp

Event Schema

Tham sốKiểu dữ liệuMô tả
eventStringLoại event
Event xác thực là event: credit_card.authentication
responseTimeStringThời gian phản hồi event theo chuẩn RFC-3339, time zone UTC+7
dataStringDữ liệu của event, xem chi tiết tại Event Object structure
Để kiểm tra nội dung data, bạn nên sử dụng
- Base64 Decode data string
- Then, JSON Decode data string from string was Base64 Decoded
Ví dụ:
- dataJson = JSON_Decode(Base64_Decode(data))
signatureStringChữ ký để xác minh dữ liệu
signature = HMACSHA256(data, secret_key)
- data: tham số data từ trong yêu cầu
- secret_key: từ application đã đăng ký với AppotaPay

Event Object structure

authenticationIdStringMã định danh authentication
merchantRefIdStringMã tham chiếuMin:1 Max:40
cardStringThông tin thẻ
card.numberStringSố thẻ16 numbers
card.expirationMonthStringTháng hết hạn của thẻ, bao gồm cả số 0 ở đầu (VD: 03)Format: MM
card.expirationYearStringNăm hết hạn của thẻ (VD.: 25)Format: YY
card.typeStringLoại thẻ, gồm:
CREDIT / DEBIT / PREPAID / UNKNOWN
card.brandStringThương hiệu thẻ, gồm:
VISA / MASTERCARD / JCB / AMEX
card.countryStringQuốc gia phát hành thẻ, bao gồm 2 chữ cái theo bảng mã ISO 3166-2 (VD: VN, US)
amountFloatSố tiền thanh toán (VD: 1000)Hỗ trợ VND
statusStringTrạng thái của xác thực có thể trả về:
CARD_ENROLLED thẻ đã check enroll và chờ xác thực từ phía người dùng
ENROLLMENT_CHECK_FAILED không thể check enroll do issuer hoặc card network
CARD_NOT_ENROLLED thẻ chưa được enroll
VERIFIED xác minh 3DS đã thành công, khi nhận trạng thái đã xác thực này, giá trị eci có thể là một trong những giá trị sau: 05, 02, 06, 01, có thể tiến hành authorization
FAILED kiểm tra 3DS thất bại
PENDING khi giao dịch thẻ có 3DS 2.0 hoặc phía xử lý là MIGS. Điều hướng user tới trang xác thực 3DS để tiếp tục quá trình thanh toán
eciStringElectronic Commerce Indicator (ECI) mã code cho thẻ đã enroll. ECI có thông tin khi xác thực 3DS thành công hoặc thất bại:
05 hoặc 02 - Xác thực thành công, tiến hành authorization
06 hoặc 01 - Thẻ không được enroll hoặc đã bị bỏ qua do luồng frictionless, tiến hành authorization
07 hoặc 00 - Xác thực thất bại
threeDsVersionStringPhiên bản 3DS
Ví dụ:
- 2.1.0 - 3DS 2.0 / EMV 3DS:
- 1.0.2 - 3DS 1.0

Example event callback data

{
"event": "credit_card.authentication",
"responseTime": "2023-12-12T11:54:23+07:00",
"data": "eyJhdXRoZW50aWNhdGlvbklkIjoiMDFISEU2MDJYMzVNV1ZHWUtBREo5UVdNNEciLCJtZXJjaGFudFJlZklkIjoiYXV2ekVla1FRIiwic3RhdHVzIjoiVkVSSUZJRUQiLCJhbW91bnQiOjEwMDAwLCJjdXJyZW5jeSI6IlZORCIsImNhcmQiOnsibnVtYmVyIjoiNTIwMDAwWFhYWFhYMjE1MSIsImV4cGlyYXRpb25Nb250aCI6IjAxIiwiZXhwaXJhdGlvblllYXIiOiIyNCIsImNhcmRCcmFuZCI6Ik1BU1RFUkNBUkQiLCJjYXJkVHlwZSI6IkNSRURJVCIsImNvdW50cnkiOiJNWSJ9LCJlY2kiOiIwMiIsInRocmVlRHNWZXJzaW9uIjoiMi4yLjAifQ",
"signature": "3d82e6b73cc8ebaa433137d74700422163fc1851d260b879aa7b6041f5bcefbf"
}

Khi bạn giải mã data, bạn có thể xem được dữ liệu trong callback event

{
"event": "credit_card.authentication",
"responseTime": "2023-12-12T11:54:23+07:00",
"data": {
"authenticationId": "01HHE602X35MWVGYKADJ9QWM4G",
"merchantRefId": "auvzEekQQ",
"status": "VERIFIED",
"amount": 10000,
"currency": "VND",
"card": {
"number": "520000XXXXXX2151",
"expirationMonth": "01",
"expirationYear": "24",
"cardBrand": "MASTERCARD",
"cardType": "CREDIT",
"country": "MY"
},
"eci": "02",
"threeDsVersion": "2.2.0"
},
"signature": "3d82e6b73cc8ebaa433137d74700422163fc1851d260b879aa7b6041f5bcefbf"
}

Để xác minh dữ liệu bằng chữ ký, bạn có thể sử dụng secret_key từ JWT (application đã được đăng ký)

data = "eyJhdXRoZW50aWNhdGlvbklkIjoiMDFISEU2MDJYMzVNV1ZHWUtBREo5UVdNNEciLCJtZXJjaGFudFJlZklkIjoiYXV2ekVla1FRIiwic3RhdHVzIjoiVkVSSUZJRUQiLCJhbW91bnQiOjEwMDAwLCJjdXJyZW5jeSI6IlZORCIsImNhcmQiOnsibnVtYmVyIjoiNTIwMDAwWFhYWFhYMjE1MSIsImV4cGlyYXRpb25Nb250aCI6IjAxIiwiZXhwaXJhdGlvblllYXIiOiIyNCIsImNhcmRCcmFuZCI6Ik1BU1RFUkNBUkQiLCJjYXJkVHlwZSI6IkNSRURJVCIsImNvdW50cnkiOiJNWSJ9LCJlY2kiOiIwMiIsInRocmVlRHNWZXJzaW9uIjoiMi4yLjAifQ";
secret_key = "Your_secret_key_was_resigtered"
signature = HMACSHA256(data, secret_key)

Link tham khảo để tạo Chữ ký: Free online Hash Hmac tool using algorithm SHA1, SHA256, SHA512 and more - Devtool