Node SDK 调用 alipay.trade.pay 时 produce_code 如何设置?
支付小周
结论
调用 alipay.trade.pay 进行当面付时,销售产品码应为:
FACE_TO_FACE_PAYMENT
在 Node SDK 的 bizContent 中,字段名通常写作 productCode,而不是 produceCode:
productCode: 'FACE_TO_FACE_PAYMENT'
FAST_INSTANT_TRADE_PAY 是电脑网站支付接口 alipay.trade.page.pay 使用的产品码,不适用于当面付接口。
原因
两个接口对应的支付产品不同:
alipay.trade.page.pay:电脑网站支付,产品码为FAST_INSTANT_TRADE_PAYalipay.trade.pay:当面付统一收单,产品码为FACE_TO_FACE_PAYMENT
参数名也要检查清楚:
- 支付宝接口原始字段:
product_code - Node SDK 驼峰字段:
productCode produceCode是拼写错误,SDK 可能无法正确转换
产品码与接口不匹配,或者字段名拼写错误,都可能引发 40004 参数无效。
Node SDK 调用示例
以下是付款码支付的示例:
const result = await alipaySdk.exec('alipay.trade.pay', {
bizContent: {
outTradeNo: 'ORDER_202609090001',
scene: 'bar_code',
authCode: '用户付款码',
subject: '测试订单',
totalAmount: '0.01',
productCode: 'FACE_TO_FACE_PAYMENT'
}
});
console.log(result);
如果直接构造支付宝接口的 JSON 参数,应写成:
{
"out_trade_no": "ORDER_202609090001",
"scene": "bar_code",
"auth_code": "用户付款码",
"subject": "测试订单",
"total_amount": "0.01",
"product_code": "FACE_TO_FACE_PAYMENT"
}
排查步骤
如果改为 FACE_TO_FACE_PAYMENT 后仍返回 40004,可以依次检查:
- 字段名是否为
productCode,不要写成produceCode。 - 产品码前后是否有空格,例如不能传入
' FACE_TO_FACE_PAYMENT '。 - 应用是否已经签约或开通当面付能力。
- 沙箱应用是否配合沙箱账号和沙箱付款码使用,不能混用正式环境的数据。
scene是否与付款码类型匹配。常见的付款码支付场景是bar_code。authCode是否为用户当前出示的有效付款码,不能用支付链接或订单号代替。outTradeNo是否唯一、totalAmount格式是否正确,以及签名、应用 ID 和网关环境是否一致。- 响应中的
sub_code和sub_msg是什么。40004只是通用错误码,通常要结合这两个字段判断具体原因。
需要修改的是:
- produceCode: 'FAST_INSTANT_TRADE_PAY'
+ productCode: 'FACE_TO_FACE_PAYMENT'
如果当前 SDK 版本的接口文档没有要求传入 product_code,这个字段也可能是可选参数。但只要传入,就必须使用与当面付相匹配的产品码,不能把电脑网站支付的 FAST_INSTANT_TRADE_PAY 用于 alipay.trade.pay。
备注:内容仅供参考。
