支付
发布于
PWA 收款用的是与任何网页相同的三层:浏览器的 Payment Request API、接入它的钱包(Safari 中的 Apple Pay,Chromium 等浏览器中的 Google Pay),以及支付服务商的 JavaScript SDK,后者在不支持时回退到托管表单。哪一层可用取决于引擎及其版本,与页面是否已安装无关。
结账面板归浏览器所有。你的代码描述接受的支付方式与总额,引擎决定能展示哪些钱包;服务商 SDK 位于其上,在该面板与自己的表单之间做选择。
Payment Request API
Section titled “Payment Request API”new PaymentRequest(methods, details) 后调用 show() 即打开浏览器面板。兼容性数据(BCD api.PaymentRequest)记录:桌面 Chrome 60、Android 版 Chrome 53、Edge 15、macOS 与 iOS 上的 Safari 11.1、跟随 Android 版 Chrome 的 Samsung Internet,以及 Android WebView 136。Firefox 55 含有实现,但默认关闭在 dom.payments.request.enabled 与 dom.payments.request.supportedRegions 国家列表之后,所以 Firefox 用户看不到面板。该 API 仅限安全上下文,跨源 <iframe> 只有带 allowpaymentrequest 属性才能使用。
- 图例
- 支持
- 部分支持
- 需开启标志
- 不支持
- 未知
| 浏览器 / 平台 | 支持 | 版本 | 置信度 | 来源 | 备注 |
|---|---|---|---|---|---|
| Chrome (Android) | 支持 | 61 | 中 | 来源 | — |
| Chrome (Desktop) | 支持 | 61 | 中 | 来源 | — |
| Edge (Desktop) | 支持 | 79 | 中 | 来源 | — |
| Safari (iOS) | 支持 | 11.1 | 中 | 来源 | 1 |
| Safari (macOS) | 支持 | 11.1 | 中 | 来源 | 2 |
| Firefox (Desktop) | 不支持 | — | 中 | 来源 | 3 |
| Samsung Internet | 支持 | 7.0 | 中 | 来源 | — |
- 以 Apple Pay 作为支付方式。
- 由 Apple Pay 支撑。
- 实现曾发布后又被禁用;默认不可用。
生态与商业政策
| 主体 | 类型 | 场景 | 状态 | 赞助 | 备注 |
|---|---|---|---|---|---|
| Apple Pay | payment_sdk | Safari / iOS | 支持 | 否 | 在 Safari 中通过 Payment Request 可用;需要完成商户域名验证。 |
| Stripe | payment_sdk | Cross-browser | 支持 | 否 | Stripe 把 Payment Request 封装为 Payment Request Button / Payment Element。 |
| Google Play billing | store_policy | Google Play TWA | 不支持 | 否 | 依据 Play 政策,分发数字商品的 TWA 必须使用 Play Billing,而不是 Payment Request。 |
检测分两步,因为浏览器可能暴露构造函数却不支持你的任何一种方式:
async function startCheckout(methods, details) { if (!('PaymentRequest' in window)) return openProviderForm(); const request = new PaymentRequest(methods, details); if (!(await request.canMakePayment())) return openProviderForm(); try { const response = await request.show(); await response.complete('success'); } catch (err) { if (err.name === 'AbortError') return; // 用户关闭了面板 return openProviderForm(); }}Apple Pay
Section titled “Apple Pay”在 Safari 中,Payment Request 背后唯一的方式是 Apple Pay;面板与 Apple Pay JS 打开的是同一个。Apple 的规划页面写明:任何地区的商户都能接受 Apple Pay,「as long as their payment service provider supports Apple Pay」;「in China mainland, Apple Pay on the web is supported in Safari on iOS only」;平台通过 Apple Pay Web Merchant Registration API 注册商户网站。在 SFSafariViewController 中展示的网页可以像在 Safari 中一样使用 Apple Pay;WKWebView 不行,Apple 要求这类应用把请求移到原生代码中。
Google Pay
Section titled “Google Pay”Google 的设置指南列出 Google Pay API for web 可运行的浏览器:「Google Chrome, Mozilla Firefox, Apple Safari, Microsoft Edge, Opera, or UCWeb UC Browser」,并要求「an HTTPS webpage with a TLS domain-validated certificate」。该 API 为所选方式返回一个支付令牌,由你的后端转交给处理商。Google 把 Firefox 与 Safari 列入支持名单,尽管这两者的 Payment Request 并不呈现 Google Pay。
服务商 SDK
Section titled “服务商 SDK”服务商 SDK 是普通 JavaScript,在 PWA 中与在标签页中一样加载。Stripe 曾用 Payment Request Button 封装 PaymentRequest 来展示 Apple Pay、Google Pay 或 Link,该组件在 Stripe 文档中已标记为弃用,由 Express Checkout Element 取代。已安装的 PWA 额外带来的问题是导航:基于重定向的 3-D Secure 或银行流程一旦离开 manifest 的 scope,就会在浏览器的超出 scope 界面下运行(Microsoft 记录了从 Store 安装的 Edge PWA 会显示 URL 与标题栏),因此发布独立窗口应用时,优先选择在弹窗或内嵌框架中完成验证的服务商。
| 层 | 可用范围 | 前提 |
|---|---|---|
| Payment Request API | Chrome 60 / Android 53、Edge 15、Safari 11.1、Samsung Internet、WebView 136 | 安全上下文;show() 需要瞬时用户激活 |
| Apple Pay | Safari(macOS、iOS);SFSafariViewController |
商户注册;支持 Apple Pay 的 PSP |
| Google Pay | Chrome、Firefox、Safari、Edge、Opera、UC 浏览器 | 带 TLS 域名验证证书的 HTTPS |
| 服务商 SDK | SDK 支持的任何引擎 | 服务商账户;为不支持的钱包准备回退表单 |
- Payment Request API(w3.org)
- PaymentRequest: show() method(developer.mozilla.org)
- Set up Google Pay API for web(developers.google.com)
- Payment Request API 兼容性
- Payment Request API 参考
- 变现
- Digital Goods API
← 返回生态总览。