alipay.trade.app.pay 生成的 orderStr 无法在小程序真机支付
明确结论
问题并不是小程序尚未上线。
alipay.trade.app.pay 是 App 支付接口,生成的 orderStr 用于在原生 App 中调起支付宝支付,不能直接用于支付宝小程序。真机运行时,支付宝会校验实际支付场景和商户签约的产品。两者不匹配时,就会提示“当面付等产品不支持在小程序场景内使用”。
开发者工具展示二维码后,扫码支付已经脱离了小程序真机的调用链。扫码成功只能说明这笔 App 支付订单可以支付,并不代表它能在小程序中使用。
正确处理方式
小程序支付需要使用商户已经签约并支持支付宝小程序场景的收单产品。常见流程如下:
- 确认当前商户已开通支付宝小程序支付能力。
- 小程序请求商户服务端创建订单。
- 服务端调用适用于小程序支付场景的接口,例如
alipay.trade.create。 - 服务端从响应中取得支付宝交易号
trade_no。 - 将
trade_no返回给小程序。 - 小程序通过
my.tradePay的tradeNO参数发起支付。 - 服务端根据异步通知或主动查询结果确认最终支付状态。
不要再把 alipay.trade.app.pay 返回的 orderStr 传给小程序。
小程序端示例
参数名称是 tradeNO,其中 NO 必须大写:
my.request({
url: 'https://example.com/api/payment/create',
method: 'POST',
data: {
orderId: 'ORDER_202609090001'
},
success(res) {
const tradeNo = res.data.tradeNo;
if (!tradeNo) {
my.alert({
title: '创建订单失败',
content: '服务端未返回支付宝交易号'
});
return;
}
my.tradePay({
tradeNO: tradeNo,
success(result) {
//这里只表示客户端调用已经返回。
//订单是否支付成功,仍应由服务端查询或异步通知确认。
console.log('tradePay result:', result);
},
fail(error) {
console.error('tradePay failed:', error);
}
});
},
fail(error) {
console.error('create order failed:', error);
}
});
服务端创建订单示例
下面的代码仅用于说明流程。具体的 SDK 方法名和响应结构,请以项目所用支付宝服务端 SDK 的文档为准:
async function createMiniProgramPayment(order, buyerId) {
const response = await alipayClient.execute('alipay.trade.create', {
bizContent: {
out_trade_no: order.orderNo,
total_amount: order.amount,
subject: order.subject,
buyer_id: buyerId
}
});
if (!response.trade_no) {
throw new Error('支付宝创建交易失败');
}
return {
tradeNo: response.trade_no
};
}
buyer_id 等身份参数是否必填、如何获取,需要根据当前开通的小程序支付产品和接口要求确定。支付金额、订单号和商品标题必须由服务端生成或校验,不能直接信任小程序提交的数据。
为什么模拟器扫码可以支付
模拟器无法完整复现真机支付环境,可能会把待支付内容转换成二维码。手机扫码后,支付宝客户端会按照该二维码所代表的支付方式处理订单。
真机中的 my.tradePay 运行在小程序容器内。支付宝可以识别调用来源,并检查以下信息是否匹配:
- 商户签约的收单产品;
- 创建交易所使用的接口;
- 小程序对应的
app_id; - 当前支付场景;
- 商户、小程序及支付产品之间的绑定关系。
所以,二维码可以扫码支付,不等于真机小程序也能调起支付。
上线状态是否有影响
小程序未上线通常不是这条错误的直接原因。体验版和真机调试同样属于小程序场景,因此体验版继续报错,符合支付场景不匹配的情况。
改用正确接口后,开发阶段还需要检查:
- 商户是否已经开通小程序支付产品;
- 小程序
app_id是否与服务端请求使用的app_id一致; - 小程序是否正确关联当前商户;
- 支付产品是否允许当前应用和测试环境使用;
- 服务端签名、应用公钥证书或普通公钥配置是否正确;
- 支付回调地址是否可由支付宝访问。
注意事项
不要在小程序端保存支付宝应用私钥,也不要由前端直接创建或签名支付订单。创建交易、校验金额、签名和确认支付结果都应在服务端完成。
客户端的成功回调不能单独作为发货依据。用户中断页面、网络异常或回调状态差异都可能导致误判。最终支付结果应以支付宝异步通知或 alipay.trade.query 的查询结果为准。
如果商户后台没有小程序支付能力,或者现有签约产品只有 App 支付、当面付等产品,需要先到支付宝开放平台确认并申请适用于小程序的收单产品,再进行真机测试。
备注:内容仅供参考。
