Appearance
统一支付接口 ¶
TIP
业务系统通过下单接口发起收款,网关会根据系统中的配置和业务系统传输的参数,选择的对应的支付通道和支付方式发起下单请求。 同时网关根据不同的支付方式返回对应发起支付使用的参数,业务系统使用该参数参数来调起支付。
同样的商户订单号可以重复提交,但重复提交时只有
支付通道
、支付方式
、商户扩展参数
、同步请求地址
、异步通知地址
、用户IP
、签名值
、请求时间
字段可以传输不同的值,其他参数需要与首次下单的数值一致,传输不同的值也不会生效。
接口说明 ¶
参数 | 说明 |
---|---|
请求URL | /uniPay/pay |
请求方式 | POST |
请求类型 | application/json |
请求参数 ¶
字段名 | 变量名 | 必填 | 类型 | 长度 | 示例值 | 描述 |
---|---|---|---|---|---|---|
商户订单号 | bizOrderNo | 是 | String | 100 | 123 | 支付时客户系统传输的业务单号,需要保证唯一,可以为字符文字组合 |
支付标题 | title | 是 | String | 100 | 测试支付 | |
支付描述 | description | 否 | String | 测试支付的描述 | ||
开启分账 | allocation | 否 | Boolean | true | 订单是否允许分账,不传输为不开启 | |
开启自动分账 | autoAllocation | 否 | Boolean | false | 是否自动对支付订单进行分账,需要开启分账字段为true才会生效 | |
过期时间 | expiredTime | 否 | Long | 123332133 | 请求多次发起时,以第一次发起的为准。如不传输,自动根据系统的配置,生成过期时间 | |
支付通道 | channel | 是 | String | 20 | ali_pay | 要进行支付的通道编码,如微信支付、支付宝支付等。见常量和状态表PayChannelEnum相关的描述 |
支付方式 | method | 是 | String | 20 | qrcode | 进行支付的方式编码,如扫码支付、条码支付等。见常量和状态表PayWayEnum相关的描述 |
支付金额 | amount | 是 | Integer | 10 | 要进行支付的金额,单位为分 | |
附加支付参数 | extraParam | 否 | ChannelParam具体实现类 | 2048 | 略 | 见下方支付ChannelParam参数说明,没用到这个参数可以不用传 |
商户扩展参数 | attach | 否 | String | 500 | id=123332 | 商户扩展参数,回调时会原样返回 |
同步请求地址 | returnUrl | 否 | String | 200 | http://abc.cn/returnCallback | 支付完成后,会自动跳转到设置的页面 |
退出地址 | quitUrl | 否 | String | 200 | http://abc.com/quit | 用户付款中途退出返回商户网站的地址(部分支付场景中可用) |
异步通知地址 | notifyUrl | 否 | String | 200 | http://abc.cn/noticeCallback | 异步通知地址,为空则读取管理端的配置,此配置不会生效 |
用户IP | clientIp | 否 | String | 64 | 127.0.0.1 | 支持V4和V6,部分支付方式要求必填,如调用微信支付方式时 |
随机数值 | nonceStr | 否 | String | 32 | d112892e382a7093 | |
签名值 | sign | 否 | String | 64 | 072695d112892e382a7093b81e6a52af | |
请求时间 | reqTime | 是 | Long | 123123121 | 使用时间戳(秒级) |
ChannelParam参数 ¶
TIP
支付时有一些支付方式需要额外传输一些参数,例如条码支付时就需要传输条码值,微信相关的支付需要传输OpenId
等,所以对这些格式不确定的参数, 通过ChannelParam
参数项进行传输。
AliPayParam(支付宝参数) ¶
参数 | 类型 | 描述 |
---|---|---|
authCode | String | 授权码,条码支付时主动扫描用户的付款码 |
WeChatPayParam(微信支付参数) ¶
参数 | 类型 | 描述 |
---|---|---|
openId | String | 微信openId,微信公众号支付或者小程序支付时需要进行传入 |
authCode | String | 授权码,条码支付时主动扫描用户的付款码 |
UnionPayParam(云闪付支付参数) ¶
参数 | 类型 | 描述 |
---|---|---|
authCode | String | 授权码,条码支付时主动扫描用户的付款码 |
响应结果 ¶
提示
业务数据包裹在公共响应参数
中的data
字段,在code
为0
时才会有返回数据。
字段名 | 变量名 | 必传 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
商户订单号 | bizOrderNo | 是 | String | 1753370980523384832 | 发起支付时传输的商户订单号 |
订单号 | orderNo | 是 | String | true | 支付系统生成的支付订单号 |
支付状态 | status | 否 | String | pay_success | 见常量和状态表PayStatusEnum相关的描述 |
支付参数体 | payBody | 否 | String | weixin://wxpay/bizpayurl?pr=QimHZC7zz | 用于用户终端发起支付请求数据 |
状态码 | code | 是 | Integer | 0 | 为0表示成功,非0表示失败 |
错误信息 | msg | 否 | String | 关闭失败 | 状态非0时会有返回值 |
响应时间 | resTime | 是 | Long | 123123121 | 服务返回请求的时间,时间戳(秒级) |
响应数据签名值 | sign | 是 | String | 072695d112892e382a7093b81e6a52af | 对响应内容进行签名 |
HTTP请求示例 ¶
请求参数 ¶
json
{
"bizOrderNo": "SDK_1715341280312",
"title": "测试接口支付",
"description": "这是支付备注",
"allocation": false,
"channel": "ali_pay",
"method": "qrcode",
"amount": 100,
"attach": "{回调参数}",
"returnUrl": "https://abc.com/callback",
"notNotify": true,
"clientIp": "127.0.0.1",
"sign": "43c0e7124739acab9d31990feb2a28aa1c2f33d95abfb50bfee66cd43edf4f52",
"reqTime": 1715341280
}
响应参数(成功) ¶
json
{
"msg": "success",
"code": 0,
"data": {
"bizOrderNo": "SDK_1715341280312",
"orderNo": "DEVP24051019412063000002",
"status": "progress",
"payBody": "https://qr.alipay.com/bax03105v3ixxuhjcaud00ce",
"sign": "5330b097a818c963283a17837e5c16a11cd89bf38d02494413ac2463658e7f4a",
"code": "0",
"resTime": 1715341281
},
"traceId": "w1DDykcR5rPB"
}
响应参数(失败) ¶
json
{
"msg": "success",
"code": 0,
"data": {
"sign": "82202845377221bd9d28227c2f8ad3ee7a643c1b319561a3b02902f5d4dce3d2",
"code": "1",
"msg": "支付金额超过限额",
"resTime": 1715345689
},
"traceId": "VnmUJOT9yGGl"
}
SDK请求示例 ¶
提示
使用SDK可以简化接入支付的速度
java
package cn.daxpay.single.sdk.payment;
import cn.daxpay.single.sdk.code.PayChannelEnum;
import cn.daxpay.single.sdk.code.PayMethodEnum;
import cn.daxpay.single.sdk.code.SignTypeEnum;
import cn.daxpay.single.sdk.model.pay.PayModel;
import cn.daxpay.single.sdk.net.DaxPayConfig;
import cn.daxpay.single.sdk.net.DaxPayKit;
import cn.daxpay.single.sdk.param.pay.PayParam;
import cn.daxpay.single.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
/**
* 统一支付接口
* @author xxm
* @since 2024/2/5
*/
public class PayOrderTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.signType(SignTypeEnum.HMAC_SHA256)
.build();
DaxPayKit.initConfig(config);
}
/**
* 支付
*/
@Test
public void pay() {
PayParam param = new PayParam();
param.setClientIp("127.0.0.1");
param.setNotNotify(true);
param.setBizOrderNo("SDK_"+ System.currentTimeMillis());
param.setTitle("测试接口支付");
param.setDescription("这是支付备注");
param.setAmount(100);
param.setChannel(PayChannelEnum.ALI.getCode());
param.setMethod(PayMethodEnum.QRCODE.getCode());
param.setAttach("{回调参数}");
param.setAllocation(false);
param.setReturnUrl("https://abc.com/callback");
DaxPayResult<PayModel> execute = DaxPayKit.execute(param);
System.out.println(JSONUtil.toJsonStr(execute));
}
}