using System; using System.Collections.Generic; using BallKingdomCrush; using Newtonsoft.Json; using SGModule.Common; using SGModule.Common.Helper; using SGModule.GooglePay; using SGModule.NetKit; using UnityEngine; public enum PayType { buy_one, buy_one_off, buy_gold_1, buy_gold_2, buy_gold_3, buy_gold_4, buy_gold_5, remove_ad, battle_pass, pack_reward, fail_pack, three_days_gift, weekly_subscription, monthly_subscription, yearly_subscription } public class PurchasingManager { private static readonly List PayConfig = ConfigSystem.GetConfig(); public static string GetPaySku(PayType key) { var keys = ""; if (PayConfig != null) foreach (var data in PayConfig) { if (data.payKey != key.ToString()) continue; keys = data.sku; break; } return keys; } public static int GetVipLvFormConfig(string sku) { var lv = 1; if (GetPaySku(PayType.weekly_subscription) == sku) lv = 1; else if (GetPaySku(PayType.monthly_subscription) == sku) lv = 2; else if (GetPaySku(PayType.yearly_subscription) == sku) lv = 3; return lv; } #if UNITY_IOS public static void InitProduct() { var appleData = new ApplePayData { sku = "", amount = 0, currency = "USD", shopName = "", type = "" }; //初始化商品 ApplePayManager.Instance.InitProduct(ConfigSystem.GetConfig(), ConfigManager.GameConfig.packageName, PurchasingManager.ApplePaySuccessCallback(appleData)); } public static void Purchase(ApplePayData payData) { //本地测试 // TestIOSPay(payData); // return; Debug.Log($"[Apple Pay] unity Purchase--0-----: {payData.sku}"); ApplePayManager.Instance.Purchase(payData.sku, ApplePaySuccessCallback(payData), message => { Debug.Log("purchase fail------- reason: " + message); }); } public static Action ApplePaySuccessCallback(ApplePayData payData) { return (backType, AppleResponseData) => { Debug.Log($"[Apple Pay] unity Purchase--1-----: {backType.ToString()}"); switch (backType) { case ApplePayBackType.Create: Debug.Log("[Apple Pay] Create"); var sku0 = SetSku(payData); Debug.Log($"[Apple Pay] Create---11: {sku0}"); SendEventClickByName(sku0, "click"); break; case ApplePayBackType.Check: UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Close); if (AppleResponseData != null && AppleResponseData.sku.Contains(".sub")) { DataMgr.VipExpirationTime.Value = Math.Max(DataMgr.VipExpirationTime.Value, AppleResponseData.expires_time); var level = GetVipLvFormConfig(AppleResponseData.sku); DataMgr.VipLevel.Value = level; payData.sku = AppleResponseData.sku; payData.shopName = "vip_club" + (level - 1); } var sku = SetSku(payData); Debug.Log($"[Apple Pay] Check sku===2===== {sku}"); GameDispatcher.Instance.Dispatch(GameMsg.apple_pay_success, sku); Debug.Log($"[Apple Pay] Check sku===3===== {sku}"); SendEventClickByName(sku, "open"); SendEventClickByName(sku, "success"); break; case ApplePayBackType.Cancel: Debug.Log("[Apple Pay] Cancel"); var sku1 = SetSku(payData); SendEventClickByName(sku1, "open"); break; } }; } private static void TestIOSPay(ApplePayData payData) { var tranId = ""; var types = ProductType.Consumable; if (GetPaySku(PayType.battle_pass) == payData.sku) { tranId = "2000000983625783"; } else if (GetPaySku(PayType.weekly_subscription) == payData.sku) { tranId = "2000000984643029"; types = ProductType.Subscription; } if (tranId == "") return ; ApplePayManager.Instance.ApplePayTest(types, payData.sku, tranId, ApplePaySuccessCallback(payData)); } private static string SetSku(ApplePayData data) { string sku = ""; if (data.type != null && data.type == GetPaySku(PayType.remove_ad)) { sku = data.type; } else if (data.sku.Contains("shop")) { sku = data.shopName; } else if (data.sku.Contains(".sub")) { sku = data.shopName; } else { sku = data.sku; } return sku; } #elif UNITY_ANDROID public static void InitProduct() { var googleData = new GooglePayData { sku = "", amount = 0, currency = "USD", shopName = "", type = "" }; //初始化商品 GooglePayManager.Instance.InitProduct(ConfigSystem.GetConfig(), ConfigManager.GameConfig.packageName, ApplePaySuccessCallback(googleData)); // IAPManagerV5.Instance.InitIAPSystem(ConfigSystem.GetConfig(),ApplePaySuccessCallback(googleData), ConfigManager.GameConfig.packageName); } private static bool _isChecking = false; private static bool isFlag = false; public static void CheckSubExpiration(bool isLogin = false) { Debug.Log($"[PurchasingManager] 检查订阅开始 CheckSubExpiration isLogin: {isLogin}"); if (_isChecking || DataMgr.VipRequestNum.Value > 5) { Debug.Log($"[PurchasingManager] 检查订阅中,忽略本次调用 _isChecking== {_isChecking} VipRequestNum: {DataMgr.VipRequestNum.Value}"); return; } if (!isFlag && isLogin) { isFlag = true; DataMgr.VipRequestNum.Value++; //登录后的调用的次数 } _isChecking = true; GooglePayManager.Instance.CheckSubscription(OnCheckFinished); } private static void OnCheckFinished(bool success) { Debug.Log($"[PurchasingManager] 订阅检查完成 success={success}"); _isChecking = false; // ✅ 解锁 //只要订阅成功后,解除5次限制 if (success) { DataMgr.VipRequestNum.Value = 0; } else { DataMgr.VipLevel.Value = -1; } } public static void Purchase(GooglePayData payData) { //本地测试 // TestIOSPay(payData); // return; Debug.Log($"[Google Pay] unity Purchase--0-----: {payData.sku}"); GooglePayManager.Instance.Purchase(payData.sku, ApplePaySuccessCallback(payData), message => { Debug.Log("purchase fail------- reason: " + message); }); } public static Action ApplePaySuccessCallback(GooglePayData payData) { return (backType, GoogleResponseData) => { Debug.Log($"[Google Pay] unity Purchase--1-----: {backType.ToString()}"); if (GoogleResponseData != null) Debug.Log($"[Google Pay] GoogleResponseData sku===: {GoogleResponseData.sku}"); MaxPayManager.isOfficialPay = true; switch (backType) { case GooglePayBackType.Create: Debug.Log("[Google Pay] Create"); var sku0 = SetSku(payData); Debug.Log($"[Google Pay] Create---11: {sku0}"); SendEventClickByName(sku0, "click"); break; case GooglePayBackType.Check: UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Close); if (GoogleResponseData != null && GoogleResponseData.sku.Contains(".sub")) { if (GoogleResponseData.expires_time > 0) { DataMgr.VipExpirationTime.Value = Math.Max(DataMgr.VipExpirationTime.Value, GoogleResponseData.expires_time); Debug.Log( $"[Google Pay] Pay GoogleResponseData.expires_time == {GoogleResponseData.expires_time} {DataMgr.VipExpirationTime.Value}"); } var level = GetVipLvFormConfig(GoogleResponseData.sku); DataMgr.VipLevel.Value = level; payData.sku = GoogleResponseData.sku; payData.shopName = "vip_club" + (level - 1); Debug.Log($"[Google Pay] Pay Success check sku==sub=== {GoogleResponseData.sku}"); GameHelper.CheckVipExpiration(); } else if (GoogleResponseData != null && GoogleResponseData.sku.Contains("shop")) { payData.sku = GoogleResponseData.sku; var index = GetGoldIndex(GoogleResponseData.sku); Debug.Log($"[Google Pay] check sku===== {GoogleResponseData.sku}"); Debug.Log($"[Google Pay] check index===== {index}"); payData.shopName = $"buy_gold{index}"; } else if (GoogleResponseData != null) { payData.sku = GoogleResponseData.sku; } var sku = SetSku(payData); Debug.Log($"[Google Pay] Check sku===-1===== {JsonConvert.SerializeObject(payData)}"); Debug.Log($"[Google Pay] Check sku===2===== {sku}"); GameDispatcher.Instance.Dispatch(GameMsg.apple_pay_success, sku); Debug.Log($"[Google Pay] Check sku===3===== {sku}"); SendEventClickByName(sku, "open"); SendEventClickByName(sku, "success"); break; case GooglePayBackType.Cancel: Debug.Log("[Google Pay] Cancel"); var sku1 = SetSku(payData); SendEventClickByName(sku1, "open"); BIManager.Instance.TrackPurchase(payData.amount, payData.currency, "0", payData.sku, "paid_err"); break; case GooglePayBackType.TimeOut: Debug.Log("[Google Pay] timeout"); GameHelper.ShowTips("no_connect", true); break; } }; } private static string SetSku(GooglePayData data) { var sku = ""; if (data.type != null && data.type == GetPaySku(PayType.remove_ad)) sku = data.type; else if (data.sku.Contains("shop")) sku = data.shopName; else if (data.sku.Contains(".sub")) sku = data.shopName; else sku = data.sku; return sku; } private static int GetGoldIndex(string sku) { var idx = 0; var list = ConfigSystem.GetConfig(); for (var i = 0; i < list.Count; i++) if (list[i].SKU == sku) { idx = i; break; } return idx; } #endif private static void SendEventClickByName(string name, string type) { if (name == null) return; string clickTrackKey = null; string successTrackKey = null; string openTrackKey = null; if (name == GetPaySku(PayType.pack_reward)) { clickTrackKey = ADEventTrack.Property.lucky_gift_click; successTrackKey = ADEventTrack.Property.lucky_gift_receive; openTrackKey = ADEventTrack.Property.lucky_gift_show; } else if (name == GetPaySku(PayType.remove_ad)) { clickTrackKey = ADEventTrack.Property.remove_ad_click; successTrackKey = ADEventTrack.Property.remove_ad_receive; openTrackKey = ADEventTrack.Property.remove_ad_show; } else if (name == GetPaySku(PayType.battle_pass)) { clickTrackKey = ADEventTrack.Property.master_pass_click; successTrackKey = ADEventTrack.Property.master_pass_receive; openTrackKey = ADEventTrack.Property.master_pass_show; } else if (name == GetPaySku(PayType.buy_one)) { clickTrackKey = ADEventTrack.Property.buy_one_click; successTrackKey = ADEventTrack.Property.buy_one_success; openTrackKey = ADEventTrack.Property.buy_one_show; } else if (name == GetPaySku(PayType.buy_one_off)) { // clickTrackKey = ADEventTrack.Property.BuyOneOffClick; // successTrackKey = ADEventTrack.Property.BuyOneOffSuccess; // openTrackKey = ADEventTrack.Property.BuyOneOffShow; } else if (name == GetPaySku(PayType.fail_pack)) { clickTrackKey = ADEventTrack.Property.fail_click; successTrackKey = ADEventTrack.Property.fail_buy_success; openTrackKey = ADEventTrack.Property.fail_show; } else if (name == GetPaySku(PayType.three_days_gift)) { clickTrackKey = ADEventTrack.Property.three_days_gift_click; successTrackKey = ADEventTrack.Property.three_days_gift_buy_success; openTrackKey = ADEventTrack.Property.three_days_gift_show; } if (name.StartsWith("buy_gold")) { var startIndex = "buy_gold".Length; var suffix = name[startIndex..]; // 截取 "gold" 后的所有字符 clickTrackKey = ADEventTrack.Property.shop_click_ + suffix; successTrackKey = ADEventTrack.Property.shop_receive_ + suffix; openTrackKey = ADEventTrack.Property.shop_show; } if (name.StartsWith("vip_club")) { Debug.Log("SendEventClickByName:" + name + " type:" + type); var startIndex = "vip_club".Length; var suffix = name[startIndex..]; // 截取 "gold" 后的所有字符 clickTrackKey = ADEventTrack.Property.vip_click_ + suffix; successTrackKey = ADEventTrack.Property.vip_success_ + suffix; openTrackKey = ADEventTrack.Property.vip_show_page; } if (type == "success" && successTrackKey != null) TrackKit.SendEvent(ADEventTrack.Google_Pay_Event, successTrackKey); else if (type == "click" && clickTrackKey != null) TrackKit.SendEvent(ADEventTrack.Google_Pay_Event, clickTrackKey); else if (type == "open" && openTrackKey != null) TrackKit.SendEvent(ADEventTrack.Google_Pay_Event, openTrackKey); } }