הנחיות לשילוב קישורים לתוכן חיצוני באפליקציה

במאמר הזה מוסבר איך לשלב את ממשקי ה-API של ספריית החיוב ב-Play כדי להציע קישורים לתוכן חיצוני באפליקציות שעומדות בדרישות. התוכנית מאפשרת למפתחים להפנות משתמשים בארה"ב אל מחוץ לאפליקציה שלהם ב-Play, כדי להציע להם מבצעים על תוכן דיגיטלי באפליקציה והורדות של אפליקציות. מידע נוסף על התוכנית זמין בדרישות התוכנית.

הגדרה של ספריית החיובים ב-Play

מוסיפים את התלות בספריית החיובים ב-Play לאפליקציית Android. כדי להשתמש בממשקי ה-API של קישורים חיצוניים, צריך להשתמש בגרסה 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, אפשר להשתמש ב-coroutines של Kotlin כדי שלא תצטרכו להגדיר מאזין נפרד.

הכנה של טוקן עסקה חיצוני

בשלב הבא, צריך ליצור אסימון עסקה חיצוני מספריית החיוב של Play. צריך ליצור אסימון חדש של עסקה חיצונית בכל פעם שהמשתמש מבקר באתר חיצוני דרך ה-API של קישורים חיצוניים. אפשר לעשות זאת באמצעות קריאה ל-API‏ 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, אפשר להשתמש ב-coroutines של Kotlin כדי שלא תצטרכו להגדיר מאזין נפרד.

הפעלת הקישור החיצוני

אחרי שאסימון העסקה החיצוני מוכן, אפשר לקשר את המשתמש מחוץ לאפליקציה להצעה של תוכן דיגיטלי או להורדה של אפליקציה באמצעות קריאה לשיטה launchExternalLink. יכול להיות שיוצגו למשתמש תיבות דו-שיח עם מידע נוסף ב-Google Play, בהתאם להגדרות המשתמש, כשמפעילים את ממשק ה-API הזה.

כשמתקשרים לשיטה 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: זו שגיאה פנימית. אל תמשיכו בעסקה או בפתיחת האתר החיצוני. אפשר לנסות שוב על ידי קריאה חוזרת ל-API או על ידי קריאה ל-launchExternalLink() בפעם הבאה שתנסו להפנות את המשתמש אל מחוץ לאפליקציה.
  • FEATURE_NOT_SUPPORTED: ממשקי ה-API של קישורי התוכן החיצוני לא נתמכים בחנות Play במכשיר הנוכחי. אל תמשיכו בעסקה או בפתיחת האתר החיצוני.
  • USER_CANCELED: לא להמשיך בפתיחת האתר החיצוני. תתקשר launchExternalLink() שוב בפעם הבאה שתנסה להפנות את המשתמש אל מחוץ לאפליקציה.
  • BILLING_UNAVAILABLE: העסקה לא עומדת בדרישות לקישורים לתוכן חיצוני, ולכן לא ניתן להמשיך במסגרת התוכנית הזו. יכולות להיות לכך שתי סיבות: המשתמש לא נמצא במדינה שעומדת בדרישות של התוכנית, או שהחשבון שלכם לא נרשם לתוכנית בהצלחה. אם זה המקרה השני, צריך לבדוק את סטטוס ההרשמה ב-Play Console.
  • DEVELOPER_ERROR: יש שגיאה בבקשה. כדאי להשתמש בהודעת ניפוי הבאגים כדי לזהות ולתקן את השגיאה לפני שממשיכים.
  • NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: אלה שגיאות זמניות שצריך לטפל בהן באמצעות מדיניות מתאימה לניסיון חוזר. במקרה של SERVICE_DISCONNECTED, צריך ליצור מחדש חיבור ל-Google Play לפני שמנסים שוב.

בדיקת קישורים לתוכן חיצוני

כדאי להשתמש בבודקי רישיונות כדי לבדוק את השילוב של המבצעים החיצוניים. לא נפיק חשבונית על עסקאות שהתחילו מחשבונות של בודקי רישיונות. מידע נוסף על הגדרת בודקי רישיונות זמין במאמר בדיקת חיובים על רכישות באפליקציות באמצעות רישוי אפליקציות.

השלבים הבאים

אחרי שתסיימו את השילוב באפליקציה, תוכלו לשלב את ה-Backend.