安顺科技商户开发者中心
MERCHANT DEVELOPER CENTER
文档/开始/接入说明

接入说明

安顺科技提供代收(收款)与代付(出款)两类商户接口。两者共用同一套商户凭证和签名规则,接口域名由平台提供。

通信协议

项目说明
协议HTTPS
接口域名https://open.ayaypay.cn/
请求方式POST
数据格式JSON(Content-Type: application/json)
字符编码UTF-8
签名算法HmacSHA256,输出小写十六进制,详见签名算法
字段类型除 extra 外,所有字段一律按字符串传递(如 "amount": "100.00"、"timestamp": "1790900000")
时间戳秒级 Unix 时间戳(10 位),与平台服务器偏差不能超过 5 分钟

接口列表

业务接口路径鉴权
代收创建代收订单POST /api/payment/createOrder签名
代收查询代收订单POST /api/payment/queryOrder签名
代收查询代收余额POST /api/payment/queryBalance签名
代付创建代付订单POST /api/payout/createOrder签名 + 代付 IP 白名单
代付查询代付订单POST /api/payout/queryOrder签名 + 代付 IP 白名单
代付查询代付余额POST /api/payout/queryBalance签名 + 代付 IP 白名单

平台还会主动调用商户的地址:代收异步通知、代付异步通知,以及开启后的下单前反查。

统一响应格式

{
  "code": 0,
  "data": {},
  "msg": "成功"
}
  • code = 0 表示成功,其他值(目前为 7)表示失败。请先判断 code,再解析 data。
  • 失败时 data 为空对象,msg 为错误信息,可以在错误速查中查询,或用响应解读工具粘贴完整响应。
  • 下单失败的 msg 带前缀:代收为 下单失败:(半角冒号),代付为 下单失败:(全角冒号)。

商户凭证

凭证说明
merchant_code商户编码,接口请求的身份标识;代收、代付相同
api_keyAPI 签名密钥,用于请求签名和验证通知签名;代收、代付共用同一个密钥

api_key 请妥善保管,只在服务端使用,切勿写进网页、App 等前端代码,也不要提交到代码仓库。

代付开通条件

调用代付接口前,需要平台为商户完成以下配置,缺少任意一项接口都会被拒绝:

条件说明未满足时的错误信息
开通代付业务商户级代付总开关商户未开通代付业务
开通代付 API 下单默认开通,平台可以单独关闭商户未开通代付API下单
配置代付 IP 白名单请求来源 IP 必须在代付 IP 白名单内;白名单为空时一律拒绝请求IP[x.x.x.x]不在代付白名单
绑定代付产品下单的 product_code 必须是已为商户开通的代付产品[产品编码]商户未开通该代付产品
开通代付钱包并充值代付余额与代收余额相互独立,余额不足时下单失败代付余额不足

代付 IP 白名单

  • 代付的三个接口都只接受白名单内 IP 的请求,白名单为空时一律拒绝。代收接口没有 IP 白名单。
  • 请提供发起代付请求的服务器的出口公网 IP。可以在服务器上执行下面的命令查询(见出口 IP 查询):
curl -s https://<本站域名>/api/ip
  • 支持单个 IP(IPv4 / IPv6)或 CIDR 网段(如 203.0.113.0/24),多个用逗号、分号、空格或换行分隔。
  • 被拒绝时错误信息会带出平台识别到的请求 IP:请求IP[x.x.x.x]不在代付白名单,可以据此核对。
  • 商户可在商户门户「个人资料 → 代付业务」查看当前配置。

代付资金规则

  • 扣款金额 = 出款金额 + 手续费;手续费 = 出款金额 × 费率 + 单笔固定费,四舍五入保留两位小数。
  • 下单受理时,扣款金额从可用余额冻结;出款成功后从总额扣除并解冻;出款失败则解冻、退回可用余额。
  • 代付余额口径:balance(总额,含冻结)、frozen_balance(冻结中)、available_balance(可用 = 总额 − 冻结)。

鉴权错误

以下错误由签名校验环节返回,所有接口都可能遇到:

错误信息(msg)原因解决办法
请求体为空或读取失败没有携带请求体以 JSON 格式提交请求体(Content-Type: application/json)
请求参数格式错误请求体不是合法的 JSON 对象检查 JSON 格式与 Content-Type;顶层必须是对象 {...}
缺少必要参数 merchant_code 或 sign请求中缺少商户编码或签名;旧版代付字段 mch_id 已不再识别传入 merchant_code 与 sign;旧版代付商户请按迁移指南改造字段
商户不存在或已禁用merchant_code 无效,或商户已被禁用确认商户编码正确且账号状态正常
商户未开通代收业务商户的代收业务开关已关闭联系平台开通代收业务
商户未开通代付业务商户未开通代付业务联系平台开通代付业务
商户未开通代付API下单代付 API 下单开关被关闭联系平台开通代付 API 下单
请求IP[x.x.x.x]不在代付白名单请求来源 IP 不在代付 IP 白名单内,或白名单为空(为空时一律拒绝)把错误信息中的 IP(即服务器出口 IP)提供给平台,加入代付 IP 白名单
商户API密钥未配置平台尚未为该商户配置 api_key联系平台管理员配置密钥
缺少时间戳参数未传 timestamp,或按数字类型传递(数字值会被忽略)timestamp 按字符串传,如 "1748332800"
时间戳格式错误timestamp 不是整数形式的字符串传 10 位秒级 Unix 时间戳字符串
时间戳缺失或格式错误未传 timestamp、按数字类型传递,或不是整数字符串timestamp 按字符串传 10 位秒级时间戳,如 "1790900000"
请求已过期(时间戳偏差超过5分钟)timestamp 与平台服务器时间相差超过 300 秒同步服务器时间(建议 NTP),每次请求取当前时间
签名验证失败sign 计算结果与平台不一致用请求诊断粘贴实际请求,自动定位原因;或对照签名排查清单
请求参数转换失败请求参数无法解析检查请求体是否为合法 JSON 对象
Key: '…Field' Error:Field validation for '[字段]' failed on the 'required' tag缺少必填字段(括号内为后端结构体字段名,如 PayeeBank 对应 payee_bank)按接口文档补全必填字段(代付错误带 参数错误: 前缀)
json: cannot unmarshal number into Go struct field ….[字段] of type string字段类型不对:该字段必须是字符串,但传了数字 / 布尔等所有字段(extra 除外)一律按字符串传,如 "amount": "100.00"

对接建议

  1. 阅读签名算法,先用文档中的测试向量验证自己的签名实现;
  2. 在文档右侧或调试台填写参数,得到可直接发送的请求和多语言代码片段;
  3. 请求失败时,用请求诊断粘贴实际请求,自动定位签名错误;用响应解读查看错误原因;
  4. 用通知模拟测试回调处理与验签代码;开启了下单前反查的代付商户,用反查自测测试反查接口。
文档/开始/签名算法

签名算法

所有接口请求和平台发出的异步通知都使用同一套签名规则:HmacSHA256,输出小写十六进制。代收、代付规则完全一致,共用同一个 api_key。

签名步骤

Step 1 筛选参数

  • 只取值为字符串的字段。数字、布尔、null、对象、数组一律不参与签名(平台会直接忽略它们);
  • 排除 sign 字段(签名本身不参与);
  • 排除 extra 字段(扩展字段不参与);
  • 排除值为空字符串的字段。

Step 2 排序

将剩余参数按 key 的 ASCII 码升序排列(区分大小写,按字节比较;不要用 localeCompare 或自然排序)。

Step 3 拼接待签名字符串

格式:key1=value1&key2=value2&key3=value3。值使用原文,不做 URL 编码、不去首尾空格;中文按 UTF-8 参与计算;首尾没有多余的 &。

Step 4 计算签名

以 api_key 作为 HMAC 密钥,对待签名字符串执行 HmacSHA256,输出小写十六进制字符串(64 个字符):

sign = HmacSHA256(待签名字符串, api_key)

所有字段一律按字符串传。 例如 "amount": 100 是数字,平台计算签名时会忽略它,而你的代码很可能把它拼进了待签名串,于是签名不一致;timestamp 按数字传还会直接报"时间戳缺失"。请写成 "amount": "100.00"、"timestamp": "1790900000"。

签名示例

以代付下单为例,假设 api_key 为 demo_api_key_123456,请求参数如下:

{
  "merchant_code": "MCH10001",
  "merchant_order_no": "P20261002001",
  "product_code": "BANK_PAYOUT",
  "amount": "1000.00",
  "payee_name": "张三",
  "payee_account": "6222020200112233446",
  "payee_bank": "招商银行",
  "payee_alias": "",
  "notify_url": "https://merchant.com/payout/callback",
  "timestamp": "1790900000",
  "extra": { "user_id": "12345" },
  "sign": ""
}

Step 1 — 排除 sign、extra、空值 payee_alias 后剩余 9 个字段:

amount=1000.00
merchant_code=MCH10001
merchant_order_no=P20261002001
notify_url=https://merchant.com/payout/callback
payee_account=6222020200112233446
payee_bank=招商银行
payee_name=张三
product_code=BANK_PAYOUT
timestamp=1790900000

Step 2 — 已按 key 升序排列。

Step 3 — 拼接:

amount=1000.00&merchant_code=MCH10001&merchant_order_no=P20261002001&notify_url=https://merchant.com/payout/callback&payee_account=6222020200112233446&payee_bank=招商银行&payee_name=张三&product_code=BANK_PAYOUT&timestamp=1790900000

Step 4 — 计算:

sign = HmacSHA256(待签名字符串, "demo_api_key_123456")
     = 9ebeba22878514abfd77471467b126d2c9cba50fee8652dc260176f49dfce0fe

在线计算

粘贴任意参数 JSON,逐步查看哪些字段参与签名、哪些被跳过:

[ 02 ]签名计算器SIGN CALCULATOR
规则:只取非空字符串值,排除 sign / extra,按 key 的 ASCII 升序拼接 k=v&k=v,HmacSHA256 输出小写十六进制。
⌁输入参数 JSON 后计算
逐步展示待签名串与签名

测试向量

以下 9 组数据均以 api_key = demo_api_key_123456 计算。你的签名实现对它们都能算出相同的 sign,就说明实现正确:

编号场景待签名串 → sign(api_key = demo_api_key_123456)
V1代付下单amount=1000.00&merchant_code=MCH10001&merchant_order_no=P20261002001&notify_url=https://merchant.com/payout/callback&payee_account=6222020200112233446&payee_bank=招商银行&payee_name=张三&product_code=BANK_PAYOUT&timestamp=1790900000
9ebeba22878514abfd77471467b126d2c9cba50fee8652dc260176f49dfce0fe
V2代付查单merchant_code=MCH10001&merchant_order_no=P20261002001&timestamp=1790900060
5000e7d65ae86d54deb85319150db28316ebcfa5223d4738752e08e9d9d7383b
V3代付查余额merchant_code=MCH10001&timestamp=1790900060
fb2116de1c6a386403430f07cb02fb39521126bb958783aebbcd9f080d839865
V4代付成功通知amount=1000.00&completed_at=2026-10-02 12:03:45&deduct_amount=1012.00&fee_amount=12.00&merchant_code=MCH10001&merchant_order_no=P20261002001&order_id=Ananpay20261002120000123a1b2c3d4&product_code=BANK_PAYOUT&status=9
14231c203ad9c58642b5424107bd50283691686041ac9e9c66b8b0cdffac6c93
V5代付失败通知amount=1000.00&completed_at=2026-10-02 12:03:45&deduct_amount=1012.00&fail_reason=收款账户户名不符&fee_amount=12.00&merchant_code=MCH10001&merchant_order_no=P20261002001&order_id=Ananpay20261002120000123a1b2c3d4&product_code=BANK_PAYOUT&status=4
d7730fa42dd0c337736d389a97d236636e54e674fa9a2ee51035ee3893fe8fa9
V6代收下单amount=100.00&client_ip=203.0.113.50&merchant_code=MCH10001&merchant_order_no=T20260527001&notify_url=https://merchant.com/callback&product_code=UPI_COLLECT&subject=会员充值&timestamp=1748332800
f5be0eca54150500d7b51b20ec783b3833efc65ddb5a5e730512b70816ef4aca
V7代收查单merchant_code=MCH10001&order_id=COL20260527143000123abcd&timestamp=1748332860
48a3b9e7f1a1739a46f2101921128d061b9deb8914c38a14e763cd9b65903595
V8代收查余额merchant_code=MCH10001&timestamp=1748332860
4bd995ab430faafd97122a3b1ac1cec5603e9d8dedc273fc78f127aaf472f073
V9代收成功通知amount=100.00&completed_at=2026-05-27 14:35:22&created_at=2026-05-27 14:30:00&mch_fee_amount=3.00&merchant_code=MCH10001&merchant_order_no=T20260527001&order_id=COL20260527143000123abcd&product_code=UPI_COLLECT&real_amount=97.00&status=9
453e1718048de8aaefb1d08ce7b0e926c69fe0fef79cf37b67a33edb7dc0b5d6

各语言实现

以下实现都严格遵循上面的规则(只签非空字符串、排除 sign / extra、按 key 升序)。在调试台生成请求后,还可以直接复制带完整请求代码的片段。

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.*;

public static String sign(Map<String, ?> params, String apiKey) throws Exception {
    TreeMap<String, String> sorted = new TreeMap<>();
    for (Map.Entry<String, ?> e : params.entrySet()) {
        String k = e.getKey();
        Object v = e.getValue();
        // 只取非空字符串;排除 sign、extra
        if ("sign".equals(k) || "extra".equals(k) || !(v instanceof String) || ((String) v).isEmpty()) continue;
        sorted.put(k, (String) v);
    }
    StringJoiner payload = new StringJoiner("&");
    sorted.forEach((k, v) -> payload.add(k + "=" + v));
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(new SecretKeySpec(apiKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
    byte[] hash = mac.doFinal(payload.toString().getBytes(StandardCharsets.UTF_8));
    StringBuilder hex = new StringBuilder();
    for (byte b : hash) hex.append(String.format("%02x", b));
    return hex.toString();
}
function pmgw_sign(array $params, string $apiKey): string {
    $data = [];
    foreach ($params as $k => $v) {
        // 只取非空字符串;排除 sign、extra
        if ($k === 'sign' || $k === 'extra' || !is_string($v) || $v === '') continue;
        $data[(string) $k] = $v;
    }
    ksort($data, SORT_STRING);
    $pairs = [];
    foreach ($data as $k => $v) $pairs[] = $k . '=' . $v;
    return hash_hmac('sha256', implode('&', $pairs), $apiKey);
}
import hashlib, hmac

def sign(params: dict, api_key: str) -> str:
    # 只取非空字符串;排除 sign、extra
    items = sorted((k, v) for k, v in params.items()
                   if k not in ("sign", "extra") and isinstance(v, str) and v != "")
    payload = "&".join(f"{k}={v}" for k, v in items)
    return hmac.new(api_key.encode("utf-8"), payload.encode("utf-8"), hashlib.sha256).hexdigest()
const crypto = require('crypto');

function sign(params, apiKey) {
  const payload = Object.keys(params)
    // 只取非空字符串;排除 sign、extra
    .filter((k) => k !== 'sign' && k !== 'extra' && typeof params[k] === 'string' && params[k] !== '')
    .sort()
    .map((k) => k + '=' + params[k])
    .join('&');
  return crypto.createHmac('sha256', apiKey).update(payload, 'utf8').digest('hex');
}
import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"sort"
	"strings"
)

func Sign(params map[string]any, apiKey string) string {
	keys := make([]string, 0, len(params))
	for k, v := range params {
		s, ok := v.(string) // 只取非空字符串;排除 sign、extra
		if k == "sign" || k == "extra" || !ok || s == "" {
			continue
		}
		keys = append(keys, k)
	}
	sort.Strings(keys)
	parts := make([]string, 0, len(keys))
	for _, k := range keys {
		parts = append(parts, k+"="+params[k].(string))
	}
	mac := hmac.New(sha256.New, []byte(apiKey))
	mac.Write([]byte(strings.Join(parts, "&")))
	return hex.EncodeToString(mac.Sum(nil))
}

通知验签

平台发出的异步通知同样携带 sign,商户收到后必须验签:

  1. 取通知报文中的所有字段,按上面的规则筛选(排除 sign、extra、空值和非字符串值);
  2. 按同样的规则计算签名;
  3. 与通知中的 sign 比较(建议忽略大小写,并使用常量时间比较);
  4. 一致才处理业务,不一致则忽略该通知。

验签时请遍历报文中的所有字段,不要写死字段列表。平台在不同状态下发送的字段不同(例如代付失败通知才有 fail_reason),写死的列表会导致验签失败。

签名排查清单

遇到 签名验证失败 时,推荐直接用请求诊断粘贴实际请求自动定位;也可以按下面的清单逐项排查:

  1. 密钥是否正确:使用平台分配的 api_key(代收、代付相同),注意区分大小写和测试 / 生产环境;
  2. 字段类型是否为字符串:数字、布尔值不参与平台签名,所有字段请按字符串传;
  3. 字段是否完整:所有非空的字符串字段(除 sign、extra)都要参与签名,包括你多传的字段;
  4. 排序是否正确:严格按 key 的 ASCII 码升序;
  5. 空值是否排除:值为空字符串的字段不参与签名;
  6. sign 和 extra 是否排除:这两个字段不参与签名;
  7. 拼接格式是否正确:key1=value1&key2=value2,值不做 URL 编码,首尾没有多余的 &;
  8. 算法是否正确:HmacSHA256,不是 SHA256、不是 MD5,也不要在待签名串末尾拼接 &key=...;
  9. 输出格式是否正确:小写十六进制字符串(64 个字符),不是 Base64;
  10. 编码是否一致:待签名字符串和密钥均使用 UTF-8(中文姓名、银行名尤其注意);
  11. 签名值与发送值是否一致:签名时用的值必须和实际发送的值完全相同(例如不要签 100、发 100.00);
  12. 用测试向量自测:用上面的测试向量和 demo_api_key_123456 计算,结果应与文档一致。
文档/代收/创建代收订单

创建代收订单

POST/api/payment/createOrder代收鉴权:签名验证

商户发起代收,平台返回支付链接、二维码、虚拟账户或表单等支付信息,商户引导用户完成支付。支付成功后平台向 notify_url 发送异步通知。

请求参数

参数类型必填签名说明
merchant_codestring是非空时参与商户编码,由平台分配(代收、代付共用)
merchant_order_nostring是非空时参与商户订单号,10~64 个字符,本商户内唯一,同一单号不可重复提交
product_codestring是非空时参与代收产品编码,由平台分配
amountstring是非空时参与订单金额(元),纯数字、最多两位小数且大于 0,建议保留两位小数,如 "100.00"
notify_urlstring是非空时参与异步通知地址,以 http:// 或 https:// 开头;支付成功后平台向此地址推送结果
return_urlstring否非空时参与前端跳转地址,支付完成后用户浏览器跳转到此地址
client_ipstring是非空时参与终端用户真实 IP(用于支付机构风控),请传用户 IP,不要传商户服务器 IP
subjectstring是非空时参与商品标题(支付机构风控要求),如"会员充值"
descriptionstring否非空时参与商品简介
timestampstring是非空时参与当前 Unix 时间戳(秒,10 位),必须按字符串传;与平台服务器时间偏差不能超过 5 分钟
extraobject / array否不参与扩展字段,JSON 对象或数组;不参与签名,查单与通知时原样返回
signstring是—签名:HmacSHA256(待签名串, api_key),小写十六进制 64 位

请求示例

请求示例 · V6
{
  "merchant_code": "MCH10001",
  "merchant_order_no": "T20260527001",
  "product_code": "UPI_COLLECT",
  "amount": "100.00",
  "notify_url": "https://merchant.com/callback",
  "client_ip": "203.0.113.50",
  "subject": "会员充值",
  "timestamp": "1748332800",
  "extra": {
    "user_id": "12345"
  },
  "sign": "f5be0eca54150500d7b51b20ec783b3833efc65ddb5a5e730512b70816ef4aca"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:amount=100.00&client_ip=203.0.113.50&merchant_code=MCH10001&merchant_order_no=T20260527001&notify_url=https://merchant.com/callback&product_code=UPI_COLLECT&subject=会员充值&timestamp=1748332800

响应参数

成功(code = 0)时,data 包含:

参数类型说明
order_idstring系统订单号
payment_typestring支付方式:payUrl / qrCode / bankVa / formSubmit,见下表
payment_valuestring支付值:支付链接、二维码内容、虚拟账户信息或 HTML 表单
expire_timestring过期时间(2006-01-02 15:04:05)

payment_type 支付方式

值说明商户处理方式
payUrl支付链接(H5 跳转)引导用户浏览器跳转到 payment_value
qrCode二维码把 payment_value 生成二维码供用户扫码
bankVa虚拟账户展示 payment_value 中的账户信息供用户转账
formSubmit表单 POST把 payment_value 中的 HTML 表单渲染到页面并自动提交

响应示例

成功响应示例
{
  "code": 0,
  "data": {
    "order_id": "COL20260527143000123abcd",
    "payment_type": "payUrl",
    "payment_value": "https://pay.example.com/cashier?token=xxx",
    "expire_time": "2026-05-27 15:00:00"
  },
  "msg": "下单成功"
}
失败响应示例
{
  "code": 7,
  "data": {},
  "msg": "下单失败:支付通道繁忙,请稍后重试"
}

注意事项

  • merchant_order_no 必须唯一。下单失败(出码失败)后该单号已被占用,重试需要换新的订单号。
  • extra 如果传递,必须是 JSON 对象或数组(如 {"user_id":"123"}),不能是字符串或数字;extra 不参与签名。
  • client_ip 请传终端用户的真实 IP,不要传商户服务器 IP。
  • timestamp 与平台服务器时间偏差超过 5 分钟会被拒绝,请保持服务器时间同步(建议 NTP)。
  • 除 extra 外,所有参数一律按字符串传递:数字、布尔等非字符串值不参与平台的签名计算,会导致验签失败。

常见错误

下单失败时 msg 以 下单失败:(半角冒号)开头。签名、时间戳等鉴权类错误见接入说明。

错误信息(msg)原因解决办法
[金额]金额格式错误:仅支持数字且最多两位小数amount 格式不正确使用纯数字、最多两位小数的字符串,如 "100.00"
[金额]金额格式错误或金额必须大于0amount 不大于 0传入大于 0 的金额
extra字段格式错误: extra must be json object or arrayextra 不是 JSON 对象或数组(例如传成了字符串)extra 传 JSON 对象,如 {"user_id":"123"}
[产品编码]产品不存在或已禁用product_code 无效或产品已停用确认产品编码正确,或联系平台
[产品编码]商户未绑定该产品商户未开通该代收产品联系平台绑定产品
[商户订单号]重复的订单号merchant_order_no 已被使用(包括之前出码失败的订单)换新的商户订单号
[系统订单号]系统订单号重复,请重试平台生成订单号碰撞(极少见)换新的商户订单号重试
代收系统维护中,暂停接单平台暂停代收接单稍后重试,或联系平台
商户通道配置受限,请联系平台客服商户在该产品下没有可用通道(配置限制)联系平台客服
下单金额不在支持范围内,请调整金额后重试金额超出可用通道的金额范围调整金额后用新单号重试
当前时段通道暂停服务,请稍后重试当前时段没有开放的通道稍后用新单号重试
通道暂时不可用,请稍后重试或联系客服通道暂不可用稍后用新单号重试,或联系客服
支付通道繁忙,请稍后重试候选通道均调用失败(出码失败)稍后用新单号重试
通道响应支付值为空(…)上游通道未返回支付链接 / 二维码稍后用新单号重试,或联系平台
创建订单失败,请稍后重试平台内部错误先查单确认,再用新单号重试
商户信息获取失败平台内部错误稍后重试
系统授权已到期,暂停受理订单平台系统授权到期联系平台
系统繁忙,请稍后重试平台内部错误先查单确认订单是否已创建,再决定是否重试
文档/代收/查询代收订单

查询代收订单

POST/api/payment/queryOrder代收鉴权:签名验证

按商户订单号或系统订单号查询代收订单的状态与金额。建议在没有收到异步通知、或需要对账时使用。

请求参数

参数类型必填签名说明
merchant_codestring是非空时参与商户编码,由平台分配(代收、代付共用)
merchant_order_nostring二选一非空时参与商户订单号(与 order_id 二选一)
order_idstring二选一非空时参与系统订单号(与 merchant_order_no 二选一;两者都传时以 order_id 为准)
timestampstring是非空时参与当前 Unix 时间戳(秒,10 位),必须按字符串传;与平台服务器时间偏差不能超过 5 分钟
signstring是—签名:HmacSHA256(待签名串, api_key),小写十六进制 64 位

请求示例

请求示例 · V7
{
  "merchant_code": "MCH10001",
  "order_id": "COL20260527143000123abcd",
  "timestamp": "1748332860",
  "sign": "48a3b9e7f1a1739a46f2101921128d061b9deb8914c38a14e763cd9b65903595"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:merchant_code=MCH10001&order_id=COL20260527143000123abcd&timestamp=1748332860

响应参数

参数类型说明
order_idstring系统订单号
merchant_order_nostring商户订单号
product_codestring产品编码
amountstring订单金额
real_amountstring商户到账金额(扣除手续费后)
mch_fee_amountstring商户手续费
statusstring订单状态码,见订单状态码
status_flagstring订单状态描述(中文)
payment_typestring支付方式
payment_valuestring支付链接 / 支付值
extraobject / null下单时传入的扩展字段,原样返回
expire_timestring过期时间
created_atstring订单创建时间(2006-01-02 15:04:05)
completed_atstring订单完结时间(未完结时为空)

订单状态码的含义见代收订单状态码。

响应示例

成功响应示例
{
  "code": 0,
  "data": {
    "order_id": "COL20260527143000123abcd",
    "merchant_order_no": "T20260527001",
    "product_code": "UPI_COLLECT",
    "amount": "100.00",
    "real_amount": "97.00",
    "mch_fee_amount": "3.00",
    "status": "9",
    "status_flag": "支付成功",
    "payment_type": "payUrl",
    "payment_value": "https://pay.example.com/cashier?token=xxx",
    "extra": {
      "user_id": "12345",
      "order_type": "vip"
    },
    "expire_time": "2026-05-27 15:00:00",
    "created_at": "2026-05-27 14:30:00",
    "completed_at": "2026-05-27 14:35:22"
  },
  "msg": "操作成功"
}
失败响应示例
{
  "code": 7,
  "data": {},
  "msg": "订单不存在"
}

注意事项

  • merchant_order_no 与 order_id 至少传一个;两个都传时以 order_id 为准。
  • 只能查询本商户的订单。

常见错误

错误信息(msg)原因解决办法
缺少查询参数(merchant_order_no 或 order_id 至少传一个)查单时两个单号都没传至少传入一个订单号
订单不存在订单号无效,或订单不属于该商户检查 order_id / merchant_order_no
文档/代收/查询代收余额

查询代收余额

POST/api/payment/queryBalance代收鉴权:签名验证

查询商户代收钱包的余额、冻结金额与可用余额。只需要商户编码和时间戳。

请求参数

参数类型必填签名说明
merchant_codestring是非空时参与商户编码,由平台分配(代收、代付共用)
timestampstring是非空时参与当前 Unix 时间戳(秒,10 位),必须按字符串传;与平台服务器时间偏差不能超过 5 分钟
signstring是—签名:HmacSHA256(待签名串, api_key),小写十六进制 64 位

请求示例

请求示例 · V8
{
  "merchant_code": "MCH10001",
  "timestamp": "1748332860",
  "sign": "4bd995ab430faafd97122a3b1ac1cec5603e9d8dedc273fc78f127aaf472f073"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:merchant_code=MCH10001&timestamp=1748332860

响应参数

参数类型说明
merchant_codestring商户编码
balancestring代收钱包余额(含冻结金额)
frozenstring冻结金额
availablestring可用余额(= balance − frozen),关注此值即可

响应示例

成功响应示例
{
  "code": 0,
  "data": {
    "merchant_code": "MCH10001",
    "balance": "50000.00",
    "frozen": "2000.00",
    "available": "48000.00"
  },
  "msg": "操作成功"
}
失败响应示例
{
  "code": 7,
  "data": {},
  "msg": "代收钱包不存在"
}

注意事项

  • 代收余额字段为 balance / frozen / available,与代付余额接口的字段名不同。

常见错误

错误信息(msg)原因解决办法
代收钱包不存在商户未开通代收钱包联系平台开通钱包
文档/代收/代收异步通知

代收异步通知

代收订单支付成功(status = 9)后,平台向下单时传入的 notify_url 发送异步通知。商户必须验签,处理完成后返回 success。

通知说明

项目说明
请求方式POST
数据格式JSON(Content-Type: application/json;charset=utf-8)
超时时间15 秒
触发条件仅支付成功(status = 9)时发送;冲正、取消等状态不发送
重试策略首次发送失败后按 15s、30s、1min、2min、5min 间隔重试(共 5 次)
成功判定商户响应体去除首尾空白后为 success 或 ok(不区分大小写)

notify_url 中包含测试域名(localhost、127.0.0.1、example.com、google.com、baidu.com)时,平台不会实际发送,直接视为通知成功。

通知参数

参数类型说明出现条件
order_idstring系统订单号总是
merchant_codestring商户编码总是
merchant_order_nostring商户订单号总是
statusstring订单状态,固定为 "9"(支付成功)总是
amountstring订单金额总是
real_amountstring商户到账金额(扣除手续费后)总是
product_codestring产品编码总是
mch_fee_amountstring商户手续费总是
extraobject下单时传入的扩展字段,原样返回;不参与签名下单时传了 extra
created_atstring订单创建时间(2006-01-02 15:04:05)总是
completed_atstring订单完结(支付成功)时间(2006-01-02 15:04:05)有值时
signstring签名,商户必须验签总是

通知示例

代收成功通知示例 · V9
{
  "order_id": "COL20260527143000123abcd",
  "merchant_code": "MCH10001",
  "merchant_order_no": "T20260527001",
  "status": "9",
  "amount": "100.00",
  "real_amount": "97.00",
  "product_code": "UPI_COLLECT",
  "mch_fee_amount": "3.00",
  "extra": {
    "user_id": "12345",
    "order_type": "vip"
  },
  "created_at": "2026-05-27 14:30:00",
  "completed_at": "2026-05-27 14:35:22",
  "sign": "453e1718048de8aaefb1d08ce7b0e926c69fe0fef79cf37b67a33edb7dc0b5d6"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:amount=100.00&completed_at=2026-05-27 14:35:22&created_at=2026-05-27 14:30:00&mch_fee_amount=3.00&merchant_code=MCH10001&merchant_order_no=T20260527001&order_id=COL20260527143000123abcd&product_code=UPI_COLLECT&real_amount=97.00&status=9

金额等字段均为字符串。请按数值比较金额,不要按字符串比较(例如 "100" 与 "100.00")。

商户验签

收到通知后,商户必须验证签名以确认通知来源合法:

  1. 取通知报文中的所有字段,排除 sign、extra、空值和非字符串值;
  2. 按签名算法计算签名;
  3. 与通知中的 sign 比较;
  4. 一致才处理业务,不一致则忽略该通知。

右侧(或下方)的验签工具可以直接粘贴收到的报文验证;通知模拟可以构造一条已签名的通知发到你的 notify_url,不用真实下单就能测试回调处理。

商户响应

处理完成后,HTTP 响应体返回:

success

若平台没有收到 success 或 ok(含超时、网络错误),会按重试策略重发。同一订单可能收到多次通知,请以 order_id 做好幂等处理。

文档/代收/代收订单状态码

代收订单状态码

查询代收订单返回的 status 取值如下。只有支付成功(9)会触发异步通知。

状态码描述说明发送通知终态
0待处理订单刚创建,系统尚未开始处理不通知否
1等待支付出码成功,等待用户完成支付不通知否
4出码失败没有可用通道,未能生成支付信息不通知是
5订单冲正订单成功后发生冲正处理不通知是
9支付成功用户已完成支付并确认到账✓ 通知是
10订单取消订单超时未支付或被取消不通知是

典型状态流转

创建订单 → 等待支付(1) → 支付成功(9)
                       → 订单取消(10)   // 超时未支付
创建订单 → 出码失败(4)                  // 没有可用通道
支付成功(9) → 订单冲正(5)               // 少数情况,不发送通知

终态:4(出码失败)、5(冲正)、9(成功)、10(取消)。通知触发:仅 9(支付成功)会触发异步通知。

文档/代付/创建代付订单

创建代付订单

POST/api/payout/createOrder代付鉴权:签名验证 + 代付 IP 白名单

商户发起代付(出款)。下单成功只代表平台已受理(status = 1),出款结果以异步通知或查单为准。

这是真实出款接口:请求必须从已加入代付 IP 白名单的服务器发出;网络超时或无法确定是否下单成功时,先用商户订单号查单确认,切勿直接换新单号重发,否则可能重复出款。

请求参数

参数类型必填签名说明
merchant_codestring是非空时参与商户编码,由平台分配(代收、代付共用)
merchant_order_nostring是非空时参与商户订单号,10~64 个字符,本商户内唯一
product_codestring是非空时参与代付产品编码,由平台分配
amountstring是非空时参与出款金额(元),纯数字、最多两位小数且大于 0,如 "1000"、"1000.50"
payee_namestring是非空时参与收款人姓名,最多 64 个字符
payee_accountstring是非空时参与收款账号,最多 128 个字符;部分产品会校验账号格式,见收款账号格式校验
payee_bankstring是非空时参与收款银行,最多 64 个字符;非银行卡类产品填收款机构名称(如 "支付宝")
payee_aliasstring否非空时参与付款人别名 / 玩家信息,最多 64 个字符(对应旧版 from_name)
payee_addressstring否非空时参与收款人地址,最多 255 个字符
verify_nostring否非空时参与核查组号,最多 32 个字符
notify_urlstring否非空时参与异步通知地址,以 http:// 或 https:// 开头,最多 255 个字符;不传则不回调
timestampstring是非空时参与当前 Unix 时间戳(秒,10 位),必须按字符串传;与平台服务器时间偏差不能超过 5 分钟
extraobject / array否不参与扩展字段,JSON 对象或数组;不参与签名,查单与通知时原样返回。开启下单前反查时在此传 verify_url、verify_token
signstring是—签名:HmacSHA256(待签名串, api_key),小写十六进制 64 位

字符串参数的首尾空白会被平台去除后再校验和入库;签名按原值计算。长度上限按字符数计算(一个汉字算 1 个字符)。

收款账号格式校验

平台可以按代付产品开启收款账号格式校验(未开启的产品不校验格式):

产品校验类型要求不符合时的错误信息
银行卡13~19 位纯数字,且通过银行卡号校验位(Luhn)校验收款账号格式错误:银行卡号应为13~19位数字 / 收款账号格式错误:银行卡号校验位不正确
支付宝中国大陆手机号(1 开头 11 位数字)或邮箱收款账号格式错误:支付宝账号应为手机号或邮箱

调试面板中的"收款账号预检"可以提前按这两种规则检查。

请求示例

请求示例 · V1
{
  "merchant_code": "MCH10001",
  "merchant_order_no": "P20261002001",
  "product_code": "BANK_PAYOUT",
  "amount": "1000.00",
  "payee_name": "张三",
  "payee_account": "6222020200112233446",
  "payee_bank": "招商银行",
  "notify_url": "https://merchant.com/payout/callback",
  "timestamp": "1790900000",
  "extra": {
    "user_id": "12345"
  },
  "sign": "9ebeba22878514abfd77471467b126d2c9cba50fee8652dc260176f49dfce0fe"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:amount=1000.00&merchant_code=MCH10001&merchant_order_no=P20261002001&notify_url=https://merchant.com/payout/callback&payee_account=6222020200112233446&payee_bank=招商银行&payee_name=张三&product_code=BANK_PAYOUT&timestamp=1790900000

开启下单前反查后,每笔下单还需在 extra 中携带 verify_url 和 verify_token(extra 不参与签名)。

响应参数

成功(code = 0)时,data 包含:

参数类型说明
order_idstring平台订单号
merchant_order_nostring商户订单号
amountstring出款金额(两位小数)
fee_amountstring手续费
deduct_amountstring扣款金额(出款金额 + 手续费),已从可用余额冻结
statusstring订单状态,固定为 "1"(处理中)
created_atstring创建时间(2006-01-02 15:04:05)

响应示例

成功响应示例
{
  "code": 0,
  "data": {
    "order_id": "Ananpay20261002120000123a1b2c3d4",
    "merchant_order_no": "P20261002001",
    "amount": "1000.00",
    "fee_amount": "12.00",
    "deduct_amount": "1012.00",
    "status": "1",
    "created_at": "2026-10-02 12:00:00"
  },
  "msg": "下单成功"
}
失败响应示例
{
  "code": 7,
  "data": {},
  "msg": "下单失败:代付余额不足"
}

注意事项

  • 下单成功只代表受理:code=0 时订单为处理中(status=1),出款结果以异步通知或查单为准。
  • 下单失败(code=7)时订单未创建、资金未冻结,修正问题后可以用同一商户订单号重新提交。
  • 订单一旦创建,无论最终成功还是失败,商户订单号都会被占用,后续出款需使用新的订单号。
  • 网络超时或无法确定是否下单成功时,请先用该商户订单号查单确认,切勿直接换新单号重发,否则可能重复出款;收到 商户单号重复 时同样先查单。
  • 字符串参数的首尾空白会被平台去除后再校验和入库;签名按原值计算。
  • timestamp 与平台服务器时间偏差超过 5 分钟会被拒绝。

资金变动

下单受理时,扣款金额(出款金额 + 手续费)从可用余额冻结;出款成功后从总额扣除并解冻;出款失败则解冻、退回可用余额。详见代付状态码与资金。

常见错误

下单失败时 msg 以 下单失败:(全角冒号)开头,此时订单未创建、资金未冻结。签名、IP 白名单等鉴权类错误见接入说明。

错误信息(msg)原因解决办法
[金额]金额格式错误:仅支持数字且最多两位小数amount 格式不正确使用 "1000" 或 "1000.50" 形式的字符串
[金额]金额必须大于0amount 不大于 0传入大于 0 的金额
商户单号不能为空merchant_order_no 为空白传入有效的商户订单号
产品编码不能为空product_code 为空白传入代付产品编码
收款人姓名和收款账号不能为空payee_name 或 payee_account 为空白补全收款信息
收款银行不能为空payee_bank 为空白填写收款银行;非银行卡类产品填收款机构名称(如 "支付宝")
[字段]过长(最多N个字符)字段超出长度上限(按字符数计)按参数表的长度限制调整
回调地址必须以 http:// 或 https:// 开头notify_url 格式不正确使用完整的 http(s) 地址,或不传(不回调)
extra 字段格式错误:必须是 JSON 对象或数组extra 不是 JSON 对象或数组extra 传 JSON 对象,如 {"key":"value"}
[产品编码]产品不存在或已禁用product_code 无效或产品已停用确认产品编码正确,或联系平台
[产品编码]商户未开通该代付产品商户未绑定该代付产品联系平台开通产品
收款账号格式错误:银行卡号应为13~19位数字银行卡类产品的账号格式不符检查卡号
收款账号格式错误:银行卡号校验位不正确卡号未通过 Luhn 校验位校验检查卡号是否输错
收款账号格式错误:支付宝账号应为手机号或邮箱支付宝类产品的账号格式不符使用大陆手机号或邮箱
反查未通过:缺少反查地址已开启下单前反查,但 extra 中没有 verify_url在 extra 中传 verify_url 与 verify_token
反查未通过:反查地址非法verify_url 不是合法的 http / https 地址检查 verify_url
反查未通过:反查地址域名不在白名单verify_url 的主机名不在反查域名白名单内(需精确匹配)使用已加白的主机名,或联系平台加白
反查未通过:请求构造失败平台无法构造反查请求(地址异常)检查 verify_url
反查未通过:反查地址无法访问反查地址连接失败或 5 秒内未响应确认反查接口可从公网访问且 5 秒内响应;可用反查自测验证
反查未通过:反查地址返回HTTP [状态码]反查接口未返回 HTTP 200(平台不跟随重定向,3xx 也算失败)反查接口返回 HTTP 200
反查未通过:商户反查拒绝反查接口的响应体不是 allow(去除首尾空白、不区分大小写比较;带引号的 "allow" 也不行)确认放行时响应体为纯文本 allow;金额请按数值比较(反查请求里固定两位小数)
暂无可用通道当前没有可承接该笔代付的通道稍后重试,或联系平台确认
代付余额不足可用余额小于扣款金额(出款金额 + 手续费)联系平台充值后重试
商户代付钱包已冻结,暂停代付代付钱包被冻结联系平台
商户代付钱包未开通,请联系客服未开通代付钱包(下单与查余额都会出现)联系平台开通
商户单号重复该商户订单号已被使用先用该单号查单确认是否已下单成功,确认未出款再换新单号
代付暂停受理平台暂停代付受理稍后重试,或联系平台
扣款金额异常,请联系客服核对费率配置费率配置异常联系平台核对
系统授权已到期,暂停受理订单平台系统授权到期联系平台
系统繁忙,请稍后重试平台内部错误先查单确认订单是否已创建,再决定是否重试
文档/代付/查询代付订单

查询代付订单

POST/api/payout/queryOrder代付鉴权:签名验证 + 代付 IP 白名单

按平台订单号或商户订单号查询代付订单的状态与金额。下单超时、收到"商户单号重复"、或需要感知冲正时都应查单。

请求参数

参数类型必填签名说明
merchant_codestring是非空时参与商户编码,由平台分配(代收、代付共用)
order_idstring二选一非空时参与平台订单号(与 merchant_order_no 二选一;两者都传时以 order_id 为准)
merchant_order_nostring二选一非空时参与商户订单号(与 order_id 二选一)
timestampstring是非空时参与当前 Unix 时间戳(秒,10 位),必须按字符串传;与平台服务器时间偏差不能超过 5 分钟
signstring是—签名:HmacSHA256(待签名串, api_key),小写十六进制 64 位

请求示例

请求示例 · V2
{
  "merchant_code": "MCH10001",
  "merchant_order_no": "P20261002001",
  "timestamp": "1790900060",
  "sign": "5000e7d65ae86d54deb85319150db28316ebcfa5223d4738752e08e9d9d7383b"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:merchant_code=MCH10001&merchant_order_no=P20261002001&timestamp=1790900060

响应参数

参数类型说明
order_idstring平台订单号
merchant_order_nostring商户订单号
product_codestring代付产品编码
amountstring出款金额(两位小数)
fee_amountstring手续费
deduct_amountstring扣款金额(出款金额 + 手续费)
statusstring订单状态码:1 处理中 / 4 失败 / 9 成功 / 5 冲正,见状态码
fail_reasonstring失败原因(仅 status=4 时有值,其余为空字符串)
created_atstring订单创建时间(2006-01-02 15:04:05)
completed_atstring完结时间(仅 status 为 4 / 5 / 9 时有值,处理中为空字符串)
extraobject下单时传入的扩展字段,原样返回(未传时不返回该字段)

状态码与资金变动见代付状态码与资金。

响应示例

成功响应示例
{
  "code": 0,
  "data": {
    "order_id": "Ananpay20261002120000123a1b2c3d4",
    "merchant_order_no": "P20261002001",
    "product_code": "BANK_PAYOUT",
    "amount": "1000.00",
    "fee_amount": "12.00",
    "deduct_amount": "1012.00",
    "status": "9",
    "fail_reason": "",
    "created_at": "2026-10-02 12:00:00",
    "completed_at": "2026-10-02 12:03:45",
    "extra": {
      "user_id": "12345"
    }
  },
  "msg": "成功"
}
失败响应示例
{
  "code": 7,
  "data": {},
  "msg": "订单不存在"
}

注意事项

  • order_id 与 merchant_order_no 至少传一个;两个都传时以 order_id 为准。只能查询本商户的订单。
  • 订单可能因上游处理、人工处理等原因较长时间停留在 1(处理中),切勿自行判定失败后重新出款。

冲正(9 → 5)不会发送通知。如需感知冲正,请对成功订单定期查单对账。

常见错误

错误信息(msg)原因解决办法
order_id 与 merchant_order_no 不能同时为空查单时两个单号都没传至少传入一个订单号
订单不存在订单号无效,或订单不属于该商户检查 order_id / merchant_order_no
文档/代付/查询代付余额

查询代付余额

POST/api/payout/queryBalance代付鉴权:签名验证 + 代付 IP 白名单

查询商户代付钱包的总额、冻结金额与可用余额。代付余额与代收余额相互独立。

请求参数

参数类型必填签名说明
merchant_codestring是非空时参与商户编码,由平台分配(代收、代付共用)
timestampstring是非空时参与当前 Unix 时间戳(秒,10 位),必须按字符串传;与平台服务器时间偏差不能超过 5 分钟
signstring是—签名:HmacSHA256(待签名串, api_key),小写十六进制 64 位

请求示例

请求示例 · V3
{
  "merchant_code": "MCH10001",
  "timestamp": "1790900060",
  "sign": "fb2116de1c6a386403430f07cb02fb39521126bb958783aebbcd9f080d839865"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:merchant_code=MCH10001&timestamp=1790900060

响应参数

参数类型说明
merchant_codestring商户编码
balancestring代付余额总额(含冻结)
frozen_balancestring冻结金额(处理中订单占用)
available_balancestring可用余额(= balance − frozen_balance),下单以此判断余额是否充足

响应示例

成功响应示例
{
  "code": 0,
  "data": {
    "merchant_code": "MCH10001",
    "balance": "50000.00",
    "frozen_balance": "1012.00",
    "available_balance": "48988.00"
  },
  "msg": "成功"
}
失败响应示例
{
  "code": 7,
  "data": {},
  "msg": "商户代付钱包未开通,请联系客服"
}

注意事项

  • 代付余额字段为 balance / frozen_balance / available_balance,与代收余额接口(balance / frozen / available)不同。
  • 代付的 balance 是含冻结的总额,下单时以 available_balance 判断余额是否充足。

常见错误

错误信息(msg)原因解决办法
商户代付钱包未开通,请联系客服未开通代付钱包(下单与查余额都会出现)联系平台开通
文档/代付/代付异步通知

代付异步通知

代付订单到达成功(status = 9)或失败(status = 4)后,平台向下单时传入的 notify_url 发送异步通知。商户必须验签,处理完成后返回 success。

通知说明

项目说明
请求方式POST
数据格式JSON(Content-Type: application/json;charset=utf-8)
超时时间10 秒
触发条件订单成功(9)或失败(4),且下单时传了 notify_url
重试策略首次发送失败后按 15s、30s、1min、2min、5min 间隔重试(共 5 次)
成功判定商户响应体去除首尾空白后为 success 或 ok(不区分大小写)

不会发送通知的情况:

  • 下单时没有传 notify_url;
  • 订单冲正(成功 9 → 冲正 5)不发送通知,如需感知冲正,请对成功订单定期查单对账;
  • 网页下单、群聊下单的订单不发送 HTTP 回调;
  • notify_url 中包含测试域名(localhost、127.0.0.1、example.com、google.com、baidu.com)时,平台不会实际发送,直接视为通知成功。

重试 5 次仍未成功的,平台记为通知失败,可联系平台手动重发。

通知参数

参数类型说明出现条件
merchant_codestring商户编码总是
order_idstring平台订单号总是
merchant_order_nostring商户订单号总是
product_codestring代付产品编码总是
amountstring出款金额(两位小数)总是
fee_amountstring手续费总是
deduct_amountstring扣款金额(出款金额 + 手续费,两位小数)总是
statusstring订单状态:9 成功 / 4 失败总是
fail_reasonstring失败原因;有值时参与签名仅失败(status=4)时出现
completed_atstring完结时间(2006-01-02 15:04:05)总是
extraobject下单时传入的扩展字段,原样返回;不参与签名下单时传了 extra
signstring签名,商户必须验签总是

通知示例

代付成功通知示例 · V4
{
  "merchant_code": "MCH10001",
  "order_id": "Ananpay20261002120000123a1b2c3d4",
  "merchant_order_no": "P20261002001",
  "product_code": "BANK_PAYOUT",
  "amount": "1000.00",
  "fee_amount": "12.00",
  "deduct_amount": "1012.00",
  "status": "9",
  "completed_at": "2026-10-02 12:03:45",
  "extra": {
    "user_id": "12345"
  },
  "sign": "14231c203ad9c58642b5424107bd50283691686041ac9e9c66b8b0cdffac6c93"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:amount=1000.00&completed_at=2026-10-02 12:03:45&deduct_amount=1012.00&fee_amount=12.00&merchant_code=MCH10001&merchant_order_no=P20261002001&order_id=Ananpay20261002120000123a1b2c3d4&product_code=BANK_PAYOUT&status=9

代付失败通知示例 · V5
{
  "merchant_code": "MCH10001",
  "order_id": "Ananpay20261002120000123a1b2c3d4",
  "merchant_order_no": "P20261002001",
  "product_code": "BANK_PAYOUT",
  "amount": "1000.00",
  "fee_amount": "12.00",
  "deduct_amount": "1012.00",
  "status": "4",
  "fail_reason": "收款账户户名不符",
  "completed_at": "2026-10-02 12:03:45",
  "extra": {
    "user_id": "12345"
  },
  "sign": "d7730fa42dd0c337736d389a97d236636e54e674fa9a2ee51035ee3893fe8fa9"
}

以 api_key = demo_api_key_123456 计算,可用于自测。待签名串:amount=1000.00&completed_at=2026-10-02 12:03:45&deduct_amount=1012.00&fail_reason=收款账户户名不符&fee_amount=12.00&merchant_code=MCH10001&merchant_order_no=P20261002001&order_id=Ananpay20261002120000123a1b2c3d4&product_code=BANK_PAYOUT&status=4

成功通知没有 fail_reason,失败通知才有。验签时请遍历报文中的所有字段,不要写死字段列表,否则其中一种通知必然验签失败。

商户验签

  1. 取通知报文中的所有字段,排除 sign、extra、空值和非字符串值;
  2. 按签名算法计算签名;
  3. 与通知中的 sign 比较;
  4. 一致才处理业务,不一致则忽略该通知。

右侧(或下方)的验签工具可以直接粘贴收到的报文验证;通知模拟可以构造成功 / 失败通知发到你的 notify_url,不用真实出款就能测试回调处理。

商户响应

处理完成后,HTTP 响应体返回:

success

若平台没有收到 success 或 ok(含超时、网络错误),会按重试策略重发。同一订单可能收到多次通知(重试或人工重发),请以 order_id 做好幂等处理。

文档/代付/下单前反查

下单前反查

可选的安全措施:平台为商户开启后,每笔 API 代付在受理前,平台会先向商户自己的反查地址确认"这笔代付确实是商户发起的",商户明确放行后才受理。可以防范 api_key 泄露后被冒用下单。网页、群聊下单不反查。

开启方式

  1. 联系平台开启"下单前反查",并提供反查域名白名单(主机名,如 verify.merchant.com);
  2. 开启后,每笔下单请求都必须在 extra 中携带:
extra 字段说明
verify_url反查地址,只支持 http / https;主机名必须与反查域名白名单精确匹配(不区分大小写)
verify_token商户自定义的校验令牌,平台原样回传给反查地址(建议每笔订单随机生成,并在商户侧保存)

下单请求示例(extra 不参与签名):

{
  "merchant_code": "MCH10001",
  "merchant_order_no": "P20261002001",
  "...": "其余字段同创建代付订单",
  "extra": {
    "verify_url": "https://verify.merchant.com/payout/verify",
    "verify_token": "c1f5e0a9b2d84e7f"
  },
  "sign": "..."
}

调试台的"创建代付订单"面板勾选"开启下单前反查"即可自动合并这两个字段。

反查请求(平台 → 商户)

平台向 verify_url 发送 POST JSON(Content-Type: application/json;charset=utf-8):

参数类型说明
tokenstring下单时 extra.verify_token 的值
merchant_codestring商户编码
merchant_order_nostring商户订单号
amountstring出款金额(固定两位小数,如下单传 "1000",这里为 "1000.00")
payee_namestring收款人姓名
payee_accountstring收款账号
payee_bankstring收款银行
{
  "token": "c1f5e0a9b2d84e7f",
  "merchant_code": "MCH10001",
  "merchant_order_no": "P20261002001",
  "amount": "1000.00",
  "payee_name": "张三",
  "payee_account": "6222020200112233446",
  "payee_bank": "招商银行"
}

反查请求不带签名。请用 token 和订单信息(单号、金额、收款账号)与你系统中的待出款记录逐项比对。amount 固定两位小数(下单传 "1000",这里是 "1000.00"),请按数值比较,按字符串比较会导致误拒。

商户响应要求

  • 5 秒内返回 HTTP 200,且响应体(去除首尾空白、不区分大小写)严格等于 allow 才放行;
  • 其他任何情况(非 200、超时、无法访问、响应体不是 allow)一律拒绝下单;
  • 平台不跟随重定向,响应体最多读取 1KB;
  • 响应体是纯文本 allow,带引号的 "allow" 会被拒绝。

反查未通过时,下单接口返回失败、订单不创建、资金不冻结,错误信息以 下单失败:反查未通过: 开头。

右侧(或下方)的反查自测工具可以按平台格式生成请求,测试你的反查接口。

常见错误

错误信息(msg)原因解决办法
反查未通过:缺少反查地址已开启下单前反查,但 extra 中没有 verify_url在 extra 中传 verify_url 与 verify_token
反查未通过:反查地址非法verify_url 不是合法的 http / https 地址检查 verify_url
反查未通过:反查地址域名不在白名单verify_url 的主机名不在反查域名白名单内(需精确匹配)使用已加白的主机名,或联系平台加白
反查未通过:请求构造失败平台无法构造反查请求(地址异常)检查 verify_url
反查未通过:反查地址无法访问反查地址连接失败或 5 秒内未响应确认反查接口可从公网访问且 5 秒内响应;可用反查自测验证
反查未通过:反查地址返回HTTP [状态码]反查接口未返回 HTTP 200(平台不跟随重定向,3xx 也算失败)反查接口返回 HTTP 200
反查未通过:商户反查拒绝反查接口的响应体不是 allow(去除首尾空白、不区分大小写比较;带引号的 "allow" 也不行)确认放行时响应体为纯文本 allow;金额请按数值比较(反查请求里固定两位小数)
文档/代付/代付状态码与资金

代付状态码与资金

商户侧只会看到以下 4 种状态。平台内部的排队、等待上游确认、人工处理等状态一律显示为 1(处理中)。

状态码描述说明发送通知终态资金变动
1处理中订单已受理,正在出款(平台内部的排队、等待上游确认、人工处理等状态一律显示为 1)不通知否扣款金额冻结中
4失败出款失败,fail_reason 给出原因✓ 通知是冻结的扣款金额解冻,退回可用余额
9成功出款成功(之后仍可能被冲正为 5)✓ 通知否扣款金额从代付余额扣除
5冲正成功后被冲正(如出款被银行退回),不发送通知不通知是扣款金额(出款金额 + 手续费)退回代付余额

典型状态流转

下单受理 → 处理中(1) → 成功(9) → 冲正(5)     // 冲正为少数情况,不发送通知
                    → 失败(4)

终态:4(失败)、5(冲正);9(成功)之后仍可能被冲正为 5。通知触发:仅 9(成功)和 4(失败)会触发异步通知。

处理中不代表失败:订单可能因上游处理、人工处理等原因较长时间停留在 1,请以通知或查单为准,切勿自行判定失败后重新出款。

资金规则

  • 扣款金额 = 出款金额 + 手续费;手续费 = 出款金额 × 费率 + 单笔固定费,四舍五入保留两位小数。
  • 下单受理时,扣款金额从可用余额冻结;出款成功后从总额扣除并解冻;出款失败则解冻、退回可用余额;冲正时扣款金额退回代付余额。
  • 余额口径:balance(总额,含冻结)、frozen_balance(冻结中)、available_balance(可用 = 总额 − 冻结)。
文档/参考/收付差异对照

收付差异对照

代收与代付共用商户凭证和签名规则,但在白名单、通知、单号占用、余额字段等方面有差异。同时对接两者时请特别留意。

项代收代付
路径前缀/api/payment/*/api/payout/*
凭证与签名同一个 merchant_code 与 api_key,签名规则相同相同
IP 白名单无有,白名单为空时一律拒绝
notify_url必填选填,不传则不回调
extraJSON 对象或数组,不参与签名相同;开启反查时携带 verify_url / verify_token
下单成功的含义出码成功,返回支付信息只表示受理(status = 1),结果以通知 / 查单为准
下单失败后的单号已被占用,重试要换新单号code = 7 时订单未创建,可以用原单号重新提交
订单状态0 / 1 / 4 / 5 / 9 / 101 / 4 / 5 / 9
何时发送通知仅 9(支付成功)9(成功)或 4(失败)
通知超时15 秒10 秒
通知重试15s、30s、1min、2min、5min15s、30s、1min、2min、5min
冲正不发送通知不发送通知,需定期查单对账
余额字段balance / frozen / availablebalance / frozen_balance / available_balance
时间戳错误文案缺少时间戳参数 / 时间戳格式错误时间戳缺失或格式错误
下单失败前缀下单失败:(半角冒号)下单失败:(全角冒号)
下单前反查无可选开启
文档/参考/错误速查

错误速查

以下错误信息整理自平台服务端。可以直接粘贴接口返回的 msg 搜索(会自动去掉"下单失败:"、"参数错误:"等前缀),或者用响应解读工具粘贴完整响应。

鉴权(签名中间件,所有接口都会遇到)

错误信息(msg)业务原因解决办法
请求体为空或读取失败收付没有携带请求体以 JSON 格式提交请求体(Content-Type: application/json)
请求参数格式错误收付请求体不是合法的 JSON 对象检查 JSON 格式与 Content-Type;顶层必须是对象 {...}
缺少必要参数 merchant_code 或 sign收付请求中缺少商户编码或签名;旧版代付字段 mch_id 已不再识别传入 merchant_code 与 sign;旧版代付商户请按迁移指南改造字段
商户不存在或已禁用收付merchant_code 无效,或商户已被禁用确认商户编码正确且账号状态正常
商户未开通代收业务代收商户的代收业务开关已关闭联系平台开通代收业务
商户未开通代付业务代付商户未开通代付业务联系平台开通代付业务
商户未开通代付API下单代付代付 API 下单开关被关闭联系平台开通代付 API 下单
请求IP[x.x.x.x]不在代付白名单代付请求来源 IP 不在代付 IP 白名单内,或白名单为空(为空时一律拒绝)把错误信息中的 IP(即服务器出口 IP)提供给平台,加入代付 IP 白名单
商户API密钥未配置收付平台尚未为该商户配置 api_key联系平台管理员配置密钥
缺少时间戳参数代收未传 timestamp,或按数字类型传递(数字值会被忽略)timestamp 按字符串传,如 "1748332800"
时间戳格式错误代收timestamp 不是整数形式的字符串传 10 位秒级 Unix 时间戳字符串
时间戳缺失或格式错误代付未传 timestamp、按数字类型传递,或不是整数字符串timestamp 按字符串传 10 位秒级时间戳,如 "1790900000"
请求已过期(时间戳偏差超过5分钟)收付timestamp 与平台服务器时间相差超过 300 秒同步服务器时间(建议 NTP),每次请求取当前时间
签名验证失败收付sign 计算结果与平台不一致用请求诊断粘贴实际请求,自动定位原因;或对照签名排查清单
请求参数转换失败收付请求参数无法解析检查请求体是否为合法 JSON 对象

参数绑定

错误信息(msg)业务原因解决办法
Key: '…Field' Error:Field validation for '[字段]' failed on the 'required' tag收付缺少必填字段(括号内为后端结构体字段名,如 PayeeBank 对应 payee_bank)按接口文档补全必填字段(代付错误带 参数错误: 前缀)
json: cannot unmarshal number into Go struct field ….[字段] of type string收付字段类型不对:该字段必须是字符串,但传了数字 / 布尔等所有字段(extra 除外)一律按字符串传,如 "amount": "100.00"

下单

错误信息(msg)业务原因解决办法
[金额]金额格式错误:仅支持数字且最多两位小数代收amount 格式不正确使用纯数字、最多两位小数的字符串,如 "100.00"
[金额]金额格式错误或金额必须大于0代收amount 不大于 0传入大于 0 的金额
extra字段格式错误: extra must be json object or array代收extra 不是 JSON 对象或数组(例如传成了字符串)extra 传 JSON 对象,如 {"user_id":"123"}
[产品编码]产品不存在或已禁用代收product_code 无效或产品已停用确认产品编码正确,或联系平台
[产品编码]商户未绑定该产品代收商户未开通该代收产品联系平台绑定产品
[商户订单号]重复的订单号代收merchant_order_no 已被使用(包括之前出码失败的订单)换新的商户订单号
[系统订单号]系统订单号重复,请重试代收平台生成订单号碰撞(极少见)换新的商户订单号重试
代收系统维护中,暂停接单代收平台暂停代收接单稍后重试,或联系平台
商户通道配置受限,请联系平台客服代收商户在该产品下没有可用通道(配置限制)联系平台客服
下单金额不在支持范围内,请调整金额后重试代收金额超出可用通道的金额范围调整金额后用新单号重试
当前时段通道暂停服务,请稍后重试代收当前时段没有开放的通道稍后用新单号重试
通道暂时不可用,请稍后重试或联系客服代收通道暂不可用稍后用新单号重试,或联系客服
支付通道繁忙,请稍后重试代收候选通道均调用失败(出码失败)稍后用新单号重试
通道响应支付值为空(…)代收上游通道未返回支付链接 / 二维码稍后用新单号重试,或联系平台
创建订单失败,请稍后重试代收平台内部错误先查单确认,再用新单号重试
商户信息获取失败代收平台内部错误稍后重试
[金额]金额格式错误:仅支持数字且最多两位小数代付amount 格式不正确使用 "1000" 或 "1000.50" 形式的字符串
[金额]金额必须大于0代付amount 不大于 0传入大于 0 的金额
商户单号不能为空代付merchant_order_no 为空白传入有效的商户订单号
产品编码不能为空代付product_code 为空白传入代付产品编码
收款人姓名和收款账号不能为空代付payee_name 或 payee_account 为空白补全收款信息
收款银行不能为空代付payee_bank 为空白填写收款银行;非银行卡类产品填收款机构名称(如 "支付宝")
[字段]过长(最多N个字符)代付字段超出长度上限(按字符数计)按参数表的长度限制调整
回调地址必须以 http:// 或 https:// 开头代付notify_url 格式不正确使用完整的 http(s) 地址,或不传(不回调)
extra 字段格式错误:必须是 JSON 对象或数组代付extra 不是 JSON 对象或数组extra 传 JSON 对象,如 {"key":"value"}
[产品编码]产品不存在或已禁用代付product_code 无效或产品已停用确认产品编码正确,或联系平台
[产品编码]商户未开通该代付产品代付商户未绑定该代付产品联系平台开通产品
收款账号格式错误:银行卡号应为13~19位数字代付银行卡类产品的账号格式不符检查卡号
收款账号格式错误:银行卡号校验位不正确代付卡号未通过 Luhn 校验位校验检查卡号是否输错
收款账号格式错误:支付宝账号应为手机号或邮箱代付支付宝类产品的账号格式不符使用大陆手机号或邮箱
暂无可用通道代付当前没有可承接该笔代付的通道稍后重试,或联系平台确认
代付余额不足代付可用余额小于扣款金额(出款金额 + 手续费)联系平台充值后重试
商户代付钱包已冻结,暂停代付代付代付钱包被冻结联系平台
商户代付钱包未开通,请联系客服代付未开通代付钱包(下单与查余额都会出现)联系平台开通
商户单号重复代付该商户订单号已被使用先用该单号查单确认是否已下单成功,确认未出款再换新单号
代付暂停受理代付平台暂停代付受理稍后重试,或联系平台
扣款金额异常,请联系客服核对费率配置代付费率配置异常联系平台核对
系统授权已到期,暂停受理订单收付平台系统授权到期联系平台
系统繁忙,请稍后重试收付平台内部错误先查单确认订单是否已创建,再决定是否重试

下单前反查(代付)

错误信息(msg)业务原因解决办法
反查未通过:缺少反查地址代付已开启下单前反查,但 extra 中没有 verify_url在 extra 中传 verify_url 与 verify_token
反查未通过:反查地址非法代付verify_url 不是合法的 http / https 地址检查 verify_url
反查未通过:反查地址域名不在白名单代付verify_url 的主机名不在反查域名白名单内(需精确匹配)使用已加白的主机名,或联系平台加白
反查未通过:请求构造失败代付平台无法构造反查请求(地址异常)检查 verify_url
反查未通过:反查地址无法访问代付反查地址连接失败或 5 秒内未响应确认反查接口可从公网访问且 5 秒内响应;可用反查自测验证
反查未通过:反查地址返回HTTP [状态码]代付反查接口未返回 HTTP 200(平台不跟随重定向,3xx 也算失败)反查接口返回 HTTP 200
反查未通过:商户反查拒绝代付反查接口的响应体不是 allow(去除首尾空白、不区分大小写比较;带引号的 "allow" 也不行)确认放行时响应体为纯文本 allow;金额请按数值比较(反查请求里固定两位小数)

查单

错误信息(msg)业务原因解决办法
缺少查询参数(merchant_order_no 或 order_id 至少传一个)代收查单时两个单号都没传至少传入一个订单号
order_id 与 merchant_order_no 不能同时为空代付查单时两个单号都没传至少传入一个订单号
订单不存在收付订单号无效,或订单不属于该商户检查 order_id / merchant_order_no

查余额

错误信息(msg)业务原因解决办法
代收钱包不存在代收商户未开通代收钱包联系平台开通钱包
文档/参考/旧版代付迁移指南

旧版代付迁移指南

代付接口已随收付一体合并升级到 v2.0.0。新服务端不兼容旧版请求,旧版代付商户必须完成以下改造才能继续出款。

接口路径没有变,但所有字段都改了名,旧版请求会直接返回 缺少必要参数 merchant_code 或 sign。请按本页逐项改造,并用请求诊断验证。

必须处理的变更

按影响大小排序:

#变更不处理会怎样
1所有字段改名(接口路径不变),旧请求一律失败返回 缺少必要参数 merchant_code 或 sign
2新增代付 IP 白名单,白名单为空时一律拒绝返回 请求IP[x.x.x.x]不在代付白名单
3冲正(9 → 5)不再发送通知;旧版的通知 status 包含 5漏记冲正,需改为定期查单对账
4余额字段改名:frozen → frozen_balance,available → available_balance读到空值,可能误判为余额不足而停止出款
5failed_reason 改名为 fail_reason拿不到失败原因
6空值从 null 改为 "",或不返回该字段用 is null 判断"未完结"的逻辑失效
7时间格式统一为 2006-01-02 15:04:05按旧格式(ISO 8601 / … +0800 CST)解析出错
8反查请求字段改名,且 amount 固定两位小数按字符串比较金额("1000" ≠ "1000.00")会返回 deny,下单全部失败
9通知字段变化:删除 created_at,多个字段改名,fail_reason 只在失败时出现写死字段列表的验签代码失败

字段对照

下单请求 /api/payout/createOrder

旧字段新字段说明
mch_idmerchant_code商户编码
mch_order_snmerchant_order_no10~64 个字符
ptype——已废弃,删除即可
moneyamount最多两位小数,必须大于 0
payee_namepayee_name最多 64 个字符
payee_accountpayee_account最多 128 个字符;部分产品会校验账号格式
payee_bankpayee_bank必填,最多 64 个字符;非银行卡类产品填收款机构名称
from_name(必填)payee_alias(选填)最多 64 个字符
——payee_address新增,选填,最多 255 个字符
verify_noverify_no最多 32 个字符
notify_url(必填)notify_url(选填)不传则不回调;最多 255 个字符
timestamptimestamp必须是字符串
extraextraJSON 对象或数组,不参与签名
signsign算法不变

下单响应

旧字段新字段
mch_id(已删除)
mch_order_snmerchant_order_no
order_idorder_id(前缀改为 Ananpay,长度 29 位,注意数据库字段长度)
real_moneyamount
mch_fix_feefee_amount
full_moneydeduct_amount
——status(新增,固定为 "1")
created_at(ISO 8601)created_at(2006-01-02 15:04:05)

查询订单 /api/payout/queryOrder

请求:mch_id → merchant_code,mch_order_sn → merchant_order_no,order_id 不变;两者都传时以 order_id 为准。

旧响应字段新响应字段
mch_order_snmerchant_order_no
real_money / mch_fix_fee / full_moneyamount / fee_amount / deduct_amount
status(4 / 5 / 9,其余都算处理中)status(1 / 4 / 5 / 9)
failed_reasonfail_reason(不是失败状态时为 "")
created_at(ISO 8601)created_at(2006-01-02 15:04:05)
completed_at(未完结时为 null)completed_at(未完结时为 "")
extra(null)extra(下单时没传就不返回)

按"不是 4 / 5 / 9 就算处理中"写的状态判断代码仍然兼容。

查询余额 /api/payout/queryBalance

旧字段新字段
mch_idmerchant_code
balancebalance(含冻结金额,含义不变)
frozenfrozen_balance
availableavailable_balance

异步通知

旧字段新字段
mch_idmerchant_code
mch_order_snmerchant_order_no
real_money / mch_fix_fee / full_moneyamount / fee_amount / deduct_amount
status(4 / 5 / 9)status(9 / 4)
failed_reason(可能为 null)fail_reason(只在失败时出现)
created_at(已删除)
completed_at(… +0800 CST)completed_at(2006-01-02 15:04:05)
extra(可能为 null)extra(下单时没传就不出现)

下单前反查(平台请求商户的 verify_url)

旧新
verify_tokentoken
mch_idmerchant_code
mch_order_snmerchant_order_no
moneyamount(固定两位小数)
payee_name / payee_account / payee_bank不变
请求头 User-Agent: Ananpay-OrderVerify/2.0不再携带

规则与行为变化

  • 下单失败与单号占用:下单返回 code=7 时,订单未创建、资金未冻结,可以用原单号重新提交。订单一旦创建,不管最后成功还是失败,这个单号都被占用。
  • 下单成功的含义:只代表受理(status=1)。遇到超时或"商户单号重复",要先查单。
  • 字段类型:所有字段按字符串传。非字符串值不参与签名;timestamp 按数字传会返回 时间戳缺失或格式错误。
  • 开通条件:代付业务开关、API 下单开关、IP 白名单、代付产品、代付钱包,缺一不可,见代付开通条件。
  • 收款账号格式校验:按产品开启(银行卡做 Luhn 校验位检查;支付宝要求手机号或邮箱)。
  • 首尾空白:字符串参数会先去掉首尾空白,再校验和入库。
  • 异步通知:超时 10 秒;失败后按 15s / 30s / 1min / 2min / 5min 重试,共 5 次;返回 success 或 ok 都算成功(不区分大小写,忽略首尾空白);notify_url 是测试域名时不会真的发送。
  • 下单前反查:5 秒内返回 HTTP 200 且响应体为 allow 才放行;不跟随重定向,最多读取 1KB;verify_url 的主机名必须与白名单精确匹配。旧文档示例中带引号的 "allow" 按新规则会被拒绝。
  • 错误文案:签名不通过 改为 签名验证失败;下单类错误统一加 下单失败: 前缀。按 msg 文本做判断的代码需要同步修改。

商户自检清单

  • [ ] 向平台获取新版 merchant_code 与 api_key
  • [ ] 把服务器出口 IP 提供给平台加入代付白名单(可用出口 IP 查询)
  • [ ] 请求字段按上表改名,所有值转为字符串
  • [ ] 删除 ptype;from_name 改为 payee_alias
  • [ ] 余额改为读取 available_balance
  • [ ] 查单和通知改为读取 fail_reason;空值判断改为判断空字符串
  • [ ] 时间解析改为 2006-01-02 15:04:05 格式
  • [ ] 通知验签改为"遍历所有非空字符串字段"的写法
  • [ ] 冲正改为定期查单对账
  • [ ] 反查接口改为读取 token;金额按数值比较;放行时返回纯文本 allow
  • [ ] 用请求诊断、通知模拟、反查自测逐项验证
文档/参考/更新日志

更新日志

接口变更记录,最新版本在前。请开发者根据变更内容及时调整调用方式。

2026-10 · 代付 v2.0.0(收付合并)

代付接口随收付一体合并全面升级,不兼容旧版请求,旧版商户请阅读旧版代付迁移指南。

  • 更新 POST /api/payout/createOrder:字段全部改名(mch_id → merchant_code、mch_order_sn → merchant_order_no、money → amount、from_name → payee_alias),删除 ptype,新增 payee_address;notify_url 改为选填;新增长度限制与收款账号格式校验;payee_bank 为必填(2026-10-04)。
  • 更新 POST /api/payout/queryOrder:响应字段改名,failed_reason → fail_reason,状态值收敛为 1 / 4 / 5 / 9。
  • 更新 POST /api/payout/queryBalance:frozen → frozen_balance、available → available_balance。
  • 更新 代付异步通知:字段改名、删除 created_at;冲正不再发送通知。
  • 更新 下单前反查:请求字段改名(verify_token → token、money → amount,固定两位小数),不再携带 User-Agent。
  • 新增 代付 IP 白名单、代付开通条件。
  • 统一 所有字段按字符串传递;时间格式统一为 2006-01-02 15:04:05。

2026-10 · 开发者中心上线

  • 接口文档与调试工具箱合并为本站,替代原 Apipost 在线文档。
  • 新增请求诊断、响应解读、通知模拟、反查自测、出口 IP 查询等工具。

2026-06-25 · 代收 v1.0.0

  • 新增 POST /api/payment/createOrder 创建代收订单
  • 新增 POST /api/payment/queryOrder 查询代收订单
  • 新增 POST /api/payment/queryBalance 查询代收余额

API 调试台

代收 + 代付 · HmacSHA256 · 生成签名与可直接发送的请求

纯本地计算 · 密钥不离开浏览器签名引擎:WebCrypto
[ 03 ]使用说明NOTES

签名规则

  • 只取非空字符串值;排除 sign、extra
  • 按 key 的 ASCII 码升序排列
  • 拼接 k1=v1&k2=v2(值用原文,不做 URL 编码)
  • 以 api_key 为密钥做 HmacSHA256,输出小写十六进制(64 位)
  • 代收、代付规则相同,共用同一个 api_key

常见踩坑

  • 所有字段按字符串传(extra 除外),数字不参与签名
  • timestamp 与服务器偏差超过 5 分钟会被拒绝,生成后尽快发送
  • 代付接口校验 IP 白名单,curl 要在已加白的服务器上执行
  • 代付下单超时或"单号重复"时先查单,不要换单号重发
  • extra 必须是 JSON 对象或数组,不参与签名

关于本工具

  • 签名在浏览器本地计算,密钥不发送到任何服务器
  • 生成的 JSON 可直接粘贴到 Postman(Body → raw → JSON),或复制 curl 在终端发送
  • 本工具不直接向网关发请求;签名失败时用请求诊断定位原因
[ 01 ]创建代收订单POST /api/payment/createOrder
商户订单号,10~64 个字符,本商户内唯一,同一单号不可重复提交
代收产品编码,由平台分配
订单金额(元),纯数字、最多两位小数且大于 0,建议保留两位小数,如 "100.00"
异步通知地址,以 http:// 或 https:// 开头;支付成功后平台向此地址推送结果
前端跳转地址,支付完成后用户浏览器跳转到此地址
终端用户真实 IP(用于支付机构风控),请传用户 IP,不要传商户服务器 IP
商品标题(支付机构风控要求),如"会员充值"
商品简介
= 2026-10-29 15:21:12(本地时间)当前 Unix 时间戳(秒,10 位),必须按字符串传;与平台服务器时间偏差不能超过 5 分钟
扩展字段,JSON 对象或数组;不参与签名,查单与通知时原样返回
用示例参数和 demo 密钥生成,结果应与文档一致
⌁填写左侧参数后点击生成
输出待签名字符串 / sign / 请求 JSON / curl / 代码片段

开发工具

粘贴实际发出的请求,按平台校验顺序逐项检查;签名不一致时自动推断错误原因。

[ TOOL ]请求诊断REQUEST DIAGNOSIS

粘贴你的程序实际发出的请求 JSON(含 sign),按平台的校验顺序逐项检查;签名不一致时,自动推断你的签名代码错在哪。

使用凭证中的 api_key 计算平台视角的签名。请求只在本机分析,不会发送。
⌁粘贴请求后点击诊断
逐项检查结果将在此显示