【问题标题】:how to get subscription expire date in inapp v3 android如何在inapp v3 android中获取订阅到期日期
【发布时间】:2015-08-17 16:29:48
【问题描述】:

您好,我已经使用 android-inapp-billing-v3 为一个项目实施了一年订阅的应用内计费 V3。我想在我的应用程序中显示剩余天数。我打电话给getSubscriptionTransactionDetails 来获取产品的交易详情,但它总是返回null。这是我的代码。

  private BillingProcessor startInappCheck(){

         bp = new BillingProcessor(mContext, BASE64ENCODEDPUBLICKEY, new BillingProcessor.IBillingHandler() {
                @Override
                public void onProductPurchased(String productId, TransactionDetails details) {
                    LogUtils.e(TAG, "onProductPurchased :" +productId);
    //              showToast("onProductPurchased: " + productId);

                }
                @Override
                public void onBillingError(int errorCode, Throwable error) {

                    LogUtils.e(TAG, "onBillingError :" +errorCode);


                }
                @Override
                public void onBillingInitialized() {
  //                showToast("onBillingInitialized");
                    readyToPurchase = true;



                    try{
                        SkuDetails subs = bp.getSubscriptionListingDetails(SUBSCRIPTION_ID);


                        LogUtils.d(TAG, "Owned Subscription: " + subs.toString());
                       TransactionDetails tr = bp.getSubscriptionTransactionDetails(SUBSCRIPTION_ID);
                      LogUtils.d(TAG, "Owned Subscription: " + tr.toString());

                    }catch (Exception e) {
                        // TODO: handle exception
                    }


                }
                @Override
                public void onPurchaseHistoryRestored() {
   //                   showToast("onPurchaseHistoryRestored");
                    for(String sku : bp.listOwnedSubscriptions()){
                        LogUtils.d(TAG, "Owned Subscription: " + sku);
                    }
   //                showToast("onPurchaseHistoryRestored");

                }
            });
         return bp;
    }

我从onCreate调用了这个方法。

  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
     if (!bp.handleActivityResult(requestCode, resultCode, data))
            super.onActivityResult(requestCode, resultCode, data);

}

我的订阅项目按钮在 fragment 中实现。还有一个问题,我发现在成功订阅后onProductPurchased 不会被调用,但我已经在onResume 中实现了逻辑,以在bp.isSubscribed(SUBSCRIPTION_ID) 返回true 时更新UI。请告诉我如何获取订阅开始日期和到期日期。

【问题讨论】:

标签: android in-app-purchase in-app-billing in-app-subscription


【解决方案1】:

我想给我自己的 que 的 ans 一个答案,这样如果有人在寻找相同的答案,就可以找到解决方案。 经过大量谷歌搜索后,我没有找到我正在寻找的确切解决方案所以我在iabv3 library 项目的BillingProcessor 类中创建了一个方法,该方法返回带有购买详细信息的Bundle,其中我得到了购买日期。现在我可以用这个找到到期日期。该方法如下所示

public Bundle getPurchases(){
    if (!isInitialized())
        return null;
    try{
        return  billingService.getPurchases(Constants.GOOGLE_API_VERSION, contextPackageName, Constants.PRODUCT_TYPE_SUBSCRIPTION, null);
    }catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

【讨论】:

  • 确切的购买日期是什么?最后一次付款的日期?
  • 是的,购买日期是产品的最后付款日期。
  • 如何从 BillingProcessor 类调用 getPurchases()? @maddyd
  • 它只显示续订后的第一个购买日期。我怎样才能获得续订日期? @maddyd
  • @AnilKanani 你有更新日期吗?
【解决方案2】:

我正在使用这个:

@Nullable
public Date getSubscriptionRenewingDate(String sku) {

    // Get the Purchase object:
    Purchase purchase = null;
    Purchase.PurchasesResult purchasesResult = _billingClient.queryPurchases(BillingClient.SkuType.SUBS);
    if (purchasesResult.getPurchasesList() != null) {
        for (Purchase p : purchasesResult.getPurchasesList()) {
            if (p.getSku().equals(sku) && p.getPurchaseState() == Purchase.PurchaseState.PURCHASED && p.isAutoRenewing()) {
                purchase = p;
                break;
            }
        }
    }

    // Get the SkuDetails object:
    SkuDetails skuDetails = null;
    for (SkuDetails s : _skuDetails) { // _skuDetails is an array of SkuDetails retrieved with querySkuDetailsAsync
        if (s.getSku().equals(sku)) {
            skuDetails = s;
            break;
        }
    }

    if (purchase != null && skuDetails != null) {

        Date purchaseDate = new Date(purchase.getPurchaseTime());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(purchaseDate);

        Date now = new Date();

        while (calendar.getTime().before(now)) {

            switch (skuDetails.getSubscriptionPeriod()) {

                case "P1W": calendar.add(Calendar.HOUR, 7*24); break;
                case "P1M": calendar.add(Calendar.MONTH, 1); break;
                case "P3M": calendar.add(Calendar.MONTH, 3); break;
                case "P6M": calendar.add(Calendar.MONTH, 6); break;
                case "P1Y": calendar.add(Calendar.YEAR, 1); break;
            }
        }

        return calendar.getTime();
    }

    return null;
}

【讨论】:

  • 在这种方法中,如果用户将他们的设备时间和日期更改为未来一年怎么办?
  • 当然它会失败,它并不是用来授予/撤销对付费内容的访问权限,而是向用户显示下一个续订日期。如果他试图破解应用程序,他必须预料到这类信息是不准确的。
  • now = new Date();这就是问题所在。它依赖于手机时间。我可以将我的电话时间设置为过去或在订阅的特定期限内。
【解决方案3】:

我已使用此代码在计费处理器库中获取购买详细信息。

   TransactionDetails transactionDetails = bp.getSubscriptionTransactionDetails(channelModel.getAndroidProductId());
        Log.d(TAG, "initializePaymentSetup: " + transactionDetails.toString());
        Log.d(TAG, "initializePaymentSetup: " + transactionDetails.purchaseInfo.toString());

 transactionDetails.purchaseInfo.purchaseData// this will return the purchase date

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多