QDAppStoreManager.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using UnityEngine.Purchasing;
  2. using UnityEngine;
  3. namespace GFGGame
  4. {
  5. public class QDAppStoreManager
  6. {
  7. public static void Init()
  8. {
  9. QDManager.isInited = true;
  10. IAPManager.Instance.InitializePurchasing();
  11. }
  12. public static void Pay(int buyID, int count, string orderID, long Price)
  13. {
  14. IAPManager.Instance.Pay(buyID, count, orderID, Price);
  15. }
  16. public static void OnEnterGame()
  17. {
  18. IAPManager.Instance.CheckOrderToDo();
  19. }
  20. }
  21. public class IAPManager : SingletonBase<IAPManager>, IStoreListener
  22. {
  23. IStoreController m_StoreController; // The Unity Purchasing system.
  24. private IAppleExtensions m_AppleExtensions;
  25. private bool canMakePayments;
  26. private string OrderId;
  27. private string OrderIdLocal
  28. {
  29. get
  30. {
  31. return PlayerPrefs.GetString(OrderIdLocalkey, null);
  32. }
  33. set
  34. {
  35. PlayerPrefs.SetString(OrderIdLocalkey, value);
  36. }
  37. }
  38. private string TransactionId
  39. {
  40. get
  41. {
  42. return PlayerPrefs.GetString(TransactionIdLocalkey, null);
  43. }
  44. set
  45. {
  46. PlayerPrefs.SetString(TransactionIdLocalkey, value);
  47. }
  48. }
  49. private string OrderIdLocalkey
  50. {
  51. get { return RoleDataManager.roleId + "OrderId"; }
  52. }
  53. private string TransactionIdLocalkey
  54. {
  55. get { return RoleDataManager.roleId + "transactionID"; }
  56. }
  57. public void CheckOrderToDo()
  58. {
  59. if (!string.IsNullOrEmpty(this.OrderIdLocal) && !string.IsNullOrEmpty(this.TransactionId))
  60. {
  61. IOSRechargeSProxy.IosVerifyOrder(OrderIdLocal, this.TransactionId).Coroutine();
  62. }
  63. }
  64. public void Pay(int buyID, int count, string orderID, long Price)
  65. {
  66. Debug.Log($"Pay {buyID}");
  67. if(!canMakePayments)
  68. {
  69. PromptController.Instance.ShowFloatTextPrompt("应用内购 (IAP) 可能在设备设置中受到限制,请开启后再试。");
  70. return;
  71. }
  72. if(!string.IsNullOrEmpty(this.OrderIdLocal))
  73. {
  74. PromptController.Instance.ShowFloatTextPrompt("有未完成的订单,请稍后再试!");
  75. CheckOrderToDo();
  76. return;
  77. }
  78. if(!string.IsNullOrEmpty(this.OrderId))
  79. {
  80. PromptController.Instance.ShowFloatTextPrompt("有未完成的订单,请稍后再试!");
  81. return;
  82. }
  83. ViewManager.Show<ModalStatusView>("");
  84. this.OrderId = orderID;
  85. m_StoreController.InitiatePurchase(buyID + "");
  86. }
  87. public void OnServerSuccess(string OrderId, string TransactionId)
  88. {
  89. this.OrderId = null;
  90. this.OrderIdLocal = null;
  91. this.TransactionId = null;
  92. PlayerPrefs.DeleteKey(OrderIdLocalkey);
  93. PlayerPrefs.DeleteKey(TransactionIdLocalkey);
  94. }
  95. public void InitializePurchasing()
  96. {
  97. Debug.Log("InitializePurchasing");
  98. var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
  99. canMakePayments = builder.Configure<IAppleConfiguration>().canMakePayments;
  100. builder.Configure<IAppleConfiguration>().SetApplePromotionalPurchaseInterceptorCallback(OnPromotionalPurchase);
  101. var dataArray = ShopCfgArray.Instance.dataArray;
  102. foreach(var shopCfg in dataArray)
  103. {
  104. if(shopCfg.costType == CostType.RMB)
  105. {
  106. builder.AddProduct(shopCfg.id + "", ProductType.Consumable);
  107. }
  108. }
  109. UnityPurchasing.Initialize(this, builder);
  110. }
  111. public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
  112. {
  113. Debug.Log("In-App Purchasing successfully initialized");
  114. m_StoreController = controller;
  115. m_AppleExtensions = extensions.GetExtension<IAppleExtensions>();
  116. EventAgent.DispatchEvent(ConstMessage.ON_PLATFORM_SDK_INITED, true);
  117. // 在 Apple 平台上,我们需要处理由 Apple 的"购买前先询问"功能导致的延期购买。
  118. //在非 Apple 平台上,这将不起作用;永远不会调用 OnDeferred。
  119. m_AppleExtensions.RegisterPurchaseDeferredListener(OnDeferred);
  120. }
  121. public void OnInitializeFailed(InitializationFailureReason error)
  122. {
  123. Debug.Log($"In-App Purchasing initialize failed: {error}");
  124. EventAgent.DispatchEvent(ConstMessage.ON_PLATFORM_SDK_INITED, false);
  125. }
  126. public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
  127. {
  128. Debug.Log($"Purchase failed - Product: '{product.definition.id}', PurchaseFailureReason: {failureReason}");
  129. this.OrderId = null;
  130. ViewManager.Hide<ModalStatusView>();
  131. switch (failureReason)
  132. {
  133. case PurchaseFailureReason.PurchasingUnavailable:
  134. PromptController.Instance.ShowFloatTextPrompt("应用内购 (IAP) 可能在设备设置中受到限制,请开启后再试。");
  135. break;
  136. case PurchaseFailureReason.ExistingPurchasePending:
  137. PromptController.Instance.ShowFloatTextPrompt("现购待定,请稍后再试。");
  138. break;
  139. case PurchaseFailureReason.ProductUnavailable:
  140. PromptController.Instance.ShowFloatTextPrompt("该商品不可购买,请稍后再试。");
  141. break;
  142. case PurchaseFailureReason.SignatureInvalid:
  143. PromptController.Instance.ShowFloatTextPrompt("验证失败,请稍后再试。");
  144. break;
  145. case PurchaseFailureReason.UserCancelled:
  146. break;
  147. case PurchaseFailureReason.PaymentDeclined:
  148. PromptController.Instance.ShowFloatTextPrompt("此次购买被拒绝,请稍后再试。");
  149. break;
  150. case PurchaseFailureReason.DuplicateTransaction:
  151. PromptController.Instance.ShowFloatTextPrompt("重复的交易,请稍后再试。");
  152. break;
  153. default:
  154. PromptController.Instance.ShowFloatTextPrompt("购买失败,请稍后再试!");
  155. break;
  156. }
  157. }
  158. public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
  159. {
  160. ViewManager.Hide<ModalStatusView>();
  161. //Retrieve the purchased product
  162. var product = args.purchasedProduct;
  163. Debug.Log($"Purchase Complete - Product: {product.definition.id}");
  164. this.OrderIdLocal = this.OrderId;
  165. this.TransactionId = product.transactionID;
  166. GameGlobal.maxShowOrderTime = 300000;
  167. IOSRechargeSProxy.IosVerifyOrder(OrderIdLocal, product.transactionID).Coroutine();
  168. //We return Complete, informing IAP that the processing on our side is done and the transaction can be closed.
  169. return PurchaseProcessingResult.Complete;
  170. }
  171. /// &lt;summary>
  172. /// 特定于 iOS。
  173. /// 未成年人要求购买并提交给家长批准时,
  174. /// 此函数将作为 Apple 的"购买前先询问"功能的一部分
  175. /// 接受调用。
  176. ///
  177. /// 购买被批准或拒绝时,将触发正常的购买
  178. /// 事件。
  179. /// &lt;/summary>
  180. /// &lt;param name="item">Item.&lt;/param>
  181. private void OnDeferred(Product item)
  182. {
  183. Debug.Log("Purchase deferred: " + item.definition.id);
  184. PromptController.Instance.ShowFloatTextPrompt("未成年人购买需要经过家长批准才能继续!");
  185. }
  186. private void OnPromotionalPurchase(Product item)
  187. {
  188. Debug.Log("Attempted promotional purchase: " + item.definition.id);
  189. // 已检测到推荐性购买。
  190. // 通过呈现家长控制门等方式处理此事件。
  191. //此处,仅出于演示目的,我们将等待五秒钟
  192. // 再继续购买。
  193. //StartCoroutine(ContinuePromotionalPurchases());
  194. }
  195. }
  196. }