Skip to main content

GLODIPAY API SPECIFICATION

Ask AI

VERSION 2.0.0

Table of Contents

Use the Test environment. No real charges are made.

Without 3DS4111 1111 1111 111101/30029
Without 3DS5555 5555 5555 444401/30029
3DS Payment4012 8888 8888 188101/30029Success: 123456 / Fail: 111111
3DS Payment5111 1111 1111 111801/30029Success: 123456 / Fail: 111111
3DS Payment4141 4141 4141 414112/30123Success: 123456 / Fail: 111111
  • Appendix
    • Payment Methods
    • Connection Modes
    • Status Values
    • Status Codes
    • Currency Codes
    • Country Codes
    • Card Types
  • Code Examples
    • PHP
    • Node.js

Introduction

This document describes the GLODIPAY API v2, which supports merchants accepting credit/debit cards, mobile banking, QR codes, wallets, and crypto in one unified payment platform.

What's new in v2:

  • Multi-PSP (Payment Service Provider): A single checkout session can expose payment methods from multiple PSPs simultaneously. Buyers see all available payment methods on the hosted checkout page -- no extra merchant-side work.
  • Auto-Cascade (S2S).

Endpoints

TestGet it from the API Keys page of the Sandbox Merchant Dashboard
ProductionGet it from the API Keys page of the Merchant Dashboard

Signature

All requests and responses are signed using RSA with MD5 to ensure integrity and authenticity.

Generating a Signature (Merchant -> GLODIPAY)

Sign request payloads with your RSA Private Key (obtained from the Merchant Dashboard).

Steps:

  • Collect all request parameters except signature as a flat key-value object.
  • Sort the keys in natural ascending order (SORT_NATURAL / localeCompare with numeric: true).
  • Trim whitespace from all string values (recursive).
  • Serialize to JSON string with all non-ASCII Unicode characters escaped to \uXXXX (RFC 8259).
  • Sign with md5WithRSAEncryption using your RSA Private Key.
  • Base64-encode the binary output.

Verifying a Signature (GLODIPAY -> Merchant)

Verify GLODIPAY responses and webhooks with the RSA Public Key (available in the Portal).

Steps:

  • Separate signature from the payload.
  • Sort remaining keys in natural ascending order.
  • Trim all string values (recursive).
  • Serialize to JSON string with all non-ASCII Unicode characters escaped to \uXXXX (RFC 8259).
  • Verify with md5WithRSAEncryption using your RSA Public Key.
  • Return value 1 = valid.

Note (Node.js): Convert all numeric values to strings before sorting/serializing. Escape forward slashes in the JSON string: .replace(///g, '/').

Note (Unicode / RFC 8259): The JSON payload must escape all non-ASCII Unicode characters (e.g., "a with accent" must become "\u00e1") before signing -- this is required by RFC 8259. In PHP, json_encode($data) does this by default -- do not use JSON_UNESCAPED_UNICODE. In Node.js, JSON.stringify() does not escape Unicode by default -- apply: .replace(/[^\\x00-\\x7F]/g, c => "\\u" + c.charCodeAt(0).toString(16).padStart(4, "0")) after serializing.

API Specification

POST PAYMENT (Checkout V2)

Create a checkout session and get a hosted payment page URL. The hosted page automatically displays all available payment methods for the buyer.

Endpoint: POST /v2/checkout Method: Form Post Content-Type: application/x-www-form-urlencoded (Form Data)

Request Parameters

merchantIdString(1,50)MMerchant's ID
orderRefString(1,250)MUnique transaction reference per merchant
amountFloatMInvoice amount. Min/max configured per merchant
currencyString(3)MISO 4217 currency code. E.g. USD
cancelUrlString(1,300)M(Frontend) URL to redirect buyer on cancellation. Must be https.
callbackUrlString(1,300)M(Frontend) URL to redirect buyer after successful payment. Must be https.
notificationUrlString(1,300)MYour server endpoint to receive webhook (IPN). Must be https.
errorUrlString(1,300)M(Frontend) URL to redirect buyer on error. Must be https.
orderDescriptionString(max:3000)MShort description shown on the checkout screen
metadataJSONOKey-value pairs attached to the session. Returned in IPN and query responses
transactionDocumentsJSONOSupporting documents for the transaction
paymentMethodStringMPayment method(s) to display. See paymentMethod values
paymentFilterJSONOPayment method types to exclude from the session
paymentSorterJSONOOrdered array of payment method types to control display order. Valid values: card, paypal, ibanking_push, local_bank_transfer, wire_transfer, wallet, skrill, alipay, wechat, googlepay, applepay, crypto, apm
feeBySellerNumber(0-100)OPercentage of processing fee paid by merchant. 0 = buyer pays 100%. Up to 2 decimal places
billingFirstNameString(max:255)OBilling first name
billingLastNameString(max:255)OBilling last name
billingStreet1String(max:255)OBilling street address line 1
billingStreet2String(max:255)OBilling street address line 2
billingCityString(max:255)OBilling city
billingEmailString(max:255)OBuyer email address
billingStateString(2,255)OBilling state / province
billingCountryStringOISO 3166-1 alpha-2 country code
billingPostalCodeString(max:25)OPostal / ZIP code
billingPhoneCountryCodeString(max:10)OPhone country code. E.g. 1 for US, 91 for India
billingPhoneNumberString(max:20)OPhone number
brandNameString(1,255)OOverride the brand name shown on the hosted checkout screen
colorModeString(1,255)OUp to 3 colors separated by ---. Accepts color names, HEX, or RGBA. E.g. #2e7d32---#e8f5e9---#81c784
logoSourceString(1,255)OOverride the logo shown on the hosted checkout screen
customerIpStringOIP address of the customer
websiteUrlString(max:300)OMerchant website URL
signatureString(max:750)MRSA-MD5 signature. See Signature
connectionModeStringODIRECT_POST or API
expiresAtStringOSession expiry in ISO 8601 format with microseconds. E.g. 2025-09-14T14:03:42.102862Z. Default: 24 hours

M = Mandatory, O = Optional

paymentMethod

Specify which payment methods to show on the hosted checkout page.

ALLAll available payment methods
APMAll payment methods except card
cardCredit / Debit cards
googlepayGoogle Pay
applepayApple Pay
paypalPayPal
ibanking_pushInstant online bank transfer
local_bank_transferDomestic bank money transfer
wire_transferDirect electronic money transfer
walletDigital wallet
alipayAlipay
wechatWeChat Pay
skrillSkrill
cryptoCryptocurrency

paymentFilter

JSON array of payment method type values to exclude from the session.

["googlepay", "applepay"]

Example Request

{
"merchantId": "1100000123",
"orderRef": "ORDER-001",
"amount": 100.00,
"currency": "USD",
"paymentMethod": "ALL",
"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": "",
"websiteUrl": "https://yoursite.com",
"connectionMode": "API",
"signature": "base64-encoded-signature"
}

Response -- connectionMode: API

Method: POST Content-Type: application/json

statusStringcreated
transactionIdString (ULID)GLODIPAY transaction ID
paymentLinkStringSigned URL -- redirect the buyer to this URL to complete payment on the hosted checkout page
messageStringHuman-readable message

The hosted checkout page at paymentLink automatically shows all available payment methods (multi-PSP collection) to the buyer. The page handles method selection, fee display, and redirect to the PSP.

Example -- Success:

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

Example -- Error:

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

Response -- connectionMode: DIRECT_POST

GLODIPAY redirects the buyer's browser directly to the hosted checkout page. No JSON response is returned.

Data sent to callbackUrl

After payment, GLODIPAY redirects the buyer to callbackUrl via GET with a payload query parameter:

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

Decoded payload fields:

statusStringFinal transaction status. See Status Values
transactionIdStringGLODIPAY transaction ID
refStringMerchant's orderRef
amountFloatInvoice amount
currencyStringCurrency code
signatureStringRSA-MD5 signature -- verify with RSA Public Key

SERVER TO SERVER -- S2S Card V2

Submit card details directly from your server, bypassing the hosted checkout page. Supports auto-cascade across multiple PSPs.

Endpoint: POST /v2/card/api Method: POST Content-Type: application/json

Request Parameters

Includes all parameters from POST PAYMENT (Checkout V2), plus the following card and billing fields:

billingFirstNameString(max:255)MBilling first name
billingLastNameString(max:255)MBilling last name
billingStreet1String(max:255)MBilling street address line 1
billingStreet2String(max:255)OBilling street address line 2
billingCityString(max:255)MBilling city
billingEmailString(max:255)MBuyer email address
billingStateString(min:2, max:255)CBilling state / province. Required when billingCountry is US or CA
billingCountryStringMISO 3166-1 alpha-2 country code
billingPostalCodeString(max:25)MPostal / ZIP code
billingPhoneCountryCodeString(max:10)OPhone country code. E.g. 1 for US, 91 for India
billingPhoneNumberString(max:30)MPhone number
cardNumberString(12,19)MCard number. E.g. 4111111111111111
cardMonthStringMExpiry month. E.g. 12
cardYearStringMExpiry year (2-digit). E.g. 30
cardSecurityCodeString(3,4)MCVV / CVC
customerIpStringMIP address of the customer
browserDetailsJSONCBrowser fingerprint. See browserDetails Object

M = Mandatory, O = Optional, C = Conditional

browserDetails Object

Required on every S2S card request. Can be submitted as a JSON object (nested) or a JSON-encoded string. Keys are snake_case as listed below; camelCase keys are accepted and normalized.

accept_headerStringMBrowser Accept header. E.g. text/html,application/xhtml+xml
screen_widthStringMScreen width in pixels. E.g. 1920
screen_heightStringMScreen height in pixels. E.g. 1080
screen_color_depthStringMScreen color depth in bits. E.g. 24
window_widthStringMViewport width in pixels. E.g. 1440
window_heightStringMViewport height in pixels. E.g. 900
languageStringMBrowser language. E.g. en-US
java_enabledStringMWhether Java is enabled. "true" or "false"
user_agentStringMBrowser user agent string
time_zoneStringMUTC offset in hours. E.g. 7 for UTC+7
time_zone_nameStringMIANA timezone name. E.g. Asia/Ho_Chi_Minh
languagesArray<String>OOrdered list of browser preferred languages. E.g. ["vi-VN", "en-US", "en"]
platformString(max:255)OBrowser platform identifier. E.g. Win32, MacIntel, Linux x86_64
cookieEnabledBooleanOIndicates whether cookies are enabled in the browser
onlineBooleanOIndicates whether the browser reports an active network connection
hardwareConcurrencyIntegerONumber of logical CPU cores available to the browser. E.g. 8, 16
deviceMemoryNumberOApproximate device memory in GB reported by the browser. E.g. 4, 8, 16. May be unavailable on some browsers
availWidthIntegerOAvailable screen width excluding OS UI elements such as taskbars and docks
availHeightIntegerOAvailable screen height excluding OS UI elements such as taskbars and docks
currentUrlString(max:2048)OFull URL of the page where the payment request originated
hostnameString(max:255)OHostname (domain) of the current page. E.g. example.com

Example 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",
"websiteUrl": "https://yoursite.com",
"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"
}

JavaScript snippet to collect 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

// ── Recommended fields (improves approval rate)
languages: navigator.languages,
platform: navigator.platform,
cookieEnabled: navigator.cookieEnabled,
online: navigator.onLine,
hardwareConcurrency: navigator.hardwareConcurrency,
deviceMemory: navigator.deviceMemory || "N/A",
availWidth: screen.availWidth,
availHeight: screen.availHeight,
currentUrl: location.href,
hostname: location.hostname,
};

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

Response

Content-Type: application/json

Transaction completed (no 3DS):

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

3DS authentication required:

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

Redirect the buyer to url to complete 3DS. After verification, GLODIPAY processes the transaction and sends the result via IPN to notificationUrl and redirects the buyer to callbackUrl.

Pending:

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

Validation error (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."]
}
]
}

Error (HTTP 400/500):

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

Auto-Cascade: When is_auto_cascade is enabled for the merchant, v2 automatically retries the card charge across all active PSPs in priority order before returning a final response. Individual PSP failures are suppressed during the cascade -- only the final outcome is returned and sent via IPN.

CARD IFRAME V2

Create a card iframe session. Instead of submitting card details server-to-server, GLODIPAY returns a signed URL for a hosted card input page (iframe) that the merchant embeds or redirects to. Card data is entered directly in the GLODIPAY-hosted page -- PCI scope stays with GLODIPAY.

Endpoint: POST /v2/card/iframe Method: POST Content-Type: application/json

Request Parameters

Same as POST PAYMENT (Checkout V2). No card fields are sent -- the buyer enters card details on the hosted iframe page.

Response

Always returns JSON.

statusStringcreated
transactionIdString (ULID)GLODIPAY transaction ID
urlStringSigned URL -- embed this in an iframe or redirect the buyer to complete card entry
messageStringHuman-readable message

Example -- Success:

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

Example -- Error:

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

After the buyer submits card details on the hosted page, the transaction result is sent via IPN to notificationUrl and the buyer is redirected to callbackUrl or errorUrl.

TRANSACTION QUERY

Query the current status and full details of a transaction.

Endpoint: POST /v2/checkout/query Method: POST Content-Type: application/json

Request

transactionIdString (ULID)MGLODIPAY transaction ID
signatureString(max:750)MRSA-MD5 signature

Response

Returns the same payload as the NOTIFICATION webhook.

NOTIFICATION (Transaction IPN)

GLODIPAY sends an HTTP POST to your notificationUrl when a transaction reaches a terminal state.

Method: POST Content-Type: application/json

Retry policy: GLODIPAY may re-send the IPN for transactions that have not been acknowledged. Your server should return {"returnCode":"100"} as soon as the notification is received. If your endpoint is unavailable or returns an unexpected response, GLODIPAY will attempt to re-deliver the IPN.

Payload

merchantIdStringMMerchant's ID
transactionIdStringMGLODIPAY transaction ID (ULID)
transactionNumberStringMGLODIPAY human-readable transaction number
refStringMMerchant's orderRef
currencyStringMISO 4217 currency code
amountFloatMInvoice amount
paidAmountFloatOAmount actually charged to buyer (including buyer fees)
settlementAmountFloatOAmount to be settled to merchant
estimationSettlementAtISO 8601 datetimeOEstimated settlement datetime. E.g. 2023-12-16T02:13:37+00:00
feesJSONOFee breakdown. See fees Object
paymentMethodDetailsJSONOPayment method used. See paymentMethodDetails Object
statusStringMTransaction status. See Status Values
statusCodeNumberMNumeric status code. See Status Codes
metadataJSONOKey-value pairs from the original checkout session
transactionDocumentsJSONOSupporting documents from the original checkout session
messageStringOHuman-readable status message
descriptorStringOTransaction descriptor
transactionCreatedAtISO 8601 datetimeMTransaction creation time in GLODIPAY system
originalTransactionCreatedAtISO 8601 datetimeMTransaction creation time at the PSP
signatureStringMRSA-MD5 signature -- verify with RSA Public Key

fees Object

buyerFloatBuyer-facing fee amount
sellerFloatMerchant fee amount
rollingFloatRolling reserve amount
operateFloatTotal operating fees (processor + GLODIPAY + partner)
estimationRollingReleaseAtISO 8601 datetimeEstimated rolling reserve release datetime

paymentMethodDetails Object

displayNameStringPayment method label
groupStringPayment method group type
familyStringPayment method family type
typeStringPayment method type. Can be used in paymentMethod / paymentFilter fields

Example IPN Payload:

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

Response (Merchant -> GLODIPAY)

Your server must respond within 30 seconds:

{
"returnCode": "100",
"description": "Received"
}
returnCodeStringRMust be "100" to acknowledge receipt
descriptionString(1,1500)OOptional description

REFUND API

Initiate a refund for a completed transaction.

Endpoint: POST /v2/refund Method: POST Content-Type: application/json

Request

transactionIdString (ULID)MThe transactionId received from the checkout IPN
amountFloatMRefund amount. Minimum: 0.10 (or full amount for some providers). Maximum: remaining refundable amount (paidAmount − already refunded)
reasonString(max:1000)OShort description of the refund reason
signatureString(max:750)MRSA-MD5 signature

Note: Certain providers (e.g. PayAgency, SmartPay, ClisaPay, FinvyPay, WPay) only support full-amount refunds. The system enforces the minimum refund amount accordingly.

Response

Content-Type: application/json

Refund created and processed immediately (auto-refund enabled):

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

Refund created and pending manual approval:

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

Validation error (HTTP 422):

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

REFUND QUERY

Query the latest status of a refund.

Endpoint: POST /v2/refund/query Method: POST Content-Type: application/json

Request

refundIdString (ULID)MGLODIPAY refund ID (from Refund API response or Refund IPN)
signatureString(max:750)MRSA-MD5 signature

Response

Content-Type: application/json

statusStringsuccess
messageStringHuman-readable message
dataJSONRefund details. Same fields as REFUND NOTIFICATION payload

Example:

{
"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 sends an HTTP POST to your notificationUrl when a refund status changes.

Method: POST Content-Type: application/json

Payload

transactionIdStringMGLODIPAY original transaction ID
refStringMMerchant's orderRef
refundIdStringMGLODIPAY refund ID
currencyStringMISO 4217 currency code
refundAmountFloatMRefund amount
statusStringMRefund status. See Status Values
statusCodeNumberMNumeric status code. See Status Codes
metadataJSONOKey-value pairs from the original checkout session
reasonStringORefund reason
messageStringOHuman-readable status message
originalRefundCreatedAtISO 8601 datetimeMRefund creation time at the PSP
refundCreatedAtISO 8601 datetimeMRefund creation time in GLODIPAY system
transactionCreatedAtISO 8601 datetimeMOriginal transaction creation time
signatureStringMRSA-MD5 signature -- verify with RSA Public Key

Response (Merchant -> GLODIPAY)

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

Simulating Payments (Test Cards)

Use the Test environment. No real charges are made.

Without 3DS4111 1111 1111 111101/30029
Without 3DS5555 5555 5555 444401/30029
3DS Payment4012 8888 8888 188101/30029Success: 123456 / Fail: 111111
3DS Payment5111 1111 1111 111801/30029Success: 123456 / Fail: 111111
3DS Payment4141 4141 4141 414112/30123Success: 123456 / Fail: 111111

Appendix

Payment Methods

cardCredit or Debit cards
googlepayGoogle Pay
applepayApple Pay
paypalPayPal
ibanking_pushInstant Online Bank Transfer
local_bank_transferDomestic Bank Money Transfer
wire_transferDirect Electronic Money Transfer
walletDigital Wallet
alipayAlipay
wechatWeChat Pay
skrillSkrill
cryptoCryptocurrency
APMAll payment methods except card
ALLAll payment methods

Connection Modes

DIRECT_POST(Default) Browser is redirected to the hosted checkout page immediately.
APIReturns a paymentLink URL in the JSON response.

Status Values

String values returned in the status field of IPN payloads and query responses.

incompleteTransaction initiated, awaiting action
pendingAwaiting payment confirmation
under_reviewTransaction under review
successfulPayment completed successfully
failedPayment failed
errorSystem error occurred
canceledTransaction canceled
rejectedTransaction rejected
expiredTransaction expired
processedTransaction was submitted to the payment provider
releasedFunds released / settled
documents_uploadedSupporting documents uploaded
refund_initiatedRefund request initiated
refund_under_reviewRefund under review
refund_successfulRefund completed successfully
refund_failedRefund failed
refund_partially_successfulPartial refund completed
refund_partially_failedPartial refund failed
void_initiatedVoid initiated
void_under_reviewVoid under review
void_successfulVoid completed successfully
void_failedVoid failed
void_partially_successfulPartial void completed
void_partially_failedPartial void failed
chargeback_alertChargeback alert received
chargebackedTransaction chargebacked
disputeDispute opened

Status Codes

Numeric code in the statusCode field of IPN payloads and query responses.

1incompleteTransaction initiated
2pendingPending confirmation
3errorSystem error
4failedPayment failed
5under_reviewUnder review
6successfulPayment successful
7releasedReleased / settled
8refund_initiatedRefund initiated
9refund_failedRefund failed
10refund_under_reviewRefund under review
11refund_successfulRefund successful
12refund_partially_failedPartial refund failed
13refund_partially_successfulPartial refund successful
14canceledCanceled
15rejectedRejected
16expiredExpired
17documents_uploadedDocuments uploaded
18void_initiatedVoid initiated
19void_under_reviewVoid under review
20void_successfulVoid successful
21void_failedVoid failed
22void_partially_successfulPartial void successful
23void_partially_failedPartial void failed
24chargeback_alertChargeback alert
25chargebackedChargebacked
26disputeDispute opened
27processedProcessed

Currency Codes

GLODIPAY follows the ISO 4217 standard.

  • Checkout API (/v2/checkout) and iFrame API (/v2/card/iframe): accept USD only.
  • Server-to-Server Card API (/v2/card/api): accepted currency depends on the payment provider. Common supported values:
USDUnited States Dollar
EUREuro
GBPPound Sterling
AUDAustralian Dollar
AEDUAE Dirham
VNDVietnamese Dong

Country Codes

GLODIPAY uses ISO 3166-1 alpha-2 two-letter codes for 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
CNChina
COColombia
CRCosta Rica
CUCuba
CVCabo Verde
CWCuraçao
CXChristmas Island
CYCyprus
CZCzechia
DEGermany
DJDjibouti
DKDenmark
DMDominica
DODominican Republic
DZAlgeria
ECEcuador
EEEstonia
EGEgypt
EHWestern Sahara
EREritrea
ESSpain
ETEthiopia
FIFinland
FJFiji
FKFalkland Islands (Malvinas)
FMMicronesia, Federated States of
FOFaroe Islands
FRFrance
GAGabon
GBUnited Kingdom of Great Britain and Northern Ireland
GDGrenada
GEGeorgia
GFFrench Guiana
GGGuernsey
GHGhana
GIGibraltar
GLGreenland
GMGambia
GNGuinea
GPGuadeloupe
GQEquatorial Guinea
GRGreece
GSSouth Georgia and the South Sandwich Islands
GTGuatemala
GUGuam
GWGuinea-Bissau
GYGuyana
HKHong Kong
HMHeard Island and McDonald Islands
HNHonduras
HRCroatia
HTHaiti
HUHungary
IDIndonesia
IEIreland
ILIsrael
IMIsle of Man
INIndia
IOBritish Indian Ocean Territory
IQIraq
IRIran, Islamic Republic of
ISIceland
ITItaly
JEJersey
JMJamaica
JOJordan
JPJapan
KEKenya
KGKyrgyzstan
KHCambodia
KIKiribati
KMComoros
KNSaint Kitts and Nevis
KPKorea, Democratic People's Republic of
KRKorea, Republic of
KWKuwait
KYCayman Islands
KZKazakhstan
LALao People's Democratic Republic
LBLebanon
LCSaint Lucia
LILiechtenstein
LKSri Lanka
LRLiberia
LSLesotho
LTLithuania
LULuxembourg
LVLatvia
LYLibya
MAMorocco
MCMonaco
MDMoldova, Republic of
MEMontenegro
MFSaint Martin (French part)
MGMadagascar
MHMarshall Islands
MKNorth Macedonia
MLMali
MMMyanmar
MNMongolia
MOMacao
MPNorthern Mariana Islands
MQMartinique
MRMauritania
MSMontserrat
MTMalta
MUMauritius
MVMaldives
MWMalawi
MXMexico
MYMalaysia
MZMozambique
NANamibia
NCNew Caledonia
NENiger
NFNorfolk Island
NGNigeria
NINicaragua
NLNetherlands, Kingdom of the
NONorway
NPNepal
NRNauru
NUNiue
NZNew Zealand
OMOman
PAPanama
PEPeru
PFFrench Polynesia
PGPapua New Guinea
PHPhilippines
PKPakistan
PLPoland
PMSaint Pierre and Miquelon
PNPitcairn
PRPuerto Rico
PSPalestine, State of
PTPortugal
PWPalau
PYParaguay
QAQatar
RERéunion
RORomania
RSSerbia
RURussian Federation
RWRwanda
SASaudi Arabia
SBSolomon Islands
SCSeychelles
SDSudan
SESweden
SGSingapore
SHSaint Helena, Ascension and Tristan da Cunha
SISlovenia
SJSvalbard and Jan Mayen
SKSlovakia
SLSierra Leone
SMSan Marino
SNSenegal
SOSomalia
SRSuriname
SSSouth Sudan
STSao Tome and Principe
SVEl Salvador
SXSint Maarten (Dutch part)
SYSyrian Arab Republic
SZEswatini
TCTurks and Caicos Islands
TDChad
TFFrench Southern Territories
TGTogo
THThailand
TJTajikistan
TKTokelau
TLTimor-Leste
TMTurkmenistan
TNTunisia
TOTonga
TRTürkiye
TTTrinidad and Tobago
TVTuvalu
TWTaiwan, Province of China
TZTanzania, United Republic of
UAUkraine
UGUganda
UMUnited States Minor Outlying Islands
USUnited States of America
UYUruguay
UZUzbekistan
VAHoly See
VCSaint Vincent and the Grenadines
VEVenezuela, Bolivarian Republic of
VGVirgin Islands (British)
VIVirgin Islands (U.S.)
VNViet Nam
VUVanuatu
WFWallis and Futuna
WSSamoa
YEYemen
YTMayotte
ZASouth Africa
ZMZambia
ZWZimbabwe

For the full ISO 3166 list, visit https://www.iso.org/iso-3166-country-codes.html

Card Types

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

Code Examples

PHP

<?php

function generateSignature(array $data): string
{
$privateKey = openssl_pkey_get_private("-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----
");

foreach ($data as $k => $v) {
if (is_array($v)) $data[$k] = json_encode($v);
}
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;
}

// Example: create a v2 checkout (API mode)
$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://checkout-sandbox.glodipayprocessing.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);
// Redirect buyer to $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'));
}

// Example: create a v2 checkout (API mode)
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: 'checkout-sandbox.glodipayprocessing.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);
// Redirect buyer: 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.