PAYATHON 2026

alipay.trade.precreate 返回 40004 参数无效如何处理?

支付小周

结论

请求中的 product_code 是空字符串,应优先修正。调用 alipay.trade.precreate 创建当面付预下单交易时,需要将其设置为:

FACE_TO_FACE_PAYMENT

bizContent 中还有许多可选参数被设为 ""。未使用的参数应直接省略。对于 royalty_info、extend_params、sub_merchant、goods_detail、settle_info、ext_user_info 等结构化参数,不要用空字符串占位,否则也可能触发 ACQ.INVALID_PARAMETER。

正确的请求参数

可以先用最小参数集发起请求:

{
  "subject": "处方缴费",
  "out_trade_no": "1601346518999",
  "total_amount": "0.01",
  "product_code": "FACE_TO_FACE_PAYMENT"
}

对应的 bizContent 字符串如下:

"{\"subject\":\"处方缴费\",\"out_trade_no\":\"1601346518999\",\"total_amount\":\"0.01\",\"product_code\":\"FACE_TO_FACE_PAYMENT\"}"

Java 示例

使用支付宝 Java SDK 时,只设置实际需要的字段:

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setSubject("处方缴费");
model.setOutTradeNo("1601346518999");
model.setTotalAmount("0.01");
model.setProductCode("FACE_TO_FACE_PAYMENT");

request.setBizModel(model);

AlipayTradePrecreateResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    System.out.println(response.getQrCode());
} else {
    System.out.println(response.getCode());
    System.out.println(response.getSubCode());
    System.out.println(response.getSubMsg());
}

如果直接设置 biz_content,可以这样写:

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

request.setBizContent(
    "{"
        + "\"subject\":\"处方缴费\","
        + "\"out_trade_no\":\"1601346518999\","
        + "\"total_amount\":\"0.01\","
        + "\"product_code\":\"FACE_TO_FACE_PAYMENT\""
        + "}"
);

排查步骤

  1. 将 product_code 设置为 FACE_TO_FACE_PAYMENT。
  2. 删除所有值为 "" 的非必填参数,不要批量用空字符串填充可选字段。
  3. 检查三个核心参数:
    • subject:订单标题不能为空。
    • out_trade_no:商户订单号不能为空,并且要保证唯一。
    • total_amount:应使用合法的金额字符串,例如 "0.01"。
  4. 使用最小参数集重新发起请求。请求成功后,再逐项加入 store_id、goods_detail 等业务参数。
  5. 如果加入某个参数后再次出现 ACQ.INVALID_PARAMETER,应检查该参数的数据类型和内部字段,不能只看它是否为空。

注意事项

ACQ.INVALID_PARAMETER 和“参数无效”通常不会直接标明具体字段。单凭这条响应,无法断定只有一个参数有问题。不过,当前请求中的 product_code 为空,以及多个可选参数使用空字符串,都是明显的风险点。

对象或数组类型的参数需要传入符合接口格式的 JSON 数据。例如:

{
  "goods_detail": [
    {
      "goods_id": "RX001",
      "goods_name": "处方缴费",
      "quantity": 1,
      "price": "0.01"
    }
  ]
}

不要写成:

{
  "goods_detail": ""
}

extend_params、sub_merchant、settle_info 等参数未使用时,也应直接省略。这样可以避免类型校验失败,也方便定位真正有问题的字段。

备注:内容仅供参考。