PAYATHON 2026

直付通二级商户能否使用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。正确的结算接收方标识应从直付通进件结果、签约配置或支付宝提供的商户资料中确认。

排查步骤

  1. 确认调用 alipay.trade.pay 的应用使用了已签约直付通能力的主商户身份。
  2. 确认 sub_merchant.merchant_id 对应的二级商户已通过审核,并开通付款码支付场景。
  3. 根据签约方案取得正确的 trans_in_type 和 trans_in。
  4. 在请求中补充 settle_info.settle_detail_infos,同时检查结算金额是否符合签约规则。
  5. 付款码通常只能使用一次。请求失败后,应让顾客刷新付款码再重新提交,不要继续使用原付款码测试。
  6. 参数补充完整后,如果仍然提示缺少结算条款,请联系支付宝技术支持或渠道管理员,核对该二级商户的进件产品、结算关系和接口权限。

注意事项

  • settle_info 是结算指令,sub_merchant 只提供二级商户身份信息。
  • 不要使用普通分账参数代替直付通的 settle_info。
  • 结算金额、结算接收方数量和手续费处理方式可能受签约方案限制,应以当前商户合同和接口文档为准。
  • 金额建议使用字符串并保留两位小数,例如 "100.00"。
  • 如果二级商户只完成了进件,却没有开通相应的当面付或付款码产品权限,即使参数填写正确,也可能无法完成交易。

备注:内容仅供参考。