إرشادات الدمج داخل التطبيق لبرنامج العروض الخارجية

يوضّح هذا الدليل كيفية الدمج مع واجهات برمجة التطبيقات لإتاحة العروض الترويجية الخارجية في التطبيقات والمناطق المؤهَّلة. لمزيد من المعلومات حول برنامج العروض الترويجية الخارجية، بما في ذلك متطلبات الأهلية والنطاق الجغرافي، يُرجى الاطّلاع على متطلبات البرنامج.

إعداد Play Billing Library

لاستخدام واجهات برمجة التطبيقات للعروض الترويجية الخارجية، يجب إضافة الإصدار 8.2 أو إصدار أحدث من تبعية Play Billing Library إلى تطبيق Android. وإذا كنت بحاجة إلى نقل البيانات من إصدار أقدم، اتّبِع التعليمات الواردة في دليل نقل البيانات قبل محاولة تنفيذ العروض الترويجية الخارجية.

الربط بخدمة Google Play

تتشابه الخطوات الأولى في عملية الدمج مع الخطوات الموضّحة في دليل دمج نظام الفوترة، باستثناء أنّه عليك استدعاء enableBillingProgram للإشارة إلى أنّك تريد استخدام عروض ترويجية خارجية عند تهيئة BillingClient:

يوضّح المثال التالي كيفية تهيئة BillingClient مع هذه التعديلات:

Kotlin

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

Java

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

بعد إعداد BillingClient، عليك إنشاء اتصال بخدمة Google Play كما هو موضّح في دليل الدمج.

التحقّق من مدى التوفّر

للتأكّد من توفّر العروض الترويجية الخارجية للمستخدم الحالي، اتّصِل بالدالة isBillingProgramAvailableAsync.

تعرض واجهة برمجة التطبيقات هذه القيمة BillingResponseCode.OK إذا كانت العروض الترويجية الخارجية متاحة. اطّلِع على معالجة الاستجابة لمعرفة تفاصيل حول كيفية استجابة تطبيقك لرموز الاستجابة الأخرى.

Kotlin


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.
      }
  })

Java


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 Billing Library. يمكنك الحصول على هذا الرمز المميّز من خلال طلب بيانات من واجهة برمجة التطبيقات createBillingProgramReportingDetailsAsync. يجب إنشاء رمز مميّز جديد قبل توجيه المستخدم إلى خارج التطبيق مباشرةً لكل عرض ترويجي خارجي. يجب عدم تخزين الرموز المميزة مؤقتًا على مستوى المعاملات.

Kotlin

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.
    }
})

Java

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.
      }
});

بدلاً من ذلك، يمكنك طلب البحث عن الدالة المعلقة createBillingProgramReportingDetailsAsync باستخدام إضافات Kotlin حتى لا تحتاج إلى تحديد أداة معالجة:

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

بدء عملية العرض الترويجي الخارجي

لبدء مسار العرض الترويجي الخارجي، يجب أن يستدعي تطبيقك المؤهَّل واجهة برمجة التطبيقات launchExternalLink() من سلسلة التعليمات البرمجية الرئيسية في تطبيقك. تتلقّى واجهة برمجة التطبيقات هذه إدخالاً على شكل عنصر LaunchExternalLinkParams. لإنشاء كائن LaunchExternalLinkParams، استخدِم الفئة LaunchExternalLinkParams.Builder. يحتوي هذا الصف على المَعلمات التالية:

  • linkUri: الرابط المؤدي إلى الموقع الإلكتروني الخارجي الذي يتم فيه عرض المحتوى الرقمي أو تنزيل التطبيق بالنسبة إلى عمليات تنزيل التطبيقات، يجب تسجيل هذا الرابط والموافقة عليه في Play Console.
  • 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 في عرض ويب أو فتحه في متصفّح معيّن، يمكنك استخدام الوضع CALLER_WILL_LAUNCH_LINK. لحماية خصوصية المستخدم، تأكَّد من عدم تمرير أي معلومات تحديد هوية شخصية في معرّف الموارد الموحّد (URI).

Kotlin


// 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)

Java


// 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 بجميع المعاملات الخارجية من خلال طلب Google Play Developer API من الخلفية. عند الإبلاغ عن معاملة، يجب تقديم externalTransactionToken تم الحصول عليه من واجهة برمجة التطبيقات createBillingProgramReportingDetailsAsync. إذا أجرى المستخدم عمليات شراء متعددة، يمكنك استخدام externalTransactionToken نفسه للإبلاغ عن كل عملية شراء. لمعرفة كيفية الإبلاغ عن معاملة، يُرجى الاطّلاع على دليل الدمج في الخلفية.

التعامل مع الردود

عند حدوث خطأ، قد تعرض الطرق isBillingProgramAvailableAsync() وcreateBillingProgramReportingDetailsAsync() وlaunchExternalLink() ردودًا غير BillingResponseCode.OK. ننصحك بالتعامل مع رموز الاستجابة هذه على النحو التالي:

  • ERROR: هذا خطأ داخلي. لا تُكمل المعاملة أو تفتح الموقع الإلكتروني الخارجي. أعِد المحاولة من خلال طلب launchExternalLink() لعرض مربع الحوار الخاص بالمعلومات للمستخدم في المرة التالية التي تحاول فيها توجيه المستخدم إلى خارج التطبيق.
  • FEATURE_NOT_SUPPORTED: لا تتوافق واجهات برمجة التطبيقات للعروض الترويجية الخارجية مع "متجر Play" على الجهاز الحالي. لا تُكمل المعاملة أو تفتح الموقع الإلكتروني الخارجي.
  • USER_CANCELED: لا تتابع فتح الموقع الإلكتروني الخارجي. اتّصِل بالدالة launchExternalLink() مرة أخرى لعرض مربع حوار المعلومات للمستخدم في المرة التالية التي تحاول فيها توجيه المستخدم إلى خارج التطبيق.
  • BILLING_UNAVAILABLE: المعاملة غير مؤهَّلة للاستفادة من العروض الترويجية الخارجية، وبالتالي لا يجب إكمالها ضمن هذا البرنامج. ويرجع ذلك إلى أنّ المستخدم ليس في بلد مؤهَّل لهذا البرنامج أو لم يتم تسجيل حسابك في البرنامج بنجاح. إذا كان الأمر كذلك، تحقَّق من حالة التسجيل في Play Developer Console.
  • DEVELOPER_ERROR: حدث خطأ في الطلب. استخدِم رسالة تصحيح الأخطاء لتحديد الخطأ وتصحيحه قبل المتابعة.
  • NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: هذه أخطاء مؤقتة يجب التعامل معها باستخدام سياسة مناسبة لإعادة المحاولة. في حالة SERVICE_DISCONNECTED، عليك إعادة إنشاء اتصال مع Google Play قبل إعادة المحاولة.

اختبار العروض الترويجية الخارجية

يجب استخدام مختبِري الترخيص لاختبار عملية دمج العروض الترويجية الخارجية. لن يتم إصدار فواتير لك مقابل المعاملات التي بدأتها حسابات مختبِري التراخيص. لمزيد من المعلومات حول إعداد مختبِري الترخيص، يُرجى الاطّلاع على مقالة اختبار الفوترة داخل التطبيقات من خلال ترخيص التطبيق.

الخطوات التالية

بعد الانتهاء من عملية الدمج داخل التطبيق، يمكنك دمج الخلفية.