JSAPI支付提示升级,2024年4月1日后会影响小程序收款吗?
结论
页面显示“JSAPI 支付未开通”,不代表小程序在 2024 年 4 月 1 日后一定无法收款。是否受影响,要看小程序实际使用的支付产品、商户账号和下单接口。
需要确认以下几点:
- “当面付”和“JSAPI 支付”是两种不同的支付能力。开通当面付,不等于已经开通 JSAPI 支付。
- 现在能够支付,只能说明现有支付链路仍可用,不能证明升级通知与这条链路无关。
- 如果小程序仍在使用通知中要求升级或即将下线的旧 JSAPI 支付链路,就需要按通知完成升级。
- 如果小程序使用的是小程序支付能力,通过
alipay.trade.create创建订单,再调用my.tradePay唤起支付,通常需要检查“小程序支付”的签约状态和应用绑定,不能只看“JSAPI 支付未开通”的提示。 - 两个小程序的
app_id、签约商户账号或服务商授权关系可能不同,需要分别核查。第一款小程序的开通状态不能用于判断第二款。
目前没有提供“2024 年 4 月 1 日升级提示”的具体内容、通知页面和所属平台,因此无法直接判断它要求升级哪个接口。应以商户平台通知中列出的受影响产品、接口和商户号为准。
为什么显示未开通却仍能支付
通常有以下几种原因。
使用的并不是 JSAPI 支付产品
小程序可能通过“小程序支付”或服务商代调用完成交易。后台显示的“JSAPI 支付未开通”属于另一项产品能力,与当前支付链路并不对应。
使用了另一个商户账号
小程序后台、开放平台和实际收款商户可能分属不同账号。页面中的产品状态对应账号 A,订单却进入账号 B,所以账号 A 即使显示未开通,支付也能成功。
通过服务商完成支付
如果小程序由第三方服务商开发,支付接口可能通过服务商模式调用。此时需要检查:
- 实际收款商户的商户号;
- 服务商应用的
app_id; - 应用授权状态;
- 订单中的
app_id、商户身份和收款主体; - JSAPI 支付或小程序支付产品由哪一方签约。
旧链路仍处于兼容期
升级截止日前,平台可能继续兼容旧接口。因此,现在能够支付,不代表截止日期后仍然不受影响。需要结合通知中的接口名称和升级范围来判断。
建议执行的核查步骤
1. 查明小程序实际调用的支付接口
从服务端代码或开放平台接口调用日志中,确认创建订单时使用的 API,例如:
alipay.trade.create
alipay.trade.precreate
alipay.trade.page.pay
alipay.trade.wap.pay
如果服务端通过 alipay.trade.create 创建交易,并在支付宝小程序中调用:
my.tradePay({
tradeNO: tradeNo
});
核查重点通常是小程序支付能力、应用签约状态,以及 app_id 与收款商户的绑定关系。
如果项目使用其他 JSAPI、旧版收银台接口或第三方封装,还要继续确认封装内部实际调用的 API,不能只根据前端方法名判断。
2. 核对订单的实际收款主体
打开商户订单详情或账单,找到一笔成功订单并确认:
- 收款商户账号或商户号;
- 订单所属应用的
app_id; - 接口名称;
- 是否经过服务商;
- 是否存在代调用或应用授权关系。
两款小程序都需要单独核对。即使使用同一套代码,它们的后台配置也可能不同。
3. 打开升级通知查看影响范围
重点查看通知中是否写明:
- 需要升级或即将下线的接口名称;
- 受影响的商户账号;
- 是否明确包含支付宝小程序;
- 是否只影响生活号、H5 页面或其他 JSAPI 场景;
- 是否需要重新签约产品;
- 是否需要修改代码、证书或应用配置。
如果通知要求升级接口,只点击“开通 JSAPI 支付”未必能解决问题。反过来,如果通知要求补充签约,只修改代码也不够。
4. 检查第二款小程序的产品签约
对于显示“JSAPI 支付未开通”的小程序,应进入对应的开放平台应用和收款商户后台,确认:
- 小程序是否关联了正确的收款商户;
- 所需支付产品是否已经签约;
- 应用是否已经添加并上线相应的支付能力;
- 签约主体与小程序主体是否符合平台要求;
- 如果由服务商代开发,商户是否已经完成应用授权。
如果实际链路确实需要 JSAPI 支付,应从后台入口申请开通,并完成平台要求的资质审核。如果使用的是小程序支付,则应检查并开通对应能力,不必为了消除提示而申请无关产品。
5. 完成支付回归测试
至少测试以下场景:
- 正常支付;
- 用户取消支付;
- 重复点击支付;
- 支付成功后的异步通知;
- 异步通知失败后的主动查询;
- 退款;
- 使用不同支付宝账号支付;
- 两款小程序分别下单和收款。
不能只把 my.tradePay 的前端成功回调当作最终支付结果。订单的最终状态应由服务端异步通知或主动查询确认。
典型的小程序支付调用方式
下面的代码只用于说明常见链路。具体请求参数、SDK 初始化方式和签名配置,应以项目当前使用的支付宝开放平台 SDK 文档为准。
服务端创建交易:
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setBizContent("""
{
"out_trade_no": "ORDER_202409130001",
"total_amount": "0.01",
"subject": "测试订单",
"buyer_id": "支付宝用户标识"
}
""");
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
String tradeNo = response.getTradeNo();
服务端将 tradeNo 返回给小程序后,小程序再唤起支付:
my.tradePay({
tradeNO: tradeNo,
success(result) {
// 前端结果只能用于页面展示。
// 订单是否支付成功,应由服务端查询或异步通知确认。
console.log('tradePay result:', result);
},
fail(error) {
console.error('tradePay failed:', error);
}
});
服务端还需要验证支付异步通知,包括签名、商户身份、应用、订单号、金额和交易状态,不能仅凭前端回调更新订单。
如果完全不处理,会有什么风险
可能出现以下几种情况:
- 当前链路不在升级范围内:通常不会因为一个未使用的产品没有开通而停止收款。
- 当前接口在通知的停用范围内:超过截止日期后,可能出现下单失败、无法唤起支付或无法创建新交易。
- 签约关系不完整,但目前仍处于历史兼容状态:平台结束兼容后,支付可能受到影响。
- 订单实际通过其他商户或服务商链路完成:是否受影响取决于实际调用方和实际签约账号,与当前页面显示的状态不一定有关。
所以,既不能认定“4 月 1 日后一定无法收款”,也不能因为目前支付正常就忽略通知。比较可靠的判断方式是找到一笔成功订单,确认它对应的真实 API、app_id、商户号和签约产品,再与升级通知中的影响范围逐项比对。
2024 年 4 月 1 日已经过去。如果现在仍能稳定创建新订单并完成支付,至少说明当前链路没有在该日期后立即全面失效。不过,这不能代替对签约状态和接口的核查。如果后台仍在显示升级警告,应准备通知截图、两款小程序的 app_id、实际收款商户号和成功订单号,向支付宝开放平台技术支持确认是否属于升级范围。
备注:内容仅供参考。