using UnityEngine; using DG.Tweening; using Newtonsoft.Json; using System.Collections.Generic; using System.Collections; using UnityEngine.UI; using System.Linq; using System; using IgnoreOPS; using SGModule.ApplePay; using SGModule.Common.Helper; using SGModule.NetKit; using RedHotRoast; using Unity.VisualScripting; public class MaxPayManager { public static readonly MaxPayManager Instance = new MaxPayManager(); public static bool isPay = false; // public static Dictionary statusDictionary = new(); MaxPayManager() { } // public static string buy_one = "com.rainforestworld.space.24.99"; // // // public static string buy_gold_1 = "com.rainforestworld.shop.1.99"; // // public static string buy_gold_2 = "com.rainforestworld.shop.3.99"; // // public static string buy_gold_3 = "com.rainforestworld.shop.19.99"; // // public static string buy_gold_4 = "com.rainforestworld.shop.39.99"; // public static string remove_ad = "com.rainforestworld.remove.2.99"; // public static string battle_pass = "com.rainforestworld.pass.9.99"; // public static string pack_reward = "com.rainforestworld.reward.1.99"; // public static string fail_pack = "com.rainforestworld.fail.1.99"; // public static string three_days_gift = "com.rainforestworld.three.1.99"; // public static string secret_albnums = "com.rainforestworld.secret_albnums.3.99"; public static bool isIOSPay = false; // private static readonly Dictionary _payTrackMap = new() // { // [buy_one] = new PayTrackMapping // { // EventKey = ADEventTrack.MaxPayEvent, // ClickPropertyKey = _ => ADEventTrack.Property.buy_one_click, // }, // [remove_ad] = new PayTrackMapping // { // EventKey = ADEventTrack.MaxPayEvent, // ClickPropertyKey = _ => ADEventTrack.Property.remove_ad_click // }, // [pack_reward] = new PayTrackMapping // { // EventKey = ADEventTrack.MaxPayEvent, // ClickPropertyKey = _ => ADEventTrack.Property.lucky_gift_click // }, // [battle_pass] = new PayTrackMapping // { // EventKey = ADEventTrack.MaxPayEvent, // ClickPropertyKey = _ => ADEventTrack.Property.master_pass_click // }, // ["buy_gold"] = new PayTrackMapping // { // EventKey = ADEventTrack.MaxPayEvent, // ClickPropertyKey = suffix => ADEventTrack.Property.gold_click_ + suffix // }, // ["secret_albnums"] = new PayTrackMapping // { // EventKey = ADEventTrack.MaxPayEvent, // ClickPropertyKey = suffix => ADEventTrack.Property.secret_click_ + suffix // }, // ["vip_club"] = new PayTrackMapping // { // EventKey = ADEventTrack.MaxPayEvent, // ClickPropertyKey = suffix => ADEventTrack.Property.vip_click_ + suffix // }, // // }; public void Buy(ApplePayClass _data) { if (!GameHelper.IsConnect()) { GameHelper.ShowTips("no_connect", true); return; } UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Open); System.Random random = new(); int paymentMethod = random.Next(0, 100); // 生成0到100之间的随机整数,包括0-99 int PayRate = GameHelper.GetCommonModel().PayRate; Debug.Log($"[max] paymentMethod:{paymentMethod} PayRate:{PayRate} _data.sku=={_data.sku}"); if ((!GameHelper.IsGiftSwitch() || paymentMethod < PayRate) && !_data.sku.Contains("secret_albnums")) { // Debug.Log("barry ios pay"); // 调用官方支付逻辑 isIOSPay = true; var appleData = new ApplePayData { sku = _data.sku, amount = _data.amount, currency = _data.currency, shopName = _data.shopName, type = _data.type }; PurchasingManager.Purchase(appleData); } else { // Debug.Log("barry max pay"); // 调用三方支付逻辑 StopPayCoroutine(); isIOSPay = false; SaveData.GetSaveObject().max_pay_object = _data; MaxPay(_data); } } /// /// 发起第三发支付 /// public void MaxPay(ApplePayClass data_) { Debug.Log($"[barry] MaxPay----- {JsonConvert.SerializeObject(data_)}"); ApplePayClass paydata = data_; SaveData.pay_time = Time.time; if (data_.sku == PurchasingManager.GetPaySku(PayType.buy_one)) { TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.buy_one_click); } else if (data_.sku == PurchasingManager.GetPaySku(PayType.buy_one_off)) { // TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.BuyOneOffClick); } else if (data_.sku != null && data_.sku == PurchasingManager.GetPaySku(PayType.remove_ad)) { TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.remove_ad_click); } else if (data_.sku == PurchasingManager.GetPaySku(PayType.pack_reward)) { TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.lucky_gift_click); } else if (data_.shopName != null && data_.shopName.StartsWith("buy_gold")) { int startIndex = "buy_gold".Length; string suffix = paydata.shopName[startIndex..]; // 截取 "gold" 后的所有字符 string eventClickName = $"gold_click_{suffix}"; TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.gold_click_ + suffix); } else if (data_.sku.StartsWith("secret_albnums")) { string suffix = data_.sku["secret_albnums".Length..]; TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.secret_albums_click_ + suffix); } else if (data_.sku.StartsWith("vip_club")) { string suffix = data_.sku["vip_club".Length..]; TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.vip_click_ + suffix); } else if (data_.sku == PurchasingManager.GetPaySku(PayType.battle_pass)) { TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.master_pass_click); } else if (data_.sku == PurchasingManager.GetPaySku(PayType.fail_pack)) { TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.fail_click); } else if (data_.sku == PurchasingManager.GetPaySku(PayType.three_days_gift)) { TrackKit.SendEvent(ADEventTrack.MaxPayEvent, ADEventTrack.Property.three_days_gift_click); } PayerData requestData = new PayerData() { amount = data_.amount, }; //max 支付订单创建 NetKit.Instance.Post("shop/paMPayIn", requestData, response => { if (response.IsSuccess) { UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Close); // Debug.Log($"max 支付订单创建:{JsonConvert.SerializeObject(obj)}"); SaveData.GetSaveObject().max_pay_object.innerOrderId = response.Data.order_id; paydata.status = 1; SavePayData(response.Data.order_id, paydata); isPay = true; OpenBrowser.OpenURL(response.Data.pay_url); } }); } public void SavePayData(string orderId, ApplePayClass payData) { // Debug.Log($"max 支付 SavePayData: orderId={orderId} status={payData}"); // 加载已保存的支付数据 var payDataJson = PlayerPrefs.GetString("three_pay_data", "{}"); var statusDictionary = JsonConvert.DeserializeObject>(payDataJson); // Debug.Log($"max 支付 statusDictionary {statusDictionary}"); // 判断是否已有相同的 orderId if (statusDictionary.ContainsKey(orderId)) { // Debug.Log($"max 支付 statusDictionary 已存在 orderId {orderId}"); // 更新现有条目的状态 statusDictionary[orderId] = payData; } else { // 添加新的条目 // Debug.Log($"max 支付 statusDictionary 不存在 orderId {orderId}"); statusDictionary.Add(orderId, payData); } // 保存更新后的数据 PlayerPrefs.SetString("three_pay_data", JsonConvert.SerializeObject(statusDictionary)); // Debug.Log($"max 支付 three_pay_data {JsonConvert.SerializeObject(statusDictionary)}"); } public ApplePayClass GetPayData(string orderId) { var payDataJson = PlayerPrefs.GetString("three_pay_data", "{}"); var statusDictionary = JsonConvert.DeserializeObject>(payDataJson); if (statusDictionary.ContainsKey(orderId)) { return statusDictionary[orderId]; } return null; } public bool GetPayStatus() { bool isCheck = false; var payDataJson = PlayerPrefs.GetString("three_pay_data", "{}"); var statusDictionary = JsonConvert.DeserializeObject>(payDataJson); if (statusDictionary == null) return false; foreach (var entry in statusDictionary) { if (entry.Value.status == 1) { isCheck = true; break; } } return isCheck; } private int PayStatus = -1; private Coroutine PayCoroutine; public IEnumerator ProcessPayData() { var payDataJson = PlayerPrefs.GetString("three_pay_data", "{}"); var statusDictionary = JsonConvert.DeserializeObject>(payDataJson); foreach (var entry in statusDictionary.OrderByDescending(pair => pair.Key)) { // Debug.Log($"max 支付 ProcessPayData0======{entry.Key} status:{entry.Value}"); if (entry.Value.status == 1) { bool keepRequesting = true; while (keepRequesting) { // 发起请求 PaySuccess(entry.Key); yield return new WaitForSeconds(5f); // Debug.Log($"max 支付 ProcessPayData1======{entry.Key} status:{PayStatus}"); if (PayStatus == 1) { // 如果返回值为1,则等待5秒后再次请求 } else { // 如果返回值不为1,则停止循环 PayStatus = -1; keepRequesting = false; } yield return null; // 等待本次请求完成 } } } } public void StopPayCoroutine() { if (PayCoroutine != null) { CrazyAsyKit.StopCoroutine(PayCoroutine); } } public void PaySuccess() { // Debug.Log("max 支付 StartCoroutine------"); PayCoroutine = CrazyAsyKit.StartCoroutine(ProcessPayData()); } public void PaySuccess(string orderId) { var test = new maxOrder(); test.order_id = orderId; //max 支付订单查询 NetKit.Instance.Post("shop/paMPayOrderQuery", test, response => { Debug.Log($"max 支付订单查询: id= {orderId} is succ={response.IsSuccess}"); if (response.IsSuccess) { // Debug.Log($"max 支付订单查询: 成功,statu====: {obj.status}"); // Debug.Log($"max 支付订单查询: {JsonConvert.SerializeObject(obj)}"); PayStatus = response.Data.status; //1:支付中,需要定时查询 if (response.Data.status == 1) { var paydata = GetPayData(orderId); if (paydata != null) { paydata.status = 1; SavePayData(response.Data.order_id, paydata); } // reCreatPur(); } //2:支付成功,发奖 else if (response.Data.status == 2) { var paydata = GetPayData(orderId); if (paydata != null) { paydata.status = 2; SavePayData(response.Data.order_id, paydata); } UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Close); bool isOpen = false; if (paydata.sku == PurchasingManager.GetPaySku(PayType.buy_one)) { isOpen = HandleSku(paydata.sku, UIConst.AddViewUI, ADEventTrack.Property.buy_one_success); } // else if (paydata.sku == PurchasingManager.GetPaySku(PayType.buy_one_off)) // { // isOpen = HandleSku(paydata.sku, UIConst.AddViewUI, ADEventTrack.Property.BuyOneOffSuccess); // } else if (paydata.sku != null && paydata.sku == PurchasingManager.GetPaySku(PayType.remove_ad)) { isOpen = HandleSku(paydata.sku, UIConst.PackrewardUI, ADEventTrack.Property.remove_ad_receive); } else if (paydata.sku == PurchasingManager.GetPaySku(PayType.pack_reward)) { isOpen = HandleSku(paydata.sku, UIConst.PackrewardUI, ADEventTrack.Property.lucky_gift_receive); } else if (paydata.shopName != null && paydata.shopName.StartsWith("buy_gold")) { int startIndex = "buy_gold".Length; string suffix = paydata.shopName[startIndex..]; // 截取 "gold" 后的所有字符 string eventSuccessName = ADEventTrack.Property.shop_receive_ + suffix; isOpen = HandleSku(paydata.sku, UIConst.BuygoldUI, eventSuccessName); } else if (paydata.sku == PurchasingManager.GetPaySku(PayType.battle_pass)) { isOpen = HandleSku(paydata.sku, UIConst.PassViewUI, ADEventTrack.Property.master_pass_receive); } else if (paydata.sku == PurchasingManager.GetPaySku(PayType.fail_pack)) { isOpen = HandleSku(paydata.sku, UIConst.PackrewardUI, ADEventTrack.Property.fail_buy_success); } else if (paydata.sku == PurchasingManager.GetPaySku(PayType.three_days_gift)) { isOpen = HandleSku(paydata.sku, UIConst.ThreeDaysGiftUI, ADEventTrack.Property.three_days_gift_buy_success); } else if (paydata.sku.StartsWith("secret_albnums")) { int startIndex = "secret_albnums".Length; string suffix = paydata.sku[startIndex..]; // 截取 "secret_albnums" 后的所有字符 string eventSuccessName = ADEventTrack.Property.secret_albums_success_ + suffix; isOpen = HandleSku(paydata.sku, UIConst.SecretAlbumsNextUI, eventSuccessName); } else if (paydata.shopName != null && paydata.shopName.StartsWith("vip_club")) { int startIndex = "vip_club".Length; string suffix = paydata.shopName[startIndex..]; // 截取 "vip_club" 后的所有字符 string eventSuccessName = ADEventTrack.Property.vip_success_ + suffix; isOpen = HandleSku(paydata.sku, UIConst.VipClubViewUI, eventSuccessName); } else { // 处理未知的 sku 值 Debug.LogError($"Unknown SKU: {paydata.sku}"); throw new ArgumentException("Unknown SKU"); } string sku = ""; if (paydata.sku.Contains("shop") || paydata.sku.Contains("sub")) { sku = paydata.shopName; } else { sku = paydata.sku; } GameDispatcher.Instance.Dispatch(GameMsg.apple_pay_success, sku); DOVirtual.DelayedCall(1, () => { SaveData.GetSaveObject().max_pay_object = null; var paydata = GetPayData(orderId); if (paydata != null) { paydata.status = 4; SavePayData(response.Data.order_id, paydata); } }); } //3:支付失败,已领奖或者支付失败,或者查询次数达到上限 else if (response.Data.status == 3) { var paydata = GetPayData(orderId); if (paydata != null) { paydata.status = 3; SavePayData(response.Data.order_id, paydata); } OnPayFailed(orderId); } //4:已发货,服务端记录已经发过奖,若客户端未发奖可发奖 else { DOVirtual.DelayedCall(1, () => { var paydata = GetPayData(orderId); if (paydata != null) { paydata.status = 4; SavePayData(response.Data.order_id, paydata); } UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Close); SaveData.GetSaveObject().max_pay_object = null; string sku = ""; if (paydata.sku.Contains("shop")) { sku = paydata.shopName; } else { sku = paydata.sku; } GameDispatcher.Instance.Dispatch(GameMsg.apple_pay_success, paydata.sku); }); } } else { // Debug.Log("max 支付 验证订单失败"); // Debug.Log($"max 支付 验证订单失败: {JsonConvert.SerializeObject(obj)}"); //验证订单失败 // reCreatPur(); // status = -1; PayStatus = -1; } }); } bool HandleSku(string sku, string uiConst, string successEvent) { bool isOpen; try { isOpen = CheckIsOpen(uiConst); TrackKit.SendEvent(ADEventTrack.MaxPayEvent, successEvent); } catch (Exception ex) { // 记录异常信息 Debug.LogError($"Error handling SKU {sku}: {ex.Message}"); // 可以选择重新抛出异常或进行其他处理 throw; } return isOpen; } public void reCreatPur() //重新验证订单 { // Debug.Log($"max 支付 reCreatPur 重新验证订单: pay_object_data===: {JsonConvert.SerializeObject(SaveData.GetSaveObject().max_pay_object)}"); // if (SaveData.GetSaveObject().max_pay_object != null) // { // CrazyAsyKit.StartCoroutine(ProcessPayData()); // } } public void OnPayFailed(string orderId) { var paydata = GetPayData(orderId); if (paydata == null) { return; } UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Close); // Debug.LogWarning("OnPurchaseFailedproduct:" + product.transactionID + " failureReason:" + failureReason); BIManager.Instance.TrackPurchase(paydata.amount, paydata.currency, "1", paydata.sku, "paid_err"); DOVirtual.DelayedCall(1, () => { SaveData.GetSaveObject().max_pay_object = null; }); } private bool CheckIsOpen(string name) { var isOpen = UIManager.Instance.IsExistUI(name); return isOpen; } private static decimal GetGoldRewradNum(int index) { decimal rewardNum = 0; var list = ConfigSystem.GetConfig(); if (list.Count > 0 && list.Count > index) { rewardNum = list[index].Actual_coins; } return rewardNum; } private void GetPayReward(decimal goldNum) { if (goldNum == 0) return; var start = new Vector2(540, 960); var rewardData = new RewardData(); var rewardSingleData = new RewardSingleData(101, goldNum, RewardOrigin.AdTask) { startPosition = start, }; rewardData.AddReward(rewardSingleData); rewardData.displayType = RewardDisplayType.RewardFly | RewardDisplayType.ValueChange; GameDispatcher.Instance.Dispatch(GameMsg.GetReward, rewardData); } } public class maxOrder { public string order_id; } public class ApplePayClass { public string innerOrderId; public string transactionId; public int amount; public string sku; public string currency = "USD"; public int status; public string shopName; public string type; } // public class ApplePayClass // { // public string innerOrderId; // public int amount; // public string sku; // public string currency = "USD"; // public int status; // } public class PayerData { public string name; public string tel; public string email; public int amount; } // 假设 orderState 是返回对象的类型 // public class orderState // { // public int State; // }