Skip to content

统一分账接口

TIP

针对可以分账的支付订单,在没有开启自动分账的情况下,需要调用此接口进行分账,支持手动指定分账接收方、手动指定分账组、使用默认分账组进行分账三种。 已经接入支付宝和微信支付的分账产品,每笔支付订单限定只能分一次账,不能多次分账。

接口说明

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

请求参数

字段名变量名必填类型示例值描述
商户分账单号bizAllocationNoString100123支付时客户系统传输的分账单号,需要保证唯一,可以为字符文字组合
支付订单号orderNoString32P123
商户支付订单号bizOrderNoString100DEVP123
分账描述descriptionString150测试支付的描述
分账组编号groupNoString20123优先级 分账接收方列表 > 分账组编号 > 默认分账组
分账接收方列表receiversAllocReceiverParam[]
异步通知地址notifyUrlString200http://abc.cn/noticeCallback异步通知地址,为空则读取管理端的配置,此配置不会生效
商户扩展参数attachString500id=123332商户扩展参数,回调时会原样返回
用户IPclientIpString127.0.0.1支持V4和V6,部分支付方式要求必填,如调用微信支付方式时
随机数nonceStrString32d112892e382a7093
签名值signString64072695d112892e382a7093b81e6a52af
请求时间reqTimeLong123123121使用时间戳(秒级)

AllocReceiverParam参数

字段名变量名必填类型示例值描述
分账接收方编号receiverNoString32123
分账金额amountInteger15

响应结果

提示

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

字段名变量名必传类型示例值描述
分账单号allocationNoString1753370980523384832发起支付时传输的商户订单号
商户分账单号bizAllocationNoString1753370980523384832支付系统生成的支付订单号
支付状态statusStringallocation_processing见常量和状态表AllocOrderStatusEnum相关的描述
状态码codeInteger0为0表示成功,非0表示失败
错误信息msgString关闭失败状态非0时会有返回值
响应时间resTimeLong123123121服务返回请求的时间,时间戳(秒级)
响应数据签名值signString072695d112892e382a7093b81e6a52af对响应内容进行签名

错误码

TIP

见返回状态码

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

HTTP请求示例

请求参数

json
{
  "bizAllocationNo": "A29729",
  "orderNo": "DEVP24060123574963000003",
  "description": "测试分账",
  "receivers": [
    {
      "receiverNo": "123",
      "amount": 6000
    }
  ],
  "attach": "88899",
  "clientIp": "127.0.0.1",
  "sign": "fbe24cb131ee86ff76b66b8d7909169b26b805ac2195969caf18d0079ba4beea",
  "reqTime": 1717261696
}

响应参数(成功)

json
{
  "msg": "success",
  "code": 0,
  "data": {
    "allocationNo": "DEVA24060201494863000002",
    "bizAllocationNo": "A60434",
    "status": "allocation_processing",
    "code": 0,
    "resTime": 1717264189,
    "sign": "a29b68e5d89ec6c7f2985a2680bd22b40cbffd79b4e0d8d0ec331e9b6337e1b1"
  },
  "traceId": "inOL4mbRjzLa"
}

响应参数(失败)

json
{
  "msg": "success",
  "code": 0,
  "data": {
    "code": 1,
    "msg": "该订单已分账完成",
    "resTime": 1717261697,
    "sign": "bd3fef1a43a017edf57359035a3f8fce2dbd3c32f5bfb43360e9ef3d913c6413"
  },
  "traceId": "rkq7V4y04zG2"
}

SDK请求示例

提示

使用SDK可以简化接入支付的速度

java
package cn.daxpay.single.sdk.allocation;

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.allocation.AllocationModel;
import cn.daxpay.single.sdk.model.pay.PayModel;
import cn.daxpay.single.sdk.model.sync.AllocSyncModel;
import cn.daxpay.single.sdk.net.DaxPayConfig;
import cn.daxpay.single.sdk.net.DaxPayKit;
import cn.daxpay.single.sdk.param.allocation.AllocFinishParam;
import cn.daxpay.single.sdk.param.allocation.AllocReceiverParam;
import cn.daxpay.single.sdk.param.allocation.AllocSyncParam;
import cn.daxpay.single.sdk.param.allocation.AllocationParam;
import cn.daxpay.single.sdk.param.pay.PayParam;
import cn.daxpay.single.sdk.response.DaxPayResult;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import org.junit.Before;
import org.junit.Test;

import java.util.Collections;

/**
 * 支付分账测试
 * @author xxm
 * @since 2024/4/6
 */
public class AllocationTest {

    @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 allocationOrder() {
        PayParam param = new PayParam();
        param.setClientIp("127.0.0.1");
        param.setNotNotify(true);

        param.setBizOrderNo("SDK_"+ System.currentTimeMillis());
        param.setTitle("测试手动分账");
        param.setDescription("这是支付备注");
        param.setAmount(10000);
        param.setChannel(PayChannelEnum.ALI.getCode());
        param.setMethod(PayMethodEnum.QRCODE.getCode());
        param.setAttach("{回调参数}");
        param.setAllocation(true);

        DaxPayResult<PayModel> execute = DaxPayKit.execute(param);
        System.out.println(JSONUtil.toJsonStr(execute));
        
    }

    /**
     * 创建自动分账订单
     */
    @Test
    public void allocationAutoOrder() {
        PayParam param = new PayParam();
        param.setClientIp("127.0.0.1");
        param.setNotNotify(true);

        param.setBizOrderNo("SDK_"+ System.currentTimeMillis());
        param.setTitle("测试手动分账");
        param.setDescription("这是支付备注");
        param.setAmount(10000);
        param.setChannel(PayChannelEnum.UNION_PAY.getCode());
        param.setMethod(PayMethodEnum.QRCODE.getCode());
        param.setAttach("{回调参数}");
        param.setAllocation(true);
        param.setAutoAllocation(true);

        DaxPayResult<PayModel> execute = DaxPayKit.execute(param);
        System.out.println(JSONUtil.toJsonStr(execute));
        
    }

    /**
     * 手动发起分账, 使用默认分账组
     */
    @Test
    public void allocationOpen() {
        // 分账参数
        AllocationParam param = new AllocationParam();
        param.setBizAllocationNo("A"+ RandomUtil.randomNumbers(5));
        param.setAttach("88899");
        param.setBizOrderNo("SDK_1717233422418");
        param.setDescription("测试分账");
        param.setClientIp("127.0.0.1");

        DaxPayResult<AllocationModel> execute = DaxPayKit.execute(param);
        System.out.println(JSONUtil.toJsonStr(execute));
    }

    /**
     * 手动发起分账, 使用指定分账组
     */
    @Test
    public void allocationOpenByGroup() {
        // 分账参数
        AllocationParam param = new AllocationParam();
        param.setBizAllocationNo("A"+ RandomUtil.randomNumbers(5));
        param.setAttach("88899");
        param.setBizOrderNo("SDK_1717257064753");
        param.setGroupNo("123");
        param.setDescription("测试分账");
        param.setClientIp("127.0.0.1");

        DaxPayResult<AllocationModel> execute = DaxPayKit.execute(param);
        System.out.println(JSONUtil.toJsonStr(execute));
    }

    /**
     * 手动发起分账, 手动传入接收方
     */
    @Test
    public void allocationOpenByReceivers() {
        // 分账参数
        AllocationParam param = new AllocationParam();
        param.setBizAllocationNo("A"+ RandomUtil.randomNumbers(5));
        param.setAttach("88899");
        param.setOrderNo("DEVP24060123574963000003");
        AllocReceiverParam allocReceiverParam = new AllocReceiverParam();
        allocReceiverParam.setReceiverNo("123");
        allocReceiverParam.setAmount(6000);
        param.setReceivers(Collections.singletonList(allocReceiverParam));
        param.setDescription("测试分账");
        param.setClientIp("127.0.0.1");

        DaxPayResult<AllocationModel> execute = DaxPayKit.execute(param);
        System.out.println(JSONUtil.toJsonStr(execute));
    }
}
本文档内容版权属于济南易杯光年软件技术有限公司