简介与协议规则
感谢使用 柯达集团。本页是开发者对接文档(V1 / MD5 签名),覆盖以下内容:
- 页面跳转支付
submit.php—— 适合网站,用户浏览器跳转到收银台付款 - API 接口支付
mapi.php—— 适合 App / 服务端,返回支付链接或二维码 - 支付结果异步通知 —— 付款成功后平台回调你的服务器
- 查询与退款
api.php?act=...—— 商户信息、订单、结算记录查询与退款
协议规范(务必遵守)
请求格式:application/x-www-form-urlencoded
返回格式:JSON(页面跳转支付除外,会直接跳转页面)
签名算法:MD5(结果小写)
字符编码:UTF-8
金额单位:元,最多 2 位小数,如 10.00
对接地址与接口路径
对接地址说明
公开文档不展示真实生产网址。请使用平台方单独提供的 <对接地址>,下文所有接口均以此作为占位符。
例如,对接地址为 https://example.com(末尾不带 /)时,页面跳转支付地址为 https://example.com/submit.php。示例域名仅用于说明,请勿直接用于生产。
| 用途 | 地址 | 方式 |
|---|---|---|
| 页面跳转支付 | <对接地址>/submit.php | POST / GET |
| API 接口支付 | <对接地址>/mapi.php | POST |
| 查询 / 退款 | <对接地址>/api.php?act=... | 见各接口 |
对接需要两个凭证,均可在商户后台「API 凭证」页获取:pid(商户 ID)和 key(MD5 密钥)。key 泄露等于资金风险,请只保存在服务器端,绝不要写进网页或 App 前端。
5 分钟对接流程
- 在商户后台「API 凭证」页拿到 pid 和 key。
- 选择接入方式:网站用
submit.php(页面跳转);App / 后端用mapi.php(返回支付链接)。 - 按 MD5 签名算法 生成
sign,提交下单参数(金额、订单号、回调地址等)。 - 用户完成支付后,平台以 GET 方式请求你的
notify_url;你验签后处理订单,并返回纯文本success。 - 建议:再用 单个订单查询 做主动查单兜底,避免因网络问题漏单。
MD5 签名算法
签名的作用是用密钥给参数"盖章",防止请求被伪造或篡改。生成步骤:
- 取出所有值非空的请求参数;剔除
sign和sign_type。 - 按参数名 ASCII 从小到大排序(a → z)。
- 拼接成
a=1&b=2&c=3形式(值不要做 URL 编码)。 sign = md5(拼接字符串 + 商户密钥key),结果取小写。密钥直接拼在末尾,中间没有&或&key=。
PHP 参考实现(可直接复制使用):
function make_sign(array $params, $key) {
unset($params['sign'], $params['sign_type']);
ksort($params);
$parts = array();
foreach ($params as $k => $v) {
if ($v === '' || $v === null) continue;
$parts[] = $k . '=' . $v;
}
return md5(implode('&', $parts) . $key);
}
示例:假设密钥为 KEY123,参与签名的参数拼接后为:
money=1.00&name=test¬ify_url=https://xx/notify.php&out_trade_no=20260817001&pid=1001&type=alipay
sign = md5("money=1.00&name=...&type=alipayKEY123")
收到异步通知时,用同样的规则对通知参数重新计算 sign,与通知中携带的 sign 比对,一致才可信。
支付方式与设备类型
支付方式列表 (type)
下单时 type 参数填「调用值」。实际可用范围以你商户后台开通的为准。
| 调用值 | 名称 | 备注 |
|---|---|---|
alipay |
支付宝 | |
wxpay |
微信支付 |
设备类型列表 (device)
可选参数,帮助平台返回更合适的支付形式(如微信内直接唤起支付)。
| 调用值 | 说明 |
|---|---|
pc | 电脑浏览器(默认) |
mobile | 手机浏览器 |
qq | 手机 QQ 内置浏览器 |
wechat | 微信内置浏览器 |
alipay | 支付宝客户端 |
jump | 仅返回支付跳转 URL |
USDT 支付说明
支付方式调用值:type=usdt(需商户后台已开通)。
- money 仍然填人民币金额(元),系统按实时汇率自动换算应付 USDT 数量。
- 通过
mapi.php下单会返回payurl:用户打开后先选择链(BSC 或 TRON),再显示收款地址与应付 USDT。 - BSC(推荐):不额外加收链上手续费。
- TRON:用户需额外承担 1.5 USDT 链上手续费,已自动计入应付总额。
- 到账后与普通订单一样走异步通知;链上交易哈希可通过 订单查询 的
api_trade_no字段获取。
USDT 下单返回示例:
{
"code": 1,
"trade_no": "2026081715300012345",
"payurl": "<对接地址>/pay/usdt/2026081715300012345/"
}
1. 页面跳转支付(submit.php)
适用场景:网站收银台。用户点击"去支付"后,浏览器跳转到本平台页面完成付款,付完自动跳回你的 return_url。
接口地址: <对接地址>/submit.php
请求方式: POST(推荐)或 GET
| 参数 | 类型 | 必填 | 说明与示例 |
|---|---|---|---|
商户ID pid |
Int | 必填 | 商户后台显示的商户 ID。示例:1001 |
支付方式 type |
String | 可选 | 不传则打开聚合收银台,由用户自选。示例:alipay |
商户订单号 out_trade_no |
String | 必填 | 你系统内的唯一订单号。示例:20260817151343001 |
异步通知地址 notify_url |
String | 必填 | 付款成功后平台回调的服务器地址,用于入账。示例:https://你的域名/notify.php |
跳转通知地址 return_url |
String | 必填 | 用户付完后浏览器跳回的页面地址,仅用于展示。 |
商品名称 name |
String | 必填 | 超过 127 字节将自动截断。示例:VIP会员 |
订单金额 money |
String | 必填 | 单位:元,最多 2 位小数。示例:100.00 |
扩展参数 param |
String | 可选 | 自定义内容,异步通知时原样返回。USDT 可传 chain=bsc 预选链。 |
签名 sign |
String | 必填 | 按 MD5 签名算法 生成的 32 位小写字符串。 |
签名类型 sign_type |
String | 必填 | 固定为 MD5。 |
PHP 生成支付表单示例:
$params = array(
'pid' => 1001,
'type' => 'alipay',
'out_trade_no' => date('YmdHis') . rand(100, 999),
'notify_url' => 'https://你的域名/notify.php',
'return_url' => 'https://你的域名/return.php',
'name' => 'VIP会员',
'money' => '100.00',
);
$params['sign'] = make_sign($params, $KEY); // 见「MD5 签名算法」
$params['sign_type'] = 'MD5';
// 输出自动提交的表单,浏览器即跳转到收银台
echo '<form id="pay" action="<对接地址>/submit.php" method="post">';
foreach ($params as $k => $v) {
echo '<input type="hidden" name="' . $k . '" value="' . htmlspecialchars($v) . '">';
}
echo '</form><script>document.getElementById("pay").submit()</script>';
2. API 接口支付(mapi.php)
适用场景:App / 服务端对接。你的后端发起请求,拿到 payurl(支付链接)或 qrcode(二维码内容),再展示给用户。
接口地址: <对接地址>/mapi.php
请求方式: POST
参数与页面跳转支付基本一致,注意三点区别:
1)type 变为必填(如 alipay / wxpay / usdt)
2)必须传 clientip = 付款用户的真实 IP(不是你服务器的 IP)
3)USDT 返回的 payurl 是选链页,引导用户打开该链接即可
在页面跳转支付参数基础上,增加 / 变化的参数:
| 参数 | 必填 | 说明 |
|---|---|---|
type | 必填 | 支付方式调用值,如 usdt |
clientip | 必填 | 付款用户的真实 IP |
device | 可选 | 默认 pc,见 设备类型 |
param | 可选 | 透传参数,回调时原样返回 |
返回字段(JSON):
| 字段 | 类型 | 说明 |
|---|---|---|
code | Int | 1 成功,其它值为失败 |
msg | String | 失败原因 |
trade_no | String | 平台订单号,请保存,用于对账和查单 |
payurl | String | 三选一:支付链接,让用户打开(USDT 为选链页) |
qrcode | String | 三选一:二维码内容,自行生成二维码图片展示 |
urlscheme | String | 三选一:App 唤起链接(如 weixin:// 开头) |
payurl / qrcode / urlscheme 每次只返回其中一个,按收到的字段处理即可。
PHP cURL 请求示例:
$params = array(
'pid' => 1001,
'type' => 'alipay',
'out_trade_no' => '20260817151343001',
'notify_url' => 'https://你的域名/notify.php',
'return_url' => 'https://你的域名/return.php',
'name' => 'VIP会员',
'money' => '100.00',
'clientip' => $_SERVER['REMOTE_ADDR'], // 用户真实 IP
'device' => 'mobile',
);
$params['sign'] = make_sign($params, $KEY);
$params['sign_type'] = 'MD5';
$ch = curl_init('<对接地址>/mapi.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if ($result['code'] == 1) {
// 三选一:payurl / qrcode / urlscheme
}
3. 支付结果通知(异步 / 同步)
付款成功后,平台会以 GET 方式请求你在下单时传入的两个地址:
notify_url—— 服务器异步通知,必须处理,是唯一可信的入账依据return_url—— 用户浏览器跳转,仅用于向用户展示结果,不能只靠它更新订单
可靠性要求
1)必须验签,且校验 trade_status 为 TRADE_SUCCESS、金额与订单一致;
2)做好幂等:同一笔通知可能重复送达,已处理过的订单直接返回 success;
3)处理成功后返回纯文本 success(不要带 HTML 或其他内容),否则平台判定失败并重试。
通知参数:
| 参数 | 说明 |
|---|---|
pid | 商户 ID |
trade_no | 平台订单号 |
out_trade_no | 你的商户订单号 |
type | 支付方式,如 alipay、usdt |
name | 商品名称 |
money | 订单金额(元,人民币)。注意可能不带末尾的 0,如 100 |
trade_status | 仅 TRADE_SUCCESS 表示支付成功 |
param | 下单时的透传参数(如有) |
sign / sign_type | 签名与签名类型(MD5) |
失败重试机制:你的服务器没有返回 success 时,平台会自动重试,间隔依次约为 2 分钟、16 分钟、36 分钟、1 小时,最多重试 5 次后停止。也可以在商户后台「订单明细 → 详情」中查看每次回调的结果,或手动点击"补单"重新发送。
PHP 通知处理示例(notify.php):
$KEY = '你的商户密钥';
// 1. 验签(用收到的原始参数值,不要重新格式化金额)
$sign = make_sign($_GET, $KEY);
if ($sign !== ($_GET['sign'] ?? '')) exit('sign error');
// 2. 校验支付状态
if (($_GET['trade_status'] ?? '') !== 'TRADE_SUCCESS') exit('fail');
// 3. 按 out_trade_no 找到本地订单,校验金额一致
// if (bccomp($_GET['money'], $order['money'], 2) !== 0) exit('money error');
// 4. 幂等更新:未处理则标记为已支付并发货;已处理直接跳过
// 5. 必须输出纯文本 success
echo 'success';
4. 商户信息查询
用途:查询账户余额、商户状态、订单统计。
接口地址: <对接地址>/api.php?act=query&pid={商户ID}&key={商户密钥}
请求方式: GET
返回示例:
{
"code": 1,
"pid": 1001,
"active": 1, // 商户状态:1 正常 / 0 封禁
"money": "1234.56", // 账户余额(元)
"type": 1, // 结算方式
"account": "结算账号",
"username": "结算姓名",
"orders": 2329, // 累计订单数
"orders_today": 6, // 今日成功订单数
"orders_lastday": 18 // 昨日成功订单数
}
5. 单个订单查询
用途:主动查询某笔订单是否已支付,与异步通知互补,防止漏单。
接口地址: <对接地址>/api.php?act=order&pid={商户ID}&key={商户密钥}&out_trade_no={商户订单号}
请求方式: GET
trade_no(平台订单号)与out_trade_no(商户订单号)二选一;都传时以trade_no为准。
返回示例:
{
"code": 1,
"msg": "succ",
"trade_no": "2026081715300012345", // 平台订单号
"out_trade_no": "20260817151343001", // 商户订单号
"api_trade_no": "...", // 上游 / 链上交易号
"type": "alipay", // 支付方式
"pid": 1001,
"addtime": "2026-08-17 15:13:43", // 创建时间
"endtime": "2026-08-17 15:14:02", // 支付时间
"name": "VIP会员",
"money": "100.00",
"param": "",
"buyer": "", // 付款账号
"status": 1 // 1 已支付 / 0 未支付
}
6. 批量订单查询
接口地址: <对接地址>/api.php?act=orders&pid={商户ID}&key={商户密钥}&limit=20&offset=0
请求方式: GET
| 参数 | 必填 | 说明 |
|---|---|---|
limit | 可选 | 返回条数,默认 10,最大 50 |
offset | 可选 | 偏移量(从第几条开始),默认 0 |
status | 可选 | 按状态过滤,如 1=已支付 |
成功返回 count(本次条数)与 data(订单数组,字段同单个订单查询)。
7. 结算记录查询
接口地址: <对接地址>/api.php?act=settle&pid={商户ID}&key={商户密钥}&limit=10&offset=0
请求方式: GET
limit:返回条数,默认 10,最大 50offset:偏移量,默认 0
成功时 code=1,data 为结算记录数组。
8. 订单退款
前提:需管理员为商户开启「订单退款 API」权限,未开启会返回 code=-2。
请注意:退款不是即时到账。调用成功后系统会创建一个退款工单,由客服人工审核处理。部分通道(含 USDT)可能不支持原路退回。
接口地址: <对接地址>/api.php?act=refund
请求方式: POST
| 参数 | 必填 | 说明 |
|---|---|---|
pid / key | 必填 | 商户 ID 与密钥 |
trade_no | 二选一 | 平台订单号 |
out_trade_no | 二选一 | 商户订单号 |
money | 必填 | 退款金额(元),不能超过订单实付金额 |
refund_no | 可选 | 你方退款单号,用于防止重复提交 |
reason | 可选 | 退款原因说明 |
返回示例(注意:此接口成功时 code=0,与其他接口不同):
{
"code": 0,
"msg": "退款工单已创建,等待人工处理",
"ticket_no": "TK202608170001", // 退款工单号
"status": "pending",
"money": "100.00"
}
常见问题
sign、sign_type 和空值参数;② 是否按参数名 a→z 排序;③ 拼接时值有没有被 URL 编码(不应编码);④ 密钥是直接拼在字符串末尾,没有 &key=;⑤ 结果是否为小写。money 可能是 100 而不是 100.00。验签必须用收到的原始参数值拼接,不要自己重新格式化后再算。另外注意 GET 参数中 param 可能包含特殊字符,取 $_GET 的解码值即可。notify_url 公网可访问(不能是内网地址,HTTPS 证书需有效);② 确认处理成功后返回的是纯文本 success,多一个空格或 HTML 都会判定失败;③ 平台会自动重试 5 次(约持续 2 小时);④ 也可在商户后台「订单明细 → 详情 → 回调记录」查看每次回调的 HTTP 状态码和返回内容,定位问题后点"补单"重发。clientip 必须传付款用户的真实 IP,不能传你服务器的 IP,也不能留空。如果你的服务在反向代理后面,取 X-Forwarded-For 的第一段。api_trade_no 字段,可到区块链浏览器查证。out_trade_no 做幂等处理:订单已是已支付状态时,直接返回 success,不要重复发货。