TWA应用旧版Android设备调用Google Billing报支付清单下载错误
问题背景
使用Bubblewrap工具将PWA打包为Android平台TWA应用,已正确配置启用Google Billing能力,在Android 11设备上所有功能运行正常,但在Android 6系统旧设备打开应用时,PaymentRequest.canMakePayment()方法返回false,抛出如下错误:
Unable to download payment manifest "https://play.google.com/billing".
目前未检索到Google Play Billing与Web端Payment Request API适配的公开官方文档,不清楚该功能的兼容运行要求,且确认此前旧版Android设备曾可正常完成支付流程。
相关实现代码如下:
const getBillingService = async () => { if (window.PaymentRequest !== undefined) { const dummyMethods = [ { supportedMethods: "https://play.google.com/billing", }, ]; const dummyDetails = { total: { label: `Total`, amount: { currency: `USD`, value: `0` }, }, }; const dummyRequest = new PaymentRequest(dummyMethods, dummyDetails); const possible = await dummyRequest.canMakePayment(); //true inside my app on newer Android versions, false in older ones //with the error Unable to download payment manifest "https://play.google.com/billing". } };
已确认满足Google Play Billing API所有官方运行要求:HTTPS访问上下文、应用从Google Play Store官方渠道下载等,功能在新版Android设备可正常运行。
问题原因排查
这个报错的核心是TWA内嵌的WebView无法正常拉取Google Play的支付清单文件,Android 6设备触发该问题的原因基本集中在4类:
- 系统WebView版本过低:Android 6出厂自带的系统WebView版本普遍在Chrome 56及以下,而基于Payment Request API的Google Play Billing集成,最低要求WebView内核版本≥72。旧版WebView既没有内置
https://play.google.com/billing支付方法的原生适配逻辑,也无法正确校验Play服务返回的支付清单签名,只要用户没手动更新过系统WebView或Chrome,大概率会触发这个报错。 - Google Play服务版本不达标:Android 6设备支持的Google Play服务版本存在上限,若设备上Play服务版本低于20.15.x,就不会暴露TWA支付调用的专用接口,WebView发起的支付清单请求会直接被Play服务拦截返回空响应,最终抛出无法下载清单的错误。
- TWA域名校验时序问题:Bubblewrap生成的TWA客户端默认走异步Digital Asset Links校验逻辑,在Android 6等旧系统上,经常出现PWA页面已经加载完成、但域名校验还没跑完的情况,此时WebView会默认禁用跨应用支付调用权限,直接阻断支付清单拉取请求。
- TLS/证书兼容问题:Android 6默认虽然支持TLS 1.2,但部分长期未更新的旧设备系统根证书库已过期,访问play.google.com拉取支付清单时会出现SSL握手失败,被系统判定为不安全连接直接阻断请求。
解决方案
按优先级依次落地即可解决:
- 增加前置版本校验逻辑
- 检测当前系统WebView内核版本,若版本号低于72,直接弹窗引导用户升级系统WebView或Chrome浏览器
- 检测Google Play服务版本,若版本低于20.15.xx,引导用户升级Play服务后再使用支付功能
- 调整Bubblewrap构建配置,将TWA的Digital Asset Links校验逻辑改为冷启动同步校验,关闭异步校验开关,避免旧系统上校验时序错位导致的权限缺失
- 优化支付能力检测逻辑:不要用0金额的测试单做
canMakePayment()检测,旧版Play服务会直接拦截0元单的清单请求返回失败,改用你在Play后台配置的正式测试商品ID构造请求;首次检测返回false时,延迟3-5秒重试1次,规避旧设备TWA权限初始化慢导致的误判 - 给应用增加针对Android 6的网络安全配置,强制启用TLS 1.2支持,将play.google.com加入可信域名白名单,避免根证书校验失败导致的连接阻断
- 增加兜底方案:若重试后
canMakePayment()仍返回false,跳转Bubblewrap配置的原生支付入口完成支付,不要完全依赖Web端Payment Request API。
补充:如果之前旧设备能正常支付、最近突然失效,优先检查是否是Play服务自动更新后回退到了适配低版本Android的旧版通道,或者你的PWA域名SSL证书链更新后,旧系统根证书无法校验新证书导致的。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

