谷歌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
相关产品推荐
相关产品推荐

