Browse Source

优化谷歌结算

zk 1 year ago
parent
commit
4bc5e41333

+ 3 - 3
app/src/main/java/com/atmob/voiceai/module/subscription/SubscriptionPageViewModel.java

@@ -289,7 +289,7 @@ public class SubscriptionPageViewModel extends BaseViewModel {
                     @Override
                     public void onSuccess(@NonNull BillingResult billingResult) {
                         AtmobLog.d(TAG, "requestPayment onSuccess: " + billingResult);
-                        gpBillingClient.registerFlowListener(this, orderNo, purchase -> queryOrderStatus(bean, orderNo, purchase));
+                        gpBillingClient.registerFlowListener(this, orderNo, purchase -> queryOrderStatus(orderNo, purchase.getPurchaseToken()));
                     }
 
                     @Override
@@ -299,8 +299,8 @@ public class SubscriptionPageViewModel extends BaseViewModel {
                 });
     }
 
-    private void queryOrderStatus(GoodsBean bean, String orderNo, Purchase purchase) {
-        memberRepository.orderStatus(orderNo, purchase.getPurchaseToken())
+    private void queryOrderStatus(String orderNo, String token) {
+        memberRepository.orderStatus(orderNo, token)
                 .subscribe(new SingleObserver<Boolean>() {
                     @Override
                     public void onSubscribe(@NonNull Disposable d) {

+ 8 - 7
app/src/main/java/com/atmob/voiceai/sdk/billing/BillingStrategy.java

@@ -10,9 +10,10 @@ import com.android.billingclient.api.BillingClient;
 import com.android.billingclient.api.BillingResult;
 import com.android.billingclient.api.Purchase;
 import com.atmob.voiceai.sdk.billing.bean.GPProductInfo;
-import com.atmob.voiceai.sdk.billing.operation.Purchases;
-import com.atmob.voiceai.sdk.billing.operation.QueryDetails;
-import com.atmob.voiceai.sdk.billing.operation.Subscription;
+import com.atmob.voiceai.sdk.billing.classify.FeatureSupported;
+import com.atmob.voiceai.sdk.billing.classify.QueryPurchases;
+import com.atmob.voiceai.sdk.billing.classify.QueryGoods;
+import com.atmob.voiceai.sdk.billing.classify.Purchases;
 
 import java.util.List;
 
@@ -32,21 +33,21 @@ public class BillingStrategy {
     }
 
     public boolean isSupportProductDetails() {
-        return billingClient.isFeatureSupported(BillingClient.FeatureType.PRODUCT_DETAILS).getResponseCode() == BillingClient.BillingResponseCode.OK;
+        return FeatureSupported.isFeatureSupported(billingClient, BillingClient.FeatureType.PRODUCT_DETAILS);
     }
 
     public Single<GPProductInfo> queryGoodsDetails(String productType, @NonNull String productId, @Nullable String basePlanId, @Nullable String legacyProductId) {
-        return QueryDetails.queryGoodsDetails(billingClient, productType, productId, basePlanId, legacyProductId);
+        return QueryGoods.queryGoodsDetails(billingClient, productType, productId, basePlanId, legacyProductId);
     }
 
 
     public Single<BillingResult> subscriptionGoods(Activity activity, Object productDetails, String basePlanId, String orderNo) {
-        return Subscription.subscriptionGoods(billingClient, activity, productDetails, basePlanId, orderNo);
+        return Purchases.launchPurchaseGoods(billingClient, activity, productDetails, basePlanId, orderNo);
     }
 
 
     public SingleSource<List<Purchase>> queryPurchase(@BillingClient.ProductType String productType) {
-        return Purchases.queryPurchase(billingClient, productType);
+        return QueryPurchases.queryPurchase(billingClient, productType);
     }
 
 }

+ 2 - 5
app/src/main/java/com/atmob/voiceai/sdk/billing/GPBillingClient.java

@@ -17,12 +17,9 @@ import com.android.billingclient.api.BillingResult;
 import com.android.billingclient.api.PendingPurchasesParams;
 import com.android.billingclient.api.Purchase;
 import com.android.billingclient.api.PurchasesUpdatedListener;
-import com.android.billingclient.api.QueryPurchasesParams;
 import com.atmob.common.logging.AtmobLog;
 import com.atmob.common.runtime.ProcessUtil;
 import com.atmob.voiceai.sdk.billing.bean.GPProductInfo;
-import com.atmob.voiceai.sdk.billing.operation.Purchases;
-import com.atmob.voiceai.utils.ToastUtil;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -285,8 +282,8 @@ public class GPBillingClient implements PurchasesUpdatedListener {
         AtmobLog.d(TAG, "onPurchasesUpdated() called with: billingResult = [" + billingResult + "], list = [" + list + "]");
         if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null) {
             for (Purchase purchase : list) {
-                AccountIdentifiers accountIdentifiers = purchase.getAccountIdentifiers();
-                if (accountIdentifiers == null) {
+                AccountIdentifiers accountIdentifiers;
+                if (purchase == null || (accountIdentifiers = purchase.getAccountIdentifiers()) == null) {
                     continue;
                 }
                 String obfuscatedAccountId = accountIdentifiers.getObfuscatedAccountId();

+ 13 - 0
app/src/main/java/com/atmob/voiceai/sdk/billing/classify/FeatureSupported.java

@@ -0,0 +1,13 @@
+package com.atmob.voiceai.sdk.billing.classify;
+
+import com.android.billingclient.api.BillingClient;
+
+public class FeatureSupported {
+
+    private static final String TAG = FeatureSupported.class.getSimpleName();
+
+
+    public static boolean isFeatureSupported(BillingClient billingClient, String featureType) {
+        return billingClient.isFeatureSupported(featureType).getResponseCode() == BillingClient.BillingResponseCode.OK;
+    }
+}

+ 12 - 10
app/src/main/java/com/atmob/voiceai/sdk/billing/operation/Subscription.java

@@ -1,6 +1,7 @@
-package com.atmob.voiceai.sdk.billing.operation;
+package com.atmob.voiceai.sdk.billing.classify;
 
 import android.app.Activity;
+import android.text.TextUtils;
 
 import com.android.billingclient.api.BillingClient;
 import com.android.billingclient.api.BillingFlowParams;
@@ -14,13 +15,13 @@ import java.util.Objects;
 
 import atmob.reactivex.rxjava3.core.Single;
 
-public class Subscription {
+public class Purchases {
 
-    private static final String TAG = Subscription.class.getSimpleName();
+    private static final String TAG = Purchases.class.getSimpleName();
 
 
-    public static Single<BillingResult> subscriptionGoods(BillingClient billingClient, Activity activity, Object productDetails, String basePlanId, String orderNo) {
-        if (billingClient.isFeatureSupported(BillingClient.FeatureType.PRODUCT_DETAILS).getResponseCode() == BillingClient.BillingResponseCode.OK) {
+    public static Single<BillingResult> launchPurchaseGoods(BillingClient billingClient, Activity activity, Object productDetails, String basePlanId, String orderNo) {
+        if (FeatureSupported.isFeatureSupported(billingClient, BillingClient.FeatureType.PRODUCT_DETAILS)) {
             return launchProductBillingFlow(billingClient, activity, productDetails, basePlanId, orderNo);
         } else {
             return launchSkuBillingFlow(billingClient, activity, productDetails, orderNo);
@@ -39,14 +40,15 @@ public class Subscription {
         if (subscriptionOfferDetails != null) {
             offerToken = subscriptionOfferDetails.getOfferToken();
         }
+        BillingFlowParams.ProductDetailsParams.Builder builder = BillingFlowParams.ProductDetailsParams.newBuilder()
+                .setProductDetails(details);
+        if (!TextUtils.isEmpty(offerToken)) {
+            builder.setOfferToken(offerToken);
+        }
         BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                 .setObfuscatedAccountId(orderNo)
                 .setIsOfferPersonalized(true)
-                .setProductDetailsParamsList(Collections.singletonList(
-                        BillingFlowParams.ProductDetailsParams.newBuilder()
-                                .setProductDetails(details)
-                                .setOfferToken(offerToken)
-                                .build()))
+                .setProductDetailsParamsList(Collections.singletonList(builder.build()))
                 .build();
         return Single.fromCallable(() -> {
             BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

+ 4 - 6
app/src/main/java/com/atmob/voiceai/sdk/billing/operation/QueryDetails.java

@@ -1,13 +1,11 @@
-package com.atmob.voiceai.sdk.billing.operation;
+package com.atmob.voiceai.sdk.billing.classify;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.android.billingclient.api.BillingClient;
 import com.android.billingclient.api.ProductDetails;
-import com.android.billingclient.api.Purchase;
 import com.android.billingclient.api.QueryProductDetailsParams;
-import com.android.billingclient.api.QueryPurchasesParams;
 import com.android.billingclient.api.SkuDetails;
 import com.android.billingclient.api.SkuDetailsParams;
 import com.atmob.common.logging.AtmobLog;
@@ -19,13 +17,13 @@ import java.util.Objects;
 
 import atmob.reactivex.rxjava3.core.Single;
 
-public class QueryDetails {
+public class QueryGoods {
 
-    private static final String TAG = QueryDetails.class.getSimpleName();
+    private static final String TAG = QueryGoods.class.getSimpleName();
 
 
     public static Single<GPProductInfo> queryGoodsDetails(BillingClient billingClient, String productType, @NonNull String productId, @Nullable String basePlanId, @Nullable String legacyProductId) {
-        if (billingClient.isFeatureSupported(BillingClient.FeatureType.PRODUCT_DETAILS).getResponseCode() == BillingClient.BillingResponseCode.OK) {
+        if (FeatureSupported.isFeatureSupported(billingClient, BillingClient.FeatureType.PRODUCT_DETAILS)) {
             return queryProductDetails(billingClient, productType, productId, basePlanId);
         } else {
             return querySkuDetails(billingClient, productType, productId, basePlanId, legacyProductId);

+ 11 - 3
app/src/main/java/com/atmob/voiceai/sdk/billing/operation/Purchases.java

@@ -1,4 +1,4 @@
-package com.atmob.voiceai.sdk.billing.operation;
+package com.atmob.voiceai.sdk.billing.classify;
 
 import com.android.billingclient.api.BillingClient;
 import com.android.billingclient.api.Purchase;
@@ -9,10 +9,17 @@ import java.util.List;
 
 import atmob.reactivex.rxjava3.core.Single;
 
-public class Purchases {
+public class QueryPurchases {
 
-    private static final String TAG = Purchases.class.getSimpleName();
+    private static final String TAG = QueryPurchases.class.getSimpleName();
 
+    /**
+     * billingClient.queryPurchasesAsync 仅返回有效订阅和非消耗型一次性购买交易
+     *
+     * @param billingClient
+     * @param productType
+     * @return
+     */
     public static Single<List<Purchase>> queryPurchase(BillingClient billingClient, @BillingClient.ProductType String productType) {
         return Single.create(emitter -> billingClient.queryPurchasesAsync(
                 QueryPurchasesParams.newBuilder()
@@ -29,4 +36,5 @@ public class Purchases {
                 }
         ));
     }
+
 }