网页扫码是否支持支付并签约功能?
结论
可以用二维码作为入口,但网页扫码通常不是一种独立的支付并签约接入方式。
更稳妥的做法是:商家展示支付宝小程序码,或展示包含小程序链接的二维码。用户使用支付宝扫码进入小程序,再按官方的支付宝小程序发起流程完成支付和签约。
如果二维码指向普通 H5 网页,就不能直接使用商家 APP 或支付宝小程序的接口。能否在网页内完成支付和签约,要看商户已开通的产品是否支持该渠道,以及当前官方文档是否提供 H5、生活号等场景。官方只列出 APP 和支付宝小程序时,不能默认普通网页也受支持。
推荐接入方式
可以按以下流程接入:
- 商家服务端生成业务订单。
- 服务端根据支付宝小程序发起支付并签约的文档创建支付宝交易,同时传入签约所需参数。
- 将商户订单号、活动编号或其他业务定位参数放入小程序码的启动参数。
- 商家网页展示小程序码。
- 用户使用支付宝扫码进入小程序。
- 小程序向商家服务端查询订单,然后调用支付能力。
- 支付和签约完成后,商家服务端分别处理支付宝的异步通知。
- 最终结果以服务端查询到的交易状态和协议状态为准。
二维码只用于把用户带入受支持的小程序场景,不应包含支付口令、签约令牌或其他敏感信息。
网页展示小程序码
小程序码应使用支付宝开放平台提供的能力生成。网页只需展示服务端保存或转发的码图,例如:
<img
src="https://merchant.example.com/api/alipay/miniapp-code?orderId=ORDER_202609130001"
alt="使用支付宝扫码支付并签约"
/>
orderId 应使用不容易被枚举的业务标识,也可以由服务端转换为一次性短码。不要把用户身份信息、签约参数或支付宝私钥写入二维码。
如果使用普通二维码承载跳转地址,需要确认用户通过支付宝扫码后,该地址确实可以打开目标小程序。链接格式、有效期和生成接口,应以当前支付宝开放平台的小程序码或小程序链接文档为准。
服务端创建交易
支付并签约所用的接口,以及签约参数的名称和结构,可能因商户开通的产品而异。接入时应直接参考官方的小程序发起示例。下面的代码只说明如何在服务端组织请求,不代表可以省略产品文档要求的字段:
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
AlipayTradeCreateModel model = new AlipayTradeCreateModel();
model.setOutTradeNo("ORDER_202609130001");
model.setTotalAmount("9.90");
model.setSubject("会员服务");
// 按已开通产品的官方文档设置支付并签约参数。
// 不要自行猜测签约参数名称、周期规则或协议产品码。
request.setBizModel(model);
request.setNotifyUrl("https://merchant.example.com/callback/alipay/trade");
AlipayTradeCreateResponse response = alipayClient.execute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
String tradeNo = response.getTradeNo();
实际接入前,需要确认当前产品是否通过 alipay.trade.create 创建交易,以及签约信息应写入哪个请求字段。不同签约产品的参数不能混用。
小程序内发起支付
小程序从商家服务端获取支付宝交易号后,可以按照小程序支付文档调用 my.tradePay:
my.tradePay({
tradeNO: tradeNo,
success: (result) => {
// 前端结果仅用于页面提示。
// 最终状态必须由服务端异步通知或主动查询确认。
console.log(result);
},
fail: (error) => {
console.error(error);
}
});
success 回调执行后,不要立即发放长期权益。此时用户可能只完成了支付,签约状态也可能仍在处理中。此外,前端还可能出现回调丢失、网络中断或重复回调。
回调与状态确认
服务端接收通知时,至少需要完成以下校验:
- 验证支付宝签名;
- 校验
app_id、商户订单号、金额和收款方; - 避免重复处理同一通知;
- 分别记录交易状态和协议状态;
- 必要时调用官方查询接口进行补偿确认。
支付成功和签约成功是两个独立的业务结果,不适合合并为一个布尔值。建议分别保存:
{
"out_trade_no": "ORDER_202609130001",
"payment_status": "SUCCESS",
"agreement_status": "SIGNED"
}
只有业务要求的两个状态都满足后,才能开通依赖自动扣款协议的服务。
普通 H5 二维码需要注意
如果二维码必须打开普通网页,而不是支付宝小程序,应先向支付宝开放平台确认:
- 已开通的支付并签约产品是否支持 H5 场景;
- 是否提供相应的网页唤起接口;
- 普通浏览器和支付宝内置浏览器各自支持哪些能力;
- 签约页面是否必须由支付宝托管;
- 回跳地址、异步通知地址和域名是否需要配置。
在确认 H5 渠道受支持之前,不建议通过 User-Agent 判断运行环境、拼接私有 Scheme,或在网页中模拟 APP、小程序调用。这些做法可能无法通过产品校验,也可能在支付宝客户端升级后失效。
因此,如果现有文档只提供 APP 和支付宝小程序方案,更合适的实现路径是在网页展示小程序码,让用户扫码进入小程序完成支付和签约。
备注:内容仅供参考。
