支付宝单笔转账报错 PAYER_USER_INFO_ERROR 的原因
结论
PAYER_USER_INFO_ERROR 通常表示付款方商户身份与当前应用、签约账号或运行环境不一致。排查时应先检查付款方配置,而不是只修改 payee_account。
model.setPayeeAccount("oqaaof0806@sandbox.com") 设置的是收款方账户。如果填写的是当前应用对应的沙箱商户账号,就相当于商户向自己转账,可能不符合接口的业务要求。沙箱测试一般应使用沙箱提供的另一个支付宝测试账号,例如沙箱买家账号,同时确保账号类型与 payee_type 一致。
扫码支付正常,只能说明支付相关配置基本可用,不能证明转账接口的付款方配置也正确。两类接口在签约权限、商户身份校验和资金能力方面可能有不同要求。
常见原因
1. 沙箱应用与商户账号不属于同一套配置
转账接口不会通过 payee_account 指定付款方。付款方由以下信息共同确定:
- 请求使用的
app_id - 应用所属的支付宝商户账号
- 当前环境对应的网关
- 应用私钥及支付宝公钥
- 必要时的应用授权关系
- 商户是否具备对应的转账产品权限
如果混用不同沙箱应用的 app_id、密钥、商户账号或 PID,付款方信息校验就可能失败。
2. 把沙箱商户账号填成了收款账号
下面的代码设置的是收款方:
model.setPayeeAccount("oqaaof0806@sandbox.com");
它不会指定付款方。如果 oqaaof0806@sandbox.com 是当前沙箱应用对应的商户账号,不建议再将其作为收款账户。测试时应改用沙箱控制台提供的买家账号或其他有效测试账号。
3. payee_type 与账户内容不匹配
收款账户是邮箱、手机号等登录账号时,应使用:
model.setPayeeType("ALIPAY_LOGONID");
填写支付宝用户 ID 时,应使用:
model.setPayeeType("ALIPAY_USERID");
如果邮箱账号使用了 ALIPAY_USERID,或者用户 ID 使用了 ALIPAY_LOGONID,都可能导致账户校验异常。不过,这类问题通常指向收款方,不能仅凭 PAYER_USER_INFO_ERROR 判断是该字段引起的。
4. 收款人实名信息不一致
如果请求中设置了 payee_real_name:
model.setPayeeRealName("张三");
姓名必须与收款支付宝账户的实名认证信息完全一致。如果无法确认沙箱账户的实名信息,可以暂时不传这个可选字段,先排除姓名校验的影响。
5. 商户没有开通或无法使用转账能力
扫码支付和单笔转账属于不同的产品能力。扫码支付成功,不代表商户已经取得 alipay.fund.trans.toaccount.transfer 的调用权限。
该接口属于较早的转账接口。接入生产环境时,应以当前支付宝开放平台控制台展示的产品能力和接口文档为准,确认是否需要改用新的转账接口。商户实际可以调用哪些接口取决于签约情况,不能只根据错误码判断。
建议的排查步骤
- 确认请求发送到沙箱网关:
https://openapi-sandbox.dl.alipaydev.com/gateway.do
-
确认
app_id来自当前使用的沙箱应用。 -
确认应用私钥和支付宝公钥与该沙箱应用配套,没有混入生产环境或其他应用的密钥。
-
在沙箱控制台核对应用对应的商户账号,确认付款商户与应用归属一致。
-
不要将当前付款商户账号用作
payee_account,改用沙箱买家账号测试。 -
确认
payee_type与收款账号的格式一致。 -
暂时删除
payee_real_name,避免沙箱账户姓名不一致影响排查。 -
检查应用是否已经开通或具备单笔转账产品权限。
-
每次测试都使用新的
out_biz_no。该字段是商户转账业务单号,重复使用可能触发幂等处理,导致参数修改后仍返回原交易结果。
示例代码
假设收款方使用沙箱买家的邮箱账号,可以这样构造请求:
AlipayFundTransToaccountTransferRequest request =
new AlipayFundTransToaccountTransferRequest();
AlipayFundTransToaccountTransferModel model =
new AlipayFundTransToaccountTransferModel();
model.setOutBizNo("TRANSFER_" + System.currentTimeMillis());
model.setPayeeType("ALIPAY_LOGONID");
model.setPayeeAccount("沙箱买家账号");
model.setAmount("0.10");
model.setRemark("沙箱转账测试");
// 无法确认沙箱账户实名信息时,先不要设置该字段。
// model.setPayeeRealName("与收款账户实名认证完全一致的姓名");
request.setBizModel(model);
AlipayFundTransToaccountTransferResponse response =
alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("转账成功:" + response.getBody());
} else {
System.out.println("转账失败:" + response.getBody());
}
客户端的所有配置也必须来自同一环境:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi-sandbox.dl.alipaydev.com/gateway.do",
"沙箱应用APP_ID",
"沙箱应用私钥",
"json",
"UTF-8",
"对应沙箱应用的支付宝公钥",
"RSA2"
);
注意事项
payee_account 表示收款方信息,不能用它修正付款方身份。遇到 PAYER_USER_INFO_ERROR 时,应先核对 app_id、商户归属、运行环境、签约权限和授权关系。
如果应用、密钥、网关和权限都没有问题,再检查收款账号是否为有效的沙箱账号,以及 payee_type 和 payee_real_name 是否匹配。就当前情况而言,建议先不要把沙箱商户账号作为收款账户,改用与该环境配套的沙箱买家账号,并确认整个请求使用的是同一个沙箱应用的配置。
备注:内容仅供参考。
