统一码支付接口说明

提供页面跳转下单、服务端接口下单、订单查询、支付结果通知和新版 HMAC 接口,便于不同类型项目快速接入。

接口约定

字符编码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_typeMD5
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 签名规则

  1. 将所有需要提交的参数组成数组。
  2. 移除 sign、sign_type,并排除空字符串、null 和数组值。
  3. 按参数名称升序排列。
  4. 拼接为 key=value&key2=value2。
  5. 在拼接结果末尾直接追加商户 API KEY,不额外增加分隔符。
  6. 计算 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商户 PID
X-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 等敏感配置必须只保存在服务端,不要提交到公开代码仓库或输出到浏览器页面。