במדריך הזה מוסבר איך להטמיע את ממשקי ה-API כדי לתמוך בשיווק מחוץ לאפליקציה באפליקציות ובאזורים שעומדים בדרישות. כאן אפשר לקרוא מידע נוסף על התוכנית לשיווק מחוץ לאפליקציה, כולל דרישות הסף וההיקף הגיאוגרפי.
הגדרה של ספריית החיובים ב-Play
כדי להשתמש בממשקי ה-API של מבצעים חיצוניים, צריך להוסיף את התלות בגרסה 8.2 ואילך של ספריית החיובים ב-Play לאפליקציית Android. אם אתם צריכים לבצע מיגרציה מגרסה קודמת, עליכם לפעול לפי ההוראות במדריך למיגרציה לפני שתנסו להטמיע מבצעים חיצוניים.
חיבור ל-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 Billing Library. אפשר לקבל את הטוקן הזה על ידי קריאה ל-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.
}
});
אפשר גם לשלוח שאילתה לפונקציית ההשהיה createBillingProgramReportingDetailsAsync באמצעות תוספי Kotlin, כדי שלא תצטרכו להגדיר מאזין:
val createBillingProgramReportingDetailsResult =
withContext(context) {
billingClient
.createBillingProgramReportingDetails(params)
}
// Process the result
הפעלת תהליך של מבצע מחוץ לאפליקציה
כדי להתחיל בתהליך של מבצע מחוץ לאפליקציה, האפליקציה שעומדת בדרישות צריכה להפעיל את ה-API launchExternalLink() מה-thread הראשי של האפליקציה. ה-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 באמצעות קריאה ל-Google Play Developer API מהקצה העורפי שלכם. כשמדווחים על עסקה, צריך לספק externalTransactionToken שהתקבל מ-API createBillingProgramReportingDetailsAsync. אם משתמש מבצע כמה רכישות, אפשר להשתמש באותו externalTransactionToken כדי לדווח על כל רכישה. במדריך לשילוב עם העורף יש הסבר איך לדווח על טרנזקציה.
טיפול בתגובות
כשמתרחשת שגיאה, יכול להיות שהשיטות isBillingProgramAvailableAsync(), createBillingProgramReportingDetailsAsync() ו-launchExternalLink() יחזירו תגובות שונות מ-BillingResponseCode.OK. כדאי לטפל בקודי התגובה האלה באופן הבא:
-
ERROR: זו שגיאה פנימית. אל תמשיכו בעסקה או בפתיחת האתר החיצוני. כדי לנסות שוב, צריך להתקשר אל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.