using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; namespace tysdk { public enum EAccoutType { hwGoogle, hwFacebook, hwGuest, hwVkid, Apple, none } public enum PaymentReceiptProvider { None, Flexion } public class PaymentReceipt { public PaymentReceiptProvider Provider; public string PurchaseJson; public string Signature; public string PurchaseToken; public bool HasPayload => !string.IsNullOrEmpty(PurchaseJson); public bool CanConsume => !string.IsNullOrEmpty(PurchaseToken); } public class PaymentReceiptVerification { public bool Verified; public string ServerOrderId; public int ProviderCode; public string ProviderMessage; } public class LoginInfo { public bool isSuccess; public int userId; public string StrUserId => userId.ToString(); public string msg; public int code; } public class LinkResult { // 0: success, 1: fail, -1 exists public int code; // when success and fail userId is current user // when exists userId is 0 public int userId; // not none when exists public Dictionary bindInfo; } public class ChangeLinkResult { public int code; public int userId; public string msg; } public class LinkCheckInfo { public int code; } public class PaymentInfo { public bool isSuccessFromSdk => code == "0"; public bool isSuccess => isSuccessFromSdk && confirmed; private bool confirmed {get; set;} = false; public int count; public string orderId; public string productId; public string price; public string code; public string msg; // Compatibility fields for legacy server payload and existing call sites. // New payment flow should read receipt data from Receipt. // Flexion: purchase.getOriginalJson(), used by server for RSA signature verification public string purchaseJson; // Flexion: purchase.getSignature(), used by server for RSA signature verification public string signature; // Flexion: purchase token, used to consume after server verification public string purchaseToken; [JsonIgnore] public PaymentReceipt Receipt; [JsonIgnore] public PaymentReceiptVerification ReceiptVerification; [JsonIgnore] public bool HasReceipt => Receipt != null && Receipt.HasPayload; [JsonIgnore] public bool CanConsumeReceipt => Receipt != null && Receipt.CanConsume; // Store order ID from Flexion SDK (e.g. GPA.xxx) public string storeOrderId; public bool verified; // Server-side order ID returned from verification public string serverOrderId; // Player ID for server-side verification public string userId; public bool Check(string orderId, string productId) { confirmed = orderId == this.orderId && productId == this.productId; if(!confirmed) UnityEngine.Debug.LogWarning("[TYSdk Pay] order not confirmed"); return confirmed; } public override string ToString() { return Newtonsoft.Json.JsonConvert.SerializeObject(this); } } public class ProductListInfo { public int code = 1; public string msg = string.Empty; public List products; #if UNITY_IOS && !UNITY_EDITOR public void ReadSKUFromJson(string json) { var prodList = Newtonsoft.Json.Linq.JArray.Parse(json).Select(x => { return new SKUDetail() { price = x["price"].ToString(), productId = x["productId"].ToString(), price_currency_code = x["LocaleCurrencyCode"].ToString(), localeCurrencySymbol = x["localeCurrencySymbol"].ToString(), localizedDescription = x["localizedDescription"].ToString(), title = x["localizedTitle"].ToString(), ProdKey = x["productIdentifier"].ToString() }; }).ToList(); products = prodList; } #endif } #if UNITY_IOS public class SKUDetail { public string price; public string productId; public string price_currency_code; public string localeCurrencySymbol; public string localizedDescription; public string title; public string type; public string ProdPriceStr => price; public float ProdPrice => float.Parse(price); public string ProdID => productId; public string ProdKey; public override string ToString() { return Newtonsoft.Json.JsonConvert.SerializeObject(this); } } #else public class SKUDetail { public string description; public string ourProductId; public string price; public string price_amount_micros; public string price_currency_code; public string productId; public string title; public string type; public string currency; public string price_amount; public override string ToString() { return Newtonsoft.Json.JsonConvert.SerializeObject(this); } public string ProdPriceStr => price; public float ProdPrice => float.Parse(price_amount_micros) / 1000000; public string ProdID => ourProductId; public string ProdKey => productId; } #endif public class ATTInfo { public bool isAccepted; } public class FlexionOrderResult { public int code { get; set; } public string info { get; set; } public string orderId { get; set; } } }