什么场景下会用到合单支付呢?下面举个例子:最常见的就是商城系统了,比如用户在一笔订单里面选择了多个不同商户的商品, 为了用户体验,在支付的时候肯定是只需要支付一次即可的;
如果我们使用传统的方式即实际后台就是一笔订单,直接支付下单即可,这里确实简单了,但是我们在给商户做结算的时候就麻烦了,需要后台去统计相关的财务信息然后再打款给商户; 但是如果不想去做这样复杂的结算步骤,或者是可能刚开始我们的平台名气小,商户想自己管理资金才放心,想自己看到相关的支付账单信息; 或者是不想再去做一套结算功能和打款流程。
此时我们就可以采用 微信的电商收付通 和 支付宝互联网平台直付通产品;它们都提供了多笔订单一起支付,最后金额自动分配的商家的账户上、账单资金冻结、结算、平台抽成的功能。
下面来谈谈在与它们对接的相关注意事项吧。
相关接口文档
关于二级商户进件
打开接口文档微信和支付的进件需要的资料都是一大坨,一看就是感觉很麻烦!在对接的时候不要管那么多,先用需要资料最少最简单的参数进件成功一个再说(快速理清认证流程和需要的相关资料), 同时也方便其他对接支付的同学可以调试后面的支付和结算相关接口(不然后面就会卡住,很多问题不能提前发现);
注意虽然资料很多但是微信和支付那边的审核是很快(几乎秒出结果),所以如果进件后审核状态一直不变,那么很大的概率是你的代码问题。
微信的电商收付通二级商户进件说明
进件的相关参数直接看官方文档即可,需要说明的是在进件的通过后,会返回一个认证的链接的二维码,需要商户去扫码确认,同时银行卡认证微信需要打款确认。
支付宝的互联网平台直付通二级商户进件说明
- 默认结算规则必须传入(虽然不传入也是可以成功的),否则后面进行支付下单的时候会失败;
- 虽然文档中写了结算账号可以是银行卡,但是实际是不支持,只支持支付宝账号;
- 进件接口请求成功后,在支付宝中登陆设置的结算账号的支付宝账号,然后搜索 ‘签约助手’ 进入里面签约;具体的流程图
- 在进件商户签约成功后(也就是上面一步的操作完成后),支付宝会回调通知我们(通知地址需要在支付宝开发者中配置);
- 注意选择使用的支付宝SDK
alipay-sdk-java
的包最好用最新的;因为旧的版本创建进件的接口中自带的AntMerchantExpandIndirectZftCreateModel
转换json转换不出sites
,导致进件请求失败。
关于支付接口
微信的合单支付说明
- 生成的合单订单号在后面查询订单的时候是需要的,不能通过子单号进行查询;但是在退款、分账操作的时候使用的是子单的订单号。
- 支付成功回调通知说明:支付成功后会将支付信息返回,其结构类似如下:
{
"combine_out_trade_no": "合单订单号",
"sub_orders": [
{
"out_trade_no": "子单订单号",
"transaction_id": "子单交易订单号",
...
},
{
"out_trade_no": "子单订单号",
"transaction_id": "子单交易订单号",
...
}
...
],
...
}
- 其他的流程和操作和普通的支付是一样的;退款的时候合单支付有专门的接口进行,同时合单支付使用的是新版本接口;
- 注意H5和微信公众号的jsapi支付需要在微信后台配置的安全域名,直接配置域名根目录即可(如:https://www.baidu.com/),否则将无法成功唤起支付(提示当前URL未注册);同时需要注意微信是会区分http和https的,不要用特殊字符。
支付宝的合单支付接口说明
- 生成的合单订单号就只在预下单的时候有用,后面都不会用了;
- 支付成功回调通知说明:虽然是合单支付的,但是支付宝的通知还是一笔笔的分开通知,即有多少个子单就有多少个通知(和普通的没有区别);其结构类似如下:
{
"out_trade_no": "子单订单号",
"trade_no": "子单交易订单号",
...
}
- 如果只有一笔订单,那么不能使用合单支付的接口,要使用普通的单个支付的接口接口,如手机网站支付就使用
alipay.trade.wap.pay
接口即可; 和普通下单的区别就是添加SettleInfo信息(支付宝提供的skd是支持设置这个的参数的:AlipayTradeWapPayModel.setSettleInfo()
);下面是一个示例:
{
"outTradeNo": "202002220016444498",
"productCode": "QUICK_WAP_WAY",
"settleInfo": {
"settleDetailInfos": [
{
"amount": "0.01",
"transInType": "defaultSettle"
}
],
"settlePeriodTime": "365d"
},
"subMerchant": {
"merchantId": "11112464984"
},
"subject": "网球排一个",
"timeoutExpress": "15m",
"totalAmount": "0.01"
}
- 关于统一收单合并支付预创建接口中的产品码productCode说明:注意文档上的是错误的,我们按实际使用修改即可。app 支付上送:
QUICK_MSECURITY_PAY
,wap 支付上送:QUICK_WAP_WAY
。 可以直接参考 支付宝的下单示例 ;注意看文档中的注意说明。 - 如果不清楚的话或者接口一直报错找不到问题,直接找支付宝的人工技术支持吧,多个人帮忙定位问题会快点。
关于订单结算接口
微信和支付宝的分账接口还是存在细微差别的。注意如果你不需要分账的话,那么就不需要调用分账接口。
如果分账失败的话在重试的时候建议还是使用原来的分账单号,避免多分(支付宝和微信那边是做了幂等的);
退款是先退该订单冻结的金额,如果不够的话会直接从商户的账号上扣除金额;如果都不够那么就会退款失败
微信的订单结算说明
微信分账接口是异步处理的,因此你需要在请求分账接口后,手动去查询一下分账是否成功。如果不需要分账的话,那么直接调用完结分账即可;注意完结分账也是异步的。 调用分账或者是完结分账接口后,资金会自动解冻(也就是二级商户可以直接提现到银行卡了);
注意:微信是提供了查询二级商户资金信息的操作接口的,如:账户余额信息、提现到银行卡等。
支付宝的订单结算说明
支付宝在调用分账接口前需要先调用确认结算接口,注意调用确认结算接口后,该笔订单的资金就会解冻到商户绑定的支付宝账号上去了; 同时支付宝的分账接口是同步的(即请求后立即就知道分账结果了)。