微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

升级/降级订阅的Android计费问题

如何解决升级/降级订阅的Android计费问题

我目前正在实施Android Billing,以便将子版本销售到我的应用中,并且我在关于升级/降级功能的障碍点上遇到了麻烦。虽然我可以出售订阅,但无法升级或降级,但该应用处理的是“正常购买”界面,而不是相关界面。

这是我当前的实现方式:

public class SubscriptionActivity extends AppCompatActivity {

    private static final String TAG = "SubscriptionActivity";
    
    private static final String FirsTITEM = "firstItem";
    private static final String SECONDITEM = "secondItem";
    private static final String THIRDITEM = "ThirdItem";

    private static final String SKUID = "sku_id";
    private static final String PACKAGENAME = "package_name";
    private static final String PURCHASetoKEN = "purchase_token";

    private FirebaseFunctions mFunctions;
    private List<SkuDetails> mSkuDetailsList;

    private final PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {

        @Override
        public void onPurchasesUpdated(@NonNull BillingResult billingResult,@Nullable List<Purchase> list) {

            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null) {
                for (Purchase purchase : list) {
                    if(purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED){
                        verifySubscription(purchase);
                    }
                }
            } else{
            
            ...
            
            }

        }

    };

    private BillingClient billingClient;

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

        mFunctions = FirebaseFunctions.getInstance("europe-west1");

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

        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(@NonNull BillingResult billingResult) {

                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    querySku();
                }

            }

            @Override
            public void onBillingServicedisconnected() {


            }

        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        billingClient.endConnection();
    }

    private void buildrecyclerView(List<SkuDetails> skuDetailsList){

        RecyclerView choosePlanView = findViewById(R.id.choosePlanRecycler);
        SubscriptionRecycler choosePlanView_Adapter = new SubscriptionRecycler(this,skuDetailsList);
        choosePlanView.setLayoutManager(new linearlayoutmanager(this));
        choosePlanView.setAdapter(choosePlanView_Adapter);
        choosePlanView_Adapter.setonItemClickListener(new SubscriptionRecycler.OnItemClickListener() {

            @Override
            public void onBuyClick(int position) {
            
                String olSku = getValueFromDatabase.getolSku();
                String purchasetoken = getValueFromDatabase.getpurchasetoken ();

                Log.d(TAG,"olSku: " + olSku);
                Log.d(TAG,"purchasetoken: " + purchasetoken);

                BillingFlowParams billingFlowParams;

                if(olSku.isEmpty() && purchasetoken.isEmpty()){

                    Log.d(TAG,"New sub");

                    billingFlowParams = BillingFlowParams.newBuilder()
                            .setSkuDetails(mSkuDetailsList.get(position))
                            .build();

                } else {

                    Log.d(TAG,"Update Sub");

                    billingFlowParams = BillingFlowParams.newBuilder()
                            .setoldSku(olSku,purchasetoken)
                            .setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION)
                            .setSkuDetails(mSkuDetailsList.get(position))
                            .build();

                }


               billingClient.launchBillingFlow( SubscriptionActivity.this,billingFlowParams);

            }

        });

    }

    private void querySku() {

        List<String> skuList = new ArrayList<>();
        skuList.add(FirsTITEM);
        skuList.add(SECONDITEM);
        skuList.add(THIRDITEM);

        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS);

        billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(@NonNull BillingResult billingResult,List<SkuDetails> skuDetailsList) {
                    if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                        mSkuDetailsList = skuDetailsList;
                        buildrecyclerView(skuDetailsList);
                    }
                }
            });

    }


    private Task<String> verifySubscription(final Purchase purchase) {

        // Create the arguments to the callable function.
        Map<String,Object> sendData = new HashMap<>();
        sendData.put(SKUID,purchase.getSku());
        sendData.put(PACKAGENAME,purchase.getPackageName());
        sendData.put(PURCHASetoKEN,purchase.getPurchasetoken());

        return mFunctions
                .getHttpsCallable("verifySubscription")
                .call(sendData)
                .continueWith(new Continuation<HttpsCallableResult,String>() {
                    @Override
                    public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                        if (task.isSuccessful() && (task.getResult().getData() != null) ) {
                            JSONObject json = new JSONObject(task.getResult().getData().toString());
                            if(Integer.parseInt(json.get("status").toString()) == 200){
                                Log.d(TAG,"ok");
                            }
                        }
                        return null;
                    }
                });
    }

}

我花了一整天时间尝试不同的设置。所以我想知道至少我做的是正确的吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。