מחזור החיים של מינוי

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

איך מטפלים במחזור החיים של מינויים שמתחדשים אוטומטית

כשמצב המינוי של משתמש משתנה, שרת הקצה העורפי שלכם מקבל הודעה אחת (SubscriptionNotification)

איור 1. מצבי מחזור חיים ואירועי מעבר של עם חידוש אוטומטי של הרכישות.

כדי לעדכן את המצב בקצה העורפי, צריך לקרוא purchases.subscriptionsv2.get API עם אסימון הרכישה שכלול בהתראה. נקודת הקצה (endpoint) הזו מספקת את מצב המינוי העדכני ביותר בהינתן אסימון רכישה, והוא נחשב הוא מקור מהימן לניהול מינויים.

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

רכישות חדשות של מינויים שמתחדשות אוטומטית

כשמשתמש רוכש מינוי, נשלחת הודעת SubscriptionNotification עם מסוג SUBSCRIPTION_PURCHASED נשלח ללקוח ה-RTDN שלכם. האם תקבלו בהודעה הזו או לרשום רכישה חדשה בתוך האפליקציה דרך PurchasesUpdatedListener או לאחזר רכישות באופן ידני מסוג onResume() של האפליקציה, עליך לעבד את הרכישה החדשה בחשבון המאובטח בקצה העורפי. לשם כך, בצע את הצעדים הבאים:

  1. שליחת שאילתה על purchases.subscriptionsv2.get נקודת קצה לקבלת מינוי מקור מידע שכולל את מצב המינוי העדכני ביותר.
  2. צריך לוודא שהערך של subscriptionState השדה הוא SUBSCRIPTION_STATE_ACTIVE.
  3. מאמתים את הרכישה.
  4. נותנים למשתמש גישה לתוכן. חשבון המשתמש המשויך אל ניתן לזהות את הרכישה באמצעות ExternalAccountIdentifiers אובייקט ממשאב המינוי אם הוגדרו מזהים בזמן הרכישה זמן באמצעות setObfuscatedAccountId וגם setObfuscatedProfileId.

ספריית החיובים ב-Play כוללת גם שיטה לאישור מינוי, acknowledgePurchase() ושיטה לבדיקת סטטוס האישור, isAcknowledged() עם זאת, מומלץ לטפל בעיבוד הרכישה בקצה העורפי שלכם ואבטחה משופרת.

משאב המינוי לרכישות חדשות נראה דומה לזה דוגמה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

חידושים של מינויים

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

אין צורך לאשר את חידושי המינוי.

תקופת חסד

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

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

סנכרון מצב המינוי עם הקצה העורפי מאפשר להגביר את המוּדעוּת של דחיית תשלומים, ומספק הקשר נוסף כשמנסים להפחית את מספר הדחיות לנטוש. האזנה ל SubscriptionNotification הודעות מסוג SUBSCRIPTION_IN_GRACE_PERIOD כדי לקבל התראה כשהמשתמש יזין תקופת חסד. בזמן שהמשתמש נמצא בתקופת חסד, המינוי מקור מידע מכיל autoRenewEnabled = true. Google Play מרחיב באופן דינמי את הערך של expiryTime עד לסיום תקופת החסד עקב ההרשאה צריכה להימשך עד שהמשתמש יבטל או עד שתקופת החסד תסתיים באורך המקסימלי. הערך בשדה subscriptionState במהלך התקופה הזו הוא SUBSCRIPTION_STATE_IN_GRACE_PERIOD. משאב המינוי נראה דומה ל- לדוגמה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

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

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

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

גישה ושחזור במסגרת תקופת החסד

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

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

חשוב לזכור את הנקודות הבאות:

  • במהלך תקופת החסד, עדיין תהיה למשתמש גישה להטבות המינוי.
  • כשמינוי מתחדש במהלך תקופת חסד, תאריך החידוש כן לא לאפס.
  • אם תאריכו את תקופת החסד – למשל מ-7 ימים ל-14 ימים – משתמשים נמצאים בתקופת חסד ומקבלים גישה מורחבת להטבות המינוי.
  • אם תקצרו את תקופת החסד, המשתמשים שנמצאים רחוק מספיק בתקופת החסד הקודמת כדי לחרוג מתקופת החסד החדשה, תוכלו ליהנות מהטבות המינוי. תבוטל מיידית. לדוגמה, אם תקצר את תקופת החסד, 14 ימים עד 7 ימים, משתמשים שנמצאים בימים 8-14 בתקופת החסד הקודמת הטבות המינוי שלהם יבוטלו באופן מיידי.
  • המינוי יישאר במצב פעיל ולא יינתן לך תקופת חסד RTDN עד לסיום תקופת החסד השקטה

תקופת חסד שקטה

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

הדרך הטובה ביותר לשמור על סנכרון עם שינויים במצב המינוי להאזין להתראות בזמן אמת למפתחים (RTDN) ולהגיב עליהן. קוראים לפונקציה purchases.subscriptionsv2.get() בזמן ה-RTDN במקום בזמן התפוגה, כדי לקבל בסטטוס של המינוי.

בהתאם לסטטוס המינוי לאחר תקופת החסד השקטה של 24 שעות אתם אמורים לקבל אחת מההודעות הבאות:

  • SUBSCRIPTION_ON_HOLD (אם הופעל)
  • SUBSCRIPTION_CANCELED (אם בוטל)
  • SUBSCRIPTION_EXPIRED (אם התוקף שלו פג)
  • SUBSCRIPTION_RENEWED (אם החידוש בוצע בהצלחה)

אפשר גם להפעיל את השיטה subscriptionV2.get() בכל שלב אחרי תקופת חסד שקטה של 24 שעות לקבלת הסטטוס העדכני של המינוי.

השעיית חשבון

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

במהלך השהיית החשבון, תצטרכו להמשיך לטפל בביטולים, שחזורים או רכישות חוזרות של המינויים שלכם לפי הצורך, מאחר שהמשתמש יכול לבצע את השינויים האלה בזמן המינוי בהמתנה.

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

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

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

עם מפתח בזמן אמת התראות, מקבלים הודעה אחת (SubscriptionNotification) מסוג SUBSCRIPTION_ON_HOLD כשמינוי נכנס להשהיית חשבון. שיחת טלפון ה purchases.subscriptionsv2.get משרת העורפי המאובטח כדי לאחזר את המינוי החדש. מידע. במהלך השהיית החשבון, השדה expiryTime של המינוי מקור מידע מוגדר לחותמת זמן קודמת, והשדה subscriptionState מוגדר לערך SUBSCRIPTION_STATE_ON_HOLD:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

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

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

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

לאחר השחזור, ספריית החיובים ב-Play תחזיר את המינוי שוב דרך השיטה queryPurchasesAsync(). אם תשתמשו בשיטה הזו כדי לקבוע למשתמש יש זכות למינוי, האפליקציה שלך אמורה לטפל באופן אוטומטי המינוי שמתאושש מהשהיית החשבון.

האזנה הודעה אחת (SubscriptionNotification) מסוג SUBSCRIPTION_RECOVERED, כדי לקבל התראה כשמינוי שוחזר והמשתמש אמור לקבל שוב גישה. אם אתם מחפשים מינוי אחרי קבלת ההתראה, השדה expiryTime מוגדר לחותמת זמן בעתיד והשדה subscriptionState מוגדר SUBSCRIPTION_STATE_ACTIVE שוב:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

אם המשתמש לא יתקן את אמצעי התשלום שלו לפני שהשהיית החשבון תסתיים במקום זאת, מקבלים RTDN מסוג SUBSCRIPTION_CANCELED. עבור הוראות לטיפול בביטול, ראו ביטולים. אחרי ש שאילתה למינוי שבוטל באופן הזה, מוחזר השדה expiryTime מוגדר לחותמת זמן קודמת:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

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

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

גישה ושחזור של השהיית חשבון

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

איור 3. ציר זמן של מינוי שמזין השהיית החשבון והשחזור שלו לפני שהוא יסתיים.

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

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

חשוב לזכור את הנקודות הבאות:

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

זמני תפוגה

לאחר שתוקף מינוי פג, המשתמש אמור לאבד את הגישה למינוי. א' הודעה אחת (SubscriptionNotification) מסוג SUBSCRIPTION_EXPIRED נשלחה במקרה הזה. כשמקבלים את ההודעה הזו, אפשר לשלוח שאילתה למפתח Google Play API לקבלת המינוי העדכני ביותר משאב. אחרי שמוודאים שה-subscriptionState הוא SUBSCRIPTION_STATE_EXPIRED, להסיר את ההרשאה ולרשום את מצב הרכישה כלא תקף בקצה העורפי. משאב המינוי נראה דומה לדוגמה הבאה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

ביטולים

משתמש יכול לבטל מינוי מיוזמתו ממרכז המינויים של Play או שהמינוי שלהם יבוטל באופן אוטומטי אם הוא לא ישוחזר לאחר להיות בהשהיית חשבון. מפתחים יכולים גם להפעיל ביטול באמצעות purchases.subscriptions.cancel לאחר ביטול המינוי, המשתמש שומר את הגישה לתוכן עד בסוף מחזור החיובים הנוכחי. כשמחזור החיובים מסתיים, הגישה צריכה להיות תבוטל.

ביטול של מינוי ללא תשלומים שמתחדש אוטומטית מפעיל התראה אחת (SUBSCRIPTION_CANCELED). מתי קיבלתם את ההתראה הזו, המינוי מקור מידע שהוחזר מ-Google Play Developer API מכיל את השדה subscriptionState מוגדר ל-SUBSCRIPTION_STATE_CANCELED, והשדה expiryTime מכיל את הערך התאריך שבו המשתמש אמור לאבד את הגישה למינוי. אם התאריך הזה הוא בעבר, המשתמש אמור לאבד את ההרשאה באופן מיידי. דבר כזה יכול לקרות, לדוגמה, אם משתמש מבטל מינוי מתוך חשבון השהיית תשלומים עקב דחיית תשלום.

משאב המינוי לרכישה שבוטלה נראה דומה לזה דוגמה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

למינויים בתשלומים, SUBSCRIPTION_CANCELLATION_SCHEDULED התראה נשלחת כשמשתמש מבטל ביוזמת המשתמש כשהתשלום נשאר למשך תקופת ההתחייבות. הביטול בהמתנה וייכנס לתוקף ב- סוף תקופת ההתחייבות הנוכחית. כשמקבלים את ההתראה הזו, משאב המינוי שהוחזר מ-Google Play Developer API כולל השדה subscriptionState שהוגדר הוא SUBSCRIPTION_STATE_ACTIVE כי המינוי בתשלומים עדיין פעיל עד סוף תקופת ההתחייבות. עם זאת, יש אובייקט ריק בהמתנה לביטול. נשלחת התראה של SUBSCRIPTION_CANCELED ואחריה מופיע SUBSCRIPTION_EXPIRED בסיום תקופת ההתחייבות.

משאב המינויים לרכישת מינוי בתשלומים שהוא התכונה 'בהמתנה לביטול' נראית דומה לדוגמה הבאה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

אפשר לעיין בשדה canceledStateContext במשאב המינוי כדי לבדוק למה המינוי בוטל (לדוגמה, אם המינוי בוטל על ידי המשתמש, על ידי המערכת או על ידך). אם המינוי היה בוטל על ידי המשתמש, אפשר להסתכל בשדה userInitiatedCancellation כדי להבין למה המשתמש ביטל את המינוי. כך ניתן לקבל מידע על התקשורת אסטרטגיות למשימות.

כשמינוי מבוטל אבל התוקף שלו עדיין לא פג, עדיין מוחזר מ- queryPurchasesAsync(). ייתכן שתרצו להציג באפליקציה הודעה כדי ליידע את המשתמש המינוי בוטל והוגדר תאריך התפוגה שלו.

ביטולים

יש מגוון סיבות לביטול מינוי, כולל הקצה העורפי שלך ביטול המינוי באמצעות purchases.subscriptionsv2.revoke או הרכישה שחויבה מחדש. במצב כזה, מבטלים את ההגדרה של המשתמש הרשאה באופן מיידי. הודעת SubscriptionNotification עם סוג במקרה כזה, נשלח SUBSCRIPTION_REVOKED. כשמקבלים את ההודעה הזו התראה, מינוי מקור מידע שהוחזר מ-Google Play Developer API מכיל את השדה subscriptionState מוגדר ל-SUBSCRIPTION_STATE_EXPIRED.

משאב המינוי לרכישה שבוטלה נראה דומה לזה דוגמה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

מינויים שנדחו

עשויות להיות סיבות שונות לכך שתרצו להאריך את משך החברות אם יש לכם הרשאה. לדוגמה, ייתכן שתרצו להציע למשתמשים גישה ללא תשלום, מבצע, כמו הענקת שבוע אחד בחינם לרכישת סרט או הצעת חינם גישה ללקוחות כמחווה של מוניטין. אפשר להשתמש purchases.subscriptions.defer מ-Play Developer API כדי לקדם את תאריך השימוש הבא מינוי שמתחדש אוטומטית. כשעושים זאת, SubscriptionNotification נשלחת הודעה מסוג SUBSCRIPTION_DEFERRED. במהלך תקופת הדחייה, המשתמש רשום כמנוי לתוכן שלך עם גישה מלאה, אך אינו מחויב. תאריך חידוש המינוי מתעדכן בהתאם לתאריך החדש.

בתוכניות בתשלום מראש אפשר להשתמש ב-API של דחיית חיוב כדי לדחות את תאריך התפוגה בזמן האימון.

משאב המינוי של מינוי שנדחה נראה דומה בדוגמה הבאה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

מינויים מושהים

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

חזרה של מינוי כל שבוע חודשי לשלושה חודשים לשישה חודשים שנתי
משך השהיה זמין* שבוע אחד
שבועיים
3 שבועות
4 שבועות
חודש אחד
חודשיים
3 חודשים
חודש אחד
חודשיים
3 חודשים
חודש אחד
חודשיים
3 חודשים
לא רלוונטי
*בכפוף לשינויים בכל שלב.

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

איור 5. משתמש משהה את הסשן ואז מחדש למינוי.
איור 6. משתמש משהה את המינוי שלו ואז נכנס השהיית חשבון.

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

כשמינוי של משתמש מושהה, ספריית החיובים ב-Play לא מוחזרת ההרשמה דרך queryPurchasesAsync() . אם המינוי מתחדש, השיטה queryPurchasesAsync() תחזיר אותו שוב.

כדאי להאזין ל-RTDN כדי לדעת מתי משתמש משהה את המינוי שלו. האלה הודעות מאפשרות גם להודיע למשתמשים באפליקציה שהם השהה את המינוי שלהם ואין להם גישה אליו. צריך גם לציין כדי לאפשר למשתמשים להמשיך את המינוי באופן ידני בכל שלב, באמצעות קישור עומק ל-Google Play.

הודעה ב-SubscriptionNotification מסוג SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED נשלח כשהמשתמש יוזם בהשהיה של המינוי. בשלב הזה, למשתמש צריכה להיות גישה אל את המינוי שלהם עד לתאריך החידוש הבא, והמנוי מקור מידע מכיל autoRenewEnabled = true. הערך בשדה subscriptionState הוא SUBSCRIPTION_STATE_ACTIVE בשלב הזה.

הודעת SubscriptionNotification מסוג SUBSCRIPTION_PAUSED נשלחת כאשר ההשהיה תיכנס לתוקף. במצב כזה, המשתמש אמור לאבד את הגישה מנוי, ומשאב המינויים מכיל autoRenewEnabled = true, והשדה subscriptionState מוגדר ל-SUBSCRIPTION_STATE_PAUSED. אפשר כדי לראות מתי המינוי צפוי להתחדש שוב, אפשר להיכנס PausedStateContext לאובייקט.

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

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

הרשמה מחדש

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

איור 7. חשבון > הקטע 'מינויים' באפליקציה של חנות Google Play שמוצג בה מינוי שבוטל לחצן הרשמה מחדש.

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

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

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

שחזור לפני שהתוקף יפוג

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

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

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

הרשמה מחדש אחרי התפוגה

אם מינוי בסיסי שמתחדש אוטומטית מוגדר באמצעות Google Play Console או API כדי לאפשר 'הרשמה מחדש', משתמשים יוכלו לרכוש מינוי מחדש שתוקפו פג חנות Google Play.

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

שדרוגים, שדרוג לאחור והרשמה מחדש

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

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

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

אם המשתמש רוכש בהצלחה את השדרוג, השדרוג לאחור או ההרשמה מחדש, זו רכישה חדשה שצריך לאשר. הדרך המומלצת לשם כך צריך להשתמש ב-Google Play Developer API. משאב המינוי נראה דומה לדוגמה הבאה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

שינויים במחירים

לעיון במדריך לשיטות מומלצות לשינוי מחירים מידע נוסף על שינוי מחירי מינויים שמתחדשים אוטומטית ושליחת הודעה למשתמשים כשיש צורך.

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

טיפול באישור המשתמש לגבי שינוי מחיר בכפוף להסכמה

כשמשתמש יאשר את העלייה במחיר המינוי, תקבלו הודעה אחת (SubscriptionNotification) מסוג SUBSCRIPTION_PRICE_CHANGED_CONFIRMED. עם מחיר עם אפשרות לסירוב נמוכה יותר, או כשמחיר המינוי יתחדש, הודעה אחת (SubscriptionNotification) מסוג SUBSCRIPTION_RENEWED. לטיפול כמו על כל חידוש אחר.

טיפול במקרים שבהם לא מביעים הסכמה להעלאת מחיר

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

המשתמשים יכולים גם לבטל את המינויים שלהם לצורך העלאת מחיר עם אפשרות לסירוב באמצעות אותו מנגנון.

איך מטפלים במחזור החיים של מינויים בתשלום מראש

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

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

איור 8. מצבי מחזור חיים ואירועי מעבר של רכישות של מינויים.

הודעה ב-SubscriptionNotification מסוג SUBSCRIPTION_PURCHASED נשלח ללקוח ה-RTDN שלך בכל פעם המינוי לתוכנית בתשלום מראש נרכש, כולל כל הוספת כסף. קוראים לפונקציה purchases.subscriptionsv2.get לבדיקת המצב העדכני ביותר של המינוי בתשלום מראש.

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

משאב המינוי לרכישת מינוי בתשלום מראש נראה דומה בדוגמה הבאה:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

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

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

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