إرشادات حول دمج الروابط المؤدية إلى المحتوى الخارجي داخل التطبيق

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

إعداد Play Billing Library

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

إعداد أداة الفوترة

لبدء استخدام خدمة الفوترة، اتّبِع الخطوات نفسها الموضّحة في بدء استخدام BillingClient مع إجراء التعديلات التالية:

  • لا تفعِّل PurchasesUpdatedListener، لأنّ هذا المستمع غير مطلوب للروابط المؤدية إلى المحتوى الخارجي.
  • استخدِم enableBillingProgram() مع BillingProgram.EXTERNAL_CONTENT_LINK للإشارة إلى أنّ تطبيقك يستخدم روابط تؤدي إلى محتوى خارجي.

يعرض المثال التالي عملية تهيئة BillingClient مع التعديلات التالية:

Kotlin

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

Java

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

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

بعد إعداد BillingClient، اربط حسابك بخدمة Google Play كما هو موضّح في مقالة الربط بخدمة Google Play.

التحقّق من أهلية المستخدم

بعد الربط بخدمة Google Play، عليك التحقّق مما إذا كان المستخدم مؤهَّلاً للمشاركة في برنامج "الروابط المؤدية إلى المحتوى الخارجي" من خلال استدعاء الطريقة isBillingProgramAvailableAsync(). تعرض هذه الطريقة القيمة BillingResponseCode.OK إذا كان المستخدم مؤهَّلاً للمشاركة في برنامج الروابط المؤدية إلى المحتوى الخارجي. يوضّح المثال التالي كيفية التحقّق من أهلية المستخدم للاستفادة من روابط المحتوى الخارجي:

Kotlin

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

        // External content links are available. Prepare an external
        // transaction token.
      }
    })

Java

billingClient.isBillingProgramAvailableAsync(
  BillingProgram.EXTERNAL_CONTENT_LINK,
  new BillingProgramAvailabilityListener() {
    @Override
    public void onBillingProgramAvailabilityResponse(
      int billingProgram, BillingResult billingResult) {
        if (billingResult.getResponseCode() != BillingResponseCode.OK) {
            // Handle failures such as retrying due to network errors,
            // handling external content links unavailable, etc.
            return;
        }

        // External content links are available. Prepare an external
        // transaction token.
      }

    });

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

إعداد رمز مميّز لمعاملة خارجية

بعد ذلك، عليك إنشاء رمز مميّز للمعاملات الخارجية من خلال Play Billing Library. يجب إنشاء رمز مميّز جديد للمعاملات الخارجية في كل مرة ينتقل فيها المستخدم إلى موقع إلكتروني خارجي من خلال واجهة برمجة التطبيقات للروابط الخارجية. ويمكن إجراء ذلك من خلال طلب createBillingProgramReportingDetailsAsync API. يجب إنشاء الرمز المميّز قبل توجيه المستخدم إلى موقع إلكتروني خارجي مباشرةً.

ملاحظة: يجب عدم تخزين الرمز المميز للمعاملة الخارجية مؤقتًا، ويجب إنشاء رمز مميز جديد في كل مرة يتم فيها توجيه المستخدم إلى موقع خارجي.

Kotlin

val params =
    BillingProgramReportingDetailsParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_CONTENT_LINK)
        .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 external transaction token locally. Pass it to the
        // external website when launchExternalLink is called.
    }
  })

Java

BillingProgramReportingDetailsParams params =
    BillingProgramReportingDetailsParams.newBuilder()
        .setBillingProgram(BillingProgram.EXTERNAL_CONTENT_LINK)
        .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 external transaction token locally. Pass it to the
        // external website when launchExternalLink is called.
      }
  });

إذا كنت تستخدم إضافات Kotlin، يمكنك استخدام إجراءات Kotlin الروتينية المتزامنة حتى لا تضطر إلى تحديد أداة معالجة منفصلة.

تشغيل الرابط الخارجي

بعد أن يصبح رمز المعاملة الخارجية جاهزًا، يمكن ربط المستخدم خارج التطبيق بعرض محتوى رقمي أو تنزيل تطبيق من خلال استدعاء طريقة launchExternalLink. قد يعرض Google Play مربّعات حوار تتضمّن معلومات إضافية للمستخدم استنادًا إلى إعدادات المستخدم عند طلب هذه الواجهة.

عند استدعاء الطريقة launchExternalLink، يجب تقديم تفاصيل الرابط الخارجي من خلال LaunchExternalLinkParams. يحتوي هذا الصف على المَعلمات التالية:

  • معرّف الموارد المنتظم (URI) للرابط: هو الرابط المؤدي إلى الموقع الإلكتروني الخارجي الذي يتم فيه عرض المحتوى الرقمي أو تنزيل التطبيق. بالنسبة إلى عمليات تنزيل التطبيقات، يجب تسجيل هذا الرابط والموافقة عليه في Play Console.
  • نوع الرابط: نوع المحتوى المقدَّم للمستخدم.
  • وضع التشغيل: يحدّد طريقة تشغيل الرابط. بالنسبة إلى عمليات تنزيل التطبيقات، يجب ضبط هذا الحقل على LAUNCH_IN_EXTERNAL_BROWSER_OR_APP.
  • برنامج الفوترة: اضبط هذا الخيار على BillingProgram.EXTERNAL_CONTENT_LINK.

Kotlin

val params =
  LaunchExternalLinkParams.newBuilder()
    .setBillingProgram(BillingProgram.EXTERNAL_CONTENT_LINK)
    .setLinkUri(Uri.parse("https://www.myapprovedsite.com"))
    .setLinkType(LaunchExternalLinkParams.LinkType.LINK_TO_APP_DOWNLOAD)
    .setLaunchMode(
      LaunchExternalLinkParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP)
    .build()

val listener : LaunchExternalLinkResponseListener =
    object : LaunchExternalLinkResponseListener {
      override fun onLaunchExternalLinkResponse(
        billingResult: BillingResult) {
        if (billingResult.responseCode !=  BillingResponseCode.OK) {
            // Handle failures such as retrying due to network errors.
            return
        }

        // If Launch Mode was set to LAUNCH_IN_EXTERNAL_BROWSER_OR_APP, the
        // user was directed outside of the app by Play. This does not give
        // any information on the user's actions during the link out, such
        // as if a transaction was completed.

        // If Launch Mode was set to CALLER_WILL_LAUNCH_LINK, then your app
        // may proceed to direct the user to the external website.
    }
}

billingClient.launchExternalLink(activity, params, listener)

Java

LaunchExternalLinkParams params =
  LaunchExternalLinkParams.newBuilder()
    .setBillingProgram(BillingProgram.EXTERNAL_CONTENT_LINK)
    .setLinkUri(Uri.parse("https://www.myapprovedsite.com"))
    .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.getResponseCode() != BillingResponseCode.OK) {
            // Handle failures such as retrying due to network errors.
            return;
        }

        // If Launch Mode was set to LAUNCH_IN_EXTERNAL_BROWSER_OR_APP, the
        // user was directed outside of the app by Play. This does not give
        // any information on the user's actions during the link out, such
        // as if a transaction was completed.

        // If Launch Mode was set to CALLER_WILL_LAUNCH_LINK, then your app
        // may proceed to direct the user to the external website.
    }
  }

billingClient.launchExternalLink(activity, params, listener);

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

عند حدوث خطأ، قد تقدّم الطرق isBillingProgramAvailableAsync() وcreateBillingProgramReportingDetailsAsync() وonLaunchExternalLinkResponse() قيمة BillingResponseCode غير 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 قبل إعادة المحاولة.

اختبار الروابط المؤدية إلى المحتوى الخارجي

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

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

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