You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌Play替代计费集成:如何获取ProductDetails?

谷歌Play Billing 获取ProductDetails及集成指导

一、如何获取ProductDetails

要获取productDetails,你需要通过BillingClient的queryProductDetailsAsync方法查询谷歌Play后台配置的商品信息,具体步骤如下:

1. 构建商品查询参数

先定义你的商品ID列表,并指定商品类型(一次性商品用INAPP,订阅用SUBS):

// 替换为你在谷歌Play控制台配置的实际商品ID
ImmutableList<String> targetProductIds = ImmutableList.of("premium_access", "monthly_sub");

// 构建查询参数
ProductQueryParams queryParams = ProductQueryParams.newBuilder()
    .setProductIds(targetProductIds)
    .setProductType(BillingClient.ProductType.SUBS) // 若为一次性商品,替换为BillingClient.ProductType.INAPP
    .build();

2. 发起异步查询并处理结果

调用queryProductDetailsAsync,在回调中获取ProductDetails集合:

// 确保BillingClient已成功连接
billingClient.queryProductDetailsAsync(queryParams, new ProductDetailsResponseListener() {
    @Override
    public void onProductDetailsResponse(BillingResult billingResult, ImmutableList<ProductDetails> productDetailsList) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !productDetailsList.isEmpty()) {
            // 遍历列表,筛选出你需要的目标商品详情
            for (ProductDetails details : productDetailsList) {
                if ("premium_access".equals(details.getProductId())) {
                    // 这里的details就是你需要传入setProductDetails的对象
                    useProductDetailsForPayment(details);
                    break;
                }
            }
        } else {
            // 处理查询失败逻辑,比如日志记录或用户提示
            Log.e("BillingError", "商品详情查询失败: " + billingResult.getDebugMessage());
        }
    }
});

// 封装支付流程的方法
private void useProductDetailsForPayment(ProductDetails productDetails) {
    // 这里就是你提供的代码片段,填入获取到的productDetails
    ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            ProductDetailsParams.newBuilder()
                .setProductDetails(productDetails)
                // 订阅商品需设置offerToken,一次性商品注释此行
                .setOfferToken(getSelectedOfferToken(productDetails))
                .build()
        );

    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build();

    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
}

// 订阅商品获取offerToken的辅助方法
private String getSelectedOfferToken(ProductDetails productDetails) {
    // 获取商品可用的优惠方案,这里默认取第一个,实际需根据业务逻辑选择
    List<ProductDetails.SubscriptionOfferDetails> offerDetails = productDetails.getSubscriptionOfferDetails();
    if (offerDetails != null && !offerDetails.isEmpty()) {
        return offerDetails.get(0).getOfferToken();
    }
    return null;
}

二、核心集成要点

1. BillingClient初始化与生命周期管理

  • 必须在主线程初始化BillingClient,并通过BillingClientStateListener监听连接状态,只有当onBillingSetupFinished返回成功时,才能执行查询或支付操作。
  • 在Activity的onResume中重新连接客户端,onPause中调用endConnection,避免连接丢失导致操作失败。

2. 支付结果监听

设置PurchasesUpdatedListener,在onPurchasesUpdated中处理支付结果:

  • 支付成功:验证购买凭证,完成商品发放逻辑。
  • 支付失败/取消:给用户相应提示,或提供重试入口。

3. 合规注意事项

  • 一次性商品不要调用setOfferToken方法,否则会导致支付流程失败。
  • 订阅商品需正确展示所有可用优惠,确保用户知晓不同订阅方案的差异。

内容的提问来源于stack exchange,提问作者Ayush Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:42:07