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

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

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

هنگامی که وضعیت اشتراک کاربر تغییر می کند، سرور باطن شما یک پیام 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 را در منبع اشتراک بررسی کنید.

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

،

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

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

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

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

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

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

خریدهای جدید تمدید مجدد خودکار

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

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

کتابخانه صورتحساب بازی همچنین شامل روشی برای تصدیق اشتراک ، 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 جدید موجود در منبع اشتراک برگشتی از 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": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ]
}

نیازی به تأیید تجدید اشتراک نیست.

دوره ارفاقی

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

روش queryPurchasesAsync() همچنان به بازگرداندن خریدهایی که در دوره GRACE هستند ، باز می گردد. اگر برنامه شما صرفاً به queryPurchasesAsync متکی است تا بررسی کند که آیا کاربر حق اشتراک دارد ، برنامه شما باید به طور خودکار دوره های GRACE را انجام دهد ، زیرا این اشتراک ها از طریق کتابخانه صورتحساب بازی فعال هستند.

همگام سازی وضعیت اشتراک با باطن خود به شما امکان می دهد تا از کاهش پرداخت آگاه باشید و زمینه بیشتری را به شما می دهد زیرا سعی می کنید چرند غیر ارادی را کاهش دهید. پیام های SubscriptionNotification را با نوع SUBSCRIPTION_IN_GRACE_PERIOD گوش دهید تا هنگام ورود کاربر به یک دوره GRACE اطلاع داده شود. در حالی که کاربر در یک دوره GRACE قرار دارد ، منبع اشتراک شامل 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
      }
    }
  ],
}

بازی به کاربران اطلاع می دهد که در یک دوره لطف قرار دارند که پرداخت آنها کاهش یافته است و آنها را وادار می کند تا مشکلات روش پرداخت خود را در فروشگاه بازی برطرف کنند. هنگامی که کاربر وارد یک دوره GRACE می شود ، شما همچنین باید کاربر را ترغیب کنید که در صورت عدم ارادت ، روش پرداخت خود را برطرف کند. یک روش ساده برای انجام این کار استفاده از API پیام رسانی درون برنامه است. اگر وقتی کاربر برنامه شما را باز می کند ، با این API تماس می گیرید ، به آنها پیام بازی در یک اسنک موقت نشان داده می شود که به کاربر اطلاع می دهد که پرداخت آنها کاهش یافته است. این پیام همچنین شامل یک پیوند عمیق برای کاربر برای رفع روش پرداخت خود در Google Play است.

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

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

دسترسی و بازیابی دوره گریس

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

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

مهم است که نکات زیر را به خاطر بسپارید:

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

دوره گریس ساکت

شما می توانید یک دوره فضل 0 روز تعیین کنید ، اما بازی حداقل 1 روز صبر می کند تا از زمان کافی برای پرداخت مجدد پرداخت اطمینان حاصل شود. این دوره Silent Grace یک شبکه ایمنی برای پردازش پرداخت ارائه می دهد. در طی این دوره 24 ساعته ، اشتراک در حالت ACTIVE باقی مانده است.

بهترین راه برای همگام سازی با تغییرات وضعیت اشتراک ، گوش دادن و واکنش به اعلان های توسعه دهنده زمان واقعی (RTDN) است. به جای زمان انقضا با روش purchases.subscriptionsv2.get() .

بسته به وضعیت اشتراک پس از دوره 24 ساعته Grace Silent ، باید یکی از اعلان های زیر را دریافت کنید:

  • SUBSCRIPTION_ON_HOLD (در صورت فعال بودن)
  • SUBSCRIPTION_CANCELED (در صورت لغو)
  • SUBSCRIPTION_EXPIRED (در صورت انقضا)
  • SUBSCRIPTION_RENEWED (در صورت تجدید موفقیت آمیز)

همچنین می توانید پس از دوره 24 ساعته Grace Silent Grace ، در هر نقطه از روش subscriptionV2.get() در هر نقطه تماس بگیرید تا آخرین وضعیت اشتراک را بدست آورید.

حساب

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

در حین نگه داشتن حساب ، شما باید در صورت لزوم هرگونه لغو ، ترمیم یا خرید مجدد اشتراک های خود را ادامه دهید ، زیرا این امکان وجود دارد که کاربر بتواند این تغییرات را در حالی که اشتراک در آن است ، انجام دهد.

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

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

پس از بهبودی ، کتابخانه صورتحساب بازی دوباره اشتراک را از طریق روش queryPurchasesAsync() باز می گرداند. اگر از این روش برای تعیین اینکه آیا کاربر حق اشتراک دارد ، استفاده می کنید ، پس برنامه شما باید به طور خودکار اشتراک بازیابی از نگهدارنده حساب را انجام دهد.

به یک پیام SubscriptionNotification با نوع SUBSCRIPTION_RECOVERED گوش دهید تا هنگام بازیابی اشتراک به شما اطلاع داده شود و کاربر باید دسترسی را دوباره بدست آورد. اگر پس از دریافت این اعلان ، از اشتراک خود پرس و جو کنید ، قسمت expiryTime در آینده روی یک Timestamp تنظیم شده است و قسمت 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 در این مورد ارسال می شود. هنگامی که این اعلان را دریافت کردید ، از API توسعه دهنده Google Play پرس و جو کنید تا آخرین منبع اشتراک را بدست آورید. پس از تأیید اینکه 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 با لغو کار کاربر ارسال می شود وقتی که پرداخت ها برای دوره تعهد باقی می مانند. لغو در انتظار است و در پایان دوره تعهد فعلی اجرا می شود. هنگامی که این اعلان را دریافت می کنید ، منبع اشتراک برگرفته از API توسعه دهنده Google Play دارای قسمت اشتراک گذاری است که به 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 هنگام وقوع این اتفاق ارسال می شود. هنگامی که این اعلان را دریافت می کنید ، منبع اشتراک بازگشت از API توسعه دهنده Google Play دارای قسمت subscriptionState است که به SUBSCRIPTION_STATE_EXPIRED تنظیم شده است.

منبع اشتراک برای یک خرید ابطال شده شبیه به مثال زیر است:

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

اشتراک های معوق

دلایل مختلفی وجود دارد که ممکن است بخواهید حق کاربر را گسترش دهید. به عنوان مثال ، شما ممکن است بخواهید به عنوان یک تبلیغ ویژه ، دسترسی رایگان به کاربران ارائه دهید ، مانند دادن یک هفته رایگان برای خرید یک فیلم یا دسترسی رایگان به مشتریان به عنوان یک ژست حسن نیت. شما می توانید از روش purchases.subscriptions.defer از API توسعه دهنده Play استفاده کنید تا تاریخ Bililng بعدی را برای یک اشتراک مجدد خودکار تهیه کنید. هنگامی که این کار را انجام می دهید ، یک پیام SubscriptionNotification با نوع SUBSCRIPTION_DEFERRED ارسال می شود. در دوره تعویق ، کاربر با دسترسی کامل در محتوای شما مشترک می شود اما شارژ نمی شود. تاریخ تجدید اشتراک به روز شده است تا تاریخ جدید را منعکس کند.

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

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

{
  "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 نشان داده شده است. وقتی کاربر به صورت دستی از سر گرفته می شود ، تاریخ صورتحساب در تاریخ رزومه دستی تغییر می کند.

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

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

در حالی که اشتراک لغو شده است اما هنوز منقضی نشده است ، کاربر هنوز مشترک است و مزایای اشتراک را دریافت می کند. اگر کاربر دوباره ارسال شود ، لغو به طور موثری خنثی می شود و اشتراک همچنان به تجدید ادامه می یابد. این عمل به عنوان Restore in Play Developer و API ها شناخته می شود.

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

اینها خریدهای جدیدی هستند. Google Play یک نشانه خرید کاملاً جدید را صادر می کند ، و پس زمینه شما RTDN را با نوع SUBSCRIPTION_PURCHASED دریافت می کند. وضعیت خرید برای این نوع از خرید خارج از برنامه شامل یک linkedPurchaseToken در ارتباط با خرید اصلی در آن مورد نیست ، زیرا اشتراک اصلی کاملاً منقضی شده است. اینها خریدهای جدیدی هستند که پس زمینه شما باید مانند هر خرید دیگری پردازش و تصدیق کند.

به روزرسانی ، کاهش و ارسال مجدد

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

علاوه بر این ، منبع اشتراک بازگشت از API توسعه دهنده Google Play حاوی یک قسمت linkedPurchaseToken است که نشانگر خرید قدیمی است که کاربر از آن به روز می کند ، کاهش می یابد ، یا دوباره ارسال می شود. شما می توانید از Token Buy در آن قسمت استفاده کنید تا اشتراک قدیمی را جستجو کرده و حساب کاربری موجود را شناسایی کنید تا بتوانید خرید جدید را با همان حساب مرتبط کنید.

قبل از ارائه گزینه های به روزرسانی ، کاهش یا ارسال مجدد گزینه ها به کاربر در برنامه خود ، باید اشتراک موجود را تصدیق کنید. اگر اشتراک موجود هنوز در انتظار تصدیق باشد ، هرگونه تغییر برنامه یا ارسال مجدد مسدود می شود.

اگر کاربر با موفقیت به روزرسانی ، کاهش یا ارسال مجدد را خریداری کند ، این یک خرید جدید است که باید آن را تصدیق کنید. روش توصیه شده برای انجام این کار استفاده از API توسعه دهنده Google Play است. منبع اشتراک شبیه به مثال زیر است:

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

تغییرات قیمت

راهنمای بهترین شیوه های تغییر قیمت را برای یادگیری در مورد تغییر قیمت های اشتراک مجدد خودکار و اطلاع رسانی به کاربران در صورت لزوم مشاهده کنید.

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

برنامه های پیش پرداخت به صورت خودکار تمدید نمی شوند ، بنابراین نمی توان آنها را لغو کرد. اگر کاربر بخواهد یک برنامه پیش پرداخت را لغو کند ، می تواند به تاریخ انقضا خود برسد.