直付通二级商户能否使用alipay.trade.pay付款码收款?
支付老李
结论
可以使用 alipay.trade.pay 为直付通二级商户发起付款码收款,但需满足以下条件:
- 主商户和应用已开通直付通及相应的付款码支付能力。
- 二级商户已完成进件和审核,并取得相应的产品权限。
- 请求中除了
sub_merchant,还需按照直付通签约配置传入settle_info结算条款。
当前报错与付款码格式无关。请求指定了二级商户,却没有提供交易资金的结算方式,因此支付宝返回 ACQ.INVALID_PARAMETER,并提示“未传入结算条款”。
需要补充的参数
sub_merchant.merchant_id 标识实际经营的二级商户,settle_info 则指定结算收款方、收款方类型和结算金额。两者作用不同,不能互相替代。
常见的业务参数结构如下:
{
"out_trade_no": "202609090001",
"scene": "bar_code",
"auth_code": "付款码",
"subject": "门店消费",
"total_amount": "100.00",
"sub_merchant": {
"merchant_id": "2088***"
},
"settle_info": {
"settle_detail_infos": [
{
"trans_in_type": "userId",
"trans_in": "2088***",
"amount": "100.00",
"summary": "二级商户交易结算"
}
]
}
}
字段含义:
trans_in_type:结算收款方的标识类型。示例中使用userId,实际可用值应以直付通签约方案和当前接口文档为准。trans_in:结算收款方标识。该字段不一定能直接填写sub_merchant.merchant_id,应使用进件或签约时确定的结算主体标识。amount:本条结算明细对应的金额。summary:结算摘要。
Java 示例
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "202609090001");
bizContent.put("scene", "bar_code");
bizContent.put("auth_code", authCode);
bizContent.put("subject", "门店消费");
bizContent.put("total_amount", "100.00");
JSONObject subMerchant = new JSONObject();
subMerchant.put("merchant_id", "2088***");
bizContent.put("sub_merchant", subMerchant);
JSONObject settleDetail = new JSONObject();
settleDetail.put("trans_in_type", "userId");
settleDetail.put("trans_in", "2088***");
settleDetail.put("amount", "100.00");
settleDetail.put("summary", "二级商户交易结算");
JSONArray settleDetailInfos = new JSONArray();
settleDetailInfos.add(settleDetail);
JSONObject settleInfo = new JSONObject();
settleInfo.put("settle_detail_infos", settleDetailInfos);
bizContent.put("settle_info", settleInfo);
AlipayTradePayRequest request = new AlipayTradePayRequest();
request.setBizContent(bizContent.toJSONString());
示例中的 trans_in 仅用于展示参数结构,不能在未经核对的情况下固定填写为二级商户的 merchant_id。正确的结算接收方标识应从直付通进件结果、签约配置或支付宝提供的商户资料中确认。
排查步骤
- 确认调用
alipay.trade.pay的应用使用了已签约直付通能力的主商户身份。 - 确认
sub_merchant.merchant_id对应的二级商户已通过审核,并开通付款码支付场景。 - 根据签约方案取得正确的
trans_in_type和trans_in。 - 在请求中补充
settle_info.settle_detail_infos,同时检查结算金额是否符合签约规则。 - 付款码通常只能使用一次。请求失败后,应让顾客刷新付款码再重新提交,不要继续使用原付款码测试。
- 参数补充完整后,如果仍然提示缺少结算条款,请联系支付宝技术支持或渠道管理员,核对该二级商户的进件产品、结算关系和接口权限。
注意事项
settle_info是结算指令,sub_merchant只提供二级商户身份信息。- 不要使用普通分账参数代替直付通的
settle_info。 - 结算金额、结算接收方数量和手续费处理方式可能受签约方案限制,应以当前商户合同和接口文档为准。
- 金额建议使用字符串并保留两位小数,例如
"100.00"。 - 如果二级商户只完成了进件,却没有开通相应的当面付或付款码产品权限,即使参数填写正确,也可能无法完成交易。
备注:内容仅供参考。
