# 合并订单交易接口

最新更新时间:2023.06.13

将多个商户的订单合并发起交易。
注意:要使用本接口下单,要求子单必须为两个或两个以上。否则请使用单笔订单交易接口。

# 接口说明

请求URL: https://{domain}/os-base/trade/merge/v2/open

请求方式: POST

请求参数 公共请求参数

参数名 必填 类型 说明
access_id 是 string 开发者唯一标识
sign_type 是 string 固定传RSA2
time_stamp 是 long 请求时间,Linux时间戳,单位毫秒
sign 是 string 签名结果
data 是 string 将业务参数转为JSON字符串,然后使用BASE64编码的数据

详细签名方法请阅读接口加密方案


名称 必填 类型 说明
payChannel 是 string 支付渠道 ALI_PAY:支付宝,WX_PAY:微信 常量定义在SDK中PayConstant.PayChannel中
payProduct 是 string 支付产品类型 APP:手机App客户端,MINI_APP:小程序,M_WEB:手机网页支付,PC_WEB:电脑网页支付,USER_QR:用户扫描商家二维码支付,MCH_QR:商家扫描用户付款码支付,FACE:刷脸付常量定义在SDK中PayConstant.PayProduct中
timeExpire 否 long 绝对超时时间,超出该时间则支付失效 时间戳,标准北京时间
ownerPayTerminal 否 string 商户支付终端, 商户自传
ownerMergeNo 否 string 商户自传的并笔支付编号,传此值时会进行系统重复提交校验
ownerAppId 否 string 商户独立应用的appId
ownerAppBuyerId 条件必传 string 支付宝或微信应用的买家id,小程序必传 (若商户有独立的小程序应用,则传商户小程序的用户id)
notifyUrl 否 string 通知地址 通知URL必须为直接可访问的URL,不允许携带查询串,要求必须为https地址。
subTradeOrders 是 List 交易子单详情
↪ appId 否 string 订单明细的应用唯一标识(16位纯数字),指商家的app_id, 没有可不传
↪ ownerTradeNo 是 string 商户交易订单号,要求唯一,此值时会进行系统重复提交校验
↪ orderFee 是 int 子订单金额 单位分 范围1~1000000000
↪ title 是 string 订单标题 最长256
↪ osMerchantCode 是 string 平台分配商户编号
↪ osStoreCode 是 string 门店编号
↪ notifyUrl 否 string 通知地址 通知URL必须为直接可访问的URL,不允许携带查询串,要求必须为https地址。如果主单notifyUrl 无值,此属性有值,则多次回调
↪ payBusiness 否 string 支付业务,业务有特殊收款配置时必传,传入此值会进行校验,未指定时,不传
↪ remark 否 string 给支付平台的附加信息,支付平台会原封回调给对用方
↪ ownerBusinessNo 否 string 商户创建的订单业务号,支付传参时原封不动返回

公共响应参数

名称 必传 类型 说明
code 是 int 请求结果code,详细请参考错误码说明)
msg 是 string 请求结果描述,失败时会返回错误原因
data 否 object 请求结果返回的业务响应参数,若无业务参数则返回空

响应参数

名称 类型 说明
osMergeNo string 开放平台交易记录唯一订单号
timestamp string 时间戳,标准北京时间
sign string 调起支付的签名信息
用户扫码支付:统一返回url链接
支付宝:返回的String可直接调用支付宝sdk拉起支付
微信支付:返回Json字符串

SDK方法

// 创建上传数据client
TyhPaymentClient client = TyhPaymentClient.create(TyhOptions.builder()
                .accessId(ACCESS_ID)
                .secretKey(SECRET_KEY)
                .allowUpload(Boolean.TRUE)
                .build());

// 合单支付示例
TradeMergeCmd.SubTradeCmd subCmd01 = TradeMergeCmd.SubTradeCmd.builder()
    .ownerTradeNo("qi_000000000000001")
    .orderFee(1)
    .title("iPhone13 Pro Max")
    .osMerchantCode("OS_MERCHANT_ID1")
    .osStoreCode("OS_MERCHANT_ID1")
    .build();

TradeMergeCmd.SubTradeCmd subCmd02 = TradeMergeCmd.SubTradeCmd.builder()
    .ownerTradeNo("qi_000000000000002")
    .orderFee(2)
    .title("iPhone12 Pro Max")
    .osMerchantCode("OS_MERCHANT_ID2")
    .osStoreCode("OS_MERCHANT_ID2")
    .build();

List<TradeMergeCmd.SubTradeCmd> subList = Arrays.asList(subCmd01, subCmd02);

TradeMergeCmd cmd = TradeMergeCmd.builder()
    .payChannel(PayConstant.PayChannel.WX_PAY)
    .payProduct(PayConstant.PayProduct.USER_QR)
    .timeExpire(String.valueOf(System.currentTimeMillis() + 1000 * 60 * 10))
    .subTradeOrders(subList)
    .build();

try {
    Results<TradeMergePayDto> results = client.mergeTrade(cmd);
    //获取支付结果
    TradeMergePayDto dto = results.getData();
} catch (Exception e) {
    e.printStackTrace();
}
     

入参格式

{
  "payChannel": "WX_PAY",
  "payProduct": "USER_QR",
  "subTradeOrders": [{
    "orderFee": 1,
    "osMerchantCode": "2163737270000001",
    "osStoreCode": "2163737270000001",
    "ownerTradeNo": "qi_000000000000001",
    "title": "iPhone13 Pro Max"
  }, {
    "orderFee": 2,
    "osMerchantCode": "2163737270000002",
    "osStoreCode": "2163737270000002",
    "ownerTradeNo": "qi_000000000000002",
    "title": "iPhone12 Pro Max"
  }],
  "timeExpire": "1637908592496"
}

出参格式:

{
  "osMergeNo": "merge_25778271750131714",
  "sign": "weixin://wxpay/bizpayurl/up?pr=2J30MBA00&groupid=00",
  "timestamp": "1637908240765"
}

code 为 8888 表示操作成功,其它值则为失败,具体内容参见错误码说明。