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\""
+ "}"
);
排查步骤
- 将
product_code设置为FACE_TO_FACE_PAYMENT。 - 删除所有值为
""的非必填参数,不要批量用空字符串填充可选字段。 - 检查三个核心参数:
subject:订单标题不能为空。out_trade_no:商户订单号不能为空,并且要保证唯一。total_amount:应使用合法的金额字符串,例如"0.01"。
- 使用最小参数集重新发起请求。请求成功后,再逐项加入
store_id、goods_detail等业务参数。 - 如果加入某个参数后再次出现
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 等参数未使用时,也应直接省略。这样可以避免类型校验失败,也方便定位真正有问题的字段。
备注:内容仅供参考。
