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

THÔNG SỐ KỸ THUẬT API 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
  • Phụ lục
    • Phương thức thanh toán
    • Chế độ kết nối
    • Giá trị trạng thái
    • Mã trạng thái
    • Mã tiền tệ
    • Mã quốc gia
    • Loại thẻ
  • Ví dụ mã nguồn
    • PHP
    • Node.js

Giới thiệu

Tài liệu này mô tả GLODIPAY API v2, hỗ trợ người bán chấp nhận thẻ tín dụng/thẻ ghi nợ, ngân hàng di động, mã QR, ví điện tử và tiền điện tử trong một nền tảng thanh toán thống nhất duy nhất.

Điểm mới trong v2:

  • Đa PSP (Nhà cung cấp dịch vụ thanh toán): Một phiên thanh toán (checkout session) có thể hiển thị đồng thời các phương thức thanh toán từ nhiều PSP. Người mua thấy tất cả các phương thức thanh toán có sẵn trên trang thanh toán được lưu trữ -- người bán không cần thực hiện thêm công việc nào.
  • Tự động chuyển tầng (Auto-Cascade) cho S2S: Khi is_auto_cascade được bật, gateway sẽ tự động thử lại việc tính phí thẻ qua nhiều PSP trước khi trả về kết quả cuối cùng.
  • Chế độ Payment Link: connectionMode: PAYMENT_LINK tạo ra một URL có thể chia sẻ mà không yêu cầu các URL chuyển hướng.

Đ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 và phản hồi đều được ký bằng RSA với MD5 để đảm bảo tính toàn vẹn và xác thực.

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

Ký các payload yêu cầu bằng khóa riêng của người bán (lấy từ Dashboard 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 các khóa theo thứ tự tăng dần tự nhiên (SORT_NATURAL / localeCompare với numeric: true).
  • Cắt bỏ khoảng trắng khỏi tất cả các giá trị chuỗi (đệ quy).
  • Tuần tự hóa thành 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)

Xác minh các phản hồi và webhook của GLODIPAY bằng khóa công khai của GLODIPAY (có sẵn trong Cổng thông tin).

Các bước:

  • Tách signature khỏi payload.
  • Sắp xếp các khóa còn lại theo thứ tự tăng dần tự nhiên.
  • Cắt bỏ khoảng trắng khỏi tất cả các giá trị chuỗi (đệ quy).
  • Tuần tự hóa thành 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, '\/').

Thông số kỹ thuật API

POST PAYMENT (Checkout V2)

Tạo một phiên thanh toán và nhận URL trang thanh toán được lưu trữ. Trang được lưu trữ sẽ tự động hiển thị tất cả các phương thức thanh toán có sẵn cho người mua.

Endpoint: POST /v2/checkout Phương thức: Form Post Content-Type: application/x-www-form-urlencoded (Form Data)

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/tối đa được cấu hình cho mỗi người bán
currencyString(3)MMã tiền tệ ISO 4217. Ví dụ: USD
cancelUrlString(1,300)M(Frontend) URL để chuyển hướng người mua khi hủy bỏ. Phải là https.
callbackUrlString(1,300)M(Frontend) URL để 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)M(Frontend) URL để chuyển hướng người mua khi có lỗi. Phải là https.
orderDescriptionString(max:3000)MMô tả ngắn gọn hiển thị trên màn hình thanh toán
metadataJSONOCác cặp khóa-giá trị được 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
paymentMethodStringM(Các) phương thức thanh toán sẽ hiển thị. Xem các giá trị paymentMethod
paymentFilterJSONOCác loại phương thức thanh toán cần loại trừ khỏi phiên
paymentSorterJSONOMảng có thứ tự các loại phương thức thanh toán để kiểm soát thứ tự hiển thị. Các giá trị hợp lệ: card, paypal, ibanking_push, local_bank_transfer, wire_transfer, wallet, skrill, alipay, wechat, googlepay, applepay, crypto, apm
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)OTên thanh toán
billingLastNameString(max:255)OHọ thanh toán
billingStreet1String(max:255)OĐịa chỉ đường phố dòng 1
billingStreet2String(max:255)OĐịa chỉ đường phố dòng 2
billingCityString(max:255)OThành phố
billingEmailString(max:255)OĐịa chỉ email người mua
billingStateString(2,255)OBang / Tỉnh
billingCountryStringOMã quốc gia ISO 3166-1 alpha-2
billingPostalCodeString(max:25)OMã 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ỹ, 91 cho Ấn Độ
billingPhoneNumberString(max:20)OSố điện thoại
brandNameString(1,255)OGhi đè tên thương hiệu hiển thị trên màn hình thanh toán được lưu trữ
colorModeString(1,255)OTối đa 3 màu cách nhau bởi ---. Chấp nhận tên màu, HEX hoặc RGBA. Ví dụ: #2e7d32---#e8f5e9---#81c784
logoSourceString(1,255)OGhi đè logo hiển thị trên màn hình thanh toán được lưu trữ
customerIpStringOĐị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ý
connectionModeStringODIRECT_POST hoặc API
expiresAtStringOThời gian hết hạn phiên ở định dạng ISO 8601 kèm micro giây. Ví dụ: 2025-09-14T14:03:42.102862Z. Mặc định: 24 giờ

M = Bắt buộc, O = Tùy chọn

paymentMethod

Chỉ định phương thức thanh toán nào sẽ hiển thị trên trang thanh toán được lưu trữ.

ALLTất cả các phương thức thanh toán có sẵn
APMTất cả các phương thức thanh toán ngoại trừ thẻ
cardThẻ tín dụng / Thẻ ghi nợ
googlepayGoogle Pay
applepayApple Pay
paypalPayPal
ibanking_pushChuyển khoản ngân hàng trực tuyến tức thì
local_bank_transferChuyển tiền qua ngân hàng trong nước
wire_transferChuyển tiền điện tử trực tiếp
walletVí điện tử
alipayAlipay
wechatWeChat Pay
skrillSkrill
cryptoTiền điện tử

paymentFilter

Mảng JSON gồm các giá trị loại phương thức thanh toán để loại trừ khỏi phiên.

["googlepay", "applepay"]

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",
"brandName": " Client Form Simulate",
"colorMode": " rgba(224,230,5,1)---rgba(166,233,15,1)---rgba(105,193,28,1)",
"logoSource": "",
"customerIp": "1.2.3.4",
"connectionMode": "API",
"signature": "base64-encoded-signature"
}

Phản hồi -- connectionMode: API

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

statusStringcreated
transactionIdString (ULID)ID giao dịch của GLODIPAY
paymentLinkStringURL đã ký -- chuyển hướng người mua đến URL này để hoàn tất thanh toán trên trang thanh toán được lưu trữ
messageStringThông báo dễ hiểu cho người dùng

Trang thanh toán được lưu trữ tại paymentLink tự động hiển thị tất cả các phương thức thanh toán có sẵn (bộ sưu tập đa PSP) cho người mua. Trang này xử lý việc chọn phương thức, hiển thị phí và chuyển hướng đến PSP.

Ví dụ -- Thành công:

{
"status": " created",
"transactionId": "01jza90dy6w82dfrrqvadn5vs4",
"paymentLink": "https://payment.gpayprocessing.com/v2/checkout/show?...",
"message": "Payment Link created successfully"
}

Ví dụ -- Lỗi:

{
"status": "error",
"transactionId": null,
"paymentLink": null,
"message": "No active payment service providers found. Please contact support."
}

Phản hồi -- connectionMode: DIRECT_POST

GLODIPAY chuyển hướng trình duyệt của người mua trực tiếp đến trang thanh toán được lưu trữ. Không có phản hồi JSON nào được trả về.

Dữ liệu gửi đến callbackUrl

Sau khi thanh toán, GLODIPAY chuyển hướng người mua đến callbackUrl qua GET với tham số truy vấn payload:

GET {callbackUrl}?payload={base64-encoded-json}

Các trường payload sau khi giải mã:

statusStringTrạng thái giao dịch cuối cùng. Xem phần Giá trị trạng thái
transactionIdStringID giao dịch của GLODIPAY
refStringorderRef của người bán
amountFloatSố tiền hóa đơn
currencyStringMã tiền tệ
signatureStringChữ ký RSA-MD5 -- xác minh bằng khóa công khai của GLODIPAY

SERVER TO SERVER -- S2S Card V2

Gửi chi tiết thẻ trực tiếp từ máy chủ của bạn, bỏ qua trang thanh toán được lưu trữ. Hỗ trợ tự động chuyển tầng qua nhiều PSP.

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

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

Bao gồm tất cả các tham số từ POST PAYMENT (Checkout V2), cộng với các trường thẻ và thông tin thanh toán sau:

billingFirstNameString(max:255)MTên thanh toán
billingLastNameString(max:255)MHọ thanh toán
billingStreet1String(max:255)MĐịa chỉ đường phố dòng 1
billingStreet2String(max:255)OĐịa chỉ đường phố 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ỹ, 91 cho Ấn Độ
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
browserDetailsJSONCDấu vân tay trình duyệt. Xem Đối tượng browserDetails

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

Đố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

Ví dụ thân bài yêu cầu (Request body):

{
"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"
}

Đ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);
});

Phản hồi (Response)

Content-Type: application/json

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

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

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

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

Chuyển hướng người mua đến 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ý (Pending):

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

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

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

Lỗi (HTTP 400/500):

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

Tự động chuyển tầng (Auto-Cascade): Khi is_auto_cascade được bật cho người bán, v2 sẽ tự động thử lại việc tính phí thẻ trên 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 của từng PSP riêng lẻ 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.

CARD IFRAME V2

Tạo phiên iframe cho thẻ. Thay vì gửi chi tiết thẻ server-to-server, GLODIPAY trả về một URL đã ký cho trang nhập thẻ được lưu trữ (iframe) mà người bán nhúng vào hoặc chuyển hướng đến. Dữ liệu thẻ được nhập trực tiếp trên trang do GLODIPAY lưu trữ -- phạm vi PCI vẫn thuộc về GLODIPAY.

Endpoint: POST /v2/card/iframe Phương thức: POST Content-Type: application/x-www-form-urlencoded (Form Data)

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

Giống như POST PAYMENT (Checkout V2). Không có trường thẻ nào được gửi -- người mua nhập chi tiết thẻ trên trang iframe được lưu trữ.

Phản hồi (Response)

Luôn trả về JSON.

statusStringcreated
transactionIdString (ULID)ID giao dịch của GLODIPAY
urlStringURL đã ký -- nhúng URL này vào iframe hoặc chuyển hướng người mua để hoàn tất việc nhập thẻ
messageStringThông báo dễ hiểu cho người dùng

Ví dụ -- Thành công:

{
"status": "created",
"transactionId": "01jza90dy6w82dfrrqvadn5vs4",
"url": "https://payment.gpayprocessing.com/v2/card-iframe/01jza90dy6w82dfrrqvadn5vs4?...",
"message": "Iframe card created successfully"
}

Ví dụ -- Lỗi:

{
"status": "error",
"transactionId": null,
"paymentLink": null,
"message": "No active payment service providers found. Please contact support."
}

Sau khi người mua gửi chi tiết thẻ trên trang được lưu trữ, kết quả giao dịch sẽ được gửi qua IPN đến notificationUrl và người mua được chuyển hướng đến callbackUrl hoặc errorUrl.

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)

Trả về cùng một payload như webhook NOTIFICATION.

NOTIFICATION (Transaction IPN)

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. Nếu endpoint của bạn không khả dụng hoặc trả về phản hồi không mong đợi, GLODIPAY sẽ cố gắng gửi lại IPN.

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. Ví dụ: 2023-12-16T02:13:37+00:00
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 thanh toán ban đầu
transactionDocumentsJSONOTài liệu hỗ trợ từ phiên thanh toán ban đầu
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. Có thể dùng trong các trường paymentMethod / paymentFilter

Ví dụ Payload IPN:

{
"merchantId": "1100000123",
"transactionId": "01jza90dy6w82dfrrqvadn5vs4",
"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

REFUND API (API Hoàn tiền)

Khởi tạo hoàn tiền cho một giao dịch đã hoàn tất.

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

Yêu cầu (Request)

transactionIdString (ULID)MID giao dịch nhận được từ IPN thanh toán
amountFloatMSố tiền hoàn lại. Tối thiểu: 0.10 (hoặc toàn bộ số tiền đối với một số nhà cung cấp). Tối đa: số tiền còn lại có thể hoàn trả (paidAmount − đã hoàn tiền)
reasonString(max:1000)OMô tả ngắn gọn lý do hoàn tiền
signatureString(max:750)MChữ ký RSA-MD5

Lưu ý: Một số nhà cung cấp nhất định (ví dụ: PayAgency, SmartPay, ClisaPay, FinvyPay, WPay) chỉ hỗ trợ hoàn tiền toàn bộ số tiền. Hệ thống sẽ thực thi số tiền hoàn lại tối thiểu tương ứng.

Phản hồi (Response)

Content-Type: application/json

Hoàn tiền đã được tạo và xử lý ngay lập tức (đã bật tự động hoàn tiền):

{
"status": "success",
"message": null,
"data": {
"refundId": "01jzabk09xc4pbgwe8hyg4cwbf",
"refundNumber": "2507-1751420414"
}
}

Hoàn tiền đã được tạo và đang chờ phê duyệt thủ công:

{
"status": "success",
"message": "Refund created and waiting for approval.",
"data": {
"refundId": "01jzabk09xc4pbgwe8hyg4cwbf",
"refundNumber": "2507-1751420414"
}
}

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

{
"status": "error",
"message": "Invalid request data.",
"errors": [
{
"field": "amount",
"message": ["The amount must be between 0.1 and 100."]
}
]
}

REFUND QUERY (Truy vấn hoàn tiền)

Truy vấn trạng thái mới nhất của một giao dịch hoàn tiền.

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

Yêu cầu (Request)

refundIdString (ULID)MID hoàn tiền của GLODIPAY (từ phản hồi Refund API hoặc Refund IPN)
signatureString(max:750)MChữ ký RSA-MD5

Phản hồi (Response)

Content-Type: application/json

statusStringsuccess
messageStringThông báo dễ hiểu cho người dùng
dataJSONChi tiết hoàn tiền. Giống các trường trong payload REFUND NOTIFICATION

Ví dụ:

{
"status": "success",
"message": "",
"data": {
"transactionId": "01jza90dy6w82dfrrqvadn5vs4",
"ref": "ORDER-001",
"refundId": "01jzabk09xc4pbgwe8hyg4cwbf",
"currency": "USD",
"refundAmount": 50.00,
"status": "refund_successful",
"statusCode": 11,
"reason": "Customer request",
"originalRefundCreatedAt": "2026-04-14T11:00:00+00:00",
"refundCreatedAt": "2026-04-14T11:00:01+00:00",
"transactionCreatedAt": "2026-04-14T10:00:00+00:00",
"signature": "base64-encoded-rsa-signature"
}
}

REFUND NOTIFICATION (Refund IPN)

GLODIPAY gửi một HTTP POST đến notificationUrl của bạn khi trạng thái hoàn tiền thay đổi.

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

Payload

transactionIdStringMID giao dịch gốc của GLODIPAY
refStringMorderRef của người bán
refundIdStringMID hoàn tiền của GLODIPAY
currencyStringMMã tiền tệ ISO 4217
refundAmountFloatMSố tiền hoàn lại
statusStringMTrạng thái hoàn tiền. 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 thanh toán ban đầu
reasonStringOLý do hoàn tiền
messageStringOThông báo trạng thái dễ hiểu
originalRefundCreatedAtISO 8601 datetimeMThời gian tạo hoàn tiền tại PSP
refundCreatedAtISO 8601 datetimeMThời gian tạo hoàn tiền trong hệ thống GLODIPAY
transactionCreatedAtISO 8601 datetimeMThời gian tạo giao dịch gốc
signatureStringMChữ ký RSA-MD5 -- xác minh bằng khóa công khai của GLODIPAY

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

{
"returnCode": "100",
"description": "Received"
}

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

Phương thức thanh toán (Payment Methods)

cardThẻ tín dụng hoặc thẻ ghi nợ
googlepayGoogle Pay
applepayApple Pay
paypalPayPal
ibanking_pushChuyển khoản ngân hàng trực tuyến tức thì
local_bank_transferChuyển tiền qua ngân hàng trong nước
wire_transferChuyển tiền điện tử trực tiếp
walletVí điện tử
alipayAlipay
wechatWeChat Pay
skrillSkrill
cryptoTiền điện tử
APMTất cả phương thức trừ thẻ
ALLTất cả phương thức có sẵn

Chế độ kết nối (Connection Modes)

DIRECT_POST(Mặc định) Trình duyệt được chuyển hướng đến trang thanh toán ngay lập tức.
APITrả về URL paymentLink trong phản hồi JSON.

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 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_initiatedVoid đã khởi tạo
void_under_reviewVoid đang xem xét
void_successfulVoid thành công
void_failedVoid thất bại
void_partially_successfulVoid một phần thành công
void_partially_failedVoid 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_initiatedVoid đã khởi tạo
19void_under_reviewVoid đang xem xét
20void_successfulVoid thành công
21void_failedVoid thất bại
22void_partially_successfulVoid một phần thành công
23void_partially_failedVoid 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.

  • Checkout API (/v2/checkout) và iFrame API (/v2/card/iframe): chỉ chấp nhận USD.
  • Server-to-Server Card API (/v2/card/api): tiền tệ được chấp nhận tùy thuộc vào nhà cung cấp thanh toá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
ATAustria
AUAustralia
AWAruba
AXÅland Islands
AZAzerbaijan
BABosnia and Herzegovina
BBBarbados
BDBangladesh
BEBelgium
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
CHSwitzerland
CICôte d'Ivoire
CKCook Islands
CLChile
CMCameroon
CNTrung Quốc
COColombia
CRCosta Rica
CUCuba
CVCabo Verde
CWCuraçao
CXChristmas Island
CYCyprus
CZCzechia
DEĐức
DJDjibouti
DKĐan Mạch
DMDominica
DODominican Republic
DZAlgeria
ECEcuador
EEEstonia
EGAi Cập
EHWestern Sahara
EREritrea
ESTây Ban Nha
ETEthiopia
FIPhần Lan
FJFiji
FKFalkland Islands (Malvinas)
FMMicronesia, Federated States of
FOFaroe Islands
FRPháp
GAGabon
GBVương quốc Anh
GDGrenada
GEGeorgia
GFFrench Guiana
GGGuernsey
GHGhana
GIGibraltar
GLGreenland
GMGambia
GNGuinea
GPGuadeloupe
GQEquatorial Guinea
GRHy Lạp
GSSouth Georgia and the South Sandwich Islands
GTGuatemala
GUGuam
GWGuinea-Bissau
GYGuyana
HKHồng Kông
HMHeard Island and McDonald Islands
HNHonduras
HRCroatia
HTHaiti
HUHungary
IDIndonesia
IEIreland
ILIsrael
IMIsle of Man
INẤn Độ
IOBritish Indian Ocean Territory
IQIraq
IRIran, Islamic Republic of
ISIceland
ITÝ
JEJersey
JMJamaica
JOJordan
JPNhật Bản
KEKenya
KGKyrgyzstan
KHCampuchia
KIKiribati
KMComoros
KNSaint Kitts and Nevis
KPTriều Tiên
KRHàn Quốc
KWKuwait
KYCayman Islands
KZKazakhstan
LALào
LBLebanon
LCSaint Lucia
LILiechtenstein
LKSri Lanka
LRLiberia
LSLesotho
LTLithuania
LULuxembourg
LVLatvia
LYLibya
MAMa-rốc
MCMonaco
MDMoldova
MEMontenegro
MFSaint Martin (phần thuộc Pháp)
MGMadagascar
MHMarshall Islands
MKBắc Macedonia
MLMali
MMMyanmar
MNMông Cổ
MOMa Cao
MPNorthern Mariana Islands
MQMartinique
MRMauritania
MSMontserrat
MTMalta
MUMauritius
MVMaldives
MWMalawi
MXMexico
MYMalaysia
MZMozambique
NANamibia
NCNew Caledonia
NENiger
NFNorfolk Island
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 and Miquelon
PNPitcairn
PRPuerto Rico
PSPalestine
PTBồ Đào Nha
PWPalau
PYParaguay
QAQatar
RERéunion
RORomania
RSSerbia
RUNga
RWRwanda
SAẢ Rập Xê-út
SBSolomon Islands
SCSeychelles
SDSudan
SEThụy Điển
SGSingapore
SHSaint Helena, Ascension and Tristan da Cunha
SISlovenia
SJSvalbard and Jan Mayen
SKSlovakia
SLSierra Leone
SMSan Marino
SNSenegal
SOSomalia
SRSuriname
SSNam Sudan
STSao Tome and Principe
SVEl Salvador
SXSint Maarten (phần thuộc Hà Lan)
SYSyria
SZEswatini
TCTurks and Caicos Islands
TDChad
TFFrench Southern Territories
TGTogo
THThái Lan
TJTajikistan
TKTokelau
TLTimor-Leste
TMTurkmenistan
TNTunisia
TOTonga
TRThổ Nhĩ Kỳ
TTTrinidad and Tobago
TVTuvalu
TWĐài Loan
TZTanzania
UAUkraine
UGUganda
UMUnited States Minor Outlying Islands
USHoa Kỳ
UYUruguay
UZUzbekistan
VAHoly See
VCSaint Vincent and the Grenadines
VEVenezuela
VGVirgin Islands (Anh)
VIVirgin Islands (Mỹ)
VNViệt Nam
VUVanuatu
WFWallis and Futuna
WSSamoa
YEYemen
YTMayotte
ZANam Phi
ZMZambia
ZWZimbabwe

Để xem danh sách ISO 3166 đầy đủ, hãy truy cập https://www.iso.org/iso-3166-country-codes.html

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
{
$privateKey = openssl_pkey_get_private("-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----
");

ksort($data, SORT_NATURAL);
array_walk_recursive(
$data,
static function (&$field) {
$field = trim($field);
}
);

openssl_sign(json_encode($data), $signature, $privateKey, 'md5WithRSAEncryption');

return base64_encode($signature);
}

function verifySignature(array $data): bool
{
$publicKey = openssl_pkey_get_public("-----BEGIN PUBLIC KEY-----
YOUR_GLODIPAY_PUBLIC_KEY_HERE
-----END PUBLIC KEY-----
");

$dataWithoutSignature = array_filter($data, static function ($key) {
return $key !== 'signature';
}, ARRAY_FILTER_USE_KEY);

$signature = $data['signature'];

ksort($dataWithoutSignature, SORT_NATURAL);
array_walk_recursive(
$dataWithoutSignature,
static function (&$field) {
$field = trim($field);
}
);

$result = openssl_verify(
json_encode($dataWithoutSignature),
base64_decode($signature),
$publicKey,
'md5WithRSAEncryption'
);

return $result === 1;
}

// Ví dụ: tạo một v2 checkout (chế độ API)
$payload = [
'merchantId' => '1100000123',
'orderRef' => 'ORDER-' . time(),
'amount' => '100.00',
'currency' => 'USD',
'paymentMethod' => 'ALL',
'callbackUrl' => 'https://yoursite.com/payment/callback',
'notificationUrl' => 'https://yoursite.com/payment/webhook',
'cancelUrl' => 'https://yoursite.com/payment/cancel',
'errorUrl' => 'https://yoursite.com/payment/error',
'orderDescription' => 'Test order',
'customerIp' => $_SERVER['REMOTE_ADDR'],
'connectionMode' => 'API',
];

$payload['signature'] = generateSignature($payload);

$ch = curl_init('https://payment-sandbox.gpayprocessing.com/v2/checkout');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);
// Chuyển hướng người mua đến $result['paymentLink']
header('Location: ' . $result['paymentLink']);
exit;

Node.js

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

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');
}

function verifySignature(data) {
const publicKey = `-----BEGIN PUBLIC KEY-----
YOUR_GLODIPAY_PUBLIC_KEY_HERE
-----END PUBLIC KEY-----`;

const { signature, ...rest } = data;

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

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

const verify = createVerify('md5WithRSAEncryption');
verify.update(canonical);
return verify.verify(publicKey, Buffer.from(signature, 'base64'));
}

// Ví dụ: tạo một v2 checkout (chế độ API)
const payload = {
merchantId: '1100000123',
orderRef: 'ORDER-' + Date.now(),
amount: '100.00',
currency: 'USD',
paymentMethod: 'ALL',
callbackUrl: 'https://yoursite.com/payment/callback',
notificationUrl: 'https://yoursite.com/payment/webhook',
cancelUrl: 'https://yoursite.com/payment/cancel',
errorUrl: 'https://yoursite.com/payment/error',
orderDescription: 'Test order',
customerIp: '1.2.3.4',
connectionMode: 'API',
};

payload.signature = generateSignature(payload);

const postData = querystring.stringify(payload);
const options = {
hostname: 'payment-sandbox.gpayprocessing.com',
path: '/v2/checkout',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData),
},
};

const req = https.request(options, (res) => {
let body = '';
res.on('data', chunk => body += chunk);
res.on('end', () => {
const result = JSON.parse(body);
console.log('Payment Link:', result.paymentLink);
// Chuyển hướng người mua: res.writeHead(302, { Location: result.paymentLink });
});
});

req.on('error', console.error);
req.write(postData);
req.end();

Bookmarks

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