欢迎接入个人即时到账接口
在开始对接之前,请先在控制台完成以下四步:
控制台「定价管理」中新建,每个定价对应一个 app_id 与 app_secret,支持固定金额与任意金额。
每个定价可上传多张您的个人收款码(轮巡使用)。金额尽量多设几档,避免用户自行输错金额导致无法匹配通知。
在一台闲置安卓手机上安装「到账监听助手」并按要求授权,它会把支付到账消息实时上报平台,触发订单匹配与商户回调。安装包见项目 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 值。
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 外的全部请求参数 |
返回示例
{
"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业务结果看响应体里的 code:0 成功;1002 签名校验失败;其它非 0 为参数 / 状态类错误,以 msg 为准。
下单请求示例(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=… 签名可选;建议在服务端兜底轮询使用,防止回调丢失。
| 字段 | 说明 |
|---|---|
code | 0 成功;订单不存在返回相应错误码与提示 |
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 做幂等校验。
// 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 并跳回,其中 result 为 success / fail。
同步跳转仅用于展示用户可能中途关闭浏览器,同步跳转不可作为发货依据;发货一律以验签通过的异步通知或主动查询结果为准。
FAQ
重复调用下单接口会重复扣费吗?
不会。系统按 order_no 幂等:已存在的订单直接返回原订单信息(含 pay_url 与最新状态),不产生新订单、不重复扣手续费。
同一个定价上传多张收款码有什么用?
多码轮巡。同金额并发下单时轮流选用不同收款码,降低「同码同金额撞单」导致的匹配混淆,提高并发收款成功率。
签名校验失败(code 1002)怎么排查?
常见原因:① 参与签名的参数与实际提交的不一致(漏签或多签了空值参数——空值不参与签名);② 未按字典序排序;③ 拼接时做了 URL 编码;④ app_secret 用错(每个定价的密钥不同,重置后旧密钥立即失效);⑤ 忘了转大写;⑥ subject 等参数含中文时,发起请求的编码与计算签名的编码不一致。排查技巧:在控制台日志中查看服务器实际收到的原文,与您本地拼接的原文逐字符比对,差异点即为问题所在。
在哪里能看到我的 app_id 和接口密钥?
登录控制台进入「定价管理」,在对应定价的详情中即可查看 app_id 与 app_secret。每个定价的密钥相互独立,重置后旧密钥立即失效,请及时同步更新服务端配置。
监听 App 没有运行会有什么后果?
用户依然会扫码付款,钱照常直达您的支付宝/微信账户;但系统感知不到到账事件,不会触发回调通知。此时您可在控制台按订单号/金额找到该笔订单,使用「补单(手动标记已收款)」操作,系统会立即向您的 notify_url 补发回调(限 72 小时内的订单)。强烈建议:用一台旧手机专机专用,置于稳定的 WiFi 环境,保持充电、永不锁屏、通知权限全开,让监听 App 常驻后台。
我的支付宝、微信账号安全吗?会不会被封号?
安全。监听应用不需要 Root 权限,也不需要您输入支付宝/微信的账号密码——收款码就是您本人的个人收款码,资金直达您的账户,平台不托管、不经手资金,从物理上杜绝了账号泄露的可能。您的账户与普通个人账号没有任何区别:系统不会频繁刷新您的账户后台,不存在异地登录、模拟客户端等异常行为,因此不会导致封号。同时也提醒:请勿在任何非官方渠道输入您的账号密码。
用户付款是直达我的账户,还是经平台中转?
直达。您的用户扫描的是您本人的收款二维码,钱直接进入您的支付宝/微信账户,全程不经过平台中转;平台只负责感知到账事件并完成订单匹配与回调通知,不触碰资金链路。(详见「支付体验」章节的演示流程。)
钱直接付到我的账户,平台怎么收手续费?
从控制台余额中扣除:每笔成功订单按当前费率计收交易服务费(新用户默认 1.2%,随等级最低可至 0.1%,交易返积分),您只需保持余额充足即可。请注意:余额不足将无法发起下单,请在控制台及时充值。
不懂技术,也找不到人帮我接入,怎么办?
联系客服,我们会根据您的接入工作量协助对接;您也可以自行在威客平台寻找团队按本文档接入——文档中的签名规则、下单示例(PHP)均可直接复制使用。
接口有日收款限额吗?
有。每个定价支持设置日收款额度,当日累计下单金额达到上限后返回「接口日收款额度已用完」,次日自动重置。额度可在控制台调整。