手机网站支付提示“买家信息不能为空”如何解决?
结论
“买家信息不能为空”通常指业务参数 buyer_id 缺失。这个参数应填写买家的支付宝用户 ID,不能填写手机号、登录账号、姓名或商户系统中的用户编号。
标准手机网站支付接口 alipay.trade.wap.pay 通常不要求商户主动传入 buyer_id。如果调用该接口时仍收到这条提示,应检查实际调用的 API、产品签约配置,以及 biz_content 的组装方式。不要把其他交易接口的必填规则直接套用到手机网站支付。
buyer_id 应传什么值
buyer_id 是支付宝侧的用户标识。通常需要先通过支付宝会员授权取得 auth_code,再调用 alipay.system.oauth.token 换取用户信息,并将响应中的 user_id 作为 buyer_id。
以下内容都不能代替 buyer_id:
- 手机号
- 支付宝登录名
- 用户姓名
- 商户会员 ID
- 应用的
app_id - 授权码
auth_code
例如,授权换取令牌的响应为:
{
"alipay_system_oauth_token_response": {
"access_token": "访问令牌",
"user_id": "2088xxxxxxxxxxxx",
"expires_in": 1296000
}
}
需要传递的买家标识就是:
{
"buyer_id": "2088xxxxxxxxxxxx"
}
正确的传递位置
buyer_id 是业务参数,应放在请求的 biz_content 中,不能作为支付宝接口的公共请求参数单独传递。
示例:
{
"app_id": "202100xxxxxxxxxx",
"method": "实际调用的交易接口名称",
"format": "JSON",
"charset": "utf-8",
"sign_type": "RSA2",
"timestamp": "2026-09-13 10:00:00",
"version": "1.0",
"biz_content": {
"out_trade_no": "ORDER_202609130001",
"total_amount": "99.00",
"subject": "订单支付",
"buyer_id": "2088xxxxxxxxxxxx"
}
}
使用 Java SDK 时,可以把它设置到业务模型中。如果所用模型没有对应的 setter,也可以按照接口文档直接构造 biz_content:
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "ORDER_202609130001");
bizContent.put("total_amount", "99.00");
bizContent.put("subject", "订单支付");
bizContent.put("buyer_id", "2088xxxxxxxxxxxx");
request.setBizContent(bizContent.toJSONString());
只有实际调用的接口支持或要求 buyer_id 时,才需要传递这个参数。
手机网站支付的排查方法
如果调用的是 alipay.trade.wap.pay,可以按以下顺序排查。
1. 确认实际接口名称
请求公共参数中的 method 应为:
alipay.trade.wap.pay
不能只根据页面的跳转方式判断接口类型。系统经过封装后,实际调用的可能是 alipay.trade.create、收单交易创建接口,或其他需要明确买家身份的产品接口。
2. 检查标准必填业务参数
典型的手机网站支付请求至少要正确设置以下参数:
{
"out_trade_no": "ORDER_202609130001",
"total_amount": "99.00",
"subject": "订单支付",
"product_code": "QUICK_WAP_WAY"
}
Java SDK 示例:
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl("https://www.example.com/pay/return");
request.setNotifyUrl("https://www.example.com/pay/notify");
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "ORDER_202609130001");
bizContent.put("total_amount", "99.00");
bizContent.put("subject", "订单支付");
bizContent.put("product_code", "QUICK_WAP_WAY");
request.setBizContent(bizContent.toJSONString());
String form = alipayClient.pageExecute(request).getBody();
标准手机网站支付通常会在支付宝收银台完成用户登录和买家识别。不能因为错误提示中出现“买家信息”,就虚构或硬编码一个 buyer_id。
3. 检查 biz_content 的 JSON 层级
下面的写法不正确,因为 buyer_id 位于公共参数层:
{
"method": "某交易接口",
"buyer_id": "2088xxxxxxxxxxxx",
"biz_content": {
"out_trade_no": "ORDER_202609130001"
}
}
应将它放入 biz_content:
{
"method": "某交易接口",
"biz_content": {
"out_trade_no": "ORDER_202609130001",
"buyer_id": "2088xxxxxxxxxxxx"
}
}
还要避免对 biz_content 重复进行 JSON 序列化或 URL 编码,否则支付宝可能无法解析其中的字段。
4. 核对产品和接口是否匹配
如果应用签约的是手机网站支付,实际调用的却是要求预先确定买家的交易创建接口,就可能出现买家信息缺失。应根据业务场景选择对应的处理方式:
- 普通 H5 收银台支付:使用
alipay.trade.wap.pay。 - 创建交易时必须确定支付宝买家:先完成支付宝会员授权,再把取得的
user_id作为buyer_id传入对应接口。 - 服务商代商户调用:检查应用、商户授权关系和实际收款主体是否正确。
注意事项
buyer_id 属于用户身份数据,不能写死为测试账号,也不能在不同用户之间复用。前端传来的买家标识不能直接信任,建议由服务端根据授权结果保存,并与当前登录用户关联。
部分新接口或特定开放能力可能使用 buyer_open_id 等其他标识。具体应传 buyer_id 还是其他字段,要以实际调用接口当前的参数表为准,不能自行互换。
如果确认调用的是标准 alipay.trade.wap.pay,请求中也没有附加特殊产品参数,但接口仍返回这条提示,应保存完整的接口响应、code、sub_code、sub_msg 和支付宝 trace_id,再根据这些信息定位具体的校验环节。
备注:内容仅供参考。
