易支付 V1 接入文档
本站兼容易支付 V1 的 submit.php、mapi.php、api.php 三个入口,签名算法为 MD5,与常见易支付商户端一致。网关地址:https://mapay.subdns.cc/
1. 签名规则
- 取除
sign、sign_type以外的全部非空参数; - 按参数名 ASCII 升序排序;
- 拼成
a=1&b=2&c=3(不进行 URL 编码); - 末尾直接拼接商户 KEY,取 MD5 小写 32 位,即
sign; sign_type固定为MD5。
sign = md5("clientip=203.0.113.10&device=mobile&money=1.00&name=测试商品¬ify_url=https://shop.example.com/pay/notify&out_trade_no=20261031001¶m=abc&pid=100000001&return_url=https://shop.example.com/pay/return&type=wxpay" + KEY)
2. 页面下单 submit.php
GET 或 POST 均可,参数见下表。成功后 302/303 跳转本站收银台。
| 参数 | 必填 | 说明 |
|---|---|---|
| pid | 是 | 应用 PID |
| out_trade_no | 是 | 商户订单号,1~64 字符,同一应用唯一 |
| name | 是 | 商品名称 |
| money | 是 | 金额(元),最多两位小数 |
| type | 否 | alipay / wxpay / unionpay / bank;留空则由用户在收银台选择 |
| notify_url | 是 | 异步通知地址,必须命中应用域名白名单 |
| return_url | 是 | 支付完成后的回跳地址 |
| clientip | 否 | 付款端 IP(IPv4/IPv6) |
| device | 否 | pc / mobile / qq / wechat / alipay / jump |
| param | 否 | 扩展参数,原样回传,不超过 2048 字节 |
| sign | 是 | MD5 签名 |
| sign_type | 是 | 固定 MD5 |
3. API 下单 mapi.php
仅支持 POST,type 与 clientip 必填。返回 JSON:
{ "code": 1, "msg": "订单已受理", "trade_no": "P2026103120381200011", "payurl": "https://mapay.subdns.cc/cashier/pay/B.../..." }
业务失败返回 {"code":0,"msg":"原因"}(HTTP 状态仍为 200)。
4. 查询与退款 api.php
| act | 方法 | 说明 |
|---|---|---|
| query | GET/POST | 账户概览(订单数、余额固定 0.00) |
| order | GET/POST | 单笔查询:传 trade_no 或 out_trade_no |
| orders | GET/POST | 批量查询:page、limit(≤50) |
| settle | GET/POST | 结算记录(本站自收,返回空列表) |
| refund | POST | 退款:trade_no、money 必填,可选 refund_no |
认证使用 pid + key(应用 KEY 原文)或完整签名。order 返回字段:
{
"code": 1, "msg": "查询成功",
"trade_no": "P2026...", "out_trade_no": "20261031001",
"api_trade_no": "", "type": "wxpay", "pid": "100000001",
"addtime": "2026-10-31 20:38:12", "endtime": "2026-10-31 20:39:02",
"name": "测试商品", "money": "1.00", "status": 1, "param": "abc", "buyer": ""
}
静态收款码没有上游退款接口,退款请求会登记为“不支持”,返回 code=-1,需人工处理。
5. 异步通知(商户接收)
支付成功且核对到账后,本站以 GET 请求通知 notify_url,并附带签名参数:
| 参数 | 说明 |
|---|---|
| pid | 应用 PID |
| trade_no | 本站支付单号(P 开头) |
| out_trade_no | 商户订单号 |
| type | 实际支付方式 |
| name | 商品名称 |
| money | 订单原始金额 |
| trade_status | 固定 TRADE_SUCCESS |
| param | 下单时的扩展参数(如有) |
| sign、sign_type | MD5 签名 |
商户返回 HTTP 2xx 且响应体为 success(小写,可含首尾空白)才视为确认,否则按退避自动重试。
6. 浏览器回跳
return_url 同样携带上述参数与签名,但仅当订单已成功、且商户已确认通知后才允许跳转;否则本站提示“等待商户系统确认”。
7. 到账推送(收款通道 → 本站)
后台通道详情里的推送地址形如 https://mapay.subdns.cc/api/pay/1/notify,需 POST 表单字段:
| 字段 | 说明 |
|---|---|
| from | 来源标识,如 SmsForwarder 或公众号名称 |
| content | 消息正文,支持纯文本、微信 JSON、通用 JSON |
| timestamp | 13 位毫秒时间戳,误差需在容差内 |
| sign | base64(hmac_sha256(key=密钥, message=timestamp + "\n" + 密钥)) |
通用 JSON 示例:
{"amount":"1.03","remark":"1234","trade_no":"4200002..."}
微信手机端转发示例:
{"title":"微信支付","msg":"微信支付收款1.03元,备注:1234"}
成功返回 200;未匹配到唯一订单返回 HTTP 409(可重试),验签失败返回 400。
8. 签名速查(PHP)
<?php
function epay_sign(array $p, string $key): string {
unset($p['sign'], $p['sign_type']);
$p = array_filter($p, static fn($v) => $v !== null && $v !== '');
ksort($p, SORT_STRING);
$parts = [];
foreach ($p as $k => $v) { $parts[] = $k . '=' . $v; }
return md5(implode('&', $parts) . $key);
}
9. 常见错误
PID、KEY 或签名无效:PID 不存在、KEY 版本不对或签名参数被 trim/重编码。该应用的域名未在白名单:在后台“应用与密钥”补充 notify/return 域名。轮询组暂无可用收款通道:通道被停用、超出限额或不在可用时段。识别金额已用尽:同金额并发过多,可提高偏移上限或使用备注匹配模式。
参数示例(未签名):
pid=100000001
type=wxpay
out_trade_no=20261031001
notify_url=https://shop.example.com/pay/notify
return_url=https://shop.example.com/pay/return
name=测试商品
money=1.00
clientip=203.0.113.10
device=mobile
param=abc