能否使用 easySdk 调用 alipay.fund.auth.order.app.freeze
结论
可以调用 alipay.fund.auth.order.app.freeze。能否通过 EasySDK 的强类型方法直接调用,要看所用语言及 EasySDK 版本是否封装了这个接口。
如果当前 EasySDK 没有对应方法,建议改用支付宝开放平台通用 SDK,通过 sdkExecute 生成客户端所需的授权参数串。不能用普通的 execute 替代,因为这是 App 资金预授权接口。服务端生成参数后,还要由客户端调起支付宝完成授权。
出现“订单参数异常,payee_login_id 与授权用户不是同一用户”时,通常不是客户端调用或签名格式有误,而是收款方身份与当前应用或应用授权关系不一致。
调用流程
通常需要完成以下步骤:
- 服务端调用
alipay.fund.auth.order.app.freeze。 - 服务端取得
sdkExecute返回的授权参数串。 - 将参数串原样返回给 App。
- App 通过支付宝客户端 SDK 打开授权页面。
- 根据异步通知或查询接口确认最终授权结果。
不能只根据客户端的同步返回结果判断冻结成功。
Java 服务端示例
如果 EasySDK 没有提供该接口的专用方法,可以使用支付宝 Java SDK:
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundAuthOrderAppFreezeModel;
import com.alipay.api.request.AlipayFundAuthOrderAppFreezeRequest;
import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse;
public class FundAuthService {
public String createAuthOrder() throws Exception {
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
"YOUR_APP_ID",
"YOUR_APP_PRIVATE_KEY",
"json",
"UTF-8",
"ALIPAY_PUBLIC_KEY",
"RSA2"
);
AlipayFundAuthOrderAppFreezeModel model =
new AlipayFundAuthOrderAppFreezeModel();
model.setOutOrderNo("AUTH_ORDER_202609130001");
model.setOutRequestNo("AUTH_REQUEST_202609130001");
model.setOrderTitle("信用服务预授权");
model.setAmount("100.00");
model.setProductCode("PRE_AUTH_ONLINE");
// 使用支付宝用户 ID 时,填写 2088 开头的用户标识。
model.setPayeeUserId("2088XXXXXXXXXXXX");
// payeeUserId 与 payeeLogonId 通常只需选择一种身份表达方式。
// 如果填写登录账号,必须保证它属于当前应用对应的收款主体。
// model.setPayeeLogonId("merchant@example.com");
AlipayFundAuthOrderAppFreezeRequest request =
new AlipayFundAuthOrderAppFreezeRequest();
request.setBizModel(model);
request.setNotifyUrl("https://example.com/alipay/fund-auth/notify");
/*
* ISV 代商户调用时,需要传入该商户对应的 app_auth_token。
* request.putOtherTextParam("app_auth_token", "YOUR_APP_AUTH_TOKEN");
*/
AlipayFundAuthOrderAppFreezeResponse response =
alipayClient.sdkExecute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
"预授权参数生成失败,code=" + response.getCode()
+ ", subCode=" + response.getSubCode()
+ ", subMsg=" + response.getSubMsg()
);
}
// 将 body 原样返回给 App,不要再次 URL 编码或拆分重组。
return response.getBody();
}
}
具体参数名称应以当前安装的支付宝 SDK 类定义和开放平台接口文档为准。例如,有些 SDK 模型使用 setPayeeLogonId,错误信息或业务描述中则可能写作 payee_login_id。不要因为字段名称相近,就同时填写多个收款方字段。
使用 EasySDK 时的处理方式
先确认当前 EasySDK 是否提供资金预授权的强类型入口。有对应入口时,优先使用该入口。如果只有 Generic 调用,还要确认它能否执行与 sdkExecute 等价的操作。
需要区分以下两种调用:
execute:直接向支付宝网关发送请求并取得接口响应。sdkExecute:在服务端生成供 App 客户端 SDK 使用的参数串。
alipay.fund.auth.order.app.freeze 的 App 场景通常需要 sdkExecute。如果 EasySDK 的 Generic 能力只支持普通 execute,不建议勉强调用,直接使用通用支付宝 SDK 更合适。
为什么会提示收款方身份不一致
排查时要核对三项身份信息:
- 当前请求中的
app_id属于哪个开放平台应用。 - 请求中的
payee_user_id或payee_logon_id属于哪个支付宝账户。 - 在 ISV 模式下,
app_auth_token对应哪个授权商户。
常见错误有:
- 把消费者的手机号或支付宝登录账号填入
payee_logon_id。 - 混用应用
app_id、商户 PID 和支付宝用户 ID。 - 同时填写
payee_user_id和payee_logon_id,但两个字段分别指向不同账户。 - ISV 使用了 A 商户的
app_auth_token,却填写了 B 商户的收款账号。 - 直连商户应用把其他支付宝账户填写为收款方。
- 混用沙箱账号、正式环境账号和网关地址。
- 真机登录的是另一个支付宝账户,导致实际测试身份与预期不符。
这里的“授权用户”不一定是当前真机登录的消费者。根据接入模式,它可能指应用对应的主体,也可能指通过 app_auth_token 授权的商户主体。具体校验的是哪一方,应结合响应中的 code、sub_code 和 sub_msg 判断。
推荐的排查顺序
1. 暂时只保留一个收款方字段
优先填写明确的支付宝用户 ID:
model.setPayeeUserId("2088XXXXXXXXXXXX");
暂时不要同时填写 payee_logon_id。支付宝用户 ID 通常比手机号或邮箱稳定,也能减少登录账号变更、别名或输入错误带来的问题。
2. 核对收款方账户归属
确认 payee_user_id 确实属于接收预授权的商户账户。需要注意:
app_id是应用标识。- PID 或支付宝用户 ID 通常是以
2088开头的账户标识。 - 手机号和邮箱属于登录账号。
- 这些值不能互相替代。
3. 判断接入模式
如果是商户自有应用直连:
- 使用该应用自己的
app_id和私钥。 - 收款方应与应用签约、配置的商户主体一致。
- 通常不需要
app_auth_token。
如果是服务商代商户调用:
- 使用服务商应用的
app_id和私钥。 - 传入目标商户对应的
app_auth_token。 payee_user_id或payee_logon_id必须属于该授权商户。- 不要复用其他商户的授权令牌。
4. 检查环境是否一致
沙箱和正式环境必须分别使用各自的以下配置:
- 网关地址
app_id- 应用私钥
- 支付宝公钥或支付宝公钥证书
- 商户及买家测试账号
app_auth_token
使用真机测试并不表示请求一定进入正式环境,实际环境仍由服务端配置和网关地址决定。
5. 记录完整服务端响应
日志中至少要记录以下字段:
code
msg
sub_code
sub_msg
out_order_no
out_request_no
app_id
payee_user_id 或脱敏后的 payee_logon_id
是否传入 app_auth_token
不要把应用私钥、完整授权令牌或其他敏感凭证写入日志。
其他注意事项
out_order_no和out_request_no应保持唯一。重复测试时,不要直接复用已经进入处理流程的请求号。- 金额应使用字符串形式的小数,例如
"100.00",不要用浮点数计算金额。 product_code、应用签约能力和账户权限必须满足资金预授权产品的要求。- 服务端返回的授权参数串应原样交给客户端。避免再次 URL 编码、经过 JSON 包装后取错字段,或手动调整参数顺序。
- 异步通知必须验签,同时校验应用、金额、订单号和授权状态。
- 如果身份关系确认无误后仍然报错,应携带
sub_code、请求时间、app_id、脱敏后的订单号和支付宝网关响应联系支付宝技术支持。仅凭“订单参数异常”无法判断具体是哪项产品配置不符合要求。
备注:内容仅供参考。
