PAYATHON 2026

为何部分运营商不支持 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 支持。

建议的处理方式

先确认信用卡能否购买同一个订阅商品,并检查商品是否已经发布,价格和地区配置是否正确。这样可以排除订阅商品本身的问题。

接下来逐项检查:

  1. 使用移动数据测试,并暂时关闭 Wi-Fi。部分运营商需要通过蜂窝网络识别号码。
  2. 确认 Google Play 账户的国家或地区、SIM 卡归属地与运营商账单地址一致。
  3. 检查号码是否属于企业账户、家庭账户副卡、MVNO、漫游号码或受限套餐。这类账户可能无法使用 DCB,也可能只支持一次性购买。
  4. 确认运营商账户没有欠费、消费限额、内容购买限制或年龄限制。
  5. 删除运营商付款方式,重新添加后再测试。
  6. 记录运营商、套餐类型、设备、Google Play 版本、测试时间和完整错误信息,再向 Google Play 或运营商支持渠道确认订阅 DCB 的适用范围。
  7. 在界面中提供信用卡、礼品余额等替代付款方式,不要将 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、运营商和用户账户的状态。

备注:内容仅供参考。