直付通二级商户调用alipay.trade.wap.pay是否需要传smid
结论
在直付通模式下,平台调用 alipay.trade.wap.pay 为二级商户收款时,需要传入该二级商户的 smid。
smid 不是 alipay.trade.wap.pay 的独立顶层参数,应通过 biz_content 中的 sub_merchant.merchant_id 传递:
{
"sub_merchant": {
"merchant_id": "二级商户的smid"
}
}
不要将 smid 填入 seller_id、extend_params.sys_service_provider_id 或应用授权相关参数。这些字段各有不同含义。
传参规则
直付通交易一般由平台应用发起,实际经营和收款主体则是已经完成进件的二级商户。支付宝通过 sub_merchant 判断交易属于哪个二级商户。
各字段的填写方式如下:
| 字段 | 填写内容 |
|---|---|
sub_merchant.merchant_id | 二级商户完成直付通进件后获得的 smid |
product_code | 手机网站支付固定填写 QUICK_WAP_WAY |
out_trade_no | 平台侧唯一订单号 |
total_amount | 订单金额,单位为元 |
subject | 订单标题 |
如果当前使用的不是直付通模式,是否需要传入 sub_merchant,应以相应产品的接口契约为准。直付通的规则不能直接用于普通当面付或普通手机网站支付。
JSON 示例
biz_content 可以使用以下结构:
{
"out_trade_no": "ORDER_202609090001",
"total_amount": "100.00",
"subject": "商品订单",
"product_code": "QUICK_WAP_WAY",
"sub_merchant": {
"merchant_id": "2088XXXXXXXXXXXX"
}
}
其中:
2088XXXXXXXXXXXX
需要替换为二级商户进件成功后取得的真实 smid,不能填写平台的支付宝用户 ID、应用 app_id 或商户自行生成的编号。
Java SDK 示例
使用支付宝 Java SDK 时,可以通过 SubMerchant 模型设置二级商户信息:
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("100.00");
model.setSubject("商品订单");
model.setProductCode("QUICK_WAP_WAY");
SubMerchant subMerchant = new SubMerchant();
subMerchant.setMerchantId("2088XXXXXXXXXXXX");
model.setSubMerchant(subMerchant);
request.setBizModel(model);
request.setReturnUrl("https://example.com/pay/return");
request.setNotifyUrl("https://example.com/pay/notify");
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
String paymentForm = response.getBody();
不同版本的 Java SDK 可能采用不同的模型类包名或字段封装方式。如果当前 SDK 中的 AlipayTradeWapPayModel 没有 setSubMerchant 方法,可以升级到支持该字段的版本,也可以直接通过 setBizContent 传入 JSON:
request.setBizContent("""
{
"out_trade_no": "ORDER_202609090001",
"total_amount": "100.00",
"subject": "商品订单",
"product_code": "QUICK_WAP_WAY",
"sub_merchant": {
"merchant_id": "2088XXXXXXXXXXXX"
}
}
""");
常见错误
将 smid 传给 seller_id
seller_id 表示交易卖家账号标识,并不是传递直付通二级商户编号的通用位置。直付通的 smid 应传入:
sub_merchant.merchant_id
将 smid 传给 sys_service_provider_id
extend_params.sys_service_provider_id 通常用于传递系统服务商相关标识,与二级商户的 smid 不是同一类标识。
使用进件申请编号代替 smid
进件申请单号、平台内部商户编号和 smid 是三种不同的标识。支付请求只能使用二级商户进件成功后返回或查询到的正式 smid。
二级商户状态尚未生效
参数结构正确并不代表交易一定能够成功。如果二级商户尚未完成签约、审核没有通过、状态不可用,或未开通相应的支付能力,交易仍可能失败。
遇到这种情况,应先查询二级商户的进件和签约状态,再结合支付宝返回的 code、sub_code 和 sub_msg 排查原因。
注意事项
支付请求中的 sub_merchant.merchant_id 必须与实际履约、收款的二级商户一致,不能在多个二级商户之间混用。
如果还使用了直付通分账、结算或其他资金处理能力,需要按照对应产品的规则另行填写结算参数。传入 sub_merchant.merchant_id 只能确定交易归属,不能代替结算或分账配置。
实际接入时,应以当前开放平台对 alipay.trade.wap.pay 的接口定义,以及直付通产品对 sub_merchant 字段的最新要求为准。如果线上接口文档与所用 SDK 模型不一致,应优先按照接口实际支持的 JSON 字段传参,并根据支付宝返回的错误码确认参数校验结果。
备注:内容仅供参考。
