Skip to content

统一支付接口

TIP

业务系统通过下单接口发起收款,网关会根据系统中的配置和业务系统传输的参数,选择的对应的支付通道和支付方式发起下单请求。 同时网关根据不同的支付方式返回对应发起支付使用的参数,业务系统使用该参数参数来调起支付。

同样的商户订单号可以重复提交,但重复提交时只有 支付通道支付方式商户扩展参数同步请求地址异步通知地址用户IP签名值请求时间字段可以传输不同的值,其他参数需要与首次下单的数值一致,传输不同的值也不会生效。

接口说明

参数说明
请求URL/uniPay/pay
请求方式POST
请求类型application/json

请求参数

字段名变量名必填类型长度示例值描述
商户订单号bizOrderNoString100123支付时客户系统传输的业务单号,需要保证唯一,可以为字符文字组合
支付标题titleString100测试支付
支付描述descriptionString测试支付的描述
开启分账allocationBooleantrue订单是否允许分账,不传输为不开启
开启自动分账autoAllocationBooleanfalse是否自动对支付订单进行分账,需要开启分账字段为true才会生效
过期时间expiredTimeLong123332133请求多次发起时,以第一次发起的为准。如不传输,自动根据系统的配置,生成过期时间
支付通道channelString20ali_pay要进行支付的通道编码,如微信支付、支付宝支付等。见常量和状态表PayChannelEnum相关的描述
支付方式methodString20qrcode进行支付的方式编码,如扫码支付、条码支付等。见常量和状态表PayWayEnum相关的描述
支付金额amountInteger10要进行支付的金额,单位为
附加支付参数extraParamChannelParam具体实现类2048见下方支付ChannelParam参数说明,没用到这个参数可以不用传
商户扩展参数attachString500id=123332商户扩展参数,回调时会原样返回
同步请求地址returnUrlString200http://abc.cn/returnCallback支付完成后,会自动跳转到设置的页面
退出地址quitUrlString200http://abc.com/quit用户付款中途退出返回商户网站的地址(部分支付场景中可用)
异步通知地址notifyUrlString200http://abc.cn/noticeCallback异步通知地址,为空则读取管理端的配置,此配置不会生效
用户IPclientIpString64127.0.0.1支持V4和V6,部分支付方式要求必填,如调用微信支付方式时
随机数nonceStrString32d112892e382a7093
签名值signString64072695d112892e382a7093b81e6a52af
请求时间reqTimeLong123123121使用时间戳(秒级)

ChannelParam参数

TIP

支付时有一些支付方式需要额外传输一些参数,例如条码支付时就需要传输条码值,微信相关的支付需要传输OpenId等,所以对这些格式不确定的参数, 通过ChannelParam参数项进行传输。

AliPayParam(支付宝参数)

参数类型描述
authCodeString授权码,条码支付时主动扫描用户的付款码

WeChatPayParam(微信支付参数)

参数类型描述
openIdString微信openId,微信公众号支付或者小程序支付时需要进行传入
authCodeString授权码,条码支付时主动扫描用户的付款码

UnionPayParam(云闪付支付参数)

参数类型描述
authCodeString授权码,条码支付时主动扫描用户的付款码

响应结果

提示

业务数据包裹在公共响应参数中的data字段,在code0时才会有返回数据。

字段名变量名必传类型示例值描述
商户订单号bizOrderNoString1753370980523384832发起支付时传输的商户订单号
订单号orderNoStringtrue支付系统生成的支付订单号
支付状态statusStringpay_success见常量和状态表PayStatusEnum相关的描述
支付参数体payBodyStringweixin://wxpay/bizpayurl?pr=QimHZC7zz用于用户终端发起支付请求数据
状态码codeInteger0为0表示成功,非0表示失败
错误信息msgString关闭失败状态非0时会有返回值
响应时间resTimeLong123123121服务返回请求的时间,时间戳(秒级)
响应数据签名值signString072695d112892e382a7093b81e6a52af对响应内容进行签名

错误码

TIP

见返回状态码

状态码名称备注
0成功同步成功

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));
    }
}
本文档内容版权属于济南易杯光年软件技术有限公司