简介

面向商户业务系统的开放 API —— 通过统一的接口完成代收(收款)与代付(付款)下单、订单查询、余额查询,并接收异步结果通知。

快速上手

获取商户编号(mchNum)

由平台运营人员开通商户账号后提供,作为接口身份标识。

生成 RSA 密钥对并配置公钥

商户自行生成 RSA 2048 密钥对,私钥自行保管用于请求签名,公钥提交给平台配置到商户档案,平台用它验证商户请求签名。

配置 API IP 白名单

将调用接口的服务器出口 IP 提供给平台配置(多个 IP 用 | 分隔)。未配置白名单时不限制来源 IP。

获取平台公钥

平台回调商户时使用平台私钥签名,商户需持有平台公钥验签,公钥由平台在商户管理「平台密钥设置」中提供。

对接接口并接收异步通知

按本文档完成下单 / 查询接口对接,在回调地址上验签并处理通知(详见各接口章节)。

接口规范

请求URL:https://<平台部署域名>/adminapi/openapi/payment/merchant(以下均省略此基础路径,以平台实际提供为准)
  • 请求方式:统一 POST,Content-Type: application/json,字符编码 UTF-8;请求提交参数格式为 JSON 字符串。
  • 身份标识:商户编号 mchNum 放在请求体 JSON 中。
  • 请求签名:请求头 x-signature 携带 RSA 签名值(详见 签名算法)。
  • 安全机制:RSA 验签 + IP 白名单双重校验;平台侧回调请求 / 响应全量留痕,便于排查。

统一响应结构

字段类型示例值说明
codeint200返回码:200 成功500 失败
msgstring操作成功返回信息,失败时为具体错误原因
dataobject{...}业务数据,无数据时该字段不返回
// 成功
{ "msg": "操作成功", "code": 200, "data": { ... } }

// 失败
{ "msg": "签名验证失败", "code": 500 }

接口速览

#接口路径说明
2代收下单POST /order/collect发起收款订单,返回支付链接 / 收款卡信息
3代收异步通知POST <notifyUrl>平台推送代收订单结果到商户回调地址
4查询代收订单POST /order/order-info按商户订单号查询代收订单最新状态
5代付下单POST /order/pay发起付款订单,平台异步处理出款
6代付异步通知POST <notifyUrl>平台推送代付订单结果到商户回调地址
7查询代付订单POST /order/order-info按商户订单号查询代付订单最新状态
8查询账户余额POST /mch/getMchInfoAccountOut查询商户账户余额与待结算金额
联调建议
平台提供内置测试接收端 POST /order/testCallback(模拟商户接收回调并验签,通过返回 ok、失败返回 verify fail),可用于验证平台回调签名链路;后台「回调记录」中可查看每次通知的完整请求报文、签名与响应详情。

1. 签名算法

平台采用 RSA 非对称签名(SHA256withRSA),商户请求需签名,平台回调商户需验签,双向保证报文不可篡改。

密钥体系

密钥持有方用途
商户私钥商户自行保管对商户 → 平台的请求体签名(请求头 x-signature)
商户公钥平台保存平台验证商户请求签名(配置在商户档案中)
平台私钥平台保管对平台 → 商户的回调报文签名(请求头 x-signature)
平台公钥商户持有商户验证平台回调签名(由平台「平台密钥设置」提供)

签名步骤(商户请求平台)

  1. 将请求体 JSON 全部字段按参数名(key)ASCII 码从小到大排序(字典序),序列化为紧凑 JSON 字符串(无多余空格、换行),得到待签名串。
  2. 使用商户私钥对待签名串执行 SHA256withRSA 签名,结果做 Base64 编码,得到签名值 sign。
  3. 将签名值放入请求头 x-signature,随原始请求体(内容不变)一起 POST。
sign = Base64( SHA256withRSA( sortJsonByKey(requestBody), 商户私钥 ) )

// 待签名串示例(按键名 ASCII 升序排列后的紧凑 JSON)
{"bankCode":"KTB","mchNum":"M10001","mchOrderNo":"202609010001",
 "notifyUrl":"https://shop.example.com/notify","payMoney":100.00,
 "paymentName":"Somchai","transAccNo":"8888888888888"}

验签步骤(商户接收平台回调)

  1. 读取请求头 x-signature 与原始请求体(raw body)。
  2. 将请求体 JSON 按 key ASCII 升序排序得到待验签串。
  3. 用平台公钥执行 SHA256withRSA 验签;通过后按业务处理,并响应 ok。

注意事项

  • 密钥格式:RSA 2048 位,公钥 X509 / 私钥 PKCS#8,Base64(带或不带头尾行均可,平台会自动清理空白字符)。
  • 签名串必须与请求体逐字节一致:先排序再序列化,勿在排序后修改字段值。
  • 接口可能增加扩展字段,商户验签时必须兼容新增字段。
  • 签名失败平台会直接拒绝请求(签名验证失败),不会创建订单。

签名示例代码

Java

// 1. 排序: 请求体 JSON 按键名 ASCII 升序(TreeMap), 紧凑序列化
TreeMap<String, Object> sorted = new TreeMap<>();
sorted.putAll(JSON.parseObject(rawBody));
String signData = JSON.toJSONString(sorted);

// 2. SHA256withRSA 签名 → Base64
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);                       // PKCS#8 Base64 私钥
signature.update(signData.getBytes(StandardCharsets.UTF_8));
String sign = Base64.getEncoder().encodeToString(signature.sign());

// 3. 放入请求头
headers.set("x-signature", sign);

PHP

// 1. 排序 + 紧凑 JSON(PHP 关联数组默认按 key 排序写入)
$body = json_decode($rawBody, true);
ksort($body);
$signData = json_encode($body, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

// 2. SHA256withRSA 签名 → Base64
openssl_sign($signData, $sign, $privateKey, OPENSSL_ALGO_SHA256);
$sign = base64_encode($sign);

Node.js

const crypto = require('crypto');

// 1. 排序 + 紧凑 JSON
const body = JSON.parse(rawBody);
const sorted = Object.keys(body).sort()
    .reduce((acc, k) => (acc[k] = body[k], acc), {});
const signData = JSON.stringify(sorted);

// 2. SHA256withRSA 签名 → Base64
const signer = crypto.createSign('RSA-SHA256');
signer.update(signData);
const sign = signer.sign(privateKey, 'base64');

2. 代收下单

商户业务系统通过本接口发起收款订单,网关按商户绑定的代收通道路由完成下单,返回支付链接与收款信息,商户展示给付款用户完成支付。

POST /adminapi/openapi/payment/merchant/order/collect
请求方式:POST Content-Type: application/json · 字符编码:UTF-8 · 请求头:x-signature

接口说明

  • 商户订单号 mchOrderNo 在同一商户下必须唯一,重复将返回错误。
  • 平台按商户绑定的代收通道(金额规则 + 权重)匹配通道后创建订单;无可用通道时报错 无可用代收通道。
  • 订单有效期 10 分钟(endTime 为失效时间),请引导用户在有效期内完成支付。
  • 自营通道返回收款银行卡信息(selfBankCard 相关字段),三方通道返回支付链接与二维码。

请求参数

字段名名称必填类型示例值说明
mchNum商户编号是stringM10001平台分配的商户编号
mchOrderNo商户订单号是string202609010001商户系统内唯一订单号
payMoney支付金额是number100.00订单金额,必须大于 0
transAccNo付款账号是string8888888888888付款人转账账号 / 卡号
paymentName付款人姓名是stringSomchai付款人姓名
bankCode银行编码是stringKTB付款银行编码
paymentMobile付款人手机号否string0812345678付款人手机号
notifyUrl异步通知地址是stringhttps://shop.example.com/notify订单结果异步回调 URL,详见 代收异步通知
{
  "mchNum": "M10001",
  "mchOrderNo": "202609010001",
  "payMoney": 100.00,
  "transAccNo": "8888888888888",
  "paymentName": "Somchai",
  "bankCode": "KTB",
  "paymentMobile": "0812345678",
  "notifyUrl": "https://shop.example.com/notify"
}

返回参数(data)

字段名名称类型示例值说明
mchNum商户编号stringM10001商户编号
paymentName付款人姓名stringSomchai请求传入的付款人姓名
transAccNo付款账号string8888888888888请求传入的付款账号
orderCreateTime下单时间string2026-09-01 10:00:00格式 yyyy-MM-dd HH:mm:ss
payMoney支付金额number100.00订单金额
paymentImageBase64收款二维码stringiVBORw0KGgo...支付链接对应二维码 PNG 的 Base64,可直接展示
createTime下单时间string2026-09-01 10:00:00同 orderCreateTime
endTime订单失效时间string2026-09-01 10:10:00下单后 10 分钟失效
paymentLink支付链接stringhttps://...?orderNo=P...收银台支付页地址,需展示给付款用户
selfBankCard自营通道标记booleantrue自营通道时返回,代表后续为收款卡信息
bankCardNo收款卡号stringxxx-xxx-1234自营通道返回:用户需向该卡转账
bankHolder收款人stringSomsak自营通道返回:收款人姓名
bankName收款银行stringKTB自营通道返回:收款银行名称
{
  "msg": "操作成功",
  "code": 200,
  "data": {
    "mchNum": "M10001",
    "paymentName": "Somchai",
    "transAccNo": "8888888888888",
    "orderCreateTime": "2026-09-01 10:00:00",
    "payMoney": 100.00,
    "paymentImageBase64": "iVBORw0KGgo...",
    "createTime": "2026-09-01 10:00:00",
    "endTime": "2026-09-01 10:10:00",
    "paymentLink": "https://pay.example.com/cashier?orderNo=P2026090110000001",
    "selfBankCard": true,
    "bankCardNo": "xxx-xxx-1234",
    "bankHolder": "Somsak",
    "bankName": "KTB"
  }
}

3. 代收异步通知

代收订单支付结果确定后(成功或失败),平台向商户下单时传入的 notifyUrl 发起 POST 回调,商户验签通过后应答 ok。

POST <notifyUrl>(商户提供的回调地址)
请求方式:POST Content-Type: application/json · 签名请求头:x-signature(平台私钥签名)

通知说明

  • 商户需用平台公钥对报文验签(步骤见 签名算法),验签通过后再处理业务。
  • 应答标准:HTTP 状态码 2xx 且响应体为 ok(忽略大小写与首尾空白),平台视为通知成功;其余情况视为失败。
  • 每次通知的请求报文、签名、HTTP 状态与商户响应都会在平台留痕,可在后台「回调记录」中查询,便于联调排查。
  • 建议商户对未收到通知 / 通知失败的订单,通过 查询代收订单 主动兜底核对。

通知参数(请求体)

字段名名称类型示例值说明
platformOrderNo平台订单号stringP2026090110000001平台生成的订单号
mchOrderNo商户订单号string202609010001商户下单时传入的订单号
mchNum商户编号stringM10001商户编号
mchName商户名称string示例商户商户名称
requestAmount订单金额number100.00下单请求金额
actualPayAmount实际支付金额number100.00实际到账金额
mchFeeAmount商户手续费number2.50本单手续费
orderStatus订单状态stringsuccesssuccess 成功fail 失败
errorMessage错误信息string失败原因,成功时为空字符串
// 平台回调请求示例(x-signature 为平台私钥对下列排序 JSON 的签名)
{
  "platformOrderNo": "P2026090110000001",
  "mchOrderNo": "202609010001",
  "mchNum": "M10001",
  "mchName": "示例商户",
  "requestAmount": 100.00,
  "actualPayAmount": 100.00,
  "mchFeeAmount": 2.50,
  "orderStatus": "success",
  "errorMessage": ""
}

商户应答

// 验签通过并处理完成业务后, 响应(HTTP 200):
ok

// 验签失败可返回(平台视为通知失败, 便于在回调记录中定位):
verify fail
安全提醒
务必先验签后处理业务,并校验 mchNum、mchOrderNo、requestAmount 与商户系统订单一致,防止伪造回调与金额篡改。

4. 查询代收订单

商户通过本接口按商户订单号查询代收订单最新状态,用于结果核对与通知失败的兜底补偿。

POST /adminapi/openapi/payment/merchant/order/order-info
请求方式:POST Content-Type: application/json · 字符编码:UTF-8 · 请求头:x-signature

请求参数

字段名名称必填类型示例值说明
mchNum商户编号是stringM10001商户编号
mchOrderNo商户订单号是string202609010001下单时商户传入的订单号
queryType查询类型是stringcollect查询代收订单固定传 collect;pay 为代付(见第 7 章)
{
  "mchNum": "M10001",
  "mchOrderNo": "202609010001",
  "queryType": "collect"
}

返回参数(data)

字段名名称类型示例值说明
mchNum商户编号stringM10001商户编号
mchName商户名称string示例商户商户名称
platformOrderNo平台订单号stringP2026090110000001平台生成的订单号
mchOrderNo商户订单号string202609010001商户订单号
requestAmount订单金额number100.00下单请求金额
actualPayAmount实际支付金额number100.00实际到账金额,未实际支付时等于订单金额
mchFeeAmount商户手续费number2.50本单手续费
orderStatus订单状态stringsuccessawait / success / fail / awaitfail,详见 订单状态与错误码
settlementStatus结算状态stringUNSETTLED结算状态,当前固定 UNSETTLED(未结算)
{
  "msg": "操作成功",
  "code": 200,
  "data": {
    "mchNum": "M10001",
    "mchName": "示例商户",
    "platformOrderNo": "P2026090110000001",
    "mchOrderNo": "202609010001",
    "requestAmount": 100.00,
    "actualPayAmount": 100.00,
    "mchFeeAmount": 2.50,
    "orderStatus": "success",
    "settlementStatus": "UNSETTLED"
  }
}

5. 代付下单

商户业务系统通过本接口发起付款(出款)订单,平台校验并扣减商户余额后按代付通道路由出款,结果通过异步通知告知商户。

POST /adminapi/openapi/payment/merchant/order/pay
请求方式:POST Content-Type: application/json · 字符编码:UTF-8 · 请求头:x-signature

接口说明

  • 商户订单号 mchOrderNo 在同一商户下必须唯一(与代收订单号相互独立)。
  • 下单即校验商户可用余额是否充足并扣减,余额不足或无可用代付通道时报错。
  • 代付为异步处理:本接口成功仅代表受理成功(data 为空),最终结果以异步通知 / 主动查询为准。

请求参数

字段名名称必填类型示例值说明
mchNum商户编号是stringM10001平台分配的商户编号
mchOrderNo商户订单号是stringP202609020001商户系统内唯一订单号
payMoney付款金额是number500.00出款金额,必须大于 0
transAccNo收款账号是string9999999999999收款人银行卡号 / 账号
paymentName收款人姓名是stringSomsak收款人姓名
bankCode银行编码是stringKBANK收款银行编码
paymentMobile收款人手机号是string0898765432收款人手机号
description业务描述是string商家提现付款业务描述
notifyUrl异步通知地址是stringhttps://shop.example.com/pay-notify订单结果异步回调 URL,详见 代付异步通知
email收款人邮箱否stringa@b.com收款人邮箱
{
  "mchNum": "M10001",
  "mchOrderNo": "P202609020001",
  "payMoney": 500.00,
  "transAccNo": "9999999999999",
  "paymentName": "Somsak",
  "bankCode": "KBANK",
  "paymentMobile": "0898765432",
  "description": "商家提现",
  "notifyUrl": "https://shop.example.com/pay-notify",
  "email": "merchant@example.com"
}

返回参数

受理成功时 code=200、msg=操作成功,无 data;最终出款结果通过异步通知或查询接口获取。

{ "msg": "操作成功", "code": 200 }

6. 代付异步通知

代付订单出款结果确定后(成功或失败),平台向商户下单时传入的 notifyUrl 发起 POST 回调,商户验签通过后应答 ok。

POST <notifyUrl>(商户提供的回调地址)
请求方式:POST Content-Type: application/json · 签名请求头:x-signature(平台私钥签名)

通知说明

  • 商户需用平台公钥对报文验签,通过后再处理业务。
  • 应答标准:HTTP 2xx 且响应体 ok,平台视为通知成功;否则视为失败。
  • 每次通知在后台「回调记录」留痕;建议以 查询代付订单 兜底核对。

通知参数(请求体)

字段名名称类型示例值说明
platformOrderNo平台订单号stringF2026090210000001平台生成的代付订单号
mchOrderNo商户订单号stringP202609020001商户下单时传入的订单号
mchNum商户编号stringM10001商户编号
mchName商户名称string示例商户商户名称
requestAmount付款金额number500.00下单请求金额
mchFeeAmount商户手续费number5.00本单手续费
orderStatus订单状态stringsuccesssuccess 成功fail 失败
errorMessage错误信息string失败原因,成功时为空字符串
{
  "platformOrderNo": "F2026090210000001",
  "mchOrderNo": "P202609020001",
  "mchNum": "M10001",
  "mchName": "示例商户",
  "requestAmount": 500.00,
  "mchFeeAmount": 5.00,
  "orderStatus": "success",
  "errorMessage": ""
}

商户应答

// 验签通过并处理完成业务后, 响应(HTTP 200):
ok

7. 查询代付订单

商户通过本接口按商户订单号查询代付订单最新状态。

POST /adminapi/openapi/payment/merchant/order/order-info
请求方式:POST Content-Type: application/json · 字符编码:UTF-8 · 请求头:x-signature

请求参数

字段名名称必填类型示例值说明
mchNum商户编号是stringM10001商户编号
mchOrderNo商户订单号是stringP202609020001下单时商户传入的订单号
queryType查询类型是stringpay查询代付订单固定传 pay
{
  "mchNum": "M10001",
  "mchOrderNo": "P202609020001",
  "queryType": "pay"
}

返回参数(data)

字段名名称类型示例值说明
mchNum商户编号stringM10001商户编号
mchName商户名称string示例商户商户名称
platformOrderNo平台订单号stringF2026090210000001平台生成的代付订单号
mchOrderNo商户订单号stringP202609020001商户订单号
requestAmount付款金额number500.00下单请求金额
actualPayAmount实际付款金额number500.00实际出款金额(当前等于付款金额)
mchFeeAmount商户手续费number5.00本单手续费
orderStatus订单状态stringsuccessawait / success / fail,详见 订单状态与错误码
settlementStatus结算状态stringUNSETTLED结算状态,当前固定 UNSETTLED
{
  "msg": "操作成功",
  "code": 200,
  "data": {
    "mchNum": "M10001",
    "mchName": "示例商户",
    "platformOrderNo": "F2026090210000001",
    "mchOrderNo": "P202609020001",
    "requestAmount": 500.00,
    "actualPayAmount": 500.00,
    "mchFeeAmount": 5.00,
    "orderStatus": "success",
    "settlementStatus": "UNSETTLED"
  }
}

8. 查询账户余额

商户通过本接口查询账户可用余额、冻结金额与待结算金额,用于出款前的余额核对。

POST /adminapi/openapi/payment/merchant/mch/getMchInfoAccountOut
请求方式:POST Content-Type: application/json · 字符编码:UTF-8 · 请求头:x-signature

请求参数

字段名名称必填类型示例值说明
mchNum商户编号是stringM10001商户编号
currency币种是stringTHB查询的币种
{
  "mchNum": "M10001",
  "currency": "THB"
}

返回参数(data)

字段名名称类型示例值说明
mchNum商户编号stringM10001商户编号
mchName商户名称string示例商户商户名称
currency币种stringTHB请求传入的币种
balance可用余额number12500.00可用于代付下单的余额
freeze冻结金额number0.00冻结金额
waitingSettleAmount待结算金额number3000.00待结算金额
freezeWaitingSettleAmount冻结待结算金额number0.00冻结中的待结算金额
totalAmount总金额number15500.00balance + freeze + waitingSettleAmount
{
  "msg": "操作成功",
  "code": 200,
  "data": {
    "mchNum": "M10001",
    "mchName": "示例商户",
    "currency": "THB",
    "balance": 12500.00,
    "freeze": 0.00,
    "waitingSettleAmount": 3000.00,
    "freezeWaitingSettleAmount": 0.00,
    "totalAmount": 15500.00
  }
}

9. 订单状态与错误码

订单状态取值说明与接口常见错误信息,便于商户系统做状态映射与异常处理。

订单状态(orderStatus)

取值含义适用说明
await处理中代收 / 代付订单已创建,等待支付或出款结果
success成功代收 / 代付收款到账 / 出款成功,终态
fail失败代收 / 代付支付失败 / 出款失败,终态
awaitfail异常待确认仅代收订单异常待人工确认,最终以通知或后续查询为准

返回码

code含义说明
200成功业务受理 / 查询成功
500失败业务失败,msg 为具体错误原因

常见错误信息(msg)

错误信息原因与处理建议
请求体不是合法JSON请求体不是合法 JSON,检查序列化与 Content-Type
缺少参数:mchNum请求体缺少商户编号
商户不存在:{mchNum}商户编号有误或未开通
商户已被禁用商户被平台禁用,联系平台处理
IP不在白名单中:{ip}调用方 IP 未配置到商户 API 白名单(多个 IP 用 | 分隔)
缺少请求头:x-signature未携带签名请求头
商户未配置验签公钥平台侧未配置商户公钥,先完成对接配置
签名验证失败签名不匹配:检查排序规则、序列化格式与私钥是否正确
payMoney必须大于0金额非法
[代收订单]商户订单号重复:{no}代收 mchOrderNo 已存在,更换订单号重试
[代付订单]商户订单号重复:{no}代付 mchOrderNo 已存在,更换订单号重试
无可用代收通道 / 无可用代付通道商户未绑定通道、通道已停用或金额不在通道规则区间,联系平台配置
订单不存在:{no}查询的商户订单号不存在
queryType仅支持: collect/pay查询类型取值非法
平台未配置RSA私钥...平台回调签名私钥未配置(平台侧问题),联系平台在「平台密钥设置」中配置
排查助手
所有商户请求与平台回调均在平台留痕(回调记录含完整请求报文、签名、HTTP 状态与响应),联调对账时请提供 mchNum 与 mchOrderNo 以便快速定位。