הנחיות לשילוב בתוך האפליקציה בתוכנית המבצעים החיצוניים

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

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

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

חיבור ל-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.

ה-API הזה מחזיר 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. אפשר לקבל את הטוקן הזה באמצעות קריאה ל-API‏ 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.
      }
});

לחלופין, אפשר להשתמש בתוספים של Kotlin כדי לשלוח שאילתה לפונקציית ההשהיה createBillingProgramReportingDetailsAsync, וכך לא תצטרכו להגדיר listener:

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

הפעלת תהליך של מבצע מחוץ לאפליקציה

כדי להתחיל בתהליך של שיווק מחוץ לאפליקציה, האפליקציה שעומדת בדרישות צריכה להפעיל את ה-API‏ launchExternalLink() מהשרשור הראשי של האפליקציה. ה-API הזה מקבל כקלט אובייקט 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 ב-WebView או לפתוח את ה-URI בדפדפן ספציפי, אפשר להשתמש במצב CALLER_WILL_LAUNCH_LINK. כדי להגן על פרטיות המשתמשים, חשוב לוודא שלא מועברים פרטים אישיים מזהים (PII) ב-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 באמצעות קריאה לממשק API של Google Play למפתחים מהקצה העורפי שלכם. כשמדווחים על עסקה, צריך לספק externalTransactionToken שהתקבל מ-API של createBillingProgramReportingDetailsAsync. אם משתמש מבצע כמה רכישות, אפשר להשתמש באותו externalTransactionToken כדי לדווח על כל רכישה. במדריך לשילוב עם הבק-אנד מוסבר איך לדווח על עסקה.

טיפול בתגובות

כשמתרחשת שגיאה, יכול להיות שהשיטות isBillingProgramAvailableAsync(), createBillingProgramReportingDetailsAsync() ו-launchExternalLink() יחזירו תגובות שונות מ-BillingResponseCode.OK. כדאי לטפל בקודי התגובה האלה באופן הבא:

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

בדיקה של מבצעים חיצוניים

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

השלבים הבאים

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