PAYATHON 2026

能否使用 easySdk 调用 alipay.fund.auth.order.app.freeze

支付老李

结论

可以调用 alipay.fund.auth.order.app.freeze。能否通过 EasySDK 的强类型方法直接调用,要看所用语言及 EasySDK 版本是否封装了这个接口。

如果当前 EasySDK 没有对应方法,建议改用支付宝开放平台通用 SDK,通过 sdkExecute 生成客户端所需的授权参数串。不能用普通的 execute 替代,因为这是 App 资金预授权接口。服务端生成参数后,还要由客户端调起支付宝完成授权。

出现“订单参数异常,payee_login_id 与授权用户不是同一用户”时,通常不是客户端调用或签名格式有误,而是收款方身份与当前应用或应用授权关系不一致。

调用流程

通常需要完成以下步骤:

  1. 服务端调用 alipay.fund.auth.order.app.freeze。
  2. 服务端取得 sdkExecute 返回的授权参数串。
  3. 将参数串原样返回给 App。
  4. App 通过支付宝客户端 SDK 打开授权页面。
  5. 根据异步通知或查询接口确认最终授权结果。

不能只根据客户端的同步返回结果判断冻结成功。

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 对应哪个授权商户。

常见错误有:

  1. 把消费者的手机号或支付宝登录账号填入 payee_logon_id。
  2. 混用应用 app_id、商户 PID 和支付宝用户 ID。
  3. 同时填写 payee_user_id 和 payee_logon_id,但两个字段分别指向不同账户。
  4. ISV 使用了 A 商户的 app_auth_token,却填写了 B 商户的收款账号。
  5. 直连商户应用把其他支付宝账户填写为收款方。
  6. 混用沙箱账号、正式环境账号和网关地址。
  7. 真机登录的是另一个支付宝账户,导致实际测试身份与预期不符。

这里的“授权用户”不一定是当前真机登录的消费者。根据接入模式,它可能指应用对应的主体,也可能指通过 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、脱敏后的订单号和支付宝网关响应联系支付宝技术支持。仅凭“订单参数异常”无法判断具体是哪项产品配置不符合要求。

备注:内容仅供参考。