Open API

业务系统通过 HTTP JSON 接口与支付平台交互。所有接口前缀为 /api/v1

通用约定

项目说明
协议HTTPS(生产)/ HTTP(开发)
编码UTF-8
金额整数,单位
签名HMAC-SHA256,密钥为 app_secret
时间戳Unix 秒,timestamp 与服务器差值 ≤ 300 秒

签名算法

1. 排除 sign 字段及空值
2. 按 key 字母序排序
3. 拼接 key=value&key=value...
4. HMAC-SHA256(app_secret, 拼接串) → 小写十六进制

响应格式

{ "code": 0, "data": { ... } }
code含义
0成功
非 0失败,message 字段含错误描述

创建订单

POST /api/v1/orders

请求体

字段类型必填说明
app_idstring接入应用 ID
out_trade_nostring业务侧订单号,同一 app 下唯一
amountinteger金额(分)
subjectstring商品标题
notify_urlstring异步通知地址
return_urlstring同步回跳地址
timestampintegerUnix 时间戳(秒)
noncestring随机字符串
signstring签名

请求示例

{
  "app_id": "app_abc123",
  "out_trade_no": "ORDER20250530001",
  "amount": 100,
  "subject": "月度会员",
  "notify_url": "https://biz.example.com/api/pay/notify",
  "return_url": "https://biz.example.com/pay/success",
  "timestamp": 1717056000,
  "nonce": "a1b2c3d4e5",
  "sign": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}

响应示例

{
  "code": 0,
  "data": {
    "order_no": "P202505300001",
    "pay_url": "http://127.0.0.1:8010/pay/xYzToken123",
    "expire_at": "2025-05-30T13:00:00Z"
  }
}

将用户重定向至 pay_url 进入收银台。


查询订单

GET /api/v1/orders/{out_trade_no}?app_id=xxx&timestamp=...&nonce=...&sign=...

查询参数同样需签名(GET 参数参与签名拼接)。

响应示例

{
  "code": 0,
  "data": {
    "order_no": "P202505300001",
    "out_trade_no": "ORDER20250530001",
    "status": "paid",
    "amount": 100,
    "paid_at": "2025-05-30T12:05:00Z",
    "channel_trade_no": "wx_demo_123456"
  }
}

订单状态

status说明
pending待支付
paid已支付
closed已关闭
expired已过期

关闭订单

POST /api/v1/orders/{out_trade_no}/close?app_id=xxx&...

pending 状态订单可关闭。已支付订单不可关闭。

响应示例

{ "code": 0, "message": "ok" }

异步通知

支付成功后,平台向创建订单时指定的 notify_url 发送 POST 请求。

业务系统应:

  1. 验证签名
  2. 校验金额与订单号
  3. 幂等更新本地订单
  4. 响应纯文本 success(非 JSON)

若未收到 success,平台会按策略重试通知。


错误码示例

场景典型响应
app_id 无效{ "code": 400, "message": "app_id 无效" }
签名错误{ "code": 400, "message": "签名验证失败" }
订单不存在{ "code": 404, "message": "订单不存在" }
重复 out_trade_no{ "code": 400, "message": "订单号已存在" }