个人聚合支付
首页 / 接入文档

接入文档

个人即时到账收款接口。商户服务端签名下单 → 用户扫码付款 → 资金直达您的个人账户 → 平台 1 秒回调通知您的服务。全程免签约、不托管资金。

MD5 签名HTTP 200 + code 语义码幂等下单回调失败自动重试 5 次多码轮巡
① 准备工作

欢迎接入个人即时到账接口

在开始对接之前,请先在控制台完成以下四步:

1注册并登录控制台

本系统使用独立账号体系(自管商户表 + bcrypt 密码),与本支付系统之外的任何站点无关联;注册后即可创建应用并拿到 app_id / app_secret

→ 前往登录
2创建定价(API 接口)

控制台「定价管理」中新建,每个定价对应一个 app_idapp_secret,支持固定金额与任意金额。

3上传收款二维码

每个定价可上传多张您的个人收款码(轮巡使用)。金额尽量多设几档,避免用户自行输错金额导致无法匹配通知。

4安装到账监听助手 App

在一台闲置安卓手机上安装「到账监听助手」并按要求授权,它会把支付到账消息实时上报平台,触发订单匹配与商户回调。安装包见项目 yundingdang.apk下载监听助手 APK(约 4.7 MB)。

余额要求每笔成功订单会按当前费率从账户余额中扣除交易服务费,请保持余额充足,否则将无法创建订单。

回调地址在商家级设置异步通知地址 notify_url 与同步跳转地址 return_url 在控制台「API 设置」中按商家配置一次,全部定价共用。

② 签名规则

MD5 签名算法

所有服务端接口均使用 MD5 签名,规则如下:

第 1 步 把待签名参数按 参数名 ASCII 码从小到大排序(字典序);

第 2 步 剔除空值参数(空字符串不参与签名)与 sign 参数本身;

第 3 步 将参数按 k=v 形式用 & 连接成字符串,不做 URL 转义

第 4 步 在字符串末尾拼接 &key=app_secret,整个字符串取 MD5 后转为大写,即为 sign 值。

PHP 签名示例
function makeSign(array $params, string $secret): string
{
    // 1. 剔除 sign 与空值
    $clean = array_filter($params, fn($k) => $k !== 'sign', ARRAY_FILTER_USE_KEY);
    $clean = array_filter($clean, fn($v) => $v !== '' && $v !== null);
    // 2. 按参数名字典序排序并拼接
    ksort($clean, SORT_STRING);
    $parts = [];
    foreach ($clean as $k => $v) { $parts[] = $k . '=' . $v; }
    $str = implode('&', $parts);
    // 3. 拼接密钥后取大写 MD5
    return strtoupper(md5($str . '&key=' . $secret));
}

验签同理收到平台回调时,用同样的算法对收到的参数计算签名,与请求中的 sign 比对(建议使用恒等比较),一致才可信。

③ 创建订单

商户服务端下单接口

POST /api/orders.php?action=create 由商户服务端携带签名调用(不需要登录态)。

参数名必填类型说明
app_id必填int定价(API 接口)编号,控制台「定价管理」中创建获得
order_no必填string商户订单号,须保证唯一;重复提交时系统幂等返回原订单,不会重复扣费
subject可选string商品名称 / 订单标题
pay_type必填int支付通道:43 = 支付宝,44 = 微信;须与定价配置的通道一致
money必填decimal订单金额(元),0 < money ≤ 1000000,系统按两位小数处理。注:若同一时段已有等额待支付订单,系统会自动追加随机尾数(+0.01~0.09)保证金额唯一,实际支付金额以创建响应与支付页展示为准
extra可选string商户自定义透传字段,回调时原样返回
sign必填string按签名规则计算,参与签名的参数为除 sign 外的全部请求参数

返回示例

创建成功响应(HTTP 200)
{
  "code": 0,
  "msg": "ok",
  "data": {
    "trade_no":  "P20260918213000000123",   // 平台订单号
    "order_no":  "SHOP20260918001",          // 商户订单号
    "money":     "10.00",
    "pay_type":  43,
    "status":    0,
    "pay_url":   "https://…/api/orders.php?action=page&app_id=1&order_no=SHOP20260918001"
  }
}

拿到 pay_url 后,把用户跳转或跳转到该地址即可进入支付页。

HTTP 恒为 200业务结果看响应体里的 code0 成功;1002 签名校验失败;其它非 0 为参数 / 状态类错误,以 msg 为准。

下单请求示例(PHP)

cURL / PHP 下单
$params = [
    'app_id'   => 1,
    'order_no' => 'SHOP20260918001',
    'subject'  => 'VIP 会员月卡',
    'pay_type' => 43,
    'money'    => '10.00',
    'extra'    => 'uid=10086',
];
$params['sign'] = makeSign($params, $appSecret);

$ch = curl_init('https://你的支付域名/api/orders.php?action=create');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query($params),
    CURLOPT_RETURNTRANSFER => true,
]);
$resp = json_decode(curl_exec($ch), true);
if ($resp['code'] === 0) {
    // 跳转支付页
    header('Location: ' . $resp['data']['pay_url']);
}
④ 支付页

收银台页面(免开发)

GET /api/orders.php?action=page&app_id=…&order_no=…

下单成功后返回的 pay_url 即支付页。页面自动展示您定价中轮巡选出的个人收款码、订单金额与支付倒计时,并在付款成功后自动跳转。无需自行开发收银界面。

金额必须一致用户须按页面展示金额精确付款(平台按「同通道 + 同金额 + 时间窗口」匹配到账事件),修改金额会导致无法自动确认。

⑤ 订单查询

主动查询订单状态

GET /api/orders.php?action=query&app_id=…&order_no=… 签名可选;建议在服务端兜底轮询使用,防止回调丢失。

字段说明
code0 成功;订单不存在返回相应错误码与提示
data.status订单状态:0 待支付 1 已支付(回调成功) 2 已支付但通知失败 3 手动确认(补单,视同已支付) 4 匹配中 9 已过期(30 分钟未支付)
data.paid布尔值,status === 1 时为 true,可直接用于发货判断

建议策略:以异步通知为准,辅以支付完成后前端轮询 query;两者都异常时,可用「查询补单」定时任务兜底。

⑥ 异步通知

支付成功回调(notify_url)

订单支付成功后,平台向控制台「API 设置」中配置的 notify_url 发起 POST 请求(表单格式),参数均带签名:

参数名说明
order_no商户订单号(您下单时传入的)
subject商品名称
pay_type支付通道:43 支付宝 / 44 微信
money订单金额,两位小数
realmoney实际到账金额(用户实付)
result支付结果,支付成功固定为 success
xddpay_order平台订单号(trade_no)
app_id定价(API 接口)编号
extra下单时透传的自定义字段,原样返回
sign签名,用您的 app_secret 按签名规则验签

应答约定

商户处理后请输出 success(HTTP 200,响应体包含 success 即视为送达),例如 PHP 直接 echo 'success';。其它任何响应都视为失败。

重试策略

通知失败后平台自动重试:匹配成功瞬间立即重试 2 次(间隔 1s、2s),之后由平台维护任务每分钟扫描补发,两次补发间隔 2 分钟,累计最多 10 次;全部失败后订单会标记为「回调失败」,可在控制台订单列表查看并手工重发。请勿以通知作为唯一触发点做重业务操作,配合 query 做幂等校验。

PHP 回调接收示例
// notify.php —— 接收平台异步通知
$params = $_POST;
$sign   = $params['sign'] ?? '';
unset($params['sign']);

if (makeSign($params, $appSecret) !== strtoupper($sign)) {
    exit('sign error');               // 验签失败,不要输出 success
}
if (($params['result'] ?? '') === 'success') {
    // ★ 务必校验 order_no 与 money 是否与本地订单一致,再发货
    markOrderPaid($params['order_no'], $params['money']);
}
echo 'success';
⑦ 同步跳转

支付完成跳回商户页(return_url)

用户支付完成后,支付页会把订单参数(与异步通知同名,含 sign)以 GET 方式拼接到 return_url 并跳回,其中 resultsuccess / fail

同步跳转仅用于展示用户可能中途关闭浏览器,同步跳转不可作为发货依据;发货一律以验签通过的异步通知或主动查询结果为准。

⑧ 常见问题

FAQ

重复调用下单接口会重复扣费吗?

不会。系统按 order_no 幂等:已存在的订单直接返回原订单信息(含 pay_url 与最新状态),不产生新订单、不重复扣手续费。

同一个定价上传多张收款码有什么用?

多码轮巡。同金额并发下单时轮流选用不同收款码,降低「同码同金额撞单」导致的匹配混淆,提高并发收款成功率。

签名校验失败(code 1002)怎么排查?

常见原因:① 参与签名的参数与实际提交的不一致(漏签或多签了空值参数——空值不参与签名);② 未按字典序排序;③ 拼接时做了 URL 编码;④ app_secret 用错(每个定价的密钥不同,重置后旧密钥立即失效);⑤ 忘了转大写;⑥ subject 等参数含中文时,发起请求的编码与计算签名的编码不一致。排查技巧:在控制台日志中查看服务器实际收到的原文,与您本地拼接的原文逐字符比对,差异点即为问题所在。

在哪里能看到我的 app_id 和接口密钥?

登录控制台进入「定价管理」,在对应定价的详情中即可查看 app_idapp_secret。每个定价的密钥相互独立,重置后旧密钥立即失效,请及时同步更新服务端配置。

监听 App 没有运行会有什么后果?

用户依然会扫码付款,钱照常直达您的支付宝/微信账户;但系统感知不到到账事件,不会触发回调通知。此时您可在控制台按订单号/金额找到该笔订单,使用「补单(手动标记已收款)」操作,系统会立即向您的 notify_url 补发回调(限 72 小时内的订单)。强烈建议:用一台旧手机专机专用,置于稳定的 WiFi 环境,保持充电、永不锁屏、通知权限全开,让监听 App 常驻后台。

我的支付宝、微信账号安全吗?会不会被封号?

安全。监听应用不需要 Root 权限,也不需要您输入支付宝/微信的账号密码——收款码就是您本人的个人收款码,资金直达您的账户,平台不托管、不经手资金,从物理上杜绝了账号泄露的可能。您的账户与普通个人账号没有任何区别:系统不会频繁刷新您的账户后台,不存在异地登录、模拟客户端等异常行为,因此不会导致封号。同时也提醒:请勿在任何非官方渠道输入您的账号密码。

用户付款是直达我的账户,还是经平台中转?

直达。您的用户扫描的是您本人的收款二维码,钱直接进入您的支付宝/微信账户,全程不经过平台中转;平台只负责感知到账事件并完成订单匹配与回调通知,不触碰资金链路。(详见「支付体验」章节的演示流程。)

钱直接付到我的账户,平台怎么收手续费?

从控制台余额中扣除:每笔成功订单按当前费率计收交易服务费(新用户默认 1.2%,随等级最低可至 0.1%,交易返积分),您只需保持余额充足即可。请注意:余额不足将无法发起下单,请在控制台及时充值。

不懂技术,也找不到人帮我接入,怎么办?

联系客服,我们会根据您的接入工作量协助对接;您也可以自行在威客平台寻找团队按本文档接入——文档中的签名规则、下单示例(PHP)均可直接复制使用。

接口有日收款限额吗?

有。每个定价支持设置日收款额度,当日累计下单金额达到上限后返回「接口日收款额度已用完」,次日自动重置。额度可在控制台调整。

准备好接入了吗

登录控制台创建定价,几分钟完成对接。

登录控制台 · 立即接入