创建交易(Create Payment)
商户调用本接口发起一笔支付(创建交易)。系统将根据金额、支付方式、国家/终端等路由到合适通道,并通过统一结构返回 result(返回码与说明)与 data(含 status,以及按需返回的 action 跳转信息或 amount 金额等)。
请求说明
- 方法:
POST - 路径:
/api/v1/payin/createPayment - Content-Type:
application/json - 鉴权:参考 接入准备 中参数以及签名算法说明,按照要求携带必须的鉴权信息
一、请求字段(Request Body)
顶层字段
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
merchantOrderId | string | ≤ 64 字符 | 是 | 商户订单号(商户维度唯一) |
amount | object | — | 是 | 支付金额,见 amount |
country | string | 2 字符,ISO-3166 | 是 | 二位国家/地区代码,如 CN |
transInitiator | object | — | 是 | 发起交易的终端信息,见 transInitiator |
paymentMethod | object | — | 是 | 支付方式,见 paymentMethod |
userInfo | object | — | 条件必填 | 用户信息;需要支持 Payermax 渠道时须上送该结构体,见 userInfo |
notifyUrl | string | ≤ 256 字符,URL | 是 | 支付结果异步回调地址 |
returnUrl | string | ≤ 256 字符,URL | 否 | 用户支付完成后的跳转地址 |
description | string | ≤ 256 字符 | 否 | 订单描述 |
amount 对象
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
value | string | 数值大于 0,字符串长度 ≤ 12 | 是 | 具体金额(最小货币单位,如 cents),须与币种匹配;与币种规则不符的金额(例如日元场景下送小数形式)将直接前置拒绝 |
currency | string | 3 字符,ISO-4217 | 是 | 币种,如 USD、PHP |
支持的国家与币种对应关系见 国家币种说明。
transInitiator 对象
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
terminalType | string | 枚举 | 是 | 发起支付的终端类型:WEB、WAP、APP |
deviceType | string | 枚举 | 条件必填 | Android、iOS。当 paymentMethod.type 为 e-wallet 且 terminalType 为 WAP 或 APP 时必送 |
browserInfo | object | — | 条件必填 | 卡交易,且非商户自带 3DS 结果场景时必送,见 browserInfo |
browserInfo 对象
(置于 transInitiator.browserInfo,条件见上。)
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
acceptHeader | string | ≤ 2048 | 是 | 用户浏览器的 Accept 请求头值 |
colorDepth | string | 2 字符 | 是 | 浏览器色深,枚举:1、4、8、15、16、24、32、48 |
javaEnabled | boolean | — | 是 | 浏览器是否启用 Java |
language | string | ≤ 8 | 是 | 如 navigator.language,例:en-GB |
screenHeight | string | ≤ 6 | 是 | 屏幕高度(像素) |
screenWidth | string | ≤ 6 | 是 | 屏幕宽度(像素) |
timeZoneOffset | string | ≤ 5 | 是 | UTC 与浏览器本地时间的时差,分钟 |
paymentMethod 对象
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | string | 是 | 支付类型,枚举:card、e-wallet、qr、onlineBanking、bankTransfer。详见 支付类型说明 |
e-wallet | object | 条件必填 | 当 type 为 e-wallet 时必须存在,见下表 |
qr | object | 条件必填 | 当 type 为 qr 时必须存在,见下表 |
onlineBanking | object | 条件必填 | 当 type 为 onlineBanking 时必须存在,见下表 |
bankTransfer | object | 条件必填 | 当 type 为 bankTransfer 时必须存在,见下表 |
card | object | 条件必填 | 当 type 为 card 时必须存在,见下表 |
threeDS | object | 条件必填 | 当 type 为 card 时须携带,用于 3DS 策略,见 threeDS |
JSON 中表示电子钱包子对象时,键名需使用 "e-wallet"(带引号)。
paymentMethod.e-wallet 对象
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
paymentBrand | string | 是 | 枚举值见 支付品牌说明 |
paymentMethod.qr 对象
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
paymentBrand | string | 是 | 枚举值见 支付品牌说明 |
paymentMethod.onlineBanking 对象
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
paymentBrand | string | 是 | 枚举值见 支付品牌说明 |
paymentMethod.bankTransfer 对象
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
paymentBrand | string | 是 | 枚举值见 支付品牌说明 |
paymentMethod.card 对象
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
cardNumber | string | ≤ 19 | 是 | 卡号;送 card 结构时必送 |
cvc | string | ≤ 4 | 否 | 卡背安全码 |
expiryDate | string | ≤ 4 | 是 | 有效期,格式 MMYY |
holderName | string | ≤ 50 | 否 | 持卡人姓名 |
threeDS 对象
(置于 paymentMethod.threeDS。)
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
threeDSStrategy | string | 是 | Force:强制 3DS(对应 inner);None:不做 3DS(对应 none);External:商户自有 3DS 结果 |
userInfo 对象
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
merchantUserId | string | ≤ 128 字符 | 否 | 商户侧用户唯一标识,用于风控、支付工具绑定、复购识别、争议追踪 |
phoneNumber | string | ≤ 32 字符 | 否 | 用户手机号 |
shopperIP | string | ≤ 64 | 否 | 用户 IP |
userAgent | string | ≤ 2048 | 否 | HTTP User-Agent 头内容 |
email | string | ≤ 254 | 否 | 用户邮箱 |
billingAddress | object | — | 否 | 账单地址;若渠道将地址用于身份校验,按渠道要求可能需要上送,见 billingAddress |
name | object | — | 否 | 用户姓名,见 name |
billingAddress 对象
(置于 userInfo.billingAddress。若上送该对象,下列标「是」的字段须填写完整。)
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
address | string | ≤ 1024 | 否 | 账单详细地址 |
city | string | ≤ 50 | 是 | 城市 |
country | string | 2 字符 | 是 | ISO-3166 二位国家代码,如 CN |
postalCode | string | ≤ 16 | 否 | 邮政编码 |
stateOrProvince | string | ≤ 3 | 否 | 州/省,ISO 3166-2 |
email | string | ≤ 254 | 是 | 用户邮箱 |
name 对象
(置于 userInfo.name。)
| 字段名 | 类型 | 长度 / 限制 | 必填 | 说明 |
|---|---|---|---|---|
firstName | string | ≤ 64 | 否 | 名 |
lastName | string | ≤ 64 | 否 | 姓 |
二、请求示例
电子钱包(e-wallet)
terminalType 为 WEB 时无需上送 deviceType。paymentMethod.type 为 e-wallet 且 terminalType 为 WAP 或 APP 时必须上送 deviceType(Android 或 iOS)。需要支持 Payermax 渠道时须上送 userInfo。
json
{
"merchantOrderId": "M202512180001",
"amount": {
"value": "1099",
"currency": "HKD"
},
"country": "HK",
"transInitiator": {
"terminalType": "APP",
"deviceType": "Android"
},
"paymentMethod": {
"type": "e-wallet",
"e-wallet": {
"paymentBrand": "gcash"
}
},
"userInfo": {
"merchantUserId": "user_10001",
"phoneNumber": "7151923499",
"shopperIP": "112.198.100.1",
"userAgent": "Mozilla/5.0 (Linux; Android 13; SM-S911B)",
"email": "example@gmail.com"
},
"notifyUrl": "https://merchant.com/webhook/payment",
"returnUrl": "https://merchant.com/pay/result",
"description": "MU ticket 2025-12-18"
}卡支付(card,含 browserInfo 与 threeDS)
json
{
"merchantOrderId": "ORDER_20260330_153728_AO1002",
"amount": {
"value": "20",
"currency": "PHP"
},
"country": "PH",
"transInitiator": {
"terminalType": "WEB",
"browserInfo": {
"acceptHeader": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"colorDepth": "24",
"javaEnabled": false,
"language": "zh-CN",
"screenHeight": "1440",
"screenWidth": "2560",
"timeZoneOffset": "480"
}
},
"paymentMethod": {
"type": "card",
"card": {
"cardNumber": "36563",
"cvc": "123",
"expiryDate": "1026",
"holderName": "Bhns Josn",
"threeDS": {
"threeDSStrategy": "None"
}
}
},
"notifyUrl": "https://xxxxxxx/api/v1/payin/test/webhook/notify",
"returnUrl": "https://www.baidu.com",
"description": "Test Order – Payment Testing",
"userInfo": {
"merchantUserId": "user_20001",
"phoneNumber": "7151923499",
"shopperIP": "178.49.15.251",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15) Gecko/20100101 Firefox/122.0",
"email": "jane.brown307@example.com",
"billingAddress": {
"city": "New York",
"country": "US",
"email": "jane.brown307@example.com",
"address": "123 Broadway Ave",
"postalCode": "10001",
"stateOrProvince": "NY"
},
"name": {
"firstName": "Jane",
"lastName": "Brown"
}
}
}三、应答说明(Response Body)
响应体根节点为 result 与 data:
| 字段名 | 类型 | 长度 / 限制 | 必返 | 说明 |
|---|---|---|---|---|
result | object | — | 是 | 支付结果(返回码与说明) |
data | object | — | — | 支付单数据,结构见下表 |
result 对象
| 字段名 | 类型 | 长度 / 限制 | 必返 | 说明 |
|---|---|---|---|---|
code | string | ≤ 32 字符 | 是 | 返回码(成功 / 失败等标识),完整释义见 应答码说明 |
msg | string | ≤ 255 字符 | 是 | 返回信息说明 |
data 对象
| 字段名 | 类型 | 长度 / 限制 | 必返 | 说明 |
|---|---|---|---|---|
paymentId | string | ≤ 64 字符 | 是 | Velora 平台生成的支付单号 |
merchantOrderId | string | / | 否 | 商户订单号 |
psp | string | / | 否 | 实际承接订单的 PSP 标识 |
channelOrderId | string | ≤ 64 字符 | 否 | PSP / 渠道侧订单号 |
status | string | Pending / Success / Failed | 是 | 当前支付状态 |
amount | object | — | 否 | 支付金额;交易成功或失败时可能返回,见 data.amount |
action | object | — | 否 | 商户侧下一步操作指引,见 data.action |
data.amount 对象
| 字段名 | 类型 | 长度 / 限制 | 必返 | 说明 |
|---|---|---|---|---|
value | string | 数值大于 0,字符串长度 ≤ 12 | 是(随 amount 出现) | 具体金额(最小货币单位,如 cents);须与币种规则一致,与规则不符的取值(例如日元场景下小数形式)将不符合约定 |
currency | string | 3 字符,ISO-4217 | 是(随 amount 出现) | 币种,如 USD、PHP |
data.action 对象
| 字段名 | 类型 | 长度 / 限制 | 必返 | 说明 |
|---|---|---|---|---|
type | string | ≤ 32 | 否 | 操作类型枚举:Redirect;threeDSRedirect |
paymentUrl | string | ≤ 255,URL | 否 | 跳转型支付地址;当 action.type 为 Redirect 时返回 |
redirectUrl | string | ≤ 1024 | 否 | 3DS 认证地址;当 action.type 为 threeDSRedirect 时返回 |
expireAt | string | ISO-8601 | 否 | 失效时间;渠道返回时向下游(商户)透传 |
四、应答示例
待支付(Pending,Redirect)
json
{
"result": {
"code": "P0001",
"msg": "Payment is processing."
},
"data": {
"paymentId": "payin_202512180001",
"merchantOrderId": "M202512180001",
"psp": "omnipay",
"channelOrderId": "OMNI202512180001",
"status": "Pending",
"action": {
"type": "Redirect",
"paymentUrl": "https://checkout.omnipay.com/pay/abc123",
"expireAt": "2025-12-18T18:30:00+08:00"
}
}
}待支付(Pending,threeDSRedirect)
json
{
"result": {
"code": "P0001",
"msg": "Payment is processing."
},
"data": {
"paymentId": "payin_202512180002",
"merchantOrderId": "M202512180002",
"psp": "bankcard_acquirer",
"channelOrderId": "ACQ202512180002",
"status": "Pending",
"action": {
"type": "threeDSRedirect",
"redirectUrl": "https://acs.bank.example.com/3ds-challenge",
"expireAt": "2025-12-18T18:30:00+08:00"
}
}
}支付成功(Success,含 amount)
json
{
"result": {
"code": "S0000",
"msg": "Success"
},
"data": {
"paymentId": "payin_202512180003",
"merchantOrderId": "M202512180003",
"psp": "wallet_partner",
"channelOrderId": "WALLET202512180003",
"status": "Success",
"amount": {
"value": "1099",
"currency": "HKD"
}
}
}创建失败(Failed,示例含 amount)
json
{
"result": {
"code": "P0012",
"msg": "Transaction rejected by risk control"
},
"data": {
"paymentId": "payin_202512180006",
"merchantOrderId": "M202512180006",
"psp": "risk_gateway",
"channelOrderId": "RISK202512180006",
"status": "Failed",
"amount": {
"value": "1099",
"currency": "HKD"
}
}
}业务结果码 result.code 的完整说明见 应答码说明。