راهنمای ادغام درون برنامه ای برای برنامه پیشنهادات خارجی

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

راه‌اندازی کتابخانه پرداخت بازی

برای استفاده از APIهای پیشنهادات خارجی، نسخه ۸.۲ یا بالاتر از وابستگی Play Billing Library را به برنامه اندروید خود اضافه کنید . اگر نیاز به مهاجرت از نسخه قبلی دارید، قبل از تلاش برای پیاده‌سازی پیشنهادات خارجی، دستورالعمل‌های موجود در راهنمای مهاجرت را دنبال کنید.

اتصال به گوگل پلی

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

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

کاتلین

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

جاوا

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

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

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

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

این API در صورت وجود پیشنهادهای خارجی 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.
      }
  });

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

برای گزارش یک تراکنش خارجی به گوگل پلی، باید یک توکن تراکنش خارجی از کتابخانه صورتحساب پلی ایجاد کنید. می‌توانید این توکن را با فراخوانی 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.
      }
});

به عنوان یک روش جایگزین، می‌توانید تابع suspend به نام createBillingProgramReportingDetailsAsync با افزونه‌های کاتلین کوئری کنید تا نیازی به تعریف شنونده (listener) نداشته باشید:

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

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

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

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

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

کاتلین


// An activity reference from which the external offers flow will be launched.
val 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 {
      override fun 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)

جاوا


// 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 را ارائه دهد.

گزارش تراکنش‌ها به گوگل پلی

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

مدیریت پاسخ

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

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

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

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

مراحل بعدی

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