אם האפליקציה שלכם מופצת דרך Google Play, ואתם רוצים למכור מוצרים דיגיטליים או להציע מינויים, עליכם להשתמש בחיוב ב-Google Play. בחיוב ב-Google Play יש כלים לניהול הקטלוג, המחירים והמינויים, דוחות שימושיים ותהליכי תשלום שמופעל על ידי חנות Play שהמשתמשים כבר מכירים.
עכשיו תוכלו לשלב את Payment Request API ואת Digital Goods API עם החיוב ב-Google Play באפליקציות שפותחו באמצעות Trusted Web Activity. היא זמינה ב-Chrome מגרסה 101 ואילך ל-Android ול-ChromeOS.
במדריך הזה נסביר איך להוסיף תמיכה בחיוב ב-Google Play לאפליקציית ה-PWA שלכם, ולארוז אותה להפצה בחנות Google Play גם ל-ChromeOS וגם לחנות Play.
כדי להוסיף תמיכה בחיוב ב-Play ל-PWA, יהיה עליך להשתמש בשני ממשקי API של פלטפורמת אינטרנט. ה-Digital Goods API משמש לאיסוף מידע על מק"טים ולבדוק אם יש רכישות והרשאות בחנות Play. ה-Payment Request API משמש להגדרה של חנות Google Play כאמצעי התשלום ולהשלמת תהליך הרכישה.
איך לייצר הכנסות מאפליקציות בחנות Play
יש שתי דרכים שבהן האפליקציה שלכם יכולה לייצר הכנסות באמצעות חיוב ב-Google Play בחנות Play:
- רכישות מתוך האפליקציה מאפשרות למכור מוצרים וירטואליים עמידים ומתכלים, כמו תכונות נוספות או להסיר מודעות.
- מי��ויים: אתם יכולים להציע למשתמשים גישה קבועה לתוכן או לשירותים בתשלום קבוע, כמו מינויים לחדשות או מינויים.
דרישות
כדי להגדיר חיוב ב-Google Play, צריך:
- חשבון פיתוח ב-Google Play וחשבון מוכר ב-Google Payment שמקושרים זה לזה.
- דף אפליקציה בחנות Play עם גרסה למסלול הפצה לבדיקה ציבורית ולבדיקות פנימיות.
- כדי ליצור ולהגדיר את המוצרים והמינויים של האפליקציה בחנות Play.
- פרויקט שנוצר באמצעות בועות עם הגדרה תקינה של Digital Asset Links (קישורים לנכסים דיגיטליים).
עדכון הפרויקט של בועות
אם לא התקנת את בועות הבועה, יהיה עליך להתקין אותו. לפרטים כיצד להתחיל, קראו את המדריך למתחילים. אם כבר יש לכם את התכונה 'אריזה בועות', הקפידו לעדכן לגרסה 1.8.2 ואילך.
התכונה 'ניילון בועות' תופיע גם מאחורי דגל. כדי להפעיל אותה, צריך לשנות את הגדרות הפרויקט דרך twa-manifest.json
, שנמצאת ברמה הבסיסית (root) של הפרויקט, ולהפעיל גם את alphaDependencies
וגם את התכונה playBilling
:
...,
"enableNotifications": true,
"features": {
"playBilling": {
"enabled": true
}
},
"alphaDependencies": {
"enabled": true
},
...
כשקובץ התצורה מתעדכן, מריצים את bubblewrap update
כדי להחיל את התצורה על הפרויקט, ולאחר מכן את bubblewrap build
כדי ליצור חבילת Android חדשה ולהעלות את החבילה ה��ו לחנות Play.
תכונה לזיהוי הזמינות של Digital Goods API ושל החיוב ב-Google Play
בשלב זה, Chrome תומך ב-Digital Goods API רק כשה-PWA מופעל במסגרת פעילות Trusted Web. ניתן לזהות אם הוא זמין באמצעות חיפוש של getDigitalGoodsService
באובייקט window
:
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
}
ה-Digital Goods API עשוי להיות זמין בכל דפדפן ולתמוך בחנויות שונות. כדי לבדוק אם יש תמיכה בקצה עורפי של חנות מסוימת, צריך להפעיל את השיטה getDigitalGoodsService()
ולהעביר את מזהה החנות כפרמטר. חנות Google Play מזוהה באמצעות המחרוזת https://play.google.com/billing
:
if ('getDigitalGoodsService' in window) {
// Digital Goods API is supported!
try {
const service =
await window.getDigitalGoodsService('https://play.google.com/billing');
// Google Play Billing is supported!
} catch (error) {
// Google Play Billing is not available. Use another payment flow.
return;
}
}
אחזור פרטים של מק"ט
ה-Digital Goods API מספק getDetails()
, שמאפשר לאחזר מידע כמו שם המוצר והתיאור שלו והכי חשוב גם המחיר – מהקצה העורפי של התשלומים.
לאחר מכן תוכלו להשתמש במידע הזה בממשק המשתמש ולספק פרטים נוספים למשתמש:
const skuDetails = await service.getDetails(['shiny_sword', 'gem']);
for (item of skuDetails) {
// Format the price according to the user locale.
const localizedPrice = new Intl.NumberFormat(
navigator.language,
{style: 'currency', currency: item.price.currency}
).format(item.price.value);
// Render the price to the UI.
renderProductDetails(
item.itemId, item.title, localizedPrice, item.description);
}
בניית תהליך הרכישה
הבונה של PaymentRequest משתמש בשני פרמטרים: רשימת אמצעי תשלום ורשימה של פרטי התשלום.
מתוך 'פעילות באינטרנט מהימנה', עליכם להשתמש באמצעי התשלום לחיוב ב-Google Play. לשם כך עליכם להגדיר את https://play.google.com/billing
כמזהה, ולהוסיף את המק"ט של המוצר כחברי נתונים:
async function makePurchase(service, sku) {
// Define the preferred payment method and item ID
const paymentMethods = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku,
}
}];
...
}
למרות שפרטי התשלום נדרשים, החיוב ב-Play יתעלם מהערכים האלה וישתמש בערכים שהוגדרו בזמן יצירת המק"ט ב-Play Console, כך שאפשר יהיה למלא אותם בערכים מזויפים:
const paymentDetails = {
total: {
label: `Total`,
amount: {currency: `USD`, value: `0`}
}
};
const request = new PaymentRequest(paymentMethods, paymentDetails);
כדי להתחיל את תהליך התשלום, צריך להפעיל את show()
באובייקט של בקשת התשלום. אם ההבטחה תצליח, ייתכן שהתשלום בוצע בהצלחה. אם התשלום נכשל, סביר להניח שהמשתמש ביטל את התשלום.
אם ההבטחה תצליח, יהיה עליכם לאמת את הרכישה ולאשר אותה. כדי להגן מפני הונאה, צריך להטמיע את השלב הזה באמצעות הקצה העורפי. רוצים לדעת איך להטמיע את האימות בקצה העורפי? תוכלו להיעזר במסמכי התיעוד בנושא חיוב ב-Play. אם לא תאשרו את הרכישה, לאחר שלושה ימים, המשתמש יקבל החזר כספי ו-Google Play תבטל את הרכישה.
...
const request = new PaymentRequest(paymentMethods, paymentDetails);
try {
const paymentResponse = await request.show();
const {purchaseToken} = paymentResponse.details;
// Call backend to validate and acknowledge the purchase.
if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
// Optional: tell the PaymentRequest API the validation was
// successful. The user-agent may show a "payment successful"
// message to the user.
const paymentComplete = await paymentResponse.complete('success');
} else {
// Optional: tell the PaymentRequest API the validation failed. The
// user agent may show a message to the user.
const paymentComplete = await paymentResponse.complete('fail');
}
} catch(e) {
// The purchase failed, and we can handle the failure here. AbortError
// usually means a user cancellation
}
...
לחלופין, אפשר להפעיל את consume()
ב-purchaseToken כדי לסמן את הרכישה כ'ניצלת' ולאפשר רכישה חוזרת שלה.
אחרי שמשלבים את כל המרכיבים, שיטת רכישה נראית כך:
async function makePurchase(service, sku) {
// Define the preferred payment method and item ID
const paymentMethods = [{
supportedMethods: "https://play.google.com/billing",
data: {
sku: sku,
}
}];
// The "total" member of the paymentDetails is required by the Payment
// Request API, but is not used when using Google Play Billing. We can
// set it up with bogus details.
const paymentDetails = {
total: {
label: `Total`,
amount: {currency: `USD`, value: `0`}
}
};
const request = new PaymentRequest(paymentMethods, paymentDetails);
try {
const paymentResponse = await request.show();
const {purchaseToken} = paymentResponse.details;
// Call backend to validate and acknowledge the purchase.
if (await acknowledgePurchaseOnBackend(purchaseToken, sku)) {
// Optional: consume the purchase, allowing the user to purchase
// the same item again.
service.consume(purchaseToken);
// Optional: tell the PaymentRequest API the validation was
// successful. The user-agent may show a "payment successful"
// message to the user.
const paymentComplete =
await paymentResponse.complete('success');
} else {
// Optional: tell the PaymentRequest API the validation failed.
// The user agent may show a message to the user.
const paymentComplete = await paymentResponse.complete('fail');
}
} catch(e) {
// The purchase failed, and we can handle the failure here.
// AbortError usually means a user cancellation
}
}
בדיקת הסטטוס של רכישות קיימות
ה-Digital Goods API מאפשר לבדוק אם למשתמש יש הרשאות (רכישות מתוך האפליקציה שעדיין לא נוצלו או מינויים פעילים) מרכישות קודמות שהוא כבר ביצע – במכשיר אחר, בהתקנה קודמת, במימוש קוד הטבה או בפעם האחרונה שהוא פתח את האפליקציה.
const service =
await window.getDigitalGoodsService('https://play.google.com/billing');
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
// Update the UI with items the user is already entitled to.
console.log(`Users has entitlement for ${p.itemId}`);
}
זו גם הזדמנות טובה לבדוק אם יש רכישות שבוצעו בעבר אבל לא אושרו. מומלץ לאשר רכישות בהקדם האפשרי כדי לוודא שההרשאות של המשתמשים מופיעות כראוי באפליקציה.
const service =
await window.getDigitalGoodsService("https://play.google.com/billing");
...
const existingPurchases = await service.listPurchases();
for (const p of existingPurchases) {
await verifyOrAcknowledgePurchaseOnBackend(p.purchaseToken, p.itemId);
// Update the UI with items the user is already entitled to.
console.log(`Users has entitlement for ${p.itemId}`);
}
בדיקת השילוב
במכשיר Android פיתוח
ניתן להפעיל את Digital Goods API במכשיר Android לפיתוח, לצורך בדיקה:
- יש לוודא שאתם משתמשים ב-Android מגרסה 9 ואילך ושמצב הפיתוח מופעל.
- מתקינים את Chrome מגרסה 101 ואילך.
- כדי להפעיל את הדגלים הבאים ב-Chrome, מנווטים אל
chrome://flags
ומחפשים את הדגל לפי שם:#enable-debug-for-store-billing
- יש לוודא שהאתר מתארח בפרוטוקול https. השימוש ב-http יגרום ל-API להיות
undefined
במכשיר ChromeOS
Digital Goods API יהיה זמין בגרסה יציבה של ChromeOS החל מגרסה 89. בינתיים, אפשר לבדוק את ה-Digital Goods API:
- מתקינים את האפליקציה מחנות Play במכשיר.
- יש לוודא שהאתר מתארח בפרוטוקול https. השימוש ב-http יגרום ל-API להיות
undefined
עם משתמשי בדיקה וצוותי בקרת איכות
חנות Play מציעה כסף לבדיקה, כולל חשבונות לבדיקה של משתמשים ומק"טים לבדיקה. מידע נוסף זמין במסמכי התיעוד בנושא בדיקת חיוב ב-Google Play.
מה השלב הבא?
כפי שצוין במסמך הזה, ה-Play Billing API כולל רכיבים בצד הלקוח שמנוהלים על ידי Digital Goods API וגם רכיבים בצד השרת.
- כדאי לראות את הטעימה של פיטר קון בכתובת https://github.com/PEConn/beer
- אפשר לעיין במסמ��י התיעוד של Play בנושא אימות רכישה.
- כדאי להשתמש באחת מ��פ��י��ת ��לקוח ש�� Google Play Developer API, שזמינות במספר שפות.
- אם אתם מטמיעים מודל מינויים באפליקציה, תוכלו לעיין במסמכי התיעוד בנושא מינויים לחיוב ב-Play.
- אפשר להטמיע התראות בזמן אמת למפתחים (RTDN) ולהירשם לקבלת התראות, כדי לקבל התראות בקצה העורפי כשמצב המינוי משתנה, במקום לשקלל את הסטטוס שלהן ב-Play.
- כדאי להטמיע את
linkedPurchaseToken
כדי למנוע כפילויות במינויים. קראו את הפוסט הזה בבלוג כדי ללמוד איך להטמיע אותו בצורה נכונה.