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 签名