Нема описа
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SubscriptionGroup.cs 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.Purchasing;
  5. namespace Samples.Purchasing.GooglePlay.UpgradeDowngradeSubscription
  6. {
  7. /// <summary>
  8. /// A subscription group is a list of subscriptions where a user can only be subscribed to a single subscription in the group at one time.
  9. /// The subscriptions in the group are ordered by their tier, meaning a user can upgrade or downgrade from one subscription to another in the group.
  10. /// </summary>
  11. public class SubscriptionGroup
  12. {
  13. IStoreController m_StoreController;
  14. IExtensionProvider m_ExtensionsProvider;
  15. string[] m_SubscriptionIds;
  16. GooglePlayProrationMode m_UpgradeSubscriptionProrationMode;
  17. GooglePlayProrationMode m_DowngradeSubscriptionProrationMode;
  18. public SubscriptionGroup(IStoreController storeController, IExtensionProvider extensionsProvider, GooglePlayProrationMode upgradeSubscriptionProrationMode,
  19. GooglePlayProrationMode downgradeSubscriptionProrationMode, params string[] subscriptionIds)
  20. {
  21. m_StoreController = storeController;
  22. m_UpgradeSubscriptionProrationMode = upgradeSubscriptionProrationMode;
  23. m_DowngradeSubscriptionProrationMode = downgradeSubscriptionProrationMode;
  24. m_ExtensionsProvider = extensionsProvider;
  25. m_SubscriptionIds = subscriptionIds;
  26. }
  27. public void BuySubscription(string newSubscriptionId)
  28. {
  29. var currentSubscriptionId = CurrentSubscriptionId();
  30. if (IsASubscriptionChange(currentSubscriptionId, newSubscriptionId))
  31. {
  32. ChangeSubscriptionTier(currentSubscriptionId, newSubscriptionId);
  33. }
  34. else
  35. {
  36. m_StoreController.InitiatePurchase(newSubscriptionId);
  37. }
  38. }
  39. static bool IsASubscriptionChange(string previousSubscriptionId, string newSubscriptionId)
  40. {
  41. return previousSubscriptionId != null && previousSubscriptionId != newSubscriptionId;
  42. }
  43. void ChangeSubscriptionTier(string currentSubscriptionId, string newSubscriptionId)
  44. {
  45. Debug.Log($"Change Subscription from {currentSubscriptionId} to {newSubscriptionId}");
  46. var prorationMode = (int)DetermineProrationMode(currentSubscriptionId, newSubscriptionId);
  47. var googlePlayStoreExtension = m_ExtensionsProvider.GetExtension<IGooglePlayStoreExtensions>();
  48. googlePlayStoreExtension.UpgradeDowngradeSubscription(currentSubscriptionId, newSubscriptionId, prorationMode);
  49. }
  50. GooglePlayProrationMode DetermineProrationMode(string previousSubscriptionId, string newSubscriptionId)
  51. {
  52. //In this sample, we use different proration modes depending on if the new subscription is an upgrade compared to the current one.
  53. var isNewSubscriptionAnUpgrade = IsSubscriptionAnUpgrade(previousSubscriptionId, newSubscriptionId);
  54. return isNewSubscriptionAnUpgrade ? m_UpgradeSubscriptionProrationMode : m_DowngradeSubscriptionProrationMode;
  55. }
  56. bool IsSubscriptionAnUpgrade(string currentSubscription, string newSubscription)
  57. {
  58. return SubscriptionTier(newSubscription) > SubscriptionTier(currentSubscription);
  59. }
  60. int SubscriptionTier(string subscriptionId)
  61. {
  62. return Array.IndexOf(m_SubscriptionIds, subscriptionId);
  63. }
  64. public string CurrentSubscriptionId()
  65. {
  66. return m_SubscriptionIds.FirstOrDefault(IsSubscribedTo);
  67. }
  68. bool IsSubscribedTo(string subscriptionId)
  69. {
  70. var subscriptionProduct = m_StoreController.products.WithID(subscriptionId);
  71. return IsSubscribedTo(subscriptionProduct);
  72. }
  73. static bool IsSubscribedTo(Product subscription)
  74. {
  75. // If the product doesn't have a receipt, then it wasn't purchased and the user is therefore not subscribed.
  76. if (subscription?.receipt == null)
  77. {
  78. return false;
  79. }
  80. var subscriptionManager = new SubscriptionManager(subscription, null);
  81. var subscriptionInfo = subscriptionManager.getSubscriptionInfo();
  82. return subscriptionInfo.isSubscribed() == Result.True;
  83. }
  84. }
  85. }