چندین گزینه خرید و پیشنهاد برای محصولات یکبار مصرف

این سند جزئیات ادغام محصولات یکبار مصرف (OTP) شما با کتابخانه صورتحساب Play را شرح می‌دهد. همچنین نحوه ادغام گزینه‌ها و پیشنهادات مختلف خرید مربوط به محصولات یکبار مصرف شما را توضیح می‌دهد.

شما می‌توانید چندین گزینه خرید و پیشنهاد برای محصولات یکبار مصرف خود پیکربندی کنید. به عنوان مثال، می‌توانید یک گزینه خرید و یک پیشنهاد پیش‌سفارش برای یک محصول یکبار مصرف پیکربندی کنید.

پیش‌نیازها

برای پیکربندی چندین پیشنهاد برای محصولات یک‌بار مصرف، باید از API queryProductDetailsAsync() استفاده کنید. API منسوخ‌شده‌ی querySkuDetailsAsync() پشتیبانی نمی‌شود. برای کسب اطلاعات در مورد نحوه‌ی استفاده از queryProductDetailsAsync() و نسخه‌ی launchBillingFlow() که ProductDetailsParams به عنوان ورودی دریافت می‌کند، به مراحل مهاجرت مراجعه کنید.

جزئیات محصول را استعلام کنید

اگر چندین پیشنهاد یا گزینه خرید برای محصول یکبار مصرف خود پیکربندی کرده‌اید، شیء ProductDetails که توسط متد queryProductDetailsAsync() برگردانده می‌شود، می‌تواند بیش از یک گزینه خرید و (یا) اجاره برای هر محصول یکبار مصرف داشته باشد. برای دریافت لیست تمام پیشنهادات واجد شرایط برای هر شیء ProductDetails ، از متد getOneTimePurchaseOfferDetailsList() استفاده کنید. فقط پیشنهادات و گزینه‌های خریدی که کاربر واجد شرایط آنها است، به عنوان بخشی از این لیست برگردانده می‌شوند. کد شما در متد onProductDetailsResponse() باید پیشنهادات برگشتی را مدیریت کند.

جریان صورتحساب را راه اندازی کنید

برای شروع درخواست خرید از برنامه خود، متد launchBillingFlow() را از thread اصلی برنامه خود فراخوانی کنید. این متد ارجاعی به یک شیء BillingFlowParams می‌گیرد که حاوی شیء ProductDetails مربوطه است که از فراخوانی queryProductDetailsAsync() به دست آمده است. برای ایجاد یک شیء BillingFlowParams ، از کلاس BillingFlowParams.Builder استفاده کنید. توجه داشته باشید که هنگام ایجاد شیء BillingFlowParams ، باید توکن پیشنهاد مربوط به پیشنهاد انتخاب شده توسط کاربر را تنظیم کنید.

نمونه زیر نحوه راه‌اندازی جریان خرید برای یک محصول یکبار مصرف با چندین پیشنهاد را نشان می‌دهد:

جاوا

    
// An activity reference from which the billing flow will launch.
Activity activity = ...;
ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers
            // that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();
// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
    
    

offerToken می‌توان به عنوان بخشی از OneTimePurchaseOfferDetails یافت. هنگامی که پیشنهاد را به کاربر نشان می‌دهید، مطمئن شوید که پارامترهای جریان صورتحساب را با توکن پیشنهاد صحیح پیکربندی می‌کنید که می‌توانید از متد oneTimePurchaseOfferDetails.getOfferToken() دریافت کنید.

گزینه‌ها و پیشنهادهای خرید

گزینه خرید به شما امکان می‌دهد نحوه اعطای حق به کاربر، قیمت آن و منطقه موجود بودن محصول را تعریف کنید. یک محصول واحد می‌تواند چندین گزینه خرید داشته باشد که نشان‌دهنده مکان و نحوه فروش محصول شما است.

گوگل پلی از گزینه‌های خرید زیر برای محصولات یک‌بارمصرف پشتیبانی می‌کند:

  • گزینه خرید
  • گزینه خرید اجاره

منظور از پیشنهادها، طرح قیمت‌گذاری است که می‌توانید برای محصولات یکبار مصرف خود ایجاد کنید. به عنوان مثال، می‌توانید برای محصول یکبار مصرف خود پیشنهاد تخفیف ایجاد کنید.

گوگل پلی از پیشنهادهای خرید زیر برای محصولات یک‌بارمصرف پشتیبانی می‌کند:

  • پیشنهاد پیش‌سفارش (فقط برای گزینه خرید پشتیبانی می‌شود)
  • پیشنهاد تخفیف (پشتیبانی شده برای هر دو گزینه خرید و اجاره)

گزینه خرید

گزینه خرید، نشان‌دهنده خرید استاندارد و قطعی محصول یک‌بارمصرف است. این گزینه یک فیلد legacyCompatible اختیاری دارد که نشان می‌دهد آیا این گزینه خرید در جریان‌های قدیمی‌تر کتابخانه پرداخت Play (نسخه ۷ یا قدیمی‌تر) که از مدل جدید پشتیبانی نمی‌کنند، در دسترس خواهد بود یا خیر. برای سازگاری با نسخه‌های قبلی، حداقل یک گزینه خرید باید به عنوان legacycompatible علامت‌گذاری شود.

مراحل ادغام گزینه‌های خرید و اجاره به شرط تملیک با PBL یکسان است. برای درک نحوه ادغام گزینه خرید به شرط تملیک با PBL، به بخش ادغام گزینه خرید به شرط تملیک با PBL مراجعه کنید.

گزینه خرید اجاره

گزینه خرید اجاره به کاربران امکان دسترسی به محصولات یک‌بار مصرف را برای مدت زمان مشخصی می‌دهد. می‌توانید دوره اجاره و انقضای آن را مشخص کنید. این سند مراحل ادغام گزینه خرید اجاره با کتابخانه پرداخت Play (PBL) را شرح می‌دهد.

گزینه خرید اجاره را با PBL ادغام کنید

این بخش نحوه ادغام گزینه خرید اجاره با کتابخانه صورتحساب Play (PBL) را شرح می‌دهد. فرض بر این است که شما با مراحل اولیه ادغام PBL مانند اضافه کردن وابستگی PBL به برنامه خود ، مقداردهی اولیه BillingClient و اتصال به Google Play آشنا هستید. این بخش بر جنبه‌های ادغام PBL که مختص گزینه خرید اجاره هستند، تمرکز دارد.

برای پیکربندی محصولات موجود برای اجاره، باید از سرویس جدید monetization.onetimeproducts از Play Developer API یا رابط کاربری Play Developer Console UI استفاده کنید. برای استفاده از این سرویس، می‌توانید REST API را مستقیماً فراخوانی کنید یا از کتابخانه کلاینت جاوا استفاده کنید.

یک جریان خرید برای گزینه اجاره راه‌اندازی کنید

برای شروع فرآیند خرید برای یک پیشنهاد اجاره، مراحل زیر را انجام دهید:

  1. با استفاده از متد ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails() ، فراداده‌های گزینه خرید اجاره را دریافت کنید.

    نمونه زیر نحوه دریافت فراداده خرید اجاره را نشان می‌دهد:

    جاوا

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // Checks if the offer is a rent purchase option.
            if (oneTimePurchaseOfferDetails.getRentalDetails() != null) {
              // process the returned RentalDetails
              OneTimePurchaseOfferDetails.RentalDetails rentalDetails =
                  oneTimePurchaseOfferDetails.getRentalDetails();
              // Get rental period in ISO 8601 format.
              String rentalPeriod = rentalDetails.getRentalPeriod();
              // Get rental expiration period in ISO 8601 format, if present.
              if (rentalDetails.getRentalExpirationPeriod() != null) {
                String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod();
              }
              // Get offer token
                String offerToken = oneTimePurchaseOfferDetails.getOfferToken();
              // Get the associated purchase option ID
              if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
                String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
              }
            }
          }
        }
      }
    });
  2. جریان صورتحساب را راه اندازی کنید.

    برای شروع درخواست خرید از برنامه خود، متد launchBillingFlow() را از thread اصلی برنامه خود فراخوانی کنید. این متد ارجاعی به یک شیء BillingFlowParams می‌گیرد که حاوی شیء ProductDetails مربوطه است که از فراخوانی queryProductDetailsAsync() به دست آمده است. برای ایجاد یک شیء BillingFlowParams ، از کلاس BillingFlowParams.Builder استفاده کنید. توجه داشته باشید که باید توکن پیشنهاد مربوط به پیشنهاد انتخاب شده توسط کاربر را هنگام ایجاد شیء BillingFlowParams تنظیم کنید. اگر کاربری واجد شرایط گزینه خرید اجاره باشد، پیشنهادی با RentalDetails و offerId در queryProductDetailsAsync() دریافت خواهد کرد.

    نمونه زیر نحوه راه‌اندازی جریان صورتحساب را نشان می‌دهد:

    کاتلین

    // An activity reference from which the billing flow will be launched.
    val activity : Activity = ...;
    
    val productDetailsParamsList = listOf(
        BillingFlowParams.ProductDetailsParams.newBuilder()
            // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // Get the offer token:
            // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
            // for a list of offers that are available to the user.
            // b. For subscriptions, call ProductDetails.subscriptionOfferDetails()
            // for a list of offers that are available to the user.
            .setOfferToken(selectedOfferToken)
            .build()
    )
    
    val billingFlowParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build()
    
    // Launch the billing flow
    val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

    جاوا

    // An activity reference from which the billing flow will be launched.
    Activity activity = ...;
    
    ImmutableList<ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            ProductDetailsParams.newBuilder()
                 // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
                .setProductDetails(productDetails)
                // Get the offer token:
                // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
                // for a list of offers that are available to the user.
                // b. For subscriptions, call ProductDetails.subscriptionOfferDetails()
                // for a list of offers that are available to the user.
                .setOfferToken(selectedOfferToken)
                .build()
        );
    
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(productDetailsParamsList)
        .build();
    
    // Launch the billing flow
    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

    offerToken می‌توان به عنوان بخشی از OneTimePurchaseOfferDetails یافت. هنگامی که پیشنهاد را به کاربر نشان می‌دهید، مطمئن شوید که پارامترهای جریان صورتحساب را با توکن پیشنهاد صحیح پیکربندی می‌کنید که می‌توانید از متد oneTimePurchaseOfferDetails.getOfferToken() دریافت کنید.

پیشنهاد پیش‌سفارش

پیش‌سفارش به شما امکان می‌دهد محصولاتی را تنظیم کنید که فقط یک بار قبل از انتشار محصول خریداری شوند. وقتی کاربری محصول شما را پیش‌سفارش می‌دهد، موافقت می‌کند که هنگام انتشار محصول، هزینه آن را پرداخت کند، مگر اینکه کاربر پیش‌سفارش را قبل از تاریخ انتشار لغو کند. در تاریخ انتشار، هزینه از خریدار کسر می‌شود و Play از طریق ایمیل به او اطلاع می‌دهد که محصول منتشر شده است.

این سند مراحل ادغام پیشنهاد خرید پیش‌سفارش با کتابخانه پرداخت Play (PBL) را شرح می‌دهد.

پیشنهاد پیش‌سفارش را با PBL ادغام کنید

این بخش نحوه ادغام پیشنهاد پیش‌سفارش با کتابخانه پرداخت Play (PBL) را شرح می‌دهد. فرض بر این است که شما با مراحل اولیه ادغام PBL مانند اضافه کردن وابستگی PBL به برنامه خود ، مقداردهی اولیه BillingClient و اتصال به Google Play آشنا هستید. این بخش بر جنبه‌های ادغام PBL که مختص پیشنهاد پیش‌سفارش هستند، تمرکز دارد.

برای پیشنهاد پیش‌سفارش، جریان خرید را راه‌اندازی کنید

برای شروع فرآیند خرید برای پیشنهاد پیش‌سفارش، مراحل زیر را انجام دهید:

  1. با استفاده از متد ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() ، فراداده‌های پیشنهاد پیش‌سفارش را دریافت کنید. نمونه زیر نحوه دریافت فراداده‌های پیشنهاد پیش‌سفارش را نشان می‌دهد:

    جاوا

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // Checks if the offer is a preorder offer.
            if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) {
              // process the returned PreorderDetails
              OneTimePurchaseOfferDetails.PreorderDetails preorderDetails =
                  oneTimePurchaseOfferDetails.getPreorderDetails();
              // Get preorder release time in millis.
              long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis();
              // Get preorder presale end time in millis.
              long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis();
              // Get offer ID
                String offerId = oneTimePurchaseOfferDetails.getOfferId();
              // Get the associated purchase option ID
              if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
                String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
              }
            }
          }
        }
      }
    });

  2. جریان صورتحساب را راه اندازی کنید.

    برای شروع درخواست خرید از برنامه خود، متد launchBillingFlow() را از thread اصلی برنامه خود فراخوانی کنید. این متد ارجاعی به یک شیء BillingFlowParams می‌گیرد که حاوی شیء ProductDetails مربوطه است که از فراخوانی queryProductDetailsAsync() به دست آمده است. برای ایجاد یک شیء BillingFlowParams ، از BillingFlowParams.Builder class استفاده کنید. توجه داشته باشید که باید توکن پیشنهاد مربوط به پیشنهاد انتخاب شده توسط کاربر را هنگام ایجاد شیء BillingFlowParams تنظیم کنید. اگر کاربری واجد شرایط پیشنهاد پیش‌سفارش باشد، پیشنهادی با PreorderDetails و offerId در متد queryProductDetailsAsync() دریافت خواهد کرد.

    نمونه زیر نحوه راه‌اندازی جریان صورتحساب را نشان می‌دهد:

    جاوا

    // An activity reference from which the billing flow will launch.
    Activity activity = ...;
    ImmutableList productDetailsParamsList =
        ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() for a list of offers
            // that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();
    // Launch the billing flow
    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

    offerToken می‌توان به عنوان بخشی از OneTimePurchaseOfferDetails یافت. هنگامی که پیشنهاد را به کاربر نشان می‌دهید، مطمئن شوید که پارامترهای جریان صورتحساب را با توکن پیشنهاد صحیح پیکربندی می‌کنید که می‌توانید از متد oneTimePurchaseOfferDetails.getOfferToken() دریافت کنید.

پیشنهاد تخفیف

این بخش نحوه پیکربندی پیشنهادات تخفیف برای محصولات یکبار مصرف شما را شرح می‌دهد.

چهار پارامتر مختلف وجود دارد که می‌توانید در یک پیشنهاد تخفیف یک‌باره برای محصول پیکربندی کنید:

  • قیمت پیشنهادی با تخفیف: جزئیات مربوط به درصد تخفیف یا قیمت مطلق تخفیف نسبت به قیمت اصلی را مشخص می‌کند.

  • واجد شرایط بودن کشورها یا مناطق: در دسترس بودن پیشنهادات محصول یک‌بار مصرف در یک کشور یا یک منطقه را مشخص می‌کند.

  • محدودیت خرید (اختیاری): به شما امکان می‌دهد تعیین کنید که یک کاربر چند بار می‌تواند از یک پیشنهاد استفاده کند. اگر کاربری از محدودیت خرید تجاوز کند، واجد شرایط دریافت پیشنهاد نخواهد بود.

  • مدت زمان محدود (اختیاری): مدت زمانی را که پیشنهاد در دسترس است مشخص می‌کند. خارج از این مدت زمان، پیشنهاد قابل خرید نیست.

اطلاعات قیمت پیشنهادی تخفیف‌دار را بازیابی کنید

برای یک پیشنهاد تخفیف‌دار، می‌توانید درصد تخفیف یا تخفیف مطلق ارائه شده را بازیابی کنید.

مثال ۱: درصد تخفیف پیشنهاد تخفیف‌دار را بازیابی کنید

نمونه زیر نحوه دریافت قیمت کامل اصلی پیشنهاد تخفیف‌دار و درصد تخفیف آن را نشان می‌دهد. توجه داشته باشید که اطلاعات درصد تخفیف فقط برای پیشنهادهای تخفیف‌دار نمایش داده می‌شود.

جاوا

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult){
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and percentageDiscount.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long percentageDiscount =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getPercentageDiscount();
            }
            // …
          }
        }
      }
    });
    
مثال ۲: دریافت تخفیف مطلق پیشنهاد تخفیف‌دار

مثال زیر نحوه دریافت قیمت کامل اصلی پیشنهاد تخفیف‌دار و تخفیف مطلق آن بر حسب میکرو را نشان می‌دهد. توجه داشته باشید که اطلاعات تخفیف مطلق بر حسب میکرو فقط برای پیشنهادهای تخفیف‌دار برگردانده می‌شود. برای پیشنهاد تخفیف باید تخفیف مطلق یا تخفیف درصدی مشخص شود.

جاوا

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and absolute DiscountAmountMicros.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long discountAmountMicros =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getDiscountAmount()
                      .getDiscountAmountMicros();
            }
            // …
          }
        }
      }
    });
    

بازه زمانی معتبر یک پیشنهاد را دریافت کنید

شما می‌توانید از متد OneTimePurchaseOfferDetails.getValidTimeWindow() برای دریافت پنجره زمانی معتبر برای یک پیشنهاد استفاده کنید. این شیء شامل زمان شروع و پایان پنجره زمانی بر حسب میلی‌ثانیه است.

مثال زیر نحوه دریافت بازه زمانی معتبر یک پیشنهاد را نشان می‌دهد:

جاوا

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getValidTimeWindow() != null) {
              // process the returned startTimeMillis and endTimeMillis.
              ValidTimeWindow validTimeWindow =
                  oneTimePurchaseOfferDetails.getValidTimeWindow();
              long startTimeMillis = validTimeWindow.getStartTimeMillis();
              long endTimeMillis = validTimeWindow.getEndTimeMillis();
              // …
            }
          }
        }
      }
    });
    

تعداد محدود در سطح پیشنهاد تخفیف

شما می‌توانید حداکثر محدودیت تعداد را در سطح پیشنهاد تخفیف مشخص کنید، که فقط در همان سطح پیشنهاد اعمال می‌شود. در اینجا یک مثال برای روشن شدن موضوع آورده شده است:

  1. سوپر اسکرین‌سیورز دو پیشنهاد برای محصول اسکرین‌سیور دارد: گزینه خرید اسکرین‌سیور و اسکرین‌سیور تخفیف‌دار.
    1. محافظ صفحه نمایش گزینه خرید، محدودیت تعداد ندارد.
    2. محافظ صفحه نمایش تخفیف، حداکثر تعداد مجاز برای سطح پیشنهاد را روی ۳ تنظیم کرده است.
  2. محصول محافظ صفحه نمایش حداکثر تعداد مجاز در سطح محصول را ندارد، بنابراین کاربران می‌توانند تعداد نامحدودی از این محصول را خریداری کنند.
  3. کاربر یک محافظ صفحه نمایش تخفیف‌دار دارد و قصد دارد با استفاده از این محافظ صفحه نمایش تخفیف‌دار، یکی دیگر نیز خریداری کند.
  4. هنگام بازیابی پیشنهادهای موجود، مقدار LimitedQuantityInfo برای محافظ صفحه نمایش گزینه خرید تهی است و مقدار تعداد باقیمانده برای محافظ صفحه نمایش تخفیف ۲ است.

مثال زیر نحوه دریافت تعداد محدود در سطح پیشنهاد تخفیف را نشان می‌دهد:

جاوا

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getLimitedQuantityInfo() != null) {
              // process the returned maximumQuantity and remainingQuantity.
              LimitedQuantityInfo limitedQuantityInfo =
                  oneTimePurchaseOfferDetails.getLimitedQuantityInfo();
              int maximumQuantity = limitedQuantityInfo.getMaximumQuantity();
              int remainingQuantity = limitedQuantityInfo.getRemainingQuantity();
              // …
            }
          }
        }
      }
    });
    

وقتی کاربران حداکثر تعداد بازخرید برای یک پیشنهاد را استفاده کنند، پیشنهاد توسط متد getOneTimePurchaseOfferDetailsList() بازگردانده نمی‌شود.

محاسبه سقف بازخرید

مثال زیر نحوه دریافت اطلاعات مربوط به محدودیت تعداد در یک پیشنهاد تخفیف خاص را نشان می‌دهد. شما می‌توانید حداکثر تعداد مجاز و مقدار باقیمانده برای کاربر فعلی را دریافت کنید. توجه داشته باشید که ویژگی محدودیت تعداد برای هر دو پیشنهاد محصولات مصرفی و غیر مصرفی یکبار مصرف قابل استفاده است. این ویژگی فقط در سطح پیشنهاد پشتیبانی می‌شود.

گوگل پلی تعداد باقیمانده را با کم کردن تعداد متعلق به کاربر از حداکثر تعداد مجاز تعیین‌شده توسط شما محاسبه می‌کند. هنگام شمارش تعداد متعلق به کاربر، گوگل پلی خریدهای مصرف‌شده یا خریدهای در انتظار را در نظر می‌گیرد. خریدهایی که لغو، بازپرداخت یا وجه آنها برگشت داده شده است، جزو تعداد متعلق به کاربر محسوب نمی‌شوند. برای مثال:

  1. محافظ صفحه نمایش‌های فوق‌العاده، یک پیشنهاد تخفیف با حداکثر تعداد مجاز یک عدد ارائه می‌دهند، بنابراین کاربران می‌توانند تا یک محافظ صفحه نمایش تخفیف‌دار خریداری کنند.

  2. کاربر یکی از محافظ صفحه نمایش‌های تخفیف‌دار را خریداری می‌کند. اگر کاربر سپس سعی کند محافظ صفحه نمایش دوم تخفیف‌دار را خریداری کند، خطا می‌دهد و PurchasesUpdatedListener کد پاسخ ITEM_UNAVAILABLE را دریافت می‌کند.

  3. کاربر درخواست بازپرداخت مبلغ خرید اولیه‌ی محافظ صفحه نمایش تخفیف‌دار را می‌دهد و با موفقیت مبلغ بازپرداخت را دریافت می‌کند. کاربر سعی می‌کند یکی از محافظ صفحه نمایش‌های تخفیف‌دار را خریداری کند و خرید با موفقیت انجام می‌شود.

واجد شرایط بودن کشور و منطقه

شما می‌توانید کشورها یا مناطقی را انتخاب کنید که در آنها پیشنهاد گزینه خرید یا پیشنهاد تخفیف برای کاربران در دسترس باشد. گوگل پلی واجد شرایط بودن کاربر را بر اساس کشور پلی ارزیابی می‌کند. هنگامی که در دسترس بودن منطقه‌ای یک پیشنهاد را پیکربندی می‌کنید، فقط در صورتی که کاربر در کشور یا منطقه مورد نظر باشد، به عنوان بخشی از getOneTimePurchaseOfferDetailsList() بازگردانده می‌شود، در غیر این صورت، بخشی از لیست پیشنهادهایی که هنگام فراخوانی queryProductDetailsAsync() برگردانده می‌شوند، نخواهد بود.

برچسب‌های پیشنهاد

نمونه زیر نحوه بازیابی برچسب‌های پیشنهاد مرتبط با یک پیشنهاد را نشان می‌دهد.

جاوا

    
billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // process the returned offer tags.
            ImmutableList<String> offerTags =
                oneTimePurchaseOfferDetails.getOfferTagsList();
            // …
          }
        }
      }
    });
    
    

وراثت برچسب‌های پیشنهاد

شما می‌توانید برچسب‌های پیشنهاد را برای هر یک از محصولات، گزینه‌های خرید یا پیشنهاد تخفیف تنظیم کنید. پیشنهادهای تخفیف، برچسب‌های پیشنهاد را از پیشنهاد گزینه خرید خود به ارث می‌برند. به طور مشابه، اگر برچسب‌های پیشنهاد در سطح محصول مشخص شده باشند، هم پیشنهاد گزینه خرید و هم پیشنهادهای تخفیف، برچسب‌های پیشنهاد محصول را به ارث می‌برند.

برای مثال، فروشگاه Super screensavers دو پیشنهاد برای محصول محافظ صفحه نمایش دارد؛ گزینه خرید محافظ صفحه نمایش و محافظ صفحه نمایش تخفیف‌دار.

  • محافظ صفحه نمایش فوق العاده دارای برچسب پیشنهاد محصول SSProductTag است.
  • محافظ صفحه نمایش گزینه خرید دارای برچسب پیشنهاد SSPurchaseOptionTag است.
  • محافظ صفحه نمایش تخفیف دارای برچسب پیشنهاد SSDiscountOfferTag است.

در این مثال، متد oneTimePurchaseOfferDetails.getOfferTagsList() برای پیشنهاد گزینه خرید SSProductTag و SSPurchaseOptionTag را برمی‌گرداند. برای پیشنهاد تخفیف، این متد SSProductTag ، SSPurchaseOptionTag و SSDiscountOfferTag را برمی‌گرداند.