PAYATHON 2026

支付宝预授权资质通过后,小程序未上线能否测试授权功能?

支付老李

结论

预授权资质通过,并不意味着必须等小程序正式上线后,才能开展所有测试。

未上线时,通常可以进行接口联调、创建预授权订单和测试前端唤起流程。至于能否在开发版或体验版中完成真实资金授权,需要以支付宝开放平台目前针对该产品、应用状态和测试环境的限制为准。有些生产能力要求小程序已经发布,沙箱环境也未必支持完整的资金预授权流程。

如果接口调用成功,但手机端没有反应,先确认是否只调用了服务端预授权接口,却没有在小程序端使用返回的 orderStr 唤起授权页面。服务端接口调用成功,不会自动在手机上弹出授权界面。

为什么接口成功后手机没有反应

支付宝预授权通常分为两个步骤:

  1. 服务端调用 alipay.fund.auth.order.app.freeze 创建预授权订单。
  2. 小程序端取得接口返回的 order_str,再调用 my.tradePay 唤起支付宝授权页面。

如果只完成第一步,服务端可能返回成功,但客户端不会自动跳转,也未必会显示错误提示。

还需要检查以下情况:

  • 服务端请求使用的 app_id 是否与当前小程序一致。
  • 预授权产品是否已经绑定到该应用,而不只是商户主体资质通过审核。
  • 该能力是否支持当前开发版或体验版。
  • 手机支付宝登录的账号是否具有体验权限。
  • 服务端是否将完整的 order_str 原样返回给小程序。
  • 小程序是否在用户点击事件中调用了 my.tradePay。
  • 是否混用了沙箱网关、生产网关、沙箱应用和生产应用配置。
  • 应用公钥、支付宝公钥、签名方式和回调地址是否来自同一套环境。

推荐的测试步骤

1. 检查应用能力状态

进入支付宝开放平台,确认预授权能力已经签约,并绑定到当前小程序的 app_id。商户资质通过审核,不代表当前应用已经获得完整的调用权限。

同时查看能力页面是否说明了以下限制:

  • 是否支持开发版或体验版;
  • 是否支持沙箱环境;
  • 是否要求小程序正式发布;
  • 是否限制测试账号、行业或支付场景。

如果产品文档明确要求应用上线,开发阶段只能验证服务端请求和前端代码。完整的真实授权需要在发布后测试。

2. 服务端创建预授权订单

下面的代码只展示主要调用关系。具体参数应以当前支付宝开放平台文档和所用 SDK 版本为准:

AlipayFundAuthOrderAppFreezeRequest request =
        new AlipayFundAuthOrderAppFreezeRequest();

request.setBizContent("""
{
  "out_order_no": "AUTH_ORDER_202609090001",
  "out_request_no": "AUTH_REQUEST_202609090001",
  "order_title": "预授权测试",
  "amount": "0.01",
  "product_code": "PRE_AUTH_ONLINE"
}
""");

AlipayFundAuthOrderAppFreezeResponse response = client.execute(request);

if (response.isSuccess()) {
    String orderStr = response.getOrderStr();
    // 将 orderStr 原样返回给小程序端
} else {
    // 记录 code、subCode、msg、subMsg,便于定位问题
}

不能只检查 HTTP 状态码,还要记录并检查业务响应中的 code、sub_code、msg 和 sub_msg。

3. 小程序端主动唤起授权页面

小程序取得服务端返回的 orderStr 后,需要调用客户端 API:

my.tradePay({
  orderStr,
  success: (result) => {
    console.log('tradePay success:', result);
  },
  fail: (error) => {
    console.error('tradePay fail:', error);
  },
  complete: (result) => {
    console.log('tradePay complete:', result);
  }
});

建议通过用户点击事件触发:

Page({
  async startPreAuth() {
    try {
      const response = await createPreAuthOrder();

      if (!response || !response.orderStr) {
        console.error('服务端未返回 orderStr', response);
        return;
      }

      my.tradePay({
        orderStr: response.orderStr,
        success: (result) => {
          console.log('授权结果:', result);
        },
        fail: (error) => {
          console.error('授权唤起失败:', error);
        }
      });
    } catch (error) {
      console.error('创建预授权订单失败:', error);
    }
  }
});

不要自行拆分、重新编码或拼接 orderStr,以免破坏签名内容。

如果仍然没有任何响应

可以按以下顺序排查:

  1. 在小程序控制台中确认点击事件已经触发。
  2. 检查 orderStr 是否存在,但不要在生产日志中长期保存完整的敏感参数。
  3. 确认已经注册 my.tradePay 的 success、fail 和 complete 回调。
  4. 使用真机调试或体验版测试,不要只依赖 IDE 模拟器。
  5. 确认测试账号已经加入小程序体验成员。
  6. 检查小程序版本、支付宝客户端版本和该能力的支持范围。
  7. 查看服务端接口返回的业务错误码和支付宝订单状态。
  8. 如果开发版和体验版都无法唤起授权页面,再检查产品文档是否要求应用已经发布。

注意事项

  • “接口调用成功”通常只表示预授权订单请求已被受理,不代表用户已经完成授权。
  • 不要重复使用同一个 out_order_no 或 out_request_no。即使是测试,业务单号也应保持唯一。
  • 真实资金授权可能占用用户的资金额度。应使用平台允许的测试方式和最小测试金额,并及时解冻测试订单。
  • 沙箱应用与生产应用的 app_id、密钥、网关和账号不能混用。
  • 如果服务端没有返回 order_str,或者返回的是查询结果,而不是可供客户端唤起的订单串,my.tradePay 就无法启动授权流程。
  • 如果支付宝当前规则明确限制未上线应用使用该能力,需要先完成小程序审核和发布,再验证完整的授权流程。不能只凭资质审核通过,就判断应用已经具备测试条件。

备注:内容仅供参考。