统一支付
接口说明
商户系统通过该接口发起支付请求,系统根据支付产品和方式返回对应的支付参数体(payBody),商户前端据此调起支付或展示二维码。
适用于商户后端已确定通道与支付方式的「直连支付」场景;若需由平台收银台/聚合页选择支付方式,请使用 网关预下单。
请求地址
POST /unipay/pay
- 认证:RSA 签名(
@PaymentVerify) - 响应:
DaxResult<NormalPayResult>
请求参数
基础参数(所有 /unipay/* 接口通用)
继承自 PaymentCommonParam / MerchantPaymentCommonParam:
| 参数 | 类型 | 必填 | 最大长度 | 描述 |
|---|---|---|---|---|
| mchNo | string | 是 | 32 | 商户号 |
| appId | string | 否 | 32 | 应用 ID |
| channelMchNo | string | 否 | 32 | 通道商户号(调试或直接指定通道时传入,正常路由场景留空) |
| reqId | string | 是 | 64 | 请求唯一标识 |
| nonceStr | string | 否 | 32 | 随机字符串 |
| sign | string | 是 | 1024 | RSA 签名(Base64) |
| reqTime | string | 是 | — | 请求时间(yyyy-MM-dd HH:mm:ss,GMT+8) |
| clientIp | string | 否 | 64 | 客户端 IP |
业务参数
| 参数 | 类型 | 必填 | 最大长度 | 描述 |
|---|---|---|---|---|
| bizOrderNo | string | 是 | 100 | 商户订单号,商户系统唯一 |
| title | string | 是 | 100 | 订单标题 |
| description | string | 否 | 50 | 订单描述 |
| amount | long | 是 | — | 订单金额,单位分(最小 1,最大 9999999999) |
| product | string | 否 | 32 | 支付产品编码(为空时由路由引擎自动选择) |
| method | string | 否 | 32 | 支付方式,如 wechat_qr、alipay_pc(见下方码表) |
| capability | string | 否 | 32 | 支付能力编码(直接指定通道时作为输入参与校验) |
| openId | string | 否 | 128 | 用户标识(微信 jsapi/mini 场景必填) |
| channelAppId | string | 否 | 128 | 通道应用 ID(非空则强制使用,须预先配置) |
| authCode | string | 否 | 128 | 授权码(付款码/被扫支付必填) |
| limitPay | string[] | 否 | 10 | 限制支付的支付方式列表(如 no_credit 禁用信用卡) |
| extraParam | string | 否 | 2048 | 通道扩展参数(JSON) |
| goodsDetail | object[] | 否 | 50 | 订单商品明细列表(用于单品营销、电子发票等) |
| notifyUrl | string | 否 | 200 | 异步通知地址 |
| returnUrl | string | 否 | 200 | 同步跳转地址 |
| attach | string | 否 | 500 | 附加数据,回调时原样返回 |
| expiredTime | string | 否 | — | 订单过期时间(yyyy-MM-dd HH:mm:ss,GMT+8,空则默认 30 分钟) |
| terminal | object | 否 | — | 终端信息(线下 POS/收银台场景) |
method 的必填性
跟随通道路由时一般必填;被扫场景可仅传 authCode(平台按前缀识别回填);已直接指定 channelMchNo + capability 时可空(按能力反推)。
请求示例
json
{
"mchNo": "M200000001",
"appId": "APP001",
"reqId": "REQ20241201001",
"nonceStr": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS",
"reqTime": "2024-12-01 12:00:00",
"sign": "Base64签名值",
"bizOrderNo": "ORDER20241201001",
"title": "测试商品",
"amount": 100,
"method": "wechat_qr",
"notifyUrl": "https://your-domain.com/notify",
"returnUrl": "https://your-domain.com/return"
}响应参数
DaxResult<NormalPayResult>,data 字段结构:
| 参数 | 类型 | 描述 |
|---|---|---|
| orderId | long | 订单 ID |
| bizOrderNo | string | 商户订单号 |
| orderNo | string | 平台业务单号 |
| tradeNo | string | 资金交易号 |
| status | string | 支付状态(PayStatusEnum) |
| payBody | string | 支付参数体(二维码内容、调起参数或跳转地址) |
| payBodyType | string | 支付参数体类型(PayBodyTypeEnum) |
payBodyType 取值
对应后端枚举 PayBodyTypeEnum:
| 类型 | 说明 | payBody 示例 |
|---|---|---|
link | 支付链接(跳转) | https://open.weixin.qq.com/... |
jsapi | JSAPI 调起参数对象 | JSON 字符串,前端直接用于调起 SDK |
from | 表单数据(自动提交表单 HTML) | <form action="...">...</form> |
identifier | 标识码(如付款码场景的标识) | 通道返回的纯标识字符串 |
qr_code | 二维码内容(前端渲染成二维码图片) | weixin://wxpay/bizpayurl?pr=xxxxx |
json | JSON 对象(通道自定义结构) | 通道约定的 JSON 字符串 |
与旧文档差异
旧版文档曾使用 code_url / pay_info / redirect_url,这些不是真实枚举值。请以上表为准。
响应示例
json
{
"code": 0,
"msg": "success",
"data": {
"orderId": 1853123456789012345,
"bizOrderNo": "ORDER20241201001",
"orderNo": "P2024120112345700001",
"tradeNo": "T2024120112345700001",
"status": "progress",
"payBody": "weixin://wxpay/bizpayurl?pr=xxxxx",
"payBodyType": "qr_code"
},
"sign": "Base64签名值",
"resTime": "2024-12-01T04:00:00Z",
"reqId": "REQ20241201001"
}支付方式(method)
method 字段对应 PayMethodEnum,按渠道分组:
微信支付
| method | 说明 |
|---|---|
| wechat_qr | 微信扫码支付(Native) |
| wechat_jsapi | 微信 JSAPI 支付(公众号) |
| wechat_mini | 微信小程序支付 |
| wechat_h5 | 微信 H5 支付 |
| wechat_app | 微信 APP 支付 |
| wechat_barcode | 微信付款码支付(被扫) |
| wechat_cashier | 微信收银台支付 |
支付宝
| method | 说明 |
|---|---|
| alipay_qr | 支付宝扫码支付 |
| alipay_jsapi | 支付宝生活号支付(含小程序) |
| alipay_pc | 支付宝 PC 网站支付 |
| alipay_h5 | 支付宝 H5 支付 |
| alipay_app | 支付宝 APP 支付 |
| alipay_barcode | 支付宝付款码支付(被扫) |
银联
| method | 说明 |
|---|---|
| union_qr | 银联扫码支付 |
| union_jsapi | 银联 JSAPI 支付 |
| union_h5 | 银联 H5 支付 |
| union_barcode | 银联付款码支付(被扫) |
抖音支付
| method | 说明 |
|---|---|
| douyin_qr | 抖音扫码支付 |
| douyin_jsapi | 抖音 JSAPI 支付 |
| douyin_h5 | 抖音 H5 支付 |
| douyin_app | 抖音 APP 支付 |
聚合支付
| method | 说明 |
|---|---|
| aggregate_pay_qrcode | 聚合扫码支付(通道原生一码多付) |
境外卡(预留)
| method | 说明 |
|---|---|
| visa_card_gateway | Visa 网关支付 |
| visa_card_present | Visa 刷卡支付 |
| mastercard_card_gateway | Mastercard 网关支付 |
| mastercard_card_present | Mastercard 刷卡支付 |
支付状态(PayStatusEnum)
| status | 说明 |
|---|---|
| wait | 等待中(未指定通道和支付方式) |
| progress | 处理中(已发起通道调用) |
| success | 支付成功 |
| close | 已关闭 |
| cancel | 已撤销 |
| fail | 支付失败 |
| timeout | 已超时 |