如何在Google Play控制台创建非续订订阅

4

目前,我已设置自动续订订阅。但我想创建非续订订阅,以便在每个计费周期结束时重新订阅。

在Google Play控制台中,没有像iOS下面所示的创建非续订订阅的选项。

iOS创建计划页面

请指导我如何在Google Play控制台中创建非续订订阅。

2个回答

4
一种不可再生的订阅实际上是一种普通的消耗性一次性产品。唯一的区别在于,订阅是循环的(需要续订)。来源于Google Play计费系统概述
您可以使用 Google Play 的结算系统来销售以下类型的数字内容:
- 一次性产品:一次性产品是用户可以通过单笔、非重复收费到用户的付款方式购买的内容。
一次性产品可以是可消耗或不可消耗的:
- 可消耗产品是用户为了获得应用内内容(例如游戏货币)而消耗的产品。当用户消耗产品时,您的应用会提供相关内容,并且用户随后可以再次购买该项目。 - 不可消耗产品是仅购买一次以提供永久福利的产品。示例包括高级升级和级别包。
- 订阅:订阅是一种按照循环基础提供内容的产品。订阅会自动续订,直至取消。订阅的示例包括在线杂志和音乐流媒体服务的访问权限。

0

这可能对你有帮助!

//First, you need to initializes
private void Initialize(){
    billingClient = BillingClient.newBuilder(context)
            .setListener(new PurchasesUpdatedListener() {
              @Override
              public void onPurchasesUpdated(@NonNull @NotNull BillingResult billingResult, List<Purchase> list) {
                // Google Play calls this to deliver the result of the purchase operation to this listener
                if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null){
                  for(Purchase purchase : list){
                    // since we have only passes a productId at LaunchPurchaseFlow
                    activity.runOnUiThread(new Runnable() {
                      @Override
                      public void run() {
                        GotPurchase(purchase);
                        if(isAutoAcknowledge && !isSubscription){
                            HandleNonConsumable(purchase);
                        }
                      }
                    });
                  }
                }else if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED){
                  activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                      PurchaseCancelled();
                    }
                  });
                }else{
                  activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                      PurchaseFailed(billingResult.getResponseCode());
                    }
                  });
                }
              }
            })
            .enablePendingPurchases()
            .build();
  }
// To start connection
public void StartConnection(){
    billingClient.startConnection(new BillingClientStateListener() {
      @Override
      public void onBillingServiceDisconnected() {
        activity.runOnUiThread(new Runnable() {
          @Override
          public void run() {
            BillingServiceDisconnect();
          }
        });
      }
      @Override
      public void onBillingSetupFinished(@NonNull @NotNull BillingResult billingResult) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
          activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
              BillingClientReady();
            }
          });
        }
      }
    });
  }
// To launch purchase flow use this method, productId is your product id and skuType can be subs or inapp . If you need for subs then pass skuType as subs
public void LaunchPurchaseFlow(String productId, String skuType){
    String idOfProduct = isTest ? "android.test.purchased" : productId;
    isSubscription = skuType.equals(BillingClient.SkuType.SUBS);
    if(billingClient.isReady()){
      List<String> skuList = new ArrayList<>();
      skuList.add(idOfProduct);
      SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
              .setSkusList(skuList)
              .setType(skuType)
              .build();
      billingClient.querySkuDetailsAsync(skuDetailsParams, new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(@NonNull @NotNull BillingResult billingResult, List<SkuDetails> list) {
          if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null){
              BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                      .setSkuDetails(list.get(0))
                      .build();
              billingClient.launchBillingFlow(activity , billingFlowParams);
          }else{
            FailedToLaunchPurchaseFlow(billingResult.getResponseCode());
          }
        }
      });

    }else{
      OnError("Billing Client is not ready");
    }
  }

如果您正在进行应用内购买,无论是可消耗还是非可消耗的,您都应该像这样处理购买。
// Consumable
public void HandleConsumable(Object purchase){
    if(purchase instanceof Purchase){
      Purchase purchase1 = (Purchase) purchase;
      if(purchase1.getPurchaseState() == Purchase.PurchaseState.PENDING){
        PurchaseStatePending();
      }else if(purchase1.getPurchaseState() == Purchase.PurchaseState.UNSPECIFIED_STATE){
        PurchaseStateUnspecified();
      }else{
        if(!purchase1.isAcknowledged()){ // TO know if payment is acknowledged, if not it means the payment is not successful/acknowledged yet.
          ConsumeParams consumeParams = ConsumeParams.newBuilder()
                  .setPurchaseToken(purchase1.getPurchaseToken())
                  .build();
          ConsumeResponseListener listener = new ConsumeResponseListener() {
            @Override
            public void onConsumeResponse(@NonNull @NotNull BillingResult billingResult, @NonNull @NotNull String s) {
              if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                activity.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                    PurchaseSuccess();
                  }
                });
              }else{
                activity.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                    PurchaseFailed(billingResult.getResponseCode());
                  }
                });
              }
            }
          };
          billingClient.consumeAsync(consumeParams , listener);
        }
      }
    }else{
      OnError("purchase is not an instance of Purchase");
    }
  }

// Non-Consumable or Acknowledged
public void HandleNonConsumable(Object purchase){
    if(purchase instanceof Purchase){
      Purchase purchase1 = (Purchase) purchase;
      if(purchase1.getPurchaseState() == Purchase.PurchaseState.PENDING){
        PurchaseStatePending();
      }else if(purchase1.getPurchaseState() == Purchase.PurchaseState.UNSPECIFIED_STATE){
        PurchaseStateUnspecified();
      }else if(purchase1.getPurchaseState() == Purchase.PurchaseState.PURCHASED){
        if(!purchase1.isAcknowledged()){
          AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                  .setPurchaseToken(purchase1.getPurchaseToken())
                  .build();
          AcknowledgePurchaseResponseListener listener = new AcknowledgePurchaseResponseListener() {
            @Override
            public void onAcknowledgePurchaseResponse(@NonNull @NotNull BillingResult billingResult) {
              if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                activity.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                    PurchaseSuccess();
                  }
                });
              }else{
                activity.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                    PurchaseFailed(billingResult.getResponseCode());
                  }
                });
              }
            }
          };
          billingClient.acknowledgePurchase(acknowledgePurchaseParams , listener);
        }
      }
    }else{
      OnError("purchase is not an instance of Purchase");
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接