接口约定
字符编码UTF-8
传统接口表单参数
兼容签名MD5
新版接口HMAC-SHA256
接口域名使用你的码支付实际部署域名。生产环境建议始终使用 HTTPS,并从业务服务器发起需要商户密钥的请求。
页面跳转支付
POST/submit.php创建订单后跳转统一收银台适合网站前台提交支付表单。接口验证商户、签名、回调地址和支付通道后创建平台订单,并重定向到收银台。
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
| pid | 是 | 整数 | 商户 PID |
| type | 是 | 字符串 | 支付类型,如 alipay、wxpay |
| out_trade_no | 是 | 字符串 | 商户唯一订单号,同一商户不可重复 |
| notify_url | 是 | 字符串 | 服务器异步通知地址 |
| return_url | 是 | 字符串 | 支付完成后的同步跳转地址 |
| name | 是 | 字符串 | 商品或订单名称 |
| money | 是 | 金额 | 订单金额,最低 0.01 元,最多两位小数 |
| attach | 否 | 字符串 | 附加数据,支付通知时原样返回 |
| sign | 是 | 字符串 | MD5 请求签名 |
| sign_type | 否 | 字符串 | 兼容字段,建议填写 MD5 |
POST /submit.php Content-Type: application/x-www-form-urlencoded pid=1000&type=alipay&out_trade_no=ORDER001&money=9.90&name=会员充值&...
服务端接口支付
POST/mapi.php创建订单并返回 JSON 数据参数规则与页面跳转支付一致,但不会直接跳转页面,而是返回平台订单号、实际支付金额、二维码内容、支付链接和收银台地址,适合业务后端自行决定展示方式。
{
"code": 1,
"msg": "请求成功",
"trade_no": "平台订单号",
"out_trade_no": "ORDER001",
"money": "9.90",
"truemoney": "9.90",
"fee": "0.00",
"qrcode": "二维码内容或地址",
"pay_url": "支付跳转地址",
"cashier_url": "统一收银台地址",
"expires_at": 1780000000
}说明:如果个人免签通道开启浮动金额,
truemoney 可能与原订单 money 不同,收银台和实际扫码付款应以 truemoney 为准。订单查询
推荐 POST/api.php?act=order按平台订单号或商户订单号查询;兼容 GET,但不建议把商户 KEY 放在 URL 中| 参数 | 必填 | 说明 |
|---|---|---|
| act | 是 | 固定为 order |
| id | 是 | 商户 PID |
| key | 是 | 商户 API KEY,仅服务端使用 |
| trade_no | 二选一 | 平台订单号 |
| out_trade_no | 二选一 | 商户订单号 |
POST /api.php?act=order Content-Type: application/x-www-form-urlencoded act=order&id=1000&key=你的商户密钥&out_trade_no=ORDER001
返回订单的支付类型、订单号、原始金额、实际支付金额、手续费、状态、创建时间和支付完成时间等字段。出于安全考虑,商户 KEY 应只从服务端通过 POST 传递,避免进入浏览器历史和访问日志。
支付结果异步通知
订单确认支付成功后,系统向商户 notify_url 发送 POST 通知。主要字段如下:
| 参数 | 说明 |
|---|---|
| pid | 商户 PID |
| trade_no | 平台订单号 |
| out_trade_no | 商户订单号 |
| type | 支付类型 |
| name | 商品名称 |
| money | 原订单金额 |
| trade_status | 支付成功时为 TRADE_SUCCESS |
| attach | 创建订单时传入的附加数据 |
| sign | 通知签名 |
| sign_type | MD5 |
pid=1000 trade_no=平台订单号 out_trade_no=ORDER001 type=alipay name=会员充值 money=9.90 trade_status=TRADE_SUCCESS attach=user_10086 sign=... sign_type=MD5
商户完成验签和业务处理后,必须返回纯文本:
success
回调处理务必做幂等:同一个 out_trade_no 即使收到多次成功通知,也只能充值、发货或开通权益一次。
MD5 签名规则
- 将所有需要提交的参数组成数组。
- 移除
sign、sign_type,并排除空字符串、null 和数组值。 - 按参数名称升序排列。
- 拼接为
key=value&key2=value2。 - 在拼接结果末尾直接追加商户 API KEY,不额外增加分隔符。
- 计算 MD5,得到小写十六进制字符串。
canonical = "money=9.90&name=会员充值&out_trade_no=ORDER001&pid=1000&type=alipay..." sign = md5(canonical + API_KEY)
新版 HMAC 接口
新项目可使用 /v1.php。认证信息放在请求头中,结合时间戳、nonce、请求方法、完整 URI 和原始请求体生成 HMAC-SHA256 签名,并对 nonce 做防重放处理。
X-CodePay-Pid商户 PIDX-CodePay-Timestamp当前 Unix 时间戳,允许小范围时钟偏差X-CodePay-Nonce每次请求使用新的随机字符串X-CodePay-SignatureHMAC-SHA256 签名创建订单
POST/v1.php?action=create{
"type": "alipay",
"out_trade_no": "ORDER001",
"notify_url": "https://merchant.example/notify",
"return_url": "https://merchant.example/return",
"name": "会员充值",
"money": "9.90",
"attach": "user_10086"
}查询订单
GET/v1.php?action=query&out_trade_no=ORDER001常见错误与排查
签名验证错误
参与签名参数、排序规则或商户密钥不一致。
回调地址未通过校验
notify_url 或 return_url 的域名不符合当前商户安全设置。
没有可用收款通道
支付类型、通道状态、在线状态、金额限额或日限额不满足。
订单已存在
同一商户提交了重复的 out_trade_no,请为每笔业务订单生成唯一订单号。
nonce 已使用
新版 HMAC 接口重复使用了同一个随机数,需要每次请求生成新的 nonce。
timestamp 已过期
服务器时间与请求时间偏差过大,先同步服务器系统时间。
API KEY、支付宝应用私钥、微信商户私钥和 APIv3 Key 等敏感配置必须只保存在服务端,不要提交到公开代码仓库或输出到浏览器页面。