Chuyển tới nội dung chính

THÔNG SỐ KỸ THUẬT API THẺ SERVER-TO-SERVER GLODIPAY

PHIÊN BẢN 2.0.0

Mục lục

Sử dụng môi trường Thử nghiệm (Test). Không có chi phí thực tế nào được tính.

Không có 3DS4111 1111 1111 111101/30029
Không có 3DS5555 5555 5555 444401/30029
Thanh toán 3DS4012 8888 8888 188101/30029Thành công: 123456 / Thất bại: 111111
Thanh toán 3DS5111 1111 1111 111801/30029Thành công: 123456 / Thất bại: 111111
Thanh toán 3DS4141 4141 4141 414112/30123Thành công: 123456 / Thất bại: 111111

Giới thiệu

Tài liệu này mô tả GLODIPAY Server-to-Server (S2S) Card API v2, cho phép người bán gửi chi tiết thanh toán thẻ trực tiếp từ máy chủ của họ mà không cần chuyển hướng người mua đến trang do GLODIPAY lưu trữ.

Các tính năng chính:

  • Gửi chi tiết thẻ trực tiếp: Số thẻ, ngày hết hạn và mã CVV được gửi trong yêu cầu API. Người bán chịu trách nhiệm thu thập chi tiết thẻ một cách an toàn trên trang của mình (yêu cầu tuân thủ PCI DSS).
  • Tự động chuyển tầng (Auto-Cascade): Khi được bật cho tài khoản người bán, gateway sẽ tự động thử lại việc tính phí qua nhiều Nhà cung cấp dịch vụ thanh toán (PSP) theo thứ tự ưu tiên. Các thất bại riêng lẻ của từng PSP sẽ được ẩn đi -- chỉ kết quả cuối cùng mới được trả về.
  • Hỗ trợ 3DS: Nếu nhà cung cấp yêu cầu xác thực 3D Secure, một phản hồi redirect sẽ được trả về kèm theo một URL để hoàn tất xác minh. Sau khi xác thực 3DS, kết quả sẽ được gửi qua IPN và người mua được chuyển hướng về trang của người bán.

Điểm cuối (Endpoints)

Thử nghiệmSẽ được cung cấp
Sản xuấtLấy từ trang API Keys trong Dashboard của người bán

Chữ ký (Signature)

Tất cả các yêu cầu gửi đến GLODIPAY phải bao gồm trường signature. Tất cả các phản hồi và payload IPN từ GLODIPAY cũng bao gồm trường signature để xác minh tính xác thực.

Chữ ký sử dụng RSA với MD5 (md5WithRSAEncryption).

Tạo chữ ký (Người bán -> GLODIPAY)

Sử dụng khóa riêng của người bán (có sẵn trong Dashboard của người bán).

Các bước:

  • Thu thập tất cả các tham số yêu cầu ngoại trừ signature dưới dạng đối tượng khóa-giá trị phẳng.
  • Sắp xếp chỉ các khóa cấp cao nhất theo thứ tự tăng dần tự nhiên (SORT_NATURAL trong PHP / localeCompare với { numeric: true } trong JavaScript). Không sắp xếp các khóa bên trong các đối tượng lồng nhau (ví dụ: fees, paymentMethodDetails).
  • Cắt bỏ khoảng trắng ở đầu và cuối tất cả các giá trị chuỗi một cách đệ quy.
  • Tuần tự hóa thành một chuỗi JSON.
  • Ký bằng openssl_sign(..., 'md5WithRSAEncryption').
  • Mã hóa Base64 đầu ra nhị phân.

Xác minh chữ ký (GLODIPAY -> Người bán)

Sử dụng khóa công khai của GLODIPAY (có sẵn từ Cổng thông tin).

Các bước:

  • Loại bỏ signature khỏi payload.
  • Sắp xếp chỉ các khóa cấp cao nhất theo thứ tự tăng dần tự nhiên. Không sắp xếp các khóa bên trong các đối tượng lồng nhau.
  • Cắt bỏ khoảng trắng ở đầu và cuối tất cả các giá trị chuỗi một cách đệ quy.
  • Tuần tự hóa thành một chuỗi JSON.
  • Xác minh bằng openssl_verify(..., base64_decode($signature), $publicKey, 'md5WithRSAEncryption').
  • Giá trị trả về 1 = hợp lệ.

Lưu ý (Node.js): Chuyển đổi tất cả các giá trị số thành chuỗi trước khi sắp xếp/tuần tự hóa. Thoát các dấu gạch chéo xuôi trong chuỗi JSON: .replace(///g, '\/').

POST PAYMENT

Gửi trực tiếp chi tiết thẻ từ máy chủ của bạn để xử lý thanh toán thẻ.

Endpoint: POST /v2/card/api Phương thức: POST Content-Type: application/json

Tham số yêu cầu (Request Parameters)

merchantIdString(1,50)MID của người bán
orderRefString(1,250)MMã tham chiếu giao dịch duy nhất cho mỗi người bán
amountFloatMSố tiền hóa đơn. Tối thiểu: 1. Tối đa 2 chữ số thập phân
currencyString(3)MMã tiền tệ ISO 4217. Ví dụ: USD
cancelUrlString(1,300)MURL để chuyển hướng người mua khi hủy bỏ. Phải là https
callbackUrlString(1,300)MURL để chuyển hướng người mua sau khi thanh toán thành công. Phải là https
notificationUrlString(1,300)MEndpoint máy chủ của bạn để nhận webhook IPN. Phải là https
errorUrlString(1,300)MURL để chuyển hướng người mua khi có lỗi. Phải là https
orderDescriptionString(max:3000)MMô tả ngắn gọn về đơn hàng
metadataJSONOCác cặp khóa-giá trị gắn vào phiên. Được trả về trong IPN và phản hồi truy vấn
transactionDocumentsJSONOTài liệu hỗ trợ cho giao dịch
paymentMethodStringMPhải là card cho thanh toán thẻ S2S
feeBySellerNumber(0-100)OPhần trăm phí xử lý do người bán trả. 0 = người mua trả 100%. Tối đa 2 chữ số thập phân
billingFirstNameString(max:255)MTên thanh toán
billingLastNameString(max:255)MHọ thanh toán
billingStreet1String(max:255)MĐịa chỉ dòng 1
billingStreet2String(max:255)OĐịa chỉ dòng 2
billingCityString(max:255)MThành phố
billingEmailString(max:255)MĐịa chỉ email người mua
billingStateString(min:2, max:255)CBang / Tỉnh. Bắt buộc khi billingCountry là US hoặc CA
billingCountryStringMMã quốc gia ISO 3166-1 alpha-2
billingPostalCodeString(max:25)MMã bưu điện / ZIP
billingPhoneCountryCodeString(max:10)OMã vùng quốc gia của điện thoại. Ví dụ: 1 cho Mỹ
billingPhoneNumberString(max:30)MSố điện thoại
cardNumberString(12,19)MSố thẻ. Ví dụ: 4111111111111111
cardMonthStringMTháng hết hạn. Ví dụ: 12
cardYearStringMNăm hết hạn (2 chữ số). Ví dụ: 30
cardSecurityCodeString(3,4)MCVV / CVC
customerIpStringMĐịa chỉ IP của khách hàng
websiteUrlString(max:300)OURL trang web của người bán
signatureString(max:750)MChữ ký RSA-MD5. Xem phần Chữ ký
expiresAtStringOHết hạn phiên theo định dạng ISO 8601. Mặc định: 24 giờ
browserDetailsJSONMDấu vân tay trình duyệt. Xem Đối tượng browserDetails

M = Bắt buộc (Mandatory), O = Tùy chọn (Optional), C = Có điều kiện (Conditional)

Đối tượng browserDetails

Bắt buộc với mọi request S2S card. Có thể gửi dưới dạng đối tượng JSON (lồng nhau) hoặc chuỗi được mã hóa JSON. Khóa viết snake_case như bảng dưới; gửi camelCase vẫn được, hệ thống tự chuẩn hóa.

accept_headerStringMBrowser Accept header. Ví dụ: text/html,application/xhtml+xml
screen_widthStringMChiều rộng màn hình tính bằng pixel. Ví dụ: 1920
screen_heightStringMChiều cao màn hình tính bằng pixel. Ví dụ: 1080
screen_color_depthStringMĐộ sâu màu màn hình tính bằng bit. Ví dụ: 24
window_widthStringMChiều rộng Viewport tính bằng pixel. Ví dụ: 1440
window_heightStringMChiều cao Viewport tính bằng pixel. Ví dụ: 900
languageStringMNgôn ngữ trình duyệt. Ví dụ: en-US
java_enabledStringMLiệu Java có được bật không. "true" hoặc "false"
user_agentStringMChuỗi User Agent của trình duyệt
time_zoneStringMĐộ lệch múi giờ theo giờ so với UTC. Ví dụ: 7 cho UTC+7
time_zone_nameStringMTên múi giờ IANA. Ví dụ: Asia/Ho_Chi_Minh

Đoạn mã JavaScript để thu thập browserDetails:

document.addEventListener('DOMContentLoaded', () => {
const browserDetails = {
accept_header: "{{ request()->header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') }}",
screen_width: window.screen.width.toString(),
screen_height: window.screen.height.toString(),
screen_color_depth: window.screen.colorDepth.toString(),
window_width: String(window.innerWidth || document.documentElement.clientWidth || screen.width),
window_height: String(window.innerHeight || document.documentElement.clientHeight || screen.height),
language: navigator.language,
java_enabled: 'false',
user_agent: navigator.userAgent,
time_zone: String(-new Date().getTimezoneOffset() / 60),
time_zone_name: Intl.DateTimeFormat().resolvedOptions().timeZone
};

document.getElementById('browserDetails').value = JSON.stringify(browserDetails, null, 2);
});

Ví dụ yêu cầu

{
"merchantId": "1100000123",
"orderRef": "ORDER-001",
"amount": "100.00",
"currency": "USD",
"paymentMethod": "card",
"callbackUrl": "https://yoursite.com/callback",
"notificationUrl": "https://yoursite.com/webhook",
"cancelUrl": "https://yoursite.com/cancel",
"errorUrl": "https://yoursite.com/error",
"orderDescription": "Test order",
"billingFirstName": "John",
"billingLastName": "Doe",
"billingStreet1": "123 Main St",
"billingStreet2": "",
"billingCity": "New York",
"billingEmail": "john@example.com",
"billingState": "NY",
"billingCountry": "US",
"billingPostalCode": "10001",
"billingPhoneCountryCode": "1",
"billingPhoneNumber": "5551234567",
"cardNumber": "4111111111111111",
"cardMonth": "12",
"cardYear": "30",
"cardSecurityCode": "123",
"customerIp": "1.2.3.4",
"browserDetails": {
"accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"screen_width": "1920",
"screen_height": "1080",
"screen_color_depth": "24",
"window_width": "1440",
"window_height": "900",
"language": "en-US",
"java_enabled": "false",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"time_zone": "7",
"time_zone_name": "Asia/Ho_Chi_Minh"
},
"signature": "base64-encoded-signature"
}

Phản hồi (Response)

Content-Type: application/json

Giao dịch hoàn tất (không yêu cầu 3DS):

{
"status": "success",
"message": "The transaction has been successfully completed.",
"data": {
"transactionId": "01jwz13qfcx4z61ded3jcj0tf2"
}
}

Yêu cầu xác thực 3DS:

{
"status": "redirect",
"message": "Please redirect the user to complete the payment.",
"data": {
"transactionId": "01jwz0ty1640apxvmyzqpvc18a",
"url": "https://payment.gpayprocessing.com/card/3ds/01jwz0ty1640apxvmyzqpvc18a"
}
}

Chuyển hướng người mua đến data.url để hoàn tất 3DS. Sau khi xác minh, GLODIPAY xử lý giao dịch và gửi kết quả qua IPN đến notificationUrl và chuyển hướng người mua đến callbackUrl.

Đang chờ xử lý (chờ xác nhận từ PSP):

{
"status": "pending",
"message": "pending",
"data": {
"transactionId": "01jwz0ty1640apxvmyzqpvc18a"
}
}

Lỗi xác thực (HTTP 422):

{
"status": "error",
"message": "Invalid request data.",
"errors": [
{
"field": "billingEmail",
"message": ["The billing email field is required."]
}
]
}

Lỗi xử lý (HTTP 400/500):

{
"status": "error",
"message": "No payment provider could process this transaction. Please try again or contact support.",
"data": {
"transactionId": "01jwz0ty1640apxvmyzqpvc18a"
}
}

Tự động chuyển tầng (Auto-Cascade): Khi được bật cho tài khoản người bán, gateway sẽ tự động thử lại việc tính phí thẻ qua tất cả các PSP đang hoạt động theo thứ tự ưu tiên trước khi trả về phản hồi cuối cùng. Các thất bại riêng lẻ của từng PSP sẽ được ẩn đi trong quá trình chuyển tầng -- chỉ kết quả cuối cùng mới được trả về và gửi qua IPN.

TRANSACTION QUERY (Truy vấn giao dịch)

Truy vấn trạng thái hiện tại và chi tiết đầy đủ của một giao dịch.

Endpoint: POST /v2/checkout/query Phương thức: POST Content-Type: application/json

Yêu cầu (Request)

transactionIdString (ULID)MID giao dịch của GLODIPAY
signatureString(max:750)MChữ ký RSA-MD5

Phản hồi (Response)

Content-Type: application/json

merchantIdStringID của người bán
transactionIdStringID giao dịch của GLODIPAY (ULID)
transactionNumberStringSố giao dịch dễ hiểu của GLODIPAY
refStringorderRef của người bán
currencyStringMã tiền tệ ISO 4217
amountFloatSố tiền hóa đơn
paidAmountFloatSố tiền thực tế thu từ người mua (bao gồm cả phí người mua)
settlementAmountFloatSố tiền được thanh quyết toán cho người bán
estimationSettlementAtISO 8601 datetimeThời gian thanh quyết toán dự kiến
feesJSONPhân tách phí. Xem đối tượng fees
statusStringTrạng thái giao dịch. Xem phần Giá trị trạng thái
statusCodeNumberMã trạng thái số. Xem phần Mã trạng thái
metadataJSONCác cặp khóa-giá trị từ phiên gốc
transactionDocumentsJSONTài liệu hỗ trợ
paymentMethodDetailsJSONPhương thức thanh toán đã dùng. Xem đối tượng paymentMethodDetails
messageStringThông báo trạng thái dễ hiểu
descriptorStringMô tả giao dịch (descriptor)
transactionCreatedAtISO 8601 datetimeThời gian tạo giao dịch trong hệ thống GLODIPAY
originalTransactionCreatedAtISO 8601 datetimeThời gian tạo giao dịch tại PSP
signatureStringChữ ký RSA-MD5 -- xác minh bằng khóa công khai của GLODIPAY

NOTIFICATION (Thông báo)

GLODIPAY gửi một HTTP POST đến notificationUrl của bạn khi một giao dịch đạt đến trạng thái cuối cùng.

Phương thức: POST Content-Type: application/json

Chính sách gửi lại (Retry policy): GLODIPAY có thể gửi lại IPN cho các giao dịch chưa được xác nhận. Máy chủ của bạn nên trả về {"returnCode":"100"} ngay khi nhận được thông báo.

Payload

merchantIdStringMID của người bán
transactionIdStringMID giao dịch của GLODIPAY (ULID)
transactionNumberStringMSố giao dịch dễ hiểu của GLODIPAY
refStringMorderRef của người bán
currencyStringMMã tiền tệ ISO 4217
amountFloatMSố tiền hóa đơn
paidAmountFloatOSố tiền thực tế thu từ người mua (bao gồm cả phí người mua)
settlementAmountFloatOSố tiền được thanh quyết toán cho người bán
estimationSettlementAtISO 8601 datetimeOThời gian thanh quyết toán dự kiến
feesJSONOPhân tách phí. Xem đối tượng fees
paymentMethodDetailsJSONOPhương thức thanh toán đã dùng. Xem đối tượng paymentMethodDetails
statusStringMTrạng thái giao dịch. Xem phần Giá trị trạng thái
statusCodeNumberMMã trạng thái số. Xem phần Mã trạng thái
metadataJSONOCác cặp khóa-giá trị từ phiên gốc
transactionDocumentsJSONOTài liệu hỗ trợ
messageStringOThông báo trạng thái dễ hiểu
descriptorStringOMô tả giao dịch (descriptor)
transactionCreatedAtISO 8601 datetimeMThời gian tạo giao dịch trong hệ thống GLODIPAY
originalTransactionCreatedAtISO 8601 datetimeMThời gian tạo giao dịch tại PSP
signatureStringMChữ ký RSA-MD5 -- xác minh bằng khóa công khai của GLODIPAY

Đối tượng fees

buyerFloatSố phí người mua phải trả
sellerFloatSố phí người bán phải trả
rollingFloatSố tiền ký quỹ (rolling reserve)
operateFloatTổng phí vận hành (processor + GLODIPAY + đối tác)
estimationRollingReleaseAtISO 8601 datetimeThời gian dự kiến giải tỏa tiền ký quỹ

Đối tượng paymentMethodDetails

displayNameStringNhãn phương thức thanh toán
groupStringLoại nhóm phương thức thanh toán
familyStringLoại họ phương thức thanh toán
typeStringLoại phương thức thanh toán
{type}JSONTùy chọn. Chi tiết riêng cho từng phương thức. Khóa bằng giá trị type (ví dụ: card). Chỉ xuất hiện cho thanh toán thẻ khi có sẵn chi tiết thẻ. Xem đối tượng card bên dưới.

Đối tượng card (paymentMethodDetails.card)

nameTên chủ thẻ
firstSixDigits6 số đầu của số thẻ (BIN)
lastFourDigits4 số cuối của số thẻ
expiryMonthTháng hết hạn (MM)
expiryYearNăm hết hạn (YY)
typeThương hiệu thẻ (visa, mastercard, amex, v.v.)
issuerTên ngân hàng phát hành (tùy thuộc vào nhà cung cấp)
issuerCountryCodeMã quốc gia ISO 3166-1 alpha-2 của ngân hàng phát hành (tùy thuộc vào nhà cung cấp)
fundingLoại nguồn tiền của thẻ (credit, debit, prepaid) (tùy thuộc vào nhà cung cấp)
authorizationCodeMã ủy quyền từ ngân hàng phát hành (tùy thuộc vào nhà cung cấp)
clientIPĐịa chỉ IP của khách hàng tại thời điểm thanh toán (tùy thuộc vào nhà cung cấp)
checksKết quả xác minh AVS/CVC (tùy thuộc vào nhà cung cấp)
threeDSecureChi tiết xác thực 3D Secure (tùy thuộc vào nhà cung cấp)

Ví dụ Payload IPN:

{
"merchantId": "1100000123",
"transactionId": "01jwz13qfcx4z61ded3jcj0tf2",
"transactionNumber": "2604-1713100800",
"ref": "ORDER-001",
"currency": "USD",
"amount": 100.00,
"paidAmount": 105.00,
"settlementAmount": 95.00,
"estimationSettlementAt": "2026-04-16T00:00:00+00:00",
"fees": {
"buyer": 5.00,
"seller": 5.00,
"rolling": 2.00,
"operate": 3.00,
"estimationRollingReleaseAt": "2026-05-14T00:00:00+00:00"
},
"status": "successful",
"statusCode": 6,
"paymentMethodDetails": {
"displayName": "Credit / Debit Card",
"group": "card",
"family": "card",
"type": "card"
},
"metadata": { "orderId": "12345" },
"transactionCreatedAt": "2026-04-14T10:00:00+00:00",
"originalTransactionCreatedAt": "2026-04-14T10:00:01+00:00",
"signature": "base64-encoded-rsa-signature"
}

Phản hồi (Người bán -> GLODIPAY)

Máy chủ của bạn phải phản hồi trong vòng 30 giây:

{
"returnCode": "100",
"description": "Received"
}
returnCodeStringRPhải là "100" để xác nhận đã nhận
descriptionString(1,1500)OMô tả tùy chọn

Mô phỏng thanh toán (Thẻ thử nghiệm)

Sử dụng môi trường Thử nghiệm (Test). Không có chi phí thực tế nào được tính.

Không có 3DS4111 1111 1111 111101/30029
Không có 3DS5555 5555 5555 444401/30029
Thanh toán 3DS4012 8888 8888 188101/30029Thành công: 123456 / Thất bại: 111111
Thanh toán 3DS5111 1111 1111 111801/30029Thành công: 123456 / Thất bại: 111111
Thanh toán 3DS4141 4141 4141 414112/30123Thành công: 123456 / Thất bại: 111111

Phụ lục

Giá trị trạng thái (Status Values)

Giá trị chuỗi được trả về trong trường status của payload IPN và phản hồi truy vấn.

incompleteGiao dịch đã khởi tạo, đang chờ hành động
pendingĐang chờ xác nhận thanh toán
under_reviewGiao dịch đang được xem xét
successfulThanh toán hoàn tất thành công
failedThanh toán thất bại
errorĐã xảy ra lỗi hệ thống
canceledGiao dịch bị hủy
rejectedGiao dịch bị từ chối
expiredGiao dịch hết hạn
releasedTiền đã giải tỏa / thanh quyết toán
documents_uploadedTài liệu hỗ trợ đã tải lên
refund_initiatedYêu cầu hoàn tiền đã khởi tạo
refund_under_reviewHoàn tiền đang xem xét
refund_successfulHoàn tiền hoàn tất thành công
refund_failedHoàn tiền thất bại
refund_partially_successfulHoàn tiền một phần thành công
refund_partially_failedHoàn tiền một phần thất bại
void_initiatedViệc hủy bỏ đã khởi tạo
void_under_reviewViệc hủy bỏ đang xem xét
void_successfulViệc hủy bỏ hoàn tất thành công
void_failedViệc hủy bỏ thất bại
void_partially_successfulViệc hủy bỏ một phần thành công
void_partially_failedViệc hủy bỏ một phần thất bại
chargeback_alertNhận được cảnh báo chargeback
chargebackedGiao dịch đã bị chargeback
disputeTranh chấp đã được mở

Mã trạng thái (Status Codes)

Mã số trong trường statusCode của payload IPN và phản hồi truy vấn.

1incompleteGiao dịch đã khởi tạo
2pendingĐang chờ xác nhận
3errorLỗi hệ thống
4failedThanh toán thất bại
5under_reviewĐang xem xét
6successfulThanh toán thành công
7releasedĐã giải tỏa / thanh quyết toán
8refund_initiatedHoàn tiền đã khởi tạo
9refund_failedHoàn tiền thất bại
10refund_under_reviewHoàn tiền đang xem xét
11refund_successfulHoàn tiền thành công
12refund_partially_failedHoàn tiền một phần thất bại
13refund_partially_successfulHoàn tiền một phần thành công
14canceledĐã hủy
15rejectedBị từ chối
16expiredHết hạn
17documents_uploadedTài liệu đã tải lên
18void_initiatedHủy bỏ đã khởi tạo
19void_under_reviewHủy bỏ đang xem xét
20void_successfulHủy bỏ thành công
21void_failedHủy bỏ thất bại
22void_partially_successfulHủy bỏ một phần thành công
23void_partially_failedHủy bỏ một phần thất bại
24chargeback_alertCảnh báo chargeback
25chargebackedĐã bị chargeback
26disputeTranh chấp đã mở

Mã tiền tệ (Currency Codes)

GLODIPAY tuân theo tiêu chuẩn ISO 4217. Tiền tệ được chấp nhận tùy thuộc vào nhà cung cấp thanh toán được cấu hình cho tài khoản người bán. Các giá trị phổ biến được hỗ trợ:

USDĐô la Mỹ
EUREuro
GBPBảng Anh
AUDĐô la Úc
AEDUAE Dirham
VNDViệt Nam Đồng

Mã quốc gia (Country Codes)

GLODIPAY sử dụng mã hai chữ cái ISO 3166-1 alpha-2 cho trường billingCountry.

ADAndorra
AEUnited Arab Emirates
AFAfghanistan
AGAntigua and Barbuda
AIAnguilla
ALAlbania
AMArmenia
AOAngola
AQAntarctica
ARArgentina
ASAmerican Samoa
ATÁo
AUÚc
AWAruba
AXÅland Islands
AZAzerbaijan
BABosnia and Herzegovina
BBBarbados
BDBangladesh
BEBỉ
BFBurkina Faso
BGBulgaria
BHBahrain
BIBurundi
BJBenin
BLSaint Barthélemy
BMBermuda
BNBrunei Darussalam
BOBolivia, Plurinational State of
BQBonaire, Sint Eustatius and Saba
BRBrazil
BSBahamas
BTBhutan
BVBouvet Island
BWBotswana
BYBelarus
BZBelize
CACanada
CCCocos (Keeling) Islands
CDCongo, Democratic Republic of the
CFCentral African Republic
CGCongo
CHThụy Sĩ
CICôte d'Ivoire
CKCook Islands
CLChile
CMCameroon
CNTrung Quốc
COColombia
CRCosta Rica
CUCuba
CVCabo Verde
CWCuraçao
CXChristmas Island
CYĐảo Síp
CZCộng hòa Séc
DEĐức
DJDjibouti
DKĐan Mạch
DMDominica
DOCộng hòa Dominica
DZAlgeria
ECEcuador
EEEstonia
EGAi Cập
EHTây Sahara
EREritrea
ESTây Ban Nha
ETEthiopia
FIPhần Lan
FJFiji
FKFalkland Islands
FMMicronesia
FOQuần đảo Faroe
FRPháp
GAGabon
GBVương quốc Anh
GDGrenada
GEGeorgia
GFFrench Guiana
GGGuernsey
GHGhana
GIGibraltar
GLGreenland
GMGambia
GNGuinea
GPGuadeloupe
GQGuinea Xích đạo
GRHy Lạp
GSNam Georgia và Quần đảo Nam Sandwich
GTGuatemala
GUGuam
GWGuinea-Bissau
GYGuyana
HKHồng Kông
HMĐảo Heard và Quần đảo McDonald
HNHonduras
HRCroatia
HTHaiti
HUHungary
IDIndonesia
IEIreland
ILIsrael
IMIsle of Man
INẤn Độ
IOLãnh thổ Ấn Độ Dương thuộc Anh
IQIraq
IRIran
ISIceland
ITÝ
JEJersey
JMJamaica
JOJordan
JPNhật Bản
KEKenya
KGKyrgyzstan
KHCampuchia
KIKiribati
KMComoros
KNSaint Kitts và Nevis
KPTriều Tiên
KRHàn Quốc
KWKuwait
KYQuần đảo Cayman
KZKazakhstan
LALào
LBLebanon
LCSaint Lucia
LILiechtenstein
LKSri Lanka
LRLiberia
LSLesotho
LTLithuania
LULuxembourg
LVLatvia
LYLibya
MAMa-rốc
MCMonaco
MDMoldova
MEMontenegro
MFSaint Martin (Pháp)
MGMadagascar
MHQuần đảo Marshall
MKBắc Macedonia
MLMali
MMMyanmar
MNMông Cổ
MOMa Cao
MPQuần đảo Bắc Mariana
MQMartinique
MRMauritania
MSMontserrat
MTMalta
MUMauritius
MVMaldives
MWMalawi
MXMexico
MYMalaysia
MZMozambique
NANamibia
NCNew Caledonia
NENiger
NFĐảo Norfolk
NGNigeria
NINicaragua
NLHà Lan
NONa Uy
NPNepal
NRNauru
NUNiue
NZNew Zealand
OMOman
PAPanama
PEPeru
PFFrench Polynesia
PGPapua New Guinea
PHPhilippines
PKPakistan
PLBa Lan
PMSaint Pierre và Miquelon
PNPitcairn
PRPuerto Rico
PSPalestine
PTBồ Đào Nha
PWPalau
PYParaguay
QAQatar
RERéunion
RORomania
RSSerbia
RUNga
RWRwanda
SAẢ Rập Xê-út
SBQuần đảo Solomon
SCSeychelles
SDSudan
SEThụy Điển
SGSingapore
SHSaint Helena
SISlovenia
SJSvalbard và Jan Mayen
SKSlovakia
SLSierra Leone
SMSan Marino
SNSenegal
SOSomalia
SRSuriname
SSNam Sudan
STSao Tome và Principe
SVEl Salvador
SXSint Maarten (Hà Lan)
SYSyria
SZEswatini
TCQuần đảo Turks và Caicos
TDChad
TFFrench Southern Territories
TGTogo
THThái Lan
TJTajikistan
TKTokelau
TLTimor-Leste
TMTurkmenistan
TNTunisia
TOTonga
TRThổ Nhĩ Kỳ
TTTrinidad và Tobago
TVTuvalu
TWĐài Loan
TZTanzania
UAUkraine
UGUganda
UMLãnh thổ hải ngoại của Hoa Kỳ
USHoa Kỳ
UYUruguay
UZUzbekistan
VAHoly See
VCSaint Vincent và Grenadines
VEVenezuela
VGQuần đảo Virgin (Anh)
VIQuần đảo Virgin (Mỹ)
VNViệt Nam
VUVanuatu
WFWallis và Futuna
WSSamoa
YEYemen
YTMayotte
ZANam Phi
ZMZambia
ZWZimbabwe

Loại thẻ (Card Types)

1VISAvisa
2MASTERCARDmastercard
3AMERICAN EXPRESSamex
4JCBjcb
5MAESTROmaestro
6DISCOVERdiscover
7UNION PAYunion-pay
8DINERSdiners

Ví dụ mã nguồn

PHP

<?php

function generateSignature(array $data, string $privateKeyStr): string
{
$key = openssl_pkey_get_private($privateKeyStr);

// Chỉ sắp xếp các khóa cấp cao nhất
ksort($data, SORT_NATURAL);

// Cắt bỏ khoảng trắng đệ quy
array_walk_recursive($data, function (&$v) {
$v = is_string($v) ? trim($v) : $v;
});

openssl_sign(json_encode($data), $signature, $key, 'md5WithRSAEncryption');
return base64_encode($signature);
}

function verifySignature(array $data, string $publicKeyStr): bool
{
$signature = $data['signature'];
unset($data['signature']);

ksort($data, SORT_NATURAL);
array_walk_recursive($data, function (&$v) {
$v = is_string($v) ? trim($v) : $v;
});

$key = openssl_pkey_get_public($publicKeyStr);
$result = openssl_verify(json_encode($data), base64_decode($signature), $key, 'md5WithRSAEncryption');
return $result === 1;
}

Node.js

// Save as script.mjs and run: node script.mjs
import { createSign } from 'crypto';

const PRIVATE_KEY = `-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----`;

function phpCast(v) {
if (typeof v === 'number') return String(v);
if (typeof v === 'boolean') return v ? '1' : '';
if (typeof v === 'string') return v.trim();
if (Array.isArray(v)) return v.map(phpCast);
if (v && typeof v === 'object') return Object.fromEntries(Object.entries(v).map(([k, val]) => [k, phpCast(val)]));
return v;
}

function generateSignature(data) {
const sorted = {};
Object.keys(data)
.filter(k => k !== 'signature')
.sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' }))
.forEach(k => { sorted[k] = data[k]; });

const canonical = JSON.stringify(phpCast(sorted))
.replace(/\//g, '\\/')
.replace(/[\u0080-\uffff]/g, c => '\\u' + c.charCodeAt(0).toString(16).padStart(4, '0'));

const sign = createSign('md5WithRSAEncryption');
sign.update(canonical);
return sign.sign(PRIVATE_KEY, 'base64');
}

Bookmarks

No bookmarks yet.
Hover over a heading and click to save a section.