چرخه عمر اشتراک

خرید اشتراک می‌تواند در طول چرخه عمر خود از چندین حالت مختلف عبور کند که این امر به عوامل بسیاری از جمله رفتار تمدید خودکار، موقعیت‌های کاهش پرداخت و اقدامات مدیریت توسعه‌دهنده بستگی دارد.

چرخه عمر اشتراک های تمدید خودکار را مدیریت کنید

هنگامی که وضعیت اشتراک کاربر تغییر می کند، سرور باطن شما یک پیام SubscriptionNotification دریافت می کند

شکل 1. وضعیت‌های چرخه حیات و رویدادهای انتقال برای تمدید خودکار خریدهای اشتراک.

برای به‌روزرسانی وضعیت موجود در باطن خود، با API purchases.subscriptionsv2.get با کد خرید موجود در اعلان تماس بگیرید. این نقطه پایانی آخرین وضعیت اشتراک را ارائه می دهد که یک نشانه خرید داده می شود و منبع حقیقت برای مدیریت اشتراک در نظر گرفته می شود.

رمز خرید از زمان ثبت نام اشتراک تا 60 روز پس از انقضا معتبر است. پس از این تاریخ، رمز خرید دیگر برای تماس با Google Play Developer API معتبر نیست.

خرید اشتراک جدید با تمدید خودکار

وقتی کاربر اشتراکی را خریداری می‌کند، یک پیام SubscriptionNotification با نوع SUBSCRIPTION_PURCHASED به مشتری RTDN شما ارسال می‌شود. چه این اعلان را دریافت کنید یا یک خرید درون برنامه ای جدید از طریق PurchasesUpdatedListener ثبت کنید یا به صورت دستی خریدها را در روش onResume() برنامه خود واکشی کنید ، باید خرید جدید را در پشتیبان امن خود پردازش کنید. برای این کار مراحل زیر را دنبال کنید:

  1. برای دریافت منبع اشتراکی که حاوی آخرین وضعیت اشتراک است، از نقطه پایانی purchases.subscriptionsv2.get پرس و جو کنید.
  2. مطمئن شوید که مقدار قسمت subscriptionState SUBSCRIPTION_STATE_ACTIVE است.
  3. خرید را تایید کنید .
  4. به کاربر اجازه دسترسی به محتوا را بدهید. اگر شناسه‌ها در زمان خرید با استفاده از setObfuscatedAccountId و setObfuscatedProfileId تنظیم شده باشند، حساب کاربری مرتبط با خرید را می‌توان با شی ExternalAccountIdentifiers از منبع اشتراک شناسایی کرد.

کتابخانه صورت‌حساب 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 Developer 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 Play اصلاح کند.

به محض اینکه کاربر روش پرداخت خود را اصلاح کرد، اشتراک با تاریخ تمدید اصلی خود تمدید می شود و شما می توانید تمدید را همانطور که در تمدید توضیح داده شده است انجام دهید.

اگر کاربر روش پرداخت خود را در طول دوره مهلت اصلاح نکند، اشتراک وارد حساب ذخیره می شود و حق خود را از دست می دهد.

دسترسی و بازیابی دوره مهلت

شکل 2 یک جدول زمانی برای اشتراکی را نشان می دهد که وارد دوره مهلت می شود و پس از اصلاح روش پرداخت کاربر، بازیابی می شود. پس از پایان دوره مهلت، کاربر باید مزایای اشتراک را از دست بدهد و حساب را متوقف کند.

شکل 2. جدول زمانی برای اشتراکی که وارد دوره مهلت می شود و قبل از پایان آن بهبود می یابد.

یادآوری نکات زیر ضروری است:

  • در طول دوره مهلت، کاربر باید دسترسی به مزایای اشتراک را حفظ کند.
  • هنگامی که اشتراک در طول دوره مهلت بهبود می یابد، تاریخ تمدید مجدد تنظیم نمی شود.
  • اگر دوره مهلت را افزایش دهید - به عنوان مثال، از 7 روز به 14 روز - کاربرانی که در دوره مهلت هستند، دسترسی بیشتری به مزایای اشتراک دارند.
  • اگر دوره مهلت را کاهش دهید، کاربرانی که به اندازه کافی در دوره مهلت قدیمی هستند و از دوره مهلت جدید فراتر رفته اند، فوراً مزایای اشتراک آنها لغو می شود. به عنوان مثال، اگر دوره مهلت را از 14 روز به 7 روز کاهش دهید، کاربرانی که در روزهای 8 تا 14 دوره مهلت قدیمی هستند فوراً مزایای اشتراک آنها لغو می شود.
  • اشتراک در حالت فعال باقی می‌ماند و تا پایان دوره مهلت خاموش، RTDN مهلت دریافت نمی‌کنید

دوره مهلت خاموش

می‌توانید یک مهلت 0 روزه تعیین کنید، اما Play حداقل 1 روز منتظر می‌ماند تا از زمان کافی برای تکرار پرداخت مطمئن شود. این دوره مهلت خاموش یک شبکه ایمنی برای پردازش پرداخت ارائه می دهد. در این دوره 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 Developer 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 را راه‌اندازی می‌کند. وقتی این اعلان را دریافت می‌کنید، منبع اشتراکی که از API برنامه‌نویس Google Play بازگردانده می‌شود، قسمت 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 ارسال می شود. در طول دوره تعویق، کاربر با دسترسی کامل در محتوای شما مشترک می شود اما هزینه ای دریافت نمی شود. تاریخ تمدید اشتراک به روز می شود تا تاریخ جدید را منعکس کند.

برای طرح‌های پیش‌پرداخت، می‌توانید از Defer Billing API برای به تعویق انداختن زمان انقضا استفاده کنید.

منبع اشتراک برای یک اشتراک معوق شبیه به مثال زیر است:

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

اشتراک‌های متوقف شده

می‌توانید با فعال کردن کاربران برای توقف موقت اشتراک خود، ریزش داوطلبانه را کاهش دهید. هنگامی که ویژگی مکث را فعال می کنید، کاربران می توانند بسته به دوره تکرار شونده، اشتراک خود را برای مدت زمانی بین یک هفته تا سه ماه متوقف کنند.

تکرار اشتراک هفتگی ماهانه سه ماهه شش ماهه سالانه
طول مکث موجود * 1 هفته
2 هفته
3 هفته
4 هفته
1 ماه
2 ماه
3 ماه
1 ماه
2 ماه
3 ماه
1 ماه
2 ماه
3 ماه
N/A
* ممکن است در هر زمان تغییر کند.

مکث اشتراک فقط پس از پایان دوره صورت‌حساب فعلی اعمال می‌شود. در حالی که اشتراک متوقف شده است، کاربر به اشتراک دسترسی ندارد و هزینه تمدید را پرداخت نمی کند. در پایان دوره توقف، اشتراک از سر گرفته می‌شود و 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 ارسال می‌شود. این باید همانطور که در Renewals توضیح داده شده است، مدیریت شود.

اگر هنگام تلاش برای از سرگیری اشتراک پس از توقف، پرداختی با مشکل مواجه شد، یک پیام SubscriptionNotification با نوع SUBSCRIPTION_ON_HOLD ارسال می‌شود. این باید همانطور که در نگهداری حساب توضیح داده شده است انجام شود.

دوباره اشتراک کنید

برای تمدید خودکار طرح های پایه اشتراک، فروشگاه Google Play ممکن است دکمه اشتراک مجدد را نمایش دهد. این دکمه به کاربران امکان می دهد دوباره به اشتراک خود دسترسی پیدا کنند. ممکن است به دلایل مختلف ظاهر نشود، به عنوان مثال زمانی که یک اشتراک مدت ها پیش منقضی شده است.

شکل 7. بخش حساب > اشتراک ها در برنامه فروشگاه Google Play اشتراک لغو شده را با دکمه اشتراک مجدد نشان می دهد.

اگرچه دکمه همیشه با برچسب Resubscribe است، عملکرد آن به وضعیت اشتراک بستگی دارد.

در حالی که یک اشتراک لغو شده است اما هنوز منقضی نشده است، کاربر همچنان مشترک است و مزایای اشتراک را دریافت می کند. اگر کاربر روی اشتراک مجدد ضربه بزند، لغو عملاً لغو می شود و اشتراک به تمدید ادامه می یابد. این عمل در اسناد و 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 روز فرصت دارند تا خرید یک طرح پیش پرداخت سه روزه را تایید کنند.

شکل 8. وضعیت های چرخه حیات و رویدادهای انتقال برای خرید اشتراک.

هر زمان که اشتراک طرح پیش‌پرداختی خریداری می‌شود، یک پیام SubscriptionNotification با نوع SUBSCRIPTION_PURCHASED برای مشتری RTDN شما ارسال می‌شود. برای بررسی آخرین وضعیت اشتراک طرح پیش پرداخت، با روش purchases.subscriptionsv2.get تماس بگیرید.

یک نشانه خرید جدید برای خریدهای تکمیلی صادر می شود و شما رمز خرید قبلی را در قسمت linkedPurchaseToken به عنوان بخشی از وضعیت خرید اشتراک جدید دریافت می کنید. رمز خرید از زمان ثبت نام اشتراک تا 60 روز پس از انقضا معتبر است. پس از این تاریخ، رمز خرید دیگر برای تماس با Google Play Developer 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": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

در قسمت expiryTime می توانید ببینید که چه زمانی این حق به پایان می رسد. خریدهای اضافی با جمع آوری زمان استحقاق را افزایش می دهد. این بدان معناست که اگر کاربر قبل از پایان حق اصلی خود شارژ کند، زمان جدید به تاریخ انقضای قبلی او اضافه می شود.

ممکن است بخواهید پیامی را در برنامه خود نشان دهید که به کاربر اطلاع می‌دهد که اشتراک‌های پیش‌پرداختش را می‌توان با یک شارژ تمدید کرد. برای اینکه بدانید کاربر چه زمانی می‌تواند شارژ کند، قسمت allowExtendAfterTime را در منبع اشتراک بررسی کنید.

طرح های پیش پرداخت به طور خودکار تمدید نمی شوند، بنابراین نمی توان آنها را لغو کرد. اگر کاربری بخواهد یک طرح پیش‌پرداخت را لغو کند، می‌تواند اجازه دهد به تاریخ انقضا برسد.