Google Play 结算库 3.0+ - 恢复购买

Posted

技术标签:

【中文标题】Google Play 结算库 3.0+ - 恢复购买【英文标题】:Google Play Billing Library 3.0+ - Restore purchase 【发布时间】:2021-05-06 15:43:31 【问题描述】:

借助 Google Play 结算库 v3.0+,我们有了新的购买流程,一切都在这里得到了完美的解释: Google Play Billing

在旧版本的库中,我们将恢复如下内容:

bp = new BillingProcessor(this, MERCHANT_ID, new BillingProcessor.IBillingHandler() 
        @Override
        public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) 
            String orderId = details.purchaseInfo.purchaseData.productId;
  // we then compare the orderID with the SKU and see if the user purchased the item,
  // however in the new version of the library there is nothing about restore

但是,文档中没有关于恢复购买的任何内容?

例如,我们有一个用例,您有一个有效的订阅和一个您购买的 IAP 产品。您删除该应用程序并重新安装它。您如何恢复订阅和该 IAP 产品?

【问题讨论】:

【参考方案1】:

BillingProcessor 和 onProductPurchased 似乎不是 Play Billing Library(也不是 AIDL)的一部分,它更像是 anjlab 实现的包装类(https://github.com/anjlab/android-inapp-billing-v3) 为了满足您的需求,我认为queryPurchases 和queryPurchaseHistoryAsync 可以提供帮助。

【讨论】:

【参考方案2】:

基本上 queryPurchaseHistoryAsync 可以完成这项工作,只是要小心传递 SKU TYPE(inapp 或 subs)。

我的实现:

fun restorePurchaseInApp() 
    bp.queryPurchaseHistoryAsync("inapp", this)


fun restorePurchaseInSubs() 
    bp.queryPurchaseHistoryAsync("subs", this)


// bp is BillingClient
// the class should implement PurchaseHistoryResponseListener

override fun onPurchaseHistoryResponse(
    p0: BillingResult,
    p1: MutableList<PurchaseHistoryRecord>?
) 
    if (p1 != null) 
        Log.d("TMS", "onPurchaseHistoryResponse: " + p1.size)
    

    if (p1 != null) 
        for (item in p1) 
            Log.d("TMS", "onPurchaseHistoryResponse sku: " + item.sku)
            Log.d("TMS", "onPurchaseHistoryResponse signature: " + item.signature)
            Log.d("TMS", "onPurchaseHistoryResponse purchaseToken: " + item.purchaseToken)
            Log.d("TMS", "onPurchaseHistoryResponse purchaseTime: " + item.purchaseTime)
        
    

在那里你会得到购买的物品,就是这样:)。我希望这会有所帮助,因为我浪费了很多时间来弄清楚这么简单的事情,而文档实现中没有提到这一点。

【讨论】:

【参考方案3】:

使用Github 上提供的 Google InApp 结算库。

Android In-App Billing API 的简单实现。

dependencies 
    implementation 'com.github.moisoni97:google-inapp-billing:1.0.5'

◆ 创建一个BillingConnector 类的实例。构造函数将采用 2 个参数:

● Context
● License key from *Play Console*
billingConnector = new BillingConnector(this, "license_key")
                .setConsumableIds(consumableIds)
                .setNonConsumableIds(nonConsumableIds)
                .setSubscriptionIds(subscriptionIds)
                .autoAcknowledge()
                .autoConsume()
                .enableLogging()
                .connect();

◆ 实现监听器来处理事件结果和错误:

billingConnector.setBillingEventListener(new BillingEventListener() 
            @Override
            public void onProductsFetched(@NonNull List<SkuInfo> skuDetails) 
                /*Provides a list with fetched products*/
            

            @Override
            public void onPurchasedProductsFetched(@NonNull List<PurchaseInfo> purchases) 
                /*Provides a list with fetched purchased products*/
            

            @Override
            public void onProductsPurchased(@NonNull List<PurchaseInfo> purchases) 
                /*Callback after a product is purchased*/
            

            @Override
            public void onPurchaseAcknowledged(@NonNull PurchaseInfo purchase) 
                /*Callback after a purchase is acknowledged*/
                
                /*
                 * Grant user entitlement for NON-CONSUMABLE products and SUBSCRIPTIONS here
                 *
                 * Even though onProductsPurchased is triggered when a purchase is successfully made
                 * there might be a problem along the way with the payment and the purchase won't be acknowledged
                 *
                 * Google will refund users purchases that aren't acknowledged in 3 days
                 *
                 * To ensure that all valid purchases are acknowledged the library will automatically
                 * check and acknowledge all unacknowledged products at the startup
                 * */
            

            @Override
            public void onPurchaseConsumed(@NonNull PurchaseInfo purchase) 
                /*Callback after a purchase is consumed*/
                
                /*
                 * CONSUMABLE products entitlement can be granted either here or in onProductsPurchased
                 * */
            

            @Override
            public void onBillingError(@NonNull BillingConnector billingConnector, @NonNull BillingResponse response) 
                /*Callback after an error occurs*/
                
                switch (response.getErrorType()) 
                    case CLIENT_NOT_READY:
                        //TODO - client is not ready yet
                        break;
                    case CLIENT_DISCONNECTED:
                        //TODO - client has disconnected
                        break;
                    case SKU_NOT_EXIST:
                        //TODO - sku does not exist
                        break;
                    case CONSUME_ERROR:
                        //TODO - error during consumption
                        break;
                    case ACKNOWLEDGE_ERROR:
                        //TODO - error during acknowledgment
                        break;
                    case ACKNOWLEDGE_WARNING:
                        /*
                         * This will be triggered when a purchase can not be acknowledged because the state is PENDING
                         * A purchase can be acknowledged only when the state is PURCHASED
                         *
                         * PENDING transactions usually occur when users choose cash as their form of payment
                         *
                         * Here users can be informed that it may take a while until the purchase complete
                         * and to come back later to receive their purchase
                         * */
                        //TODO - warning during acknowledgment
                        break;
                    case FETCH_PURCHASED_PRODUCTS_ERROR:
                        //TODO - error occurred while querying purchased products
                        break;
                    case BILLING_ERROR:
                        //TODO - error occurred during initialization / querying sku details
                        break;
                    case USER_CANCELED:
                        //TODO - user pressed back or canceled a dialog
                        break;
                    case SERVICE_UNAVAILABLE:
                        //TODO - network connection is down
                        break;
                    case BILLING_UNAVAILABLE:
                        //TODO - billing API version is not supported for the type requested
                        break;
                    case ITEM_UNAVAILABLE:
                        //TODO - requested product is not available for purchase
                        break;
                    case DEVELOPER_ERROR:
                        //TODO - invalid arguments provided to the API
                        break;
                    case ERROR:
                        //TODO - fatal error during the API action
                        break;
                    case ITEM_ALREADY_OWNED:
                        //TODO - failure to purchase since item is already owned
                        break;
                    case ITEM_NOT_OWNED:
                        //TODO - failure to consume since item is not owned
                        break;
                
            
        );

开始购买

● 购买非消耗品/消耗品:

billingConnector.purchase(this, "sku_id");

● 购买订阅:

billingConnector.subscribe(this, "sku_id");

● 取消订阅:

billingConnector.unsubscribe(this, "sku_id");

源代码:-https://github.com/Mahadev-code/Android-inApp-Billing

【讨论】:

以上是关于Google Play 结算库 3.0+ - 恢复购买的主要内容,如果未能解决你的问题,请参考以下文章

添加了结算权限,Google Play无法在APK中识别出来

使用Google Play计费库和系统会在3天之内退还Inapp产品的退款

即使 IAP 的价格发生变化,Google Play 应用内结算 v3 getSkuDetails() 也会返回缓存结果

Google Play控制台:应用尚未提供任何应用内商品。

使用最新的 Play 商店“不支持应用内结算版本 3”

Ionic 3.0版本构建 - 取代Android Studio内置的现有Google Play应用