MPay 开发文档
欢迎使用 MPay 支付平台,本文档将帮助您快速接入我们的支付服务。
💡 提示
MPay 提供标准的 RESTful API 接口,您可以使用任何编程语言直接调用 HTTP 接口完成支付集成,无需依赖 SDK。
快速接入
1. 获取密钥
登录商户平台,在「开发对接」-「API密钥」中获取您的 mch_no(商户号)和 api_key(API密钥)。
💡 无需复杂配置
作为特约商户,您无需申请微信/支付宝的AppID和密钥,只需使用MPay平台分配的商户号和API密钥即可直接调用支付接口。
2. 接口地址
| 环境 | 地址 |
|---|---|
| 生产环境 | https://pay.fuyou8.com/api |
签名认证
所有 API 请求都需要进行签名认证,签名算法如下:
1. 将请求参数按照参数名 ASCII 码从小到大排序
2. 使用 URL 键值对的格式拼接成字符串
3. 在字符串末尾拼接 &key=您的API密钥
4. 对拼接后的字符串进行 MD5 运算,并转换为大写
签名示例
// Node.js 示例
const crypto = require('crypto');
function sign(params, apiKey) {
const sortedKeys = Object.keys(params).sort();
const stringA = sortedKeys
.map(key => `${key}=${params[key]}`)
.join('&');
const stringSignTemp = `${stringA}&key=${apiKey}`;
return crypto.createHash('md5')
.update(stringSignTemp)
.digest('hex')
.toUpperCase();
}
创建订单
POST/pay/create
创建支付订单,获取支付参数。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| merchant_id | string | 是 | 商户ID |
| out_trade_no | string | 是 | 商户订单号,需保证唯一 |
| amount | number | 是 | 订单金额,单位:分 |
| channel | string | 是 | 支付渠道:wechat/alipay |
| subject | string | 是 | 商品描述 |
| notify_url | string | 是 | 异步通知地址 |
| timestamp | string | 是 | 时间戳 |
| sign | string | 是 | 签名 |
请求示例
{
"merchant_id": "M1234567890",
"out_trade_no": "ORDER202401010001",
"amount": 9900,
"channel": "wechat",
"subject": "测试商品",
"notify_url": "https://your-domain.com/notify",
"timestamp": "1704067200",
"sign": "A1B2C3D4E5F6..."
}
响应示例
{
"code": 0,
"message": "success",
"data": {
"order_id": "P202401010001",
"pay_url": "https://pay.mpay.com/...",
"qr_code": "weixin://wxpay/..."
}
}
查询订单
POST/pay/query
查询订单支付状态。建议在以下场景调用:
- 用户支付后跳转回商户页面时
- 未收到回调通知时主动查询
- 对账时核实订单状态
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| mch_no | string | 是 | 商户号 |
| out_trade_no | string | 否 | 商户订单号(与order_no二选一) |
| order_no | string | 否 | 平台订单号(与out_trade_no二选一) |
| timestamp | string | 是 | 时间戳(秒) |
| nonce_str | string | 是 | 随机字符串 |
| sign | string | 是 | 签名 |
响应示例
{
"code": 0,
"message": "success",
"data": {
"order_no": "P202401010001",
"out_trade_no": "ORDER202401010001",
"amount": 9900,
"pay_type": "wechat_native",
"status": 1,
"status_desc": "已支付",
"transaction_id": "4200001234202401010001",
"pay_time": "2024-01-01 12:00:00",
"create_time": "2024-01-01 11:55:00"
}
}
订单状态说明
| 状态码 | 说明 |
|---|---|
| 0 | 待支付 |
| 1 | 已支付 |
| 2 | 已退款 |
| 3 | 已关闭 |
| 4 | 失败 |
关闭订单
POST/pay/close
关闭未支付的订单。
申请退款
POST/pay/refund
对已支付的订单发起退款申请。
⚠️ 注意
退款金额不能超过原订单金额,同一订单可多次退款,但累计退款金额不能超过原订单金额。
支付回调
支付成功后,系统会向您配置的 notify_url 发送 POST 请求通知支付结果。
💡 回调机制说明
• 回调通知采用异步方式,支付成功后 1-3 秒内发送
• 如果商户服务器未正确响应,系统会进行重试(最多 3 次)
• 重试间隔:5秒、10秒、15秒
• 建议同时使用回调通知 + 主动查询双重确认机制
回调参数
| 参数 | 类型 | 说明 |
|---|---|---|
| order_no | string | 平台订单号 |
| out_trade_no | string | 商户订单号 |
| amount | number | 支付金额(分) |
| status | number | 订单状态:1=已支付 |
| transaction_id | string | 渠道交易号 |
| pay_time | string | 支付时间 |
| timestamp | number | 时间戳(秒) |
| sign | string | 签名(使用您的API密钥验证) |
回调示例
{
"order_no": "P202401010001",
"out_trade_no": "ORDER202401010001",
"amount": 9900,
"status": 1,
"transaction_id": "4200001234202401010001",
"pay_time": "2024-01-01 12:00:00",
"timestamp": 1704067200,
"sign": "A1B2C3D4E5F6..."
}
回调处理示例
// Node.js Express 示例
app.post('/notify', (req, res) => {
const data = req.body;
// 1. 验证签名
const sign = data.sign;
delete data.sign;
const mySign = generateSign(data, API_KEY);
if (sign !== mySign) {
return res.send('fail');
}
// 2. 检查订单状态
if (data.status !== 1) {
return res.send('fail');
}
// 3. 检查金额是否匹配
const order = await Order.findOne({ orderNo: data.out_trade_no });
if (order.amount !== data.amount) {
return res.send('fail');
}
// 4. 更新订单状态(注意幂等性)
if (order.status === 'paid') {
return res.send('success'); // 已处理过
}
await Order.updateOne(
{ orderNo: data.out_trade_no },
{ status: 'paid', paidAt: data.pay_time }
);
// 5. 返回成功
res.send('success');
});
⚠️ 重要提醒
• 务必验证签名,防止伪造回调
• 务必验证金额,防止金额篡改
• 处理逻辑需保证幂等性,同一订单可能收到多次回调
• 返回 success 字符串表示处理成功
退款回调
退款处理完成后,系统会向您配置的回调地址发送退款结果通知,参数格式与支付回调类似。
退款回调参数
| 参数 | 类型 | 说明 |
|---|---|---|
| order_no | string | 平台订单号 |
| out_trade_no | string | 商户订单号 |
| refund_no | string | 退款单号 |
| refund_amount | number | 退款金额(分) |
| refund_status | string | 退款状态:success/fail |
| timestamp | number | 时间戳(秒) |
| sign | string | 签名 |