用户端统一支付
所有业务插件统一调用核心支付接口。用户端不得提交或覆盖订单金额。
查询可用支付渠道
text
GET /api/auth/payment/channels需要会员登录。
| Query参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
source_plugin_id | string | 是 | 来源插件标识,例如 ecommerce |
source_order_uid | string | 是 | 插件业务订单UID |
browser_environment | integer | 否 | 1普通浏览器,2微信内,3支付宝内 |
响应示例:
json
{
"code": 0,
"msg": "success",
"data": [{
"payment_config_uid": "cph8...",
"channel": 1,
"scene": 1,
"name": "微信支付",
"logo": "https://cdn.example.com/payment/wechat.png",
"recommended": true
}]
}| 响应字段 | 类型 | 说明 |
|---|---|---|
data[].payment_config_uid | string | 支付配置业务 UID,创建支付时原样提交 |
data[].channel | integer | 支付渠道:1微信,2支付宝 |
data[].scene | integer | 支付场景:1微信小程序,2微信JSAPI,3微信H5,4微信APP,5支付宝小程序,6支付宝H5,7支付宝APP |
data[].name | string | 管理端配置的支付方式名称 |
data[].logo | string | 按当前默认存储渠道补全的 Logo 地址 |
data[].recommended | boolean | 是否为当前列表推荐项 |
订单不存在、不属于当前会员、已支付、已关闭或已过期时返回业务错误。没有满足用户端渠道与支付场景的配置时,成功返回空数组。
创建支付
text
POST /api/auth/payment/create请求参数:
json
{
"source_plugin_id": "ecommerce",
"source_order_uid": "c123",
"payment_config_uid": "cph8...",
"scene": 1,
"browser_environment": 1,
"request_uid": "pay_1790000000000_abcd1234",
"return_url": "https://m.example.com/payment/result"
}| Body参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
source_plugin_id | string | 是 | 来源插件标识 |
source_order_uid | string | 是 | 业务订单UID |
payment_config_uid | string | 是 | 渠道列表返回的支付配置UID |
scene | integer | 是 | 支付场景1至7 |
browser_environment | integer | 否 | 浏览器环境 |
request_uid | string | 是 | 8至64位客户端幂等标识,同一请求重试保持不变 |
return_url | string | 否 | H5支付完成返回地址 |
响应示例:
json
{
"code": 0,
"msg": "success",
"data": {
"attempt_uid": "cpa1...",
"payment_uid": "cpay...",
"launch_type": "uni_request_payment",
"payload": {
"provider": "wxpay",
"timeStamp": "1790000000",
"nonceStr": "...",
"package": "prepay_id=...",
"signType": "RSA",
"paySign": "..."
}
}
}launch_type 取值:
uni_request_payment:调用uni.requestPayment。redirect:H5跳转payload.url。
| 响应字段 | 类型 | 说明 |
|---|---|---|
data.attempt_uid | string | 本次支付尝试 UID,用于审计 |
data.payment_uid | string | 核心支付单 UID,用于查询最终状态 |
data.launch_type | string | uni_request_payment 或 redirect |
data.payload | object | 第三方支付拉起参数,不包含商户密钥 |
同一会员重复提交相同 request_uid 时不会创建第二条支付尝试;待支付请求返回已缓存的拉起参数。失败或关闭的请求必须生成新的 request_uid 再次发起。
查询支付状态
text
GET /api/auth/payment/status?payment_uid={支付单UID}仅允许查询当前会员自己的支付单。
响应示例:
json
{
"code": 0,
"msg": "success",
"data": {
"payment_uid": "cpay...",
"payment_no": "POcpay...",
"status": 3,
"amount": "99.00",
"paid_amount": "99.00",
"paid_at": "2026-10-15T15:20:30+08:00"
}
}状态:1待支付,2支付中,3已支付,4已关闭,5部分退款,6已退款。
| 响应字段 | 类型 | 说明 |
|---|---|---|
data.payment_uid | string | 核心支付单 UID |
data.payment_no | string | 核心支付单号 |
data.status | integer | 支付单状态 |
data.amount | string | 应付金额,两位小数字符串 |
data.paid_amount | string | 已支付金额,两位小数字符串 |
data.paid_at | string/null | 服务端确认的支付时间 |
第三方支付回调
text
POST /api/payment/notify/{channel}/{config_uid}该接口由微信或支付宝调用,不携带平台来源头和会员令牌。
channel=1:微信支付API v3通知,验证RSA签名并使用APIv3 Key解密。channel=2:支付宝异步通知,验证RSA2签名、AppID和商户号。- 重复通知通过数据库行锁、支付状态机和插件条件更新幂等处理。
- 不同渠道先后成功支付时仅首笔进入业务订单;后续流水记录为待退款异常并向渠道返回成功,避免第三方无限重试。
- 验签、金额或订单校验失败时不修改订单,并返回渠道失败响应等待重试。