PAYATHON 2026

调用alipay.trade.precreate提示买家信息不能为空

支付老李

结论

alipay.trade.precreate 是当面付扫码支付的预创建接口。生成二维码时,付款人还未确定,所以通常不需要传入 buyer_id、buyer_logon_id 等买家信息。

出现“买家信息不能为空”时,一般不是因为缺少 buyer 参数,而是请求中的 product_code 与预创建场景不匹配,支付宝按其他支付产品的规则处理了请求。请将该字段设置为当面付对应的 FACE_TO_FACE_PAYMENT。如果当前接口文档允许不传,也可以先移除该字段再测试。

原因说明

扫码支付的流程如下:

  1. 商户调用 alipay.trade.precreate 创建交易二维码。
  2. 买家使用支付宝扫描二维码。
  3. 支付宝在扫码后识别并关联买家账户。

调用预创建接口时,买家还没有扫码,商户无法也不需要提前提供买家信息。

如果将 product_code 设置为其他产品的值,例如 App 支付使用的 QUICK_MSECURITY_PAY,请求场景就会与 alipay.trade.precreate 不一致。支付宝服务端可能按照错误的产品规则进行校验,并返回看似与当前接口文档不符的提示:

sub_code: ACQ.INVALID_PARAMETER
sub_msg: 买家信息不能为空

这个提示很容易让人以为需要补充 buyer 参数。此时应先检查接口名称、产品码与请求模型是否匹配。

解决步骤

1. 检查 product_code

预创建接口应使用:

FACE_TO_FACE_PAYMENT

不要使用 App 支付等其他场景的产品码:

QUICK_MSECURITY_PAY

如果当前版本的接口文档没有要求传入 product_code,可以暂时不设置,让接口按预创建场景处理。

2. 确认实际调用的接口

最终发送给支付宝的 method 应为:

alipay.trade.precreate

除了检查业务代码中的类名,还要查看 SDK 日志或实际请求参数。公共封装、网关代理或从其他支付场景复制的代码,都可能导致实际调用了不同的接口。

3. 检查业务参数

至少确认以下字段有效:

out_trade_no
total_amount
subject

如果传入 time_expire,其格式和取值范围应以当前使用的支付宝接口文档为准。不同 SDK 版本对该字段的封装方式可能不同,不要直接套用其他支付接口的超时字段。

4. 删除无关参数后重新测试

先使用最小参数集完成一次成功调用,再逐项加入门店、商品明细、扩展参数和过期时间等字段。这样更容易找出导致错误的具体参数。

Java 示例

下面的示例说明了各参数之间的正确关系。具体类名和字段方法请以项目使用的支付宝 Java SDK 版本为准:

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("ORDER_202609090001");
model.setSubject("测试商品");
model.setTotalAmount("0.01");
model.setProductCode("FACE_TO_FACE_PAYMENT");

// 如果当前 SDK 和接口文档支持 time_expire,可按文档要求设置。
// model.setTimeExpire("2026-09-09 18:30:00");

request.setBizModel(model);

AlipayTradePrecreateResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    String qrCode = response.getQrCode();
    System.out.println("二维码内容:" + qrCode);
} else {
    System.out.println("code:" + response.getCode());
    System.out.println("msg:" + response.getMsg());
    System.out.println("subCode:" + response.getSubCode());
    System.out.println("subMsg:" + response.getSubMsg());
}

如果当前文档没有要求设置 product_code,可以用下面的写法进行对比测试:

AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("ORDER_202609090002");
model.setSubject("测试商品");
model.setTotalAmount("0.01");

// 不设置其他支付产品的 product_code
request.setBizModel(model);

注意事项

  • 不要为了消除报错,随意添加接口文档中不存在的 buyer 参数。
  • product_code 必须与支付接口和签约产品一致,不能在 App 支付、手机网站支付、电脑网站支付与当面付之间混用。
  • 确认应用已经开通并具备当面付相关能力。产品权限未开通时,服务端可能返回其他业务错误。
  • 核对网关环境、应用 app_id、商户身份和签约环境,避免混用沙箱与生产配置。
  • 如果改用正确的 FACE_TO_FACE_PAYMENT 后仍然报错,请保存支付宝返回的完整响应和请求流水号,并检查实际发送的 method 与 biz_content。只看 sub_msg,无法判断是否还存在商户配置、产品权限或 SDK 封装问题。

备注:内容仅供参考。