PAYATHON 2026

网页扫码是否支持支付并签约功能?

支付老李

结论

可以用二维码作为入口,但网页扫码通常不是一种独立的支付并签约接入方式。

更稳妥的做法是:商家展示支付宝小程序码,或展示包含小程序链接的二维码。用户使用支付宝扫码进入小程序,再按官方的支付宝小程序发起流程完成支付和签约。

如果二维码指向普通 H5 网页,就不能直接使用商家 APP 或支付宝小程序的接口。能否在网页内完成支付和签约,要看商户已开通的产品是否支持该渠道,以及当前官方文档是否提供 H5、生活号等场景。官方只列出 APP 和支付宝小程序时,不能默认普通网页也受支持。

推荐接入方式

可以按以下流程接入:

  1. 商家服务端生成业务订单。
  2. 服务端根据支付宝小程序发起支付并签约的文档创建支付宝交易,同时传入签约所需参数。
  3. 将商户订单号、活动编号或其他业务定位参数放入小程序码的启动参数。
  4. 商家网页展示小程序码。
  5. 用户使用支付宝扫码进入小程序。
  6. 小程序向商家服务端查询订单,然后调用支付能力。
  7. 支付和签约完成后,商家服务端分别处理支付宝的异步通知。
  8. 最终结果以服务端查询到的交易状态和协议状态为准。

二维码只用于把用户带入受支持的小程序场景,不应包含支付口令、签约令牌或其他敏感信息。

网页展示小程序码

小程序码应使用支付宝开放平台提供的能力生成。网页只需展示服务端保存或转发的码图,例如:

<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 和支付宝小程序方案,更合适的实现路径是在网页展示小程序码,让用户扫码进入小程序完成支付和签约。

备注:内容仅供参考。