PAYATHON 2026

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_PAY
  • alipay.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,可以依次检查:

  1. 字段名是否为 productCode,不要写成 produceCode。
  2. 产品码前后是否有空格,例如不能传入 ' FACE_TO_FACE_PAYMENT '。
  3. 应用是否已经签约或开通当面付能力。
  4. 沙箱应用是否配合沙箱账号和沙箱付款码使用,不能混用正式环境的数据。
  5. scene 是否与付款码类型匹配。常见的付款码支付场景是 bar_code。
  6. authCode 是否为用户当前出示的有效付款码,不能用支付链接或订单号代替。
  7. outTradeNo 是否唯一、totalAmount 格式是否正确,以及签名、应用 ID 和网关环境是否一致。
  8. 响应中的 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。

备注:内容仅供参考。