راهنمایی یکپارچه‌سازی درون‌برنامه‌ای برای برنامه پیشنهادهای خارجی

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

راه‌اندازی «کتابخانه خدمات صورت‌حساب Play»

برای استفاده از «میاناهای برنامه‌سازی کاربردی پیشنهادهای خارجی»، وابستگی «کتابخانه خدمات صورت‌حساب Play» نسخه ۸.۲.۱ یا بالاتر را به برنامه Android خود اضافه کنید. اگر نیاز دارید از نسخه قدیمی‌تری انتقال دهید، قبل‌از اینکه بخواهید پیشنهادهای خارجی را پیاده‌سازی کنید، دستورالعمل‌های راهنمای انتقال را دنبال کنید.

اتصال به Google Play

اولین مراحل در فرایند یکپارچه‌سازی همان مراحلی است که در راهنمای یکپارچه‌سازی صورت‌حساب توضیح داده شده است، با این تفاوت که باید enableBillingProgram را فراخوانی کنید تا نشان دهید می‌خواهید از پیشنهادهای ویژه خارجی هنگام مقداردهی اولیه BillingClient استفاده کنید:

مثال زیر مقداردهی اولیه BillingClient را با این اصلاحات نشان می‌دهد:

کاتلین

val billingClient = BillingClient.newBuilder(context)
    .enableBillingProgram(
        EnableBillingProgramParams.newBuilder()
            .setBillingProgram(BillingProgram.EXTERNAL_OFFER)
            .build()
    )
    .build()

جاوا

private BillingClient billingClient = BillingClient.newBuilder(context)
    .enableBillingProgram(BillingProgram.EXTERNAL_OFFER)
    .build();

پس‌از مقداردهی اولیه BillingClient، باید همان‌طور که در راهنمای یکپارچه‌سازی توضیح داده شده است، اتصالی به Google Play برقرار کنید.

بررسی دردسترس بودن

برای تأیید اینکه پیشنهادهای ویژه خارجی برای کاربر فعلی دردسترس است، با isBillingProgramAvailableAsync تماس بگیرید.

اگر پیشنهادهای ویژه خارجی دردسترس باشد، این «میانای برنامه‌سازی کاربردی» مقدار BillingResponseCode.OK را برمی‌گرداند. برای جزئیات مربوط به نحوه پاسخ برنامه شما به کدهای پاسخ دیگر، به مدیریت پاسخ مراجعه کنید.

کاتلین

billingClient.isBillingProgramAvailableAsync(
    BillingProgram.EXTERNAL_OFFER,
    object : BillingProgramAvailabilityListener {
        override fun onBillingProgramAvailabilityResponse(
            billingResult: BillingResult,
            billingProgramAvailabilityDetails: BillingProgramAvailabilityDetails
        ) {
            if (billingResult.responseCode != BillingResponseCode.OK) {
                // Handle failures such as retrying due to network errors,
                // handling external offers unavailable, etc.
                return
            }

            // External offers are available. Continue with steps in the
            // guide.
        }
    }
)

جاوا


billingClient.isBillingProgramAvailableAsync(
  BillingProgram.EXTERNAL_OFFER,
  new BillingProgramAvailabilityListener() {
    @Override
    public void onBillingProgramAvailabilityResponse(
      BillingResult billingResult,
      BillingProgramAvailabilityDetails billingProgramAvailabilityDetails) {
        if (billingResult.getResponseCode() != BillingResponseCode.OK) {
            // Handle failures such as retrying due to network errors,
            // handling external offers being unavailable, etc.
            return;
        }
        // External offers are available. Continue with steps in the
        // guide.
      }
  });

آماده کردن کد تراکنش خارجی

برای گزارش کردن تراکنش خارجی به Google Play، باید یک رمز تراکنش خارجی داشته باشید که از «کتابخانه خدمات صورت‌حساب Play» تولید شده باشد. می‌توانید این رمز را با فراخواندن createBillingProgramReportingDetailsAsync API دریافت کنید. برای هر پیشنهاد ویژه خارجی، باید بلافاصله قبل‌از هدایت کاربر به خارج از برنامه، رمز جدیدی تولید شود. نشان‌ها نباید در تراکنش‌ها ذخیره شوند.

کاتلین

val params =
    BillingProgramReportingDetailsParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_OFFER)
        .build()

billingClient.createBillingProgramReportingDetailsAsync(
    params,
    object : BillingProgramReportingDetailsListener {
        override fun onCreateBillingProgramReportingDetailsResponse(
            billingResult: BillingResult,
            billingProgramReportingDetails: BillingProgramReportingDetails?
        ) {
            if (billingResult.responseCode != BillingResponseCode.OK) {
                // Handle failures such as retrying due to network errors.
                return
            }
            val externalTransactionToken =
                billingProgramReportingDetails?.externalTransactionToken
            // Persist the transaction token in your backend. You may pass it
            // to the external website when calling the launchExternalLink API.
        }
    }
)

جاوا

BillingProgramReportingDetailsParams params =
  BillingProgramReportingDetailsParams.newBuilder()
    .setBillingProgram(BillingProgram.EXTERNAL_OFFER)
    .build();

billingClient.createBillingProgramReportingDetailsAsync(
  params,
  new BillingProgramReportingDetailsListener() {
    @Override
    public void onCreateBillingProgramReportingDetailsResponse(
      BillingResult billingResult,
      @Nullable BillingProgramReportingDetails
        billingProgramReportingDetails) {
        if (billingResult.getResponseCode() != BillingResponseCode.OK) {
            // Handle failures such as retrying due to network errors.
            return;
        }

        String transactionToken =
          billingProgramReportingDetails.getExternalTransactionToken();
        // Persist the transaction token in your backend. You may pass it
        // to the external website when calling the launchExternalLink API.
      }
});

یا می‌توانید تابع تعلیق را با افزونه‌های Kotlin createBillingProgramReportingDetailsAsync پُرسمان کنید تا نیازی به تعریف شنود نداشته باشید:

val createBillingProgramReportingDetailsResult =
    withContext(coroutineContext) {
        billingClient
            .createBillingProgramReportingDetails(params)
    }
// Process the result

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

برای شروع جریان پیشنهاد خارجی، برنامه واجدشرایط شما باید میانای برنامه‌سازی کاربردی launchExternalLink() را از رشته اصلی برنامه‌تان فراخوانی کند. این API ورودی شیء LaunchExternalLinkParams را می‌گیرد. برای ایجاد شیء LaunchExternalLinkParams، از کلاس LaunchExternalLinkParams.Builder استفاده کنید. این کلاس شامل پارامترهای زیر است:

  • linkUri - پیوند به وب‌سایت خارجی که محتوای دیجیتال یا بارگیری برنامه در آن ارائه می‌شود. برای بارگیری‌های برنامه، این پیوند باید در «کنسول توسعه‌دهنده Play» ثبت و تأیید شود.
  • linkType - نوع محتوایی که به کاربر پیشنهاد می‌شود.
  • launchMode - مشخص می‌کند که پیوند چگونه راه‌اندازی شود. برای بارگیری‌های برنامه، باید این تنظیم را روی LAUNCH_IN_EXTERNAL_BROWSER_OR_APP قرار دهید.
  • billingProgram - این را روی BillingProgram.EXTERNAL_OFFER تنظیم کنید.

وقتی با launchExternalLink() تماس می‌گیرید، ممکن است براساس تنظیمات کاربر، کادرهای گفتگوی اطلاعات اضافی به کاربر نشان دهد. بسته به پارامتر launchMode، Play یا نشانی وب پیوند را در مرورگر خارجی راه‌اندازی می‌کند یا جریان را به برنامه شما برمی‌گرداند تا نشانی وب را راه‌اندازی کند. در اکثر موارد، می‌توانید از حالت LAUNCH_IN_EXTERNAL_BROWSER_OR_APP استفاده کنید که در آن Play نشانی وب را برایتان راه‌اندازی می‌کند. اگر می‌خواهید رفتار سفارشی‌تری داشته باشید، مثلاً نشانی وب را در نمای وب راه‌اندازی کنید یا نشانی وب را در مرورگر خاصی باز کنید، می‌توانید از حالت CALLER_WILL_LAUNCH_LINK استفاده کنید. برای محافظت از حریم خصوصی کاربر، مطمئن شوید که هیچ اطلاعات شناسایی شخصی (PII) در نشانی وب منتقل نمی‌شود.

کاتلین

// An activity reference from which the external offers flow will be launched.
val activity = this.activity

val params =
    LaunchExternalLinkParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_OFFER)
        // You can pass along the external transaction token from
        // BillingProgramReportingDetails as a URL parameter in the URI
        .setLinkUri(yourLinkUri)
        .setLinkType(LaunchExternalLinkParams.LinkType.LINK_TO_APP_DOWNLOAD)
        .setLaunchMode(
            LaunchExternalLinkParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP
        )
        .build()

val listener: LaunchExternalLinkResponseListener =
    LaunchExternalLinkResponseListener { billingResult ->
        if (billingResult.responseCode == BillingResponseCode.OK) {
            // Proceed with the rest of the external offer flow. If the user
            // purchases an item, be sure to report the transaction to Google Play.
        } else {
            // Handle failures such as retrying due to network errors.
        }
    }

billingClient.launchExternalLink(activity, params, listener)

جاوا


// An activity reference from which the external offers flow will be launched.
Activity activity = ...;

LaunchExternalLinkParams params = LaunchExternalLinkParams.newBuilder()
  .setBillingProgram(BillingProgram.EXTERNAL_OFFER)
  // You can pass along the external transaction token from  
  // BillingProgramReportingDetails as a URL parameter in the URI
  .setLinkUri(yourLinkUri)
  .setLinkType(LaunchExternalLinkParams.LinkType.LINK_TO_APP_DOWNLOAD)
  .setLaunchMode(
    LaunchExternalLinkParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
  .build();

LaunchExternalLinkResponseListener listener =
  new LaunchExternalLinkResponseListener() {
    @Override
    public void onLaunchExternalLinkResponse(BillingResult billingResult) {
      if (billingResult.responseCode == BillingResponseCode.OK) {
        // Proceed with the rest of the external offer flow. If the user
        // purchases an item, be sure to report the transaction to Google
        // Play.
      } else {
        // Handle failures such as retrying due to network errors.
      }
    }
  }

billingClient.launchExternalLink(activity, params, listener);

اگر LaunchMode را روی CALLER_WILL_LAUNCH_LINK تنظیم کنید، فقط درصورتی باید کاربر را به خارج از برنامه هدایت کنید که onLaunchExternalLinkResponse BillingResponseCode.OK را ارائه دهد.

گزارش تراکنش‌ها به Google Play

باید همه تراکنش‌های خارجی را با فراخوانی Google Play Developer API از زیرینه خود به Google Play گزارش دهید. وقتی تراکنشی را گزارش می‌کنید، باید externalTransactionToken را که از createBillingProgramReportingDetailsAsync API دریافت کرده‌اید ارائه دهید. اگر کاربری چندین خرید انجام دهد، می‌توانید از همان externalTransactionToken برای گزارش هر خرید استفاده کنید. برای آشنایی با نحوه گزارش کردن تراکنش، راهنمای یکپارچه‌سازی زیرینه را ببینید.

اداره کردن پاسخ

وقتی خطایی رخ می‌دهد، ممکن است روش‌های isBillingProgramAvailableAsync()، createBillingProgramReportingDetailsAsync()، و launchExternalLink() پاسخ‌هایی غیر از BillingResponseCode.OK برگردانند. این کدهای پاسخ را به این روش مدیریت کنید:

  • ‫ERROR: این خطای داخلی است. تراکنش یا باز کردن وب‌سایت خارجی را ادامه ندهید. دفعه بعد که تلاش کردید کاربر را به خارج از برنامه هدایت کنید، با فراخوانی launchExternalLink() دوباره امتحان کنید تا کادر گفتگوی اطلاعات به کاربر نمایش داده شود.
  • FEATURE_NOT_SUPPORTED: «میاناهای برنامه‌سازی کاربردی پیشنهادهای ویژه خارجی» در «فروشگاه Play» در دستگاه فعلی پشتیبانی نمی‌شود. تراکنش یا باز کردن وب‌سایت خارجی را ادامه ندهید.
  • ‫USER_CANCELED: باز کردن وب‌سایت خارجی ادامه پیدا نمی‌کند. برای نمایش کادر گفتگوی اطلاعات به کاربر در تلاش بعدی‌تان برای هدایت کاربر به خارج از برنامه، launchExternalLink() دوباره تماس بگیرید.
  • BILLING_UNAVAILABLE: تراکنش برای پیشنهادهای خارجی واجدشرایط نیست و بنابراین نباید تحت این برنامه ادامه یابد. این امر یا به این دلیل است که کاربر در کشور واجدشرایط برای این برنامه نیست یا حساب شما باموفقیت در این برنامه ثبت نشده است. اگر مورد دوم است، وضعیت ثبت‌نام خود را در «کنسول توسعه‌دهندگان Play» بررسی کنید.
  • ‫DEVELOPER_ERROR: خطایی در درخواست وجود دارد. قبل‌از ادامه دادن، از پیام اشکال‌زدایی برای شناسایی و اصلاح خطا استفاده کنید.
  • ‫NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: این خطاها گذرا هستند و باید با خط‌مشی مناسبی برای تلاش مجدد مدیریت شوند. در مورد SERVICE_DISCONNECTED، قبل‌از تلاش مجدد، اتصال با Google Play را دوباره برقرار کنید.

آزمایش پیشنهادهای ویژه خارجی

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

مراحل بعدی

پس‌از تکمیل ادغام درون‌برنامه‌ای، آماده ادغام زیرینه خود هستید.