为何部分运营商不支持 Google Play 订阅的 DCB?
结论
这是运营商支付能力和策略不同造成的,不是 In-App Billing 配置错误。
支持通过 Direct Carrier Billing(DCB)购买普通应用,并不代表也支持用 DCB 购买订阅。订阅涉及周期性扣费、续订授权、额度管理和退款处理,Google Play 需要与运营商分别接入这些能力。如果运营商尚未开放订阅扣费、用户账户不符合条件,或者相关系统能力当时尚未部署,用户确认付款后就可能看到以下提示:
Direct Carrier Billing is not available (IAI).
所以,同一个应用和订阅商品在 AT&T、Verizon 上可以购买,在 Sprint 等运营商上失败,并不反常。升级 IAB v2 或 IAB v3,也无法让尚未支持订阅 DCB 的运营商获得这项能力。
为什么普通应用可以购买,订阅却失败
购买普通应用通常只需一次性扣费,订阅则要求运营商能够处理后续的自动续费,因此两者依赖的支付能力并不相同。
使用订阅 DCB 通常还要满足这些条件:
- 运营商已与 Google Play 开通订阅类商品的代扣能力。
- 手机号码、SIM 卡与 Google Play 账户的国家或地区相匹配。
- 用户使用符合条件的个人后付费或预付费账户。
- 账户允许购买数字内容,且没有达到消费限额或信用额度。
- 运营商能够处理周期性扣费、续订失败、取消和退款。
- 当前设备、网络连接和号码识别方式符合运营商要求。
如果错误出现在 Google Wallet 或 Google Play 的付款确认界面,尤其是在用户点击接受付款之后,通常表示应用已经成功发起购买流程,问题发生在 Google Play 与运营商之间的支付链路。应用端无法通过代码开启或修复某家运营商的 DCB 支持。
建议的处理方式
先确认信用卡能否购买同一个订阅商品,并检查商品是否已经发布,价格和地区配置是否正确。这样可以排除订阅商品本身的问题。
接下来逐项检查:
- 使用移动数据测试,并暂时关闭 Wi-Fi。部分运营商需要通过蜂窝网络识别号码。
- 确认 Google Play 账户的国家或地区、SIM 卡归属地与运营商账单地址一致。
- 检查号码是否属于企业账户、家庭账户副卡、MVNO、漫游号码或受限套餐。这类账户可能无法使用 DCB,也可能只支持一次性购买。
- 确认运营商账户没有欠费、消费限额、内容购买限制或年龄限制。
- 删除运营商付款方式,重新添加后再测试。
- 记录运营商、套餐类型、设备、Google Play 版本、测试时间和完整错误信息,再向 Google Play 或运营商支持渠道确认订阅 DCB 的适用范围。
- 在界面中提供信用卡、礼品余额等替代付款方式,不要将 DCB 设为唯一的购买途径。
运营商的支持范围可能随地区、套餐和时间变化。历史测试中某家运营商可以使用,不代表它现在支持所有用户。一次失败也不能证明该运营商完全不支持订阅 DCB。
应用端应如何处理
应用不应根据运营商名称硬编码 DCB 支持情况。Google Play Billing 不会向应用提供可靠的“当前运营商是否支持订阅 DCB”开关,最终资格还可能根据具体账户动态判断。
应用只需正常启动订阅购买流程,并统一处理 Google Play 返回的结果:
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(
ImmutableList.of(
BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setOfferToken(offerToken)
.build()))
.build();
BillingResult billingResult =
billingClient.launchBillingFlow(activity, billingFlowParams);
if (billingResult.getResponseCode()
!= BillingClient.BillingResponseCode.OK) {
showPurchaseError(billingResult.getDebugMessage());
}
购买结果还需要在 PurchasesUpdatedListener 中处理:
@Override
public void onPurchasesUpdated(
BillingResult billingResult,
List<Purchase> purchases) {
switch (billingResult.getResponseCode()) {
case BillingClient.BillingResponseCode.OK:
if (purchases != null) {
for (Purchase purchase : purchases) {
verifyAndProcessPurchase(purchase);
}
}
break;
case BillingClient.BillingResponseCode.USER_CANCELED:
showMessage("购买未完成,请选择其他付款方式后重试。");
break;
case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE:
showMessage("当前账户或付款方式暂不支持此订阅。");
break;
default:
showMessage("付款未完成:" + billingResult.getDebugMessage());
break;
}
}
错误提示应保持中性。BILLING_UNAVAILABLE 等响应只表示当前购买环境不可用,不能据此认定某家运营商永久不支持订阅。
注意事项
Google Play Billing API V2 和 IAB v3 都是历史接口。新应用应使用当前受支持的 Google Play Billing Library,并按 Google Play 的要求在服务端验证购买、确认交易和管理订阅状态。
升级 Billing Library 有助于改善兼容性和错误处理,但不能绕过运营商限制。付款方式中是否显示 DCB、用户能否用它购买某项订阅,以及续订时能否成功扣款,最终取决于 Google Play、运营商和用户账户的状态。
备注:内容仅供参考。
