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

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

إعداد Play Billing Library

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

تهيئة عميل الفوترة

لتهيئة عميل الفوترة، اتّبِع الخطوات نفسها الموضّحة في تهيئة 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. يجب إنشاء الرمز المميّز قبل توجيه المستخدم إلى خارج التطبيق مباشرةً.

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

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 قبل إعادة المحاولة.

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

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

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

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