沙箱环境的小程序能否使用小程序支付?
结论
支付宝沙箱通常无法完整测试小程序支付。沙箱小程序即使能正常运行,服务端调用 alipay.trade.create 创建支付订单时,仍可能收到“没有权限”或 isv.insufficient-isv-permissions 错误。
这类错误通常不是代码参数有误,而是沙箱应用没有“小程序支付”产品权限。沙箱与正式环境支持的能力并不完全相同,拥有沙箱账号或沙箱 app_id,不等于已经获得小程序支付接口权限。
解决步骤
支付能力需要在正式环境中开通和联调:
- 在支付宝开放平台创建正式小程序应用,或进入已有的正式应用。
- 为该小程序申请并开通“小程序支付”能力。
- 按照平台要求完成商家签约、应用审核和必要的绑定。
- 将服务端配置换成正式应用的
app_id、应用私钥和支付宝公钥。 - 将接口网关切换到正式地址:
https://openapi.alipay.com/gateway.do
- 由服务端调用
alipay.trade.create创建订单并取得trade_no。 - 小程序端调用
my.tradePay,传入该trade_no发起支付。 - 服务端通过异步通知或主动查询接口确认最终支付结果。
如果正式应用仍提示没有权限,先到开放平台控制台确认“小程序支付”已经签约并生效,再检查调用接口所用的 app_id 是否属于已开通支付能力的小程序应用。
服务端创建订单示例
下面的示例只保留了主要调用流程。密钥、金额和订单号等信息应从安全配置或业务系统中获取:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setNotifyUrl("https://example.com/alipay/notify");
request.setBizContent("""
{
"out_trade_no": "ORDER_202609130001",
"total_amount": "0.01",
"subject": "测试商品",
"buyer_id": "用户的支付宝 user_id"
}
""");
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
String tradeNo = response.getTradeNo();
System.out.println("trade_no: " + tradeNo);
} else {
System.out.println("code: " + response.getCode());
System.out.println("sub_code: " + response.getSubCode());
System.out.println("sub_msg: " + response.getSubMsg());
}
小程序端使用服务端返回的 trade_no:
my.tradePay({
tradeNO: tradeNo,
success: (result) => {
console.log('支付调用完成', result);
},
fail: (error) => {
console.error('支付调用失败', error);
}
});
无法使用正式支付时如何开发
正式支付能力开通前,可以暂时隔离支付模块:
- 服务端返回模拟的下单结果,用来验证页面和订单状态流转。
- 小程序端封装统一的支付方法,并在开发环境中返回模拟结果。
- 使用测试请求验证支付回调逻辑,但不能把模拟结果作为真实到账凭证。
- 正式能力开通后,再联调真实支付、取消支付、重复通知和退款等场景。
注意事项
“没有权限”和签名失败不是同一类问题。排查时需要结合响应中的 code、sub_code 和 sub_msg 判断:
- 遇到权限类错误,检查产品签约状态、应用类型和
app_id。 - 遇到签名类错误,检查应用私钥、支付宝公钥、签名方式和字符集。
- 遇到买家信息错误,确认
buyer_id是当前支付宝用户对应的user_id。 - 不要混用不同环境的参数。沙箱
app_id、沙箱密钥和沙箱网关需要配套使用,正式环境的参数也一样。 - 不能只根据小程序端回调判断支付是否成功,应以服务端异步通知或
alipay.trade.query的查询结果为准。
支付宝开放平台可能调整沙箱能力范围。如果控制台已经为沙箱应用提供明确的“小程序支付”签约入口,应以当前控制台和对应接口文档为准。否则,应按沙箱不支持完整支付链路处理。
备注:内容仅供参考。