如何检查用户是否在 Android 中拥有有效订阅?

问题描述

我有一个用 AIDL 编写的应用,我正在尝试将其迁移到计费库 V3。

以下课程是我用来允许用户为应用内订阅付费的课程,效果很好。 我想在应用程序打开时检查用户是否对我的应用程序进行了有效订阅。我该怎么做?

public class GetProActivity extends Activity implements PurchasesUpdatedListener {
private Button buyButton;
private BillingClient billingClient;
private String subscriptionProductID = "4";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    buyButton = (Button) findViewById(R.id.buy);

    billingClient = BillingClient.newBuilder(this)
            .setListener(this)
            .enablePendingPurchases()
            .build();

    billingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(BillingResult billingResult) {
            if (billingResult.getResponseCode() ==  BillingClient.BillingResponseCode.OK) {
                // The BillingClient is ready. You can query purchases here.
                loadAllSKUs();
            }
        }
        @Override
        public void onBillingServicedisconnected() {
            // Try to restart the connection on the next request to
            // Google Play by calling the startConnection() method.
        }
    });

}

@Override
public void onPurchasesUpdated(BillingResult billingResult,List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
            && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

public void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
        Log.d("Testing","purchased");
        if(!purchase.isAckNowledged())
        {
            Log.d("Testing","ackNowledging");
            AckNowledgePurchaseParams ackNowledgePurchaseParams
                    = AckNowledgePurchaseParams.newBuilder()
                    .setPurchasetoken(purchase.getPurchasetoken())
                    .build();

            billingClient.ackNowledgePurchase(ackNowledgePurchaseParams,new AckNowledgePurchaseResponseListener() {
                @Override
                public void onAckNowledgePurchaseResponse(BillingResult billingResult) {
                    if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK){
                        Log.d("Testing","ackNowledging");
                    }
                }
            });
        }
    }
}


private void loadAllSKUs() {
    if (billingClient.isReady()) {
        List<String> skuList = new ArrayList<>();
        skuList.add(subscriptionProductID);
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS);
        billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(BillingResult billingResult,List<SkuDetails> skuDetailsList) {
                        for (final SkuDetails skuDetails : skuDetailsList) {
                            if (skuDetails.getSku().equalsIgnoreCase(subscriptionProductID)) {
                                Log.d("Testing",skuDetails.getSku());
                                buyButton.setonClickListener(new View.OnClickListener() {
                                    public void onClick(View v) {
                                        Log.d("Testing","buttonClick");
                                        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                                                .setSkuDetails(skuDetails)
                                                .build();
                                        int responseCode = billingClient.launchBillingFlow(GetProActivity.this,billingFlowParams).getResponseCode();
                                    }
                                });
                            }
                        }
                    }
                });
    } else {
        Log.d("Testing","not ready");
    }
}
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)