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

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

إعداد Play Billing Library

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

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

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

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

Kotlin

val billingClient = BillingClient.newBuilder(context)
    .enableBillingProgram(
        EnableBillingProgramParams.newBuilder()
            .setBillingProgram(BillingProgram.EXTERNAL_OFFER)
            .build()
    )
    .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(coroutineContext) {
        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 نيابةً عنك. إذا أردت الحصول على سلوك أكثر تخصيصًا، مثل فتح معرّف URI في عرض ويب أو فتحه في متصفّح معيّن، يمكنك استخدام الوضع CALLER_WILL_LAUNCH_LINK. لحماية خصوصية المستخدم، تأكَّد من عدم تمرير أي معلومات تكشف الهوية الشخصية في معرّف URI.

Kotlin

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

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 Console.
  • DEVELOPER_ERROR: هناك خطأ في الطلب. استخدِم رسالة تصحيح الأخطاء لتحديد الخطأ وتصحيحه قبل المتابعة.
  • NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: هذه أخطاء مؤقتة يجب معالجتها باستخدام سياسة مناسبة لإعادة المحاولة. في حال حدوث SERVICE_DISCONNECTED، أعِد إنشاء اتصال بخدمة Google Play قبل إعادة المحاولة.

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

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

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

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