支付宝预授权资质通过后,小程序未上线能否测试授权功能?
支付老李
结论
预授权资质通过,并不意味着必须等小程序正式上线后,才能开展所有测试。
未上线时,通常可以进行接口联调、创建预授权订单和测试前端唤起流程。至于能否在开发版或体验版中完成真实资金授权,需要以支付宝开放平台目前针对该产品、应用状态和测试环境的限制为准。有些生产能力要求小程序已经发布,沙箱环境也未必支持完整的资金预授权流程。
如果接口调用成功,但手机端没有反应,先确认是否只调用了服务端预授权接口,却没有在小程序端使用返回的 orderStr 唤起授权页面。服务端接口调用成功,不会自动在手机上弹出授权界面。
为什么接口成功后手机没有反应
支付宝预授权通常分为两个步骤:
- 服务端调用
alipay.fund.auth.order.app.freeze创建预授权订单。 - 小程序端取得接口返回的
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,以免破坏签名内容。
如果仍然没有任何响应
可以按以下顺序排查:
- 在小程序控制台中确认点击事件已经触发。
- 检查
orderStr是否存在,但不要在生产日志中长期保存完整的敏感参数。 - 确认已经注册
my.tradePay的success、fail和complete回调。 - 使用真机调试或体验版测试,不要只依赖 IDE 模拟器。
- 确认测试账号已经加入小程序体验成员。
- 检查小程序版本、支付宝客户端版本和该能力的支持范围。
- 查看服务端接口返回的业务错误码和支付宝订单状态。
- 如果开发版和体验版都无法唤起授权页面,再检查产品文档是否要求应用已经发布。
注意事项
- “接口调用成功”通常只表示预授权订单请求已被受理,不代表用户已经完成授权。
- 不要重复使用同一个
out_order_no或out_request_no。即使是测试,业务单号也应保持唯一。 - 真实资金授权可能占用用户的资金额度。应使用平台允许的测试方式和最小测试金额,并及时解冻测试订单。
- 沙箱应用与生产应用的
app_id、密钥、网关和账号不能混用。 - 如果服务端没有返回
order_str,或者返回的是查询结果,而不是可供客户端唤起的订单串,my.tradePay就无法启动授权流程。 - 如果支付宝当前规则明确限制未上线应用使用该能力,需要先完成小程序审核和发布,再验证完整的授权流程。不能只凭资质审核通过,就判断应用已经具备测试条件。
备注:内容仅供参考。
