跳到主要内容

GLODIPAY API 规范

版本 2.0.0

目录

使用测试环境。不产生实际费用。

无 3DS4111 1111 1111 111101/30029
无 3DS5555 5555 5555 444401/30029
3DS 付款4012 8888 8888 188101/30029成功:123456 / 失败:111111
3DS 付款5111 1111 1111 111801/30029成功:123456 / 失败:111111
3DS 付款4141 4141 4141 414112/30123成功:123456 / 失败:111111
  • 附录
    • 付款方式
    • 连接模式
    • 状态值
    • 状态码
    • 货币代码
    • 国家代码
    • 卡类型
  • 代码示例
    • PHP
    • Node.js

介绍

本文档描述了 GLODIPAY API v2,它支持商户在统一的付款平台上接受信用卡/借记卡、移动银行、二维码、钱包和加密货币。

v2 中的新功能:

  • 多 PSP (支付服务提供商): 单个结账会话可以同时展示来自多个 PSP 的付款方式。买家可以在托管的结账页面上看到所有可用的付款方式 —— 商户无需额外工作。
  • 自动级联 (S2S): 启用 is_auto_cascade 后,网关将在返回最终结果之前,自动在多个 PSP 之间重试扣款。
  • 付款链接模式: connectionMode: PAYMENT_LINK 创建一个可共享的 URL,无需重定向 URL。

接口地址 (Endpoints)

测试环境将另行提供
生产环境从商户后台的 API Keys 页面获取

签名 (Signature)

所有请求和响应均使用 RSA with MD5 进行签名,以确保完整性和真实性。

生成签名 (商户 -> GLODIPAY)

使用您的 商户私钥(从商户后台获取)对请求 Payload 进行签名。

步骤:

  • 将除 signature 以外的所有请求参数收集为扁平的键值对象。
  • 自然升序 对键进行排序(SORT_NATURAL / localeComparenumeric: true)。
  • 修整所有字符串值的前导/尾随空格(递归)。
  • 序列化为 JSON 字符串。
  • 使用 openssl_sign(..., 'md5WithRSAEncryption') 进行签名。
  • 对二进制输出进行 Base64 编码。

验证签名 (GLODIPAY -> 商户)

使用 GLODIPAY 公钥(可在门户网站获取)验证 GLODIPAY 响应和 Webhook。

步骤:

  • 从 Payload 中分离出 signature
  • 按自然升序对剩余的键进行排序。
  • 修整所有字符串值的前导/尾随空格(递归)。
  • 序列化为 JSON 字符串。
  • 使用 openssl_verify(..., base64_decode($signature), $publicKey, 'md5WithRSAEncryption') 进行验证。
  • 返回值 1 = 有效。

注意 (Node.js):在排序/序列化之前将所有数字值转换为字符串。转义 JSON 字符串中的正斜杠:.replace(///g, '\/')。

API 规范

POST PAYMENT (结账 V2)

创建结账会话并获取托管付款页面的 URL。托管页面会自动为买家展示所有可用的付款方式。

接口地址: POST /v2/checkout 请求方法: Form Post Content-Type: application/x-www-form-urlencoded (Form Data)

请求参数

merchantIdString(1,50)M商户 ID
orderRefString(1,250)M每个商户唯一的交易参考号
amountFloatM发票金额。按商户配置最小/最大值
currencyString(3)MISO 4217 货币代码。例如:USD
cancelUrlString(1,300)M(前端) 取消付款时重定向买家的 URL。必须为 https。
callbackUrlString(1,300)M(前端) 付款成功后重定向买家的 URL。必须为 https。
notificationUrlString(1,300)M您的服务器接收 Webhook (IPN) 的接口。必须为 https。
errorUrlString(1,300)M(前端) 发生错误时重定向买家的 URL。必须为 https。
orderDescriptionString(max:3000)M在结账屏幕上显示的简短描述
metadataJSONO附加到会话的键值对。在 IPN 和查询响应中返回
transactionDocumentsJSONO交易的辅助文档
paymentMethodStringM要显示的付款方式。请参阅 paymentMethod 取值
paymentFilterJSONO要从会话中排除的付款方式类型
paymentSorterJSONO控制显示顺序的有序付款方式类型数组。有效值:card, paypal, ibanking_push, local_bank_transfer, wire_transfer, wallet, skrill, alipay, wechat, googlepay, applepay, crypto, apm
feeBySellerNumber(0-100)O商户支付的手续费百分比。0 = 买家支付 100%。最多保留 2 位小数
billingFirstNameString(max:255)O账单名字
billingLastNameString(max:255)O账单姓氏
billingStreet1String(max:255)O账单街道地址第 1 行
billingStreet2String(max:255)O账单街道地址第 2 行
billingCityString(max:255)O账单城市
billingEmailString(max:255)O买家电子邮件地址
billingStateString(2,255)O账单州/省
billingCountryStringOISO 3166-1 alpha-2 国家代码
billingPostalCodeString(max:25)O邮政编码
billingPhoneCountryCodeString(max:10)O电话国家代码。例如:美国为 1,印度为 91
billingPhoneNumberString(max:20)O电话号码
brandNameString(1,255)O覆盖在托管结账屏幕上显示的品牌名称
colorModeString(1,255)O最多 3 种颜色,用 --- 分隔。接受颜色名称、HEX 或 RGBA。例如:#2e7d32---#e8f5e9---#81c784
logoSourceString(1,255)O覆盖在托管结账屏幕上显示的 Logo
customerIpStringO客户的 IP 地址
websiteUrlString(max:300)O商户网站 URL
signatureString(max:750)MRSA-MD5 签名。请参阅“签名”部分
connectionModeStringODIRECT_POST 或 API
expiresAtStringO会话过期时间,ISO 8601 格式,带微秒。例如:2025-09-14T14:03:42.102862Z。默认值:24 小时

M = 必填 (Mandatory),O = 可选 (Optional)

paymentMethod

指定在托管结账页面上显示哪些付款方式。

ALL所有可用的付款方式
APM除银行卡外的所有付款方式
card信用卡 / 借记卡
googlepayGoogle Pay
applepayApple Pay
paypalPayPal
ibanking_push即时在线银行转账
local_bank_transfer国内银行转账
wire_transfer直接电子汇款
wallet数字钱包
alipay支付宝
wechat微信支付
skrillSkrill
crypto加密货币

paymentFilter

要从会话中排除的付款方式类型值的 JSON 数组。

["googlepay", "applepay"]

请求示例

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

响应 -- connectionMode: API

请求方法: POST Content-Type: application/json

statusStringcreated
transactionIdString (ULID)GLODIPAY 交易 ID
paymentLinkString已签名的 URL —— 将买家重定向到此 URL,以在托管结账页面上完成付款
messageString人类可读的消息

位于 paymentLink 的托管结账页面会自动向买家展示所有可用的付款方式(多 PSP 集合)。该页面处理方式选择、费用显示以及向 PSP 的重定向。

成功示例:

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

错误示例:

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

响应 -- connectionMode: DIRECT_POST

GLODIPAY 将买家的浏览器直接重定向到托管的结账页面。不返回 JSON 响应。

发送到 callbackUrl 的数据

付款后,GLODIPAY 通过 GET 请求将买家重定向到 callbackUrl,并带有一个 payload 查询参数:

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

解码后的 Payload 字段:

statusString最终交易状态。请参阅“状态值”部分
transactionIdStringGLODIPAY 交易 ID
refString商户的 orderRef
amountFloat发票金额
currencyString货币代码
signatureStringRSA-MD5 签名 —— 使用 GLODIPAY 公钥验证

SERVER TO SERVER -- S2S 卡 V2

直接从您的服务器提交银行卡详情,绕过托管结账页面。支持跨多个 PSP 的自动级联。

接口地址: POST /v2/card/api 请求方法: POST Content-Type: application/json

请求参数

包括来自 POST PAYMENT (结账 V2) 的所有参数,以及以下银行卡和账单字段:

billingFirstNameString(max:255)M账单名字
billingLastNameString(max:255)M账单姓氏
billingStreet1String(max:255)M账单街道地址第 1 行
billingStreet2String(max:255)O账单街道地址第 2 行
billingCityString(max:255)M账单城市
billingEmailString(max:255)M买家电子邮件地址
billingStateString(min:2, max:255)C账单州/省。当 billingCountry 为 US 或 CA 时必填
billingCountryStringMISO 3166-1 alpha-2 国家代码
billingPostalCodeString(max:25)M邮政编码
billingPhoneCountryCodeString(max:10)O电话国家代码。例如:美国为 1,印度为 91
billingPhoneNumberString(max:30)M电话号码
cardNumberString(12,19)M卡号。例如:4111111111111111
cardMonthStringM到期月份。例如:12
cardYearStringM到期年份(2 位数字)。例如:30
cardSecurityCodeString(3,4)MCVV / CVC
customerIpStringM客户的 IP 地址
browserDetailsJSONC浏览器指纹。请参阅 browserDetails 对象

M = 必填,O = 可选,C = 条件必填

browserDetails 对象

每个 S2S 卡片请求都必须提供。可以作为 JSON 对象(嵌套)或 JSON 编码的字符串提交。键名使用下表所列的 snake_case;camelCase 也会被自动规范化。

accept_headerStringM浏览器 Accept 头部。例如:text/html,application/xhtml+xml
screen_widthStringM屏幕宽度(像素)。例如:1920
screen_heightStringM屏幕高度(像素)。例如:1080
screen_color_depthStringM屏幕颜色深度(位)。例如:24
window_widthStringM视口宽度(像素)。例如:1440
window_heightStringM视口高度(像素)。例如:900
languageStringM浏览器语言。例如:en-US
java_enabledStringM是否启用 Java。“true”或“false”
user_agentStringM浏览器 User Agent 字符串
time_zoneStringM相对于 UTC 的时区偏移(小时)。例如:UTC+7 为 7
time_zone_nameStringMIANA 时区名称。例如:Asia/Shanghai

请求体示例:

{
"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/Shanghai"
},
"signature": "base64-encoded-signature"
}

收集 browserDetails 的 JavaScript 片段:

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

响应

Content-Type: application/json

交易完成 (无需 3DS):

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

需要 3DS 认证:

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

将买家重定向到 url 以完成 3DS。验证后,GLODIPAY 处理交易,通过 IPN 将结果发送到 notificationUrl,并将买家重定向到 callbackUrl

待处理 (Pending):

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

验证错误 (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."]
}
]
}

错误 (HTTP 400/500):

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

自动级联:当商户启用 is_auto_cascade 时,v2 在返回最终响应之前,会按优先级顺序自动在所有活动的 PSP 之间重试扣款。在级联期间,单个 PSP 的失败将被抑制 —— 仅返回并通过 IPN 发送最终结果。

卡 IFRAME V2

创建银行卡 Iframe 会话。GLODIPAY 不会通过服务器到服务器的方式提交银行卡详情,而是返回一个已签名的 URL,用于托管的银行卡输入页面 (Iframe),商户可以嵌入该页面或重定向到该页面。银行卡数据直接在 GLODIPAY 托管的页面中输入 —— PCI 范围仍由 GLODIPAY 承担。

接口地址: POST /v2/card/iframe 请求方法: POST Content-Type: application/x-www-form-urlencoded (Form Data)

请求参数

POST PAYMENT (结账 V2) 相同。不发送银行卡字段 —— 买家在托管的 Iframe 页面上输入银行卡详情。

响应

始终返回 JSON。

statusStringcreated
transactionIdString (ULID)GLODIPAY 交易 ID
urlString已签名的 URL —— 将此 URL 嵌入 Iframe 或重定向买家以完成银行卡输入
messageString人类可读的消息

成功示例:

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

错误示例:

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

在买家在托管页面上提交银行卡详情后,交易结果将通过 IPN 发送到 notificationUrl,买家将被重定向到 callbackUrlerrorUrl

交易查询 (TRANSACTION QUERY)

查询交易的当前状态和完整详情。

接口地址: POST /v2/checkout/query 请求方法: POST Content-Type: application/json

请求 (Request)

transactionIdString (ULID)MGLODIPAY 交易 ID
signatureString(max:750)MRSA-MD5 签名

响应 (Response)

返回与 NOTIFICATION Webhook 相同的 Payload。

通知 (交易 IPN)

当交易达到终端状态时,GLODIPAY 会向您的 notificationUrl 发送 HTTP POST 请求。

请求方法: POST Content-Type: application/json

重试策略: GLODIPAY 可能会重新发送尚未确认交易的 IPN。您的服务器应在收到通知后立即返回 {"returnCode":"100"}。如果您的接口不可用或返回了非预期的响应,GLODIPAY 将尝试重新传送 IPN。

Payload

merchantIdStringM商户 ID
transactionIdStringMGLODIPAY 交易 ID (ULID)
transactionNumberStringMGLODIPAY 人类可读的交易编号
refStringM商户的 orderRef
currencyStringMISO 4217 货币代码
amountFloatM发票金额
paidAmountFloatO实际向买家收取的金额(包括买家费用)
settlementAmountFloatO结算给商户的金额
estimationSettlementAtISO 8601 datetimeO预计结算日期时间。例如:2023-12-16T02:13:37+00:00
feesJSONO费用明细。请参阅 fees 对象
paymentMethodDetailsJSONO所使用的付款方式。请参阅 paymentMethodDetails 对象
statusStringM交易状态。请参阅“状态值”部分
statusCodeNumberM数字状态码。请参阅“状态码”部分
metadataJSONO原始结账会话中的键值对
transactionDocumentsJSONO原始结账会话中的辅助文档
messageStringO人类可读的状态消息
descriptorStringO交易描述符
transactionCreatedAtISO 8601 datetimeMGLODIPAY 系统中的交易创建时间
originalTransactionCreatedAtISO 8601 datetimeM支付渠道侧的交易创建时间
signatureStringMRSA-MD5 签名 —— 使用 GLODIPAY 公钥验证

fees 对象

buyerFloat面向买家的费用金额
sellerFloat商户费用金额
rollingFloat滚动保证金金额
operateFloat总运营费用(渠道商 + GLODIPAY + 合作伙伴)
estimationRollingReleaseAtISO 8601 datetime预计滚动保证金释放日期时间

paymentMethodDetails 对象

displayNameString付款方式标签
groupString付款方式组类型
familyString付款方式系列类型
typeString付款方式类型。可用于 paymentMethod / paymentFilter 字段

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

响应 (商户 -> GLODIPAY)

您的服务器必须在 30 秒 内响应:

{
"returnCode": "100",
"description": "Received"
}
returnCodeStringR必须为 "100" 以确认收到
descriptionString(1,1500)O可选描述

退款 API

为已完成的交易发起退款。

接口地址: POST /v2/refund 请求方法: POST Content-Type: application/json

请求 (Request)

transactionIdString (ULID)M从结账 IPN 接收到的 transactionId
amountFloatM退款金额。最小值:0.10(某些渠道可能要求全额退款)。最大值:剩余可退款金额(paidAmount - 已退款金额)
reasonString(max:1000)O退款原因的简短描述
signatureString(max:750)MRSA-MD5 签名

注意:某些支付渠道(如 PayAgency, SmartPay, ClisaPay, FinvyPay, WPay)仅支持全额退款。系统将相应地强制执行最小退款金额。

响应 (Response)

Content-Type: application/json

退款已创建并立即处理(启用了自动退款):

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

退款已创建并等待人工审核:

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

验证错误 (HTTP 422):

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

退款查询

查询退款的最新状态。

接口地址: POST /v2/refund/query 请求方法: POST Content-Type: application/json

请求 (Request)

refundIdString (ULID)MGLODIPAY 退款 ID(来自退款 API 响应或退款 IPN)
signatureString(max:750)MRSA-MD5 签名

响应 (Response)

Content-Type: application/json

statusStringsuccess
messageString人类可读的消息
dataJSON退款详情。字段与 REFUND NOTIFICATION Payload 相同

示例:

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

退款通知 (退款 IPN)

当退款状态发生变化时,GLODIPAY 会向您的 notificationUrl 发送 HTTP POST 请求。

请求方法: POST Content-Type: application/json

Payload

transactionIdStringMGLODIPAY 原始交易 ID
refStringM商户的 orderRef
refundIdStringMGLODIPAY 退款 ID
currencyStringMISO 4217 货币代码
refundAmountFloatM退款金额
statusStringM退款状态。请参阅“状态值”部分
statusCodeNumberM数字状态码。请参阅“状态码”部分
metadataJSONO原始结账会话中的键值对
reasonStringO退款原因
messageStringO人类可读的状态消息
originalRefundCreatedAtISO 8601 datetimeM支付渠道侧的退款创建时间
refundCreatedAtISO 8601 datetimeMGLODIPAY 系统中的退款创建时间
transactionCreatedAtISO 8601 datetimeM原始交易创建时间
signatureStringMRSA-MD5 签名 —— 使用 GLODIPAY 公钥验证

响应 (商户 -> GLODIPAY)

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

模拟付款 (测试卡)

使用测试环境。不产生实际费用。

无 3DS4111 1111 1111 111101/30029
无 3DS5555 5555 5555 444401/30029
3DS 付款4012 8888 8888 188101/30029成功:123456 / 失败:111111
3DS 付款5111 1111 1111 111801/30029成功:123456 / 失败:111111
3DS 付款4141 4141 4141 414112/30123成功:123456 / 失败:111111

附录

付款方式

card信用卡或借记卡
googlepayGoogle Pay
applepayApple Pay
paypalPayPal
ibanking_push即时在线银行转账
local_bank_transfer国内银行转账
wire_transfer直接电子汇款
wallet数字钱包
alipay支付宝
wechat微信支付
skrillSkrill
crypto加密货币
APM除银行卡外的所有付款方式
ALL所有可用的付款方式

连接模式

DIRECT_POST(默认) 浏览器立即重定向到托管的结账页面。
API在 JSON 响应中返回 paymentLink URL。

状态值

在 IPN Payload 和查询响应的 status 字段中返回的字符串值。

incomplete交易已发起,等待操作
pending等待付款确认
under_review交易审核中
successful付款成功完成
failed付款失败
error发生系统错误
canceled交易已取消
rejected交易被拒绝
expired交易已过期
released资金已释放 / 结算
documents_uploaded辅助文档已上传
refund_initiated退款请求已发起
refund_under_review退款审核中
refund_successful退款成功完成
refund_failed退款失败
refund_partially_successful部分退款完成
refund_partially_failed部分退款失败
void_initiated撤销已发起
void_under_review撤销审核中
void_successful撤销成功完成
void_failed撤销失败
void_partially_successful部分撤销完成
void_partially_failed部分撤销失败
chargeback_alert收到拒付警报
chargebacked交易已拒付
dispute争议已开启

状态码

在 IPN Payload 和查询响应的 statusCode 字段中的数字代码。

1incomplete交易已发起
2pending等待确认
3error系统错误
4failed付款失败
5under_review审核中
6successful付款成功
7released已释放 / 结算
8refund_initiated退款已发起
9refund_failed退款失败
10refund_under_review退款审核中
11refund_successful退款成功
12refund_partially_failed部分退款失败
13refund_partially_successful部分退款成功
14canceled已取消
15rejected已拒绝
16expired已过期
17documents_uploaded文档已上传
18void_initiated撤销已发起
19void_under_review撤销审核中
20void_successful撤销成功
21void_failed撤销失败
22void_partially_successful部分撤销成功
23void_partially_failed部分撤销失败
24chargeback_alert拒付警报
25chargebacked已拒付
26dispute争议已开启

货币代码

GLODIPAY 遵循 ISO 4217 标准。

  • 结账 API (/v2/checkout) 和 卡 Iframe API (/v2/card/iframe):仅接受 USD
  • 服务器到服务器卡 API (/v2/card/api):接受的货币取决于支付渠道。常用的支持值包括:
USD美元
EUR欧元
GBP英镑
AUD澳元
AED阿联酋迪拉姆
VND越南盾

国家代码

GLODIPAY 在 billingCountry 字段中使用 ISO 3166-1 alpha-2 两位字母代码。

AD安道尔
AE阿拉伯联合酋长国
AF阿富汗
AG安提瓜和巴布达
AI安圭拉
AL阿尔巴尼亚
AM亚美尼亚
AO安哥拉
AQ南极洲
AR阿根廷
AS美属萨摩亚
AT奥地利
AU澳大利亚
AW阿鲁巴
AX奥兰群岛
AZ阿塞拜疆
BA波斯尼亚和黑塞哥维那
BB巴巴多斯
BD孟加拉国
BE比利时
BF布基纳法索
BG保加利亚
BH巴林
BI布隆迪
BJ贝宁
BL圣巴泰勒米
BM百慕大
BN文莱达鲁萨兰国
BO多民族玻利维亚国
BQ博内尔、圣尤斯特歇斯和萨巴
BR巴西
BS巴哈马
BT不丹
BV布韦岛
BW博茨瓦纳
BY白俄罗斯
BZ伯利兹
CA加拿大
CC科科斯(基林)群岛
CD刚果民主共和国
CF中非共和国
CG刚果
CH瑞士
CI科特迪瓦
CK库克群岛
CL智利
CM喀麦隆
CN中国
CO哥伦比亚
CR哥斯达黎加
CU古巴
CV佛得角
CW库拉索
CX圣诞岛
CY塞浦路斯
CZ捷克
DE德国
DJ吉布提
DK丹麦
DM多米尼克
DO多米尼加共和国
DZ阿尔及利亚
EC厄瓜多尔
EE爱沙尼亚
EG埃及
EH西撒哈拉
ER厄立特里亚
ES西班牙
ET埃塞俄比亚
FI芬兰
FJ斐济
FK福克兰群岛(马尔维纳斯)
FM密克罗尼西亚联邦
FO法罗群岛
FR法国
GA加蓬
GB大不列颠及北爱尔兰联合王国
GD格林纳达
GE格鲁吉亚
GF法属圭亚那
GG根西岛
GH加纳
GI直布罗陀
GL格陵兰
GM冈比亚
GN几内亚
GP瓜德罗普
GQ赤道几内亚
GR希腊
GS南乔治亚岛和南桑威奇群岛
GT危地马拉
GU关岛
GW几内亚比绍
GY圭亚那
HK香港
HM赫德岛和麦克唐纳群岛
HN洪都拉斯
HR克罗地亚
HT海地
HU匈牙利
ID印度尼西亚
IE爱尔兰
IL以色列
IM马恩岛
IN印度
IO英属印度洋领地
IQ伊拉克
IR伊朗伊斯兰共和国
IS冰岛
IT意大利
JE泽西岛
JM牙买加
JO约旦
JP日本
KE肯尼亚
KG吉尔吉斯斯坦
KH柬埔寨
KI基里巴斯
KM科摩罗
KN圣基茨和尼维斯
KP朝鲜民主主义人民共和国
KR大韩民国
KW科威特
KY开曼群岛
KZ哈萨克斯坦
LA老挝人民民主共和国
LB黎巴嫩
LC圣卢西亚
LI列支敦士登
LK斯里兰卡
LR利比里亚
LS莱索托
LT立陶宛
LU卢森堡
LV拉脱维亚
LY利比亚
MA摩洛哥
MC摩纳哥
MD摩尔多瓦共和国
ME黑山
MF圣马丁(法属部分)
MG马达加斯加
MH马绍尔群岛
MK北马其顿
ML马里
MM缅甸
MN蒙古
MO澳门
MP北马里亚纳群岛
MQ马提尼克
MR毛里塔尼亚
MS蒙特塞拉特
MT马耳他
MU毛里求斯
MV马尔代夫
MW马拉维
MX墨西哥
MY马来西亚
MZ莫桑比克
NA纳米比亚
NC新喀里多尼亚
NE尼日尔
NF诺福克岛
NG尼日利亚
NI尼加拉瓜
NL荷兰王国
NO挪威
NP尼泊尔
NR瑙鲁
NU纽埃
NZ新西兰
OM阿曼
PA巴拿马
PE秘鲁
PF法属波利尼西亚
PG巴布亚新几内亚
PH菲律宾
PK巴基斯坦
PL波兰
PM圣皮埃尔和密克隆
PN皮特凯恩
PR波多黎各
PS巴勒斯坦国
PT葡萄牙
PW帕劳
PY巴拉圭
QA卡塔尔
RE留尼汪
RO罗马尼亚
RS塞尔维亚
RU俄罗斯联邦
RW卢旺达
SA沙特阿拉伯
SB所罗门群岛
SC塞舌尔
SD苏丹
SE瑞典
SG新加坡
SH圣赫勒拿、阿森松和特里斯坦-达库尼亚
SI斯洛文尼亚
SJ斯瓦尔巴和扬马延
SK斯洛伐克
SL塞拉利昂
SM圣马力诺
SN塞内加尔
SO索马里
SR苏里南
SS南苏丹
ST圣多美和普林西比
SV萨尔瓦多
SX荷属圣马丁
SY阿拉伯叙利亚共和国
SZ斯威士兰
TC特克斯和凯科斯群岛
TD乍得
TF法属南部领地
TG多哥
TH泰国
TJ塔吉克斯坦
TK托克劳
TL东帝汶
TM土库曼斯坦
TN突尼斯
TO汤加
TR土耳其
TT特立尼达和多巴哥
TV图瓦卢
TW中国台湾
TZ坦桑尼亚联合共和国
UA乌克兰
UG乌干达
UM美国本土外小岛屿
US美利坚合众国
UY乌拉圭
UZ乌兹别克斯坦
VA圣座
VC圣文森特和格林纳丁斯
VE委内瑞拉玻利瓦尔共和国
VG维尔京群岛(英属)
VI维尔京群岛(美属)
VN越南
VU瓦努阿图
WF瓦利斯和富图纳
WS萨摩亚
YE也门
YT马约特
ZA南非
ZM赞比亚
ZW津巴布韦

有关完整的 ISO 3166 列表,请访问 https://www.iso.org/iso-3166-country-codes.html

卡类型

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

代码示例

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

// 示例:创建 v2 结账(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);
// 将买家重定向到 $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'));
}

// 示例:创建 v2 结账(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);
// 重定向买家: 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.