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

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

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

پیش نیازها

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

جزئیات محصول را جویا شوید

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

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

برای شروع درخواست خرید از برنامه خود، متد launchBillingFlow() را از رشته اصلی برنامه خود فراخوانی کنید. این روش به یک شی 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 &quot;productDetails&quot; 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() دریافت کنید، پیکربندی کنید.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

برای پیکربندی محصولات موجود برای اجاره، باید از سرویس جدید monetization.onetimeproducts از Play Developer API یا رابط کاربری Play Developer Console استفاده کنید. برای استفاده از این سرویس، می‌توانید مستقیماً با 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() را از رشته اصلی برنامه خود فراخوانی کنید. این روش به یک شی 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() را از رشته اصلی برنامه خود فراخوانی کنید. این متد به یک شی 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() دریافت کنید، پیکربندی کنید.

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

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

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

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

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

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

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

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

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

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

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

جاوا

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();
            }
            // …
          }
        }
      }
    });
    
مثال 2: تخفیف مطلق پیشنهاد با تخفیف را بازیابی کنید

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

جاوا

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. محافظ صفحه نمایش فوق العاده 2 پیشنهاد برای محصول محافظ صفحه دارد: گزینه خرید محافظ صفحه نمایش و محافظ صفحه نمایش تخفیف.
    1. محافظ صفحه نمایش گزینه خرید تعداد محدودی تنظیم نشده است.
    2. محافظ صفحه نمایش تخفیف دارای حداکثر مقدار مجاز سطح پیشنهاد روی 3 است.
  2. محصول محافظ صفحه نمایش دارای حداکثر مقدار مجاز در سطح محصول نیست، بنابراین کاربران می توانند تعداد نامحدودی از این محصول را خریداری کنند.
  3. کاربر دارای 1 محافظ صفحه نمایش تخفیفی است و قصد دارد یکی دیگر را با محافظ صفحه نمایش تخفیف خریداری کند.
  4. هنگام بازیابی پیشنهادات موجود، LimitedQuantityInfo برای محافظ صفحه گزینه خرید پوچ است و مقدار مقدار باقیمانده برای محافظ صفحه نمایش تخفیف 2 است.

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

جاوا

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() برگردانده نمی شود.

حد بازخرید را محاسبه کنید

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

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

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

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

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

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

می‌توانید کشورها یا مناطقی را انتخاب کنید که پیشنهاد خرید یا پیشنهاد تخفیف برای کاربران در دسترس باشد. Google Play واجد شرایط بودن کاربر را بر اساس کشور Play ارزیابی خواهد کرد. هنگامی که در دسترس بودن منطقه‌ای را برای یک پیشنهاد پیکربندی می‌کنید، اگر کاربر در یک کشور یا منطقه مورد نظر باشد، فقط به عنوان بخشی از 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 را برمی‌گرداند.