# 合并订单交易接口

最新更新时间: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 表示操作成功,其它值则为失败,具体内容参见错误码说明。