简介与协议规则

感谢使用 柯达集团。本页是开发者对接文档(V1 / MD5 签名),覆盖以下内容:

协议规范(务必遵守)

请求格式:application/x-www-form-urlencoded

返回格式:JSON(页面跳转支付除外,会直接跳转页面)

签名算法:MD5(结果小写)

字符编码:UTF-8

金额单位:元,最多 2 位小数,如 10.00

对接地址与接口路径

对接地址说明

公开文档不展示真实生产网址。请使用平台方单独提供的 <对接地址>,下文所有接口均以此作为占位符。

例如,对接地址为 https://example.com(末尾不带 /)时,页面跳转支付地址为 https://example.com/submit.php。示例域名仅用于说明,请勿直接用于生产。

用途地址方式
页面跳转支付<对接地址>/submit.phpPOST / GET
API 接口支付<对接地址>/mapi.phpPOST
查询 / 退款<对接地址>/api.php?act=...见各接口

对接需要两个凭证,均可在商户后台「API 凭证」页获取:pid(商户 ID)和 key(MD5 密钥)。key 泄露等于资金风险,请只保存在服务器端,绝不要写进网页或 App 前端。

5 分钟对接流程

  1. 在商户后台「API 凭证」页拿到 pid 和 key。
  2. 选择接入方式:网站用 submit.php(页面跳转);App / 后端用 mapi.php(返回支付链接)。
  3. 按 MD5 签名算法 生成 sign,提交下单参数(金额、订单号、回调地址等)。
  4. 用户完成支付后,平台以 GET 方式请求你的 notify_url;你验签后处理订单,并返回纯文本 success。
  5. 建议:再用 单个订单查询 做主动查单兜底,避免因网络问题漏单。

MD5 签名算法

签名的作用是用密钥给参数"盖章",防止请求被伪造或篡改。生成步骤:

  1. 取出所有值非空的请求参数;剔除 sign 和 sign_type。
  2. 按参数名 ASCII 从小到大排序(a → z)。
  3. 拼接成 a=1&b=2&c=3 形式(值不要做 URL 编码)。
  4. 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(需商户后台已开通)。

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):

字段 类型 说明
codeInt1 成功,其它值为失败
msgString失败原因
trade_noString平台订单号,请保存,用于对账和查单
payurlString三选一:支付链接,让用户打开(USDT 为选链页)
qrcodeString三选一:二维码内容,自行生成二维码图片展示
urlschemeString三选一: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 方式请求你在下单时传入的两个地址:

可靠性要求

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

返回示例:

{
  "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

成功时 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 状态码和返回内容,定位问题后点"补单"重发。
mapi 下单提示 IP 相关错误?
clientip 必须传付款用户的真实 IP,不能传你服务器的 IP,也不能留空。如果你的服务在反向代理后面,取 X-Forwarded-For 的第一段。
USDT 订单如何确认链上到账?
到账后平台照常发送异步通知,无需自行监控链上。如需交易哈希,调用 单个订单查询,取 api_trade_no 字段,可到区块链浏览器查证。
同一笔订单会收到多次通知吗?
可能会(网络超时导致的重试、人工补单等)。请务必按 out_trade_no 做幂等处理:订单已是已支付状态时,直接返回 success,不要重复发货。