01快速开始
注册商户并通过审核后,在「商户中心 → 商户信息」里拿到两个值:
| 名称 | 说明 | 示例 |
|---|---|---|
| 商户 ID(pid) | 数字编号,用来标识你的账户 | 10001 |
| 商户密钥(key) | 32 位字符串,只能放在服务端,用于签名 | a1b2c3d4e5f6... |
密钥等同于密码,不要写进前端 JS / 小程序 / APP 包体里,否则别人可以伪造你的订单。
接口地址
| 用途 | 地址 |
|---|---|
| 页面跳转支付 | https://pay.kutyar.cn/submit.php |
| API 接口支付 | https://pay.kutyar.cn/mapi.php |
| 订单 / 结算查询 | https://pay.kutyar.cn/api.php?act=query |
支付方式 type 取值:alipay 支付宝、wxpay 微信支付、qqpay QQ 钱包。
02签名规则
所有接口都要带 sign,算法固定为 MD5 小写 32 位:
- 把除
sign、sign_type以外的参数按 参数名 ASCII 升序排序; - 跳过空值,拼成
k1=v1&k2=v2&k3=v3(末尾不带 &); - 在末尾直接接上商户密钥,做 MD5,取小写。
// PHP 示例
ksort($param);
$str = '';
foreach ($param as $k => $v) {
if ($k != 'sign' && $k != 'sign_type' && $v != '') {
$str .= $k . '=' . $v . '&';
}
}
$str = rtrim($str, '&');
$sign = md5($str . $MERCHANT_KEY);
以 pid=10001, type=alipay, money=1.00, out_trade_no=T20261026001、密钥 testkey 为例:
待签名串:money=1.00&out_trade_no=T20261026001&pid=10001&type=alipay
sign = md5("money=1.00&out_trade_no=T20261026001&pid=10001&type=alipaytestkey")
金额一定要传两位小数的字符串(
1.00,不要写 1),否则签名会对不上。03页面跳转支付 推荐
浏览器直接跳转到 submit.php(GET 或 POST 都行),用户会看到收银台页面并完成支付。
| 参数 | 必填 | 说明 |
|---|---|---|
pid | 是 | 商户 ID |
type | 是 | alipay / wxpay / qqpay |
out_trade_no | 是 | 你的订单号,同一订单号不要重复提交 |
notify_url | 是 | 异步通知地址,必须是公网可访问的完整 URL |
return_url | 是 | 支付完成后用户跳回的页面 |
name | 是 | 商品名称,最长 127 字节 |
money | 是 | 金额,单位元,两位小数 |
sitename | 否 | 站点名称,显示在收银台 |
param | 否 | 自定义参数,通知时会原样带回 |
sign | 是 | 签名 |
sign_type | 是 | 固定 MD5 |
<!-- 最简单的接入方式:拼好参数直接跳转 -->
https://pay.kutyar.cn/submit.php
?pid=10001
&type=alipay
&out_trade_no=T20261026001
¬ify_url=https://your.site/pay/notify
&return_url=https://your.site/pay/return
&name=VIP会员
&money=1.00
&sign=xxxx
&sign_type=MD5
04API 接口支付
参数与页面跳转一致,另外多两个可选参数;返回 JSON,适合在 App、小程序里自己渲染收银台。
| 参数 | 必填 | 说明 |
|---|---|---|
clientip | 否 | 用户真实 IP,风控用 |
device | 否 | pc(默认)/ mobile / wechat / alipay / qq |
成功时返回:
{
"code": 1,
"trade_no": "2026102614301277123",
"payurl": "https://qr.alipay.com/xxx", // 部分通道返回
"qrcode": "https://pay.kutyar.cn/qrcode/xxx"
}
失败时 code 为负数,msg 是原因:
{ "code": -1, "msg": "签名校验失败,请返回重试!" }
拿到
payurl 后自己生成二维码或跳转即可;如果是网页环境,直接跳 payurl 也行。05异步通知(notify_url)
用户支付成功后,平台会以 GET 方式请求你填的 notify_url,参数如下:
| 参数 | 说明 |
|---|---|
pid | 商户 ID |
trade_no | 平台订单号 |
out_trade_no | 你的订单号 |
type | 支付方式名称 |
name | 商品名称 |
money | 实际支付金额 |
trade_status | 固定 TRADE_SUCCESS |
param | 下单时传的自定义参数(可选) |
sign / sign_type | 签名,规则同上 |
处理要求
- 先验签,签名不对直接返回失败;
- 幂等:同一
out_trade_no可能收到多次通知,处理过就不要再发货; - 校验金额与订单号是否与本地一致,防止伪造;
- 处理成功输出纯文本
success(不要带 HTML),否则平台会重复通知。
// notify.php 示例 $key = '你的商户密钥'; $sign = $_GET['sign']; unset($_GET['sign'], $_GET['sign_type']); ksort($_GET); $str = urldecode(http_build_query($_GET)); if (md5($str . $key) !== $sign) { exit('fail'); } if ($_GET['trade_status'] === 'TRADE_SUCCESS') { // TODO: 校验订单号/金额 → 标记已支付 → 发货 } echo 'success';
06同步跳转(return_url)
支付完成后浏览器会跳回 return_url,参数与异步通知相同。这一跳只用于展示「支付成功」页面,不要在这里发货——用户可能直接关掉页面。
07订单查询
服务端查询商户状态与订单量(不需要签名,用密钥字段鉴权):
GET https://pay.kutyar.cn/api.php?act=query&pid=10001&key=你的密钥
{
"code": 1,
"pid": 10001,
"active": 1,
"money": "128.50",
"orders": 26,
"orders_today": 3,
"orders_lastday": 5
}
结算记录查询用 act=settle,参数相同。
08常见错误
| 提示 | 原因 / 处理 |
|---|---|
| 签名校验失败 | 参数顺序、空值过滤、金额格式(要两位小数)任一处不一致;确认密钥正确 |
| 订单号格式不正确 | 只允许字母、数字、. _ - | |
| 该订单已完成支付 | 同一 out_trade_no 不要重复下单,换新订单号 |
| 该域名不可发起支付 | 去商户中心「授权域名」里把 notify_url 的域名加白 |
| 商户已封禁 / 未通过审核 | 联系客服处理 |
| 最小/最大支付金额 | 超出平台单笔限额,改金额 |
还有问题?点右下角客服或到「商户中心 → 帮助」提交工单,附上订单号和请求参数,处理更快。