/// <summary> 向服务器申请重连补单 </summary> private void RequestPayout() { EB.Debug.Log("【商城】申请重连补单!"); List <Transaction> list = SparxTransactionHelper.GetAllVaildLoacalTrans(); if (list.Count < 0) { return; } for (int i = 0; i < list.Count; i++) { IAP.Transaction trans = list[i]; if (trans == null) { EB.Debug.Log("【商城】本地订单是空的,序号i = {0}", i); continue; } EB.Debug.Log("【商城】添加校验订单:{0}", trans.transactionId); _verify.Add(trans); } EB.Debug.Log("【商城】添加的需要校验的订单数量:{0}", _verify.Count); }
/// <summary>获取所有本地订单</summary> private static List <Transaction> GetAllLoacalTrans() { List <Transaction> transList = new List <Transaction>(); string transStrs = PlayerPrefs.GetString(TransactionUrl, ""); if (string.IsNullOrEmpty(transStrs)) { EB.Debug.Log("【商城】本地没有本地订单储存"); return(transList); } EB.Debug.Log("【商城】本地已添加的本地总订单:{0}", transStrs); string[] strs = transStrs.Split(';'); if (strs == null || strs.Length <= 0) { EB.Debug.Log("本地订单储存异常"); return(transList); } for (int i = 0; i < strs.Length; i++) { IAP.Transaction trans = GetTransInLocal(strs[i], false); if (trans == null) { EB.Debug.Log("【商城】本地存储某个本地订单是空的,序号i = {0}", i); continue; } transList.Add(trans); EB.Debug.Log("【商城】获得本地订单transactionId:{0}", strs[i]); } return(transList); }
/// <summary>获取本地订单</summary> private static IAP.Transaction GetTransInLocal(string transId, bool needVaild = true) { if (string.IsNullOrEmpty(transId)) { UnityEngine.Debug.LogError("【商城】获取本地订单异常,订单为null"); return(null); } EB.Debug.Log("【商城】获得本地订单transactionId:{0}", transId); IAP.Transaction transaction = new IAP.Transaction(); transaction.transactionId = transId; transaction.productId = PlayerPrefs.GetString(string.Format("{0}_{1}_productId", TransactionUrl, transaction.transactionId), ""); transaction.payload = PlayerPrefs.GetString(string.Format("{0}_{1}_payload", TransactionUrl, transaction.transactionId), ""); transaction.signature = PlayerPrefs.GetString(string.Format("{0}_{1}_signature", TransactionUrl, transaction.transactionId), ""); transaction.platform = PlayerPrefs.GetString(string.Format("{0}_{1}_platform", TransactionUrl, transaction.transactionId), ""); transaction.IAPPlatform = PlayerPrefs.GetString(string.Format("{0}_{1}_iapplatform", TransactionUrl, transaction.transactionId), ""); EB.Debug.Log("【商城】productId = {0};payload = {1};signature = {2};platform = {3};iapplatform = {4}", transaction.productId, transaction.payload, transaction.signature, transaction.platform, transaction.IAPPlatform); if (needVaild && (transaction.productId == "" || transaction.payload == "" || transaction.platform == "")) { EB.Debug.LogWarning("【商城】无效的本地订单"); return(null); } return(transaction); }
/// <summary>添加本地订单</summary> public static void AddTransInLocal(IAP.Transaction transaction) { if (transaction == null) { UnityEngine.Debug.LogError("【商城】添加本地订单异常,订单为null"); return; } string transStrs = PlayerPrefs.GetString(TransactionUrl, ""); if (transStrs.IndexOf(transaction.transactionId) >= 0) { EB.Debug.Log("【商城】本地订单已有该订单:{0}", transaction.transactionId); return; } transStrs = string.IsNullOrEmpty(transStrs) ? transaction.transactionId : string.Format("{0};{1}", transStrs, transaction.transactionId); PlayerPrefs.SetString(TransactionUrl, transStrs); PlayerPrefs.SetString(string.Format("{0}_{1}_productId", TransactionUrl, transaction.transactionId), transaction.productId); PlayerPrefs.SetString(string.Format("{0}_{1}_payload", TransactionUrl, transaction.transactionId), transaction.serverPayload);//特殊设置,设置的时候设置服务器所需要的补单数据,而不是服务器下发给客户端的数据 PlayerPrefs.SetString(string.Format("{0}_{1}_signature", TransactionUrl, transaction.transactionId), transaction.signature); PlayerPrefs.SetString(string.Format("{0}_{1}_platform", TransactionUrl, transaction.transactionId), transaction.platform); PlayerPrefs.SetString(string.Format("{0}_{1}_iapplatform", TransactionUrl, transaction.transactionId), transaction.IAPPlatform); EB.Debug.Log("【商城】本地订单添加订单成功:{0}", string.Format("{0}_{1}", TransactionUrl, transaction.transactionId)); }
void OnPurchaseCanceled(IAP.Transaction transaction) { EB.Debug.Log("【商城】支付取消"); _config.Listener.OnOfferPurchaseCanceled(); if (transaction != null) { SparxTransactionHelper.DelTransInLocal(transaction); } }
void OnPurchaseFailed(string error, IAP.Transaction transaction) { EB.Debug.Log("【商城】支付失败:{0}" + error); _config.Listener.OnOfferPurchaseFailed(error); if (transaction != null) { SparxTransactionHelper.DelTransInLocal(transaction); } }
void OnVerifyAgain(IAP.Transaction transaction) { if (transaction == null) { EB.Debug.LogWarning("【商城】OnVerifyAgain调用中transaction为null"); return; } EB.Debug.Log("【商城】支付去补单:{0}", transaction.transactionId); CheckSupplementTransaction(transaction.transactionId); RemoveSomeTransaction(); _VerifyAgain.Add(new SupplementTransaction(transaction)); }
public void BuyPayout(IAP.Item item, System.Action <string, IAP.Transaction> callback, object extraInfo = null) { if (!string.IsNullOrEmpty(item.LimitedTimeGiftId))//新增限时礼包的物品关联处理 { if (extraInfo == null) { var ht = Johny.HashtablePool.Claim(); ht["limitedTimeGiftId"] = item.LimitedTimeGiftId; extraInfo = ht; } else { ((Hashtable)extraInfo).Add("limitedTimeGiftId", item.LimitedTimeGiftId); } } _api.BuyPayout(string.Format("{0}{1}", _externalId, _iapManager.ProviderName), item.payoutId, _iapManager.ProviderName, item.value, new ArrayList(), delegate(string error, Hashtable data) { if (!string.IsNullOrEmpty(error)) { callback(error, null); return; } if (data == null || data.Count == 0) { callback("BuyPayout result is empty", null); return; } IAP.Transaction transaction = new IAP.Transaction(); transaction.transactionId = EB.Dot.String("store.info.transactionid", data, null); transaction.productId = item.productId; #if USE_TENCENTSDK || USE_VIVOSDK || USE_HUAWEISDK transaction.payload = EB.Dot.String("store.info.extraInfo", data, null); #else transaction.payload = EB.Dot.String("store.info.extraInfo", data, item.developerPayload.Replace("{platform}", _iapManager.ProviderName)); #endif transaction.signature = EB.Dot.String("store.info.sign", data, transaction.signature); transaction.platform = _iapManager.ProviderName; transaction.serverPayload = _iapManager.GetPayload(transaction); transaction.IAPPlatform = _iapManager.ProviderName;//多渠道支付时用到 callback(null, transaction); //生成订单后把订单存储在本地 SparxTransactionHelper.AddTransInLocal(transaction); }, extraInfo); }
/// <summary>删除本地订单</summary> public static void DelTransInLocal(IAP.Transaction transaction) { if (transaction == null || string.IsNullOrEmpty(transaction.transactionId)) { UnityEngine.Debug.LogError("【商城】删除本地订单异常,订单为null"); return; } EB.Debug.Log("【商城】删除本地订单transactionId:{0}", transaction.transactionId); string transStrs = PlayerPrefs.GetString(TransactionUrl, ""); if (string.IsNullOrEmpty(transStrs)) { EB.Debug.Log("【商城】删除本地订单异常,本地总订单为null"); return; } EB.Debug.Log("【商城】删除订单中本地总订单:{0}", transStrs); int strIndex = transStrs.IndexOf(transaction.transactionId); if (strIndex < 0) { EB.Debug.Log("【商城】本地总订单不包含需删除的订单"); return; } if (transStrs.Length == transaction.transactionId.Length) { transStrs = ""; } else if (strIndex == 0) { transStrs = transStrs.Remove(strIndex, transaction.transactionId.Length + 1); } else if (strIndex > 0) { transStrs = transStrs.Remove(strIndex - 1, transaction.transactionId.Length + 1); } EB.Debug.Log("【商城】删除本地订单后的本地总订单:{0}", transStrs); PlayerPrefs.SetString(TransactionUrl, transStrs); PlayerPrefs.DeleteKey(string.Format("{0}_{1}_productId", TransactionUrl, transaction.transactionId)); PlayerPrefs.DeleteKey(string.Format("{0}_{1}_payload", TransactionUrl, transaction.transactionId)); PlayerPrefs.DeleteKey(string.Format("{0}_{1}_signature", TransactionUrl, transaction.transactionId)); PlayerPrefs.DeleteKey(string.Format("{0}_{1}_platform", TransactionUrl, transaction.transactionId)); PlayerPrefs.DeleteKey(string.Format("{0}_{1}_iapplatform", TransactionUrl, transaction.transactionId)); }
private void VerifyPayout(IAP.Transaction transaction) { IAP.Item payout = _payouts.Find(delegate(IAP.Item obj) { return(obj.productId == transaction.productId); }); if (payout == null) { EB.Debug.Log("【商城】无法验证,找不到商品:productId:{0};transactionId:{1}", transaction.productId, transaction.transactionId); _verify.Add(transaction); return; } Hashtable data = Johny.HashtablePool.Claim(); data["cents"] = payout.cents; data["currency"] = payout.currencyCode; data["externalTrkid"] = _externalId + (string.IsNullOrEmpty(transaction.IAPPlatform)?_iapManager.ProviderName:transaction.IAPPlatform); data["payoutid"] = payout.payoutId; data["platform"] = transaction.platform; if (!string.IsNullOrEmpty(transaction.limitedTimeGiftId)) { data["limitedTimeGiftId"] = transaction.limitedTimeGiftId; } if (_iapManager.ProviderName == "itunes") { data["receipt-data"] = transaction.payload; } else { data["response-data"] = transaction.payload; data["response-signature"] = transaction.signature; } CheckSupplementTransaction(transaction.transactionId); EB.Debug.Log("【商城】校验:{0}", transaction.transactionId); isRequest = true; _api.VerifyPayout(_iapManager.ProviderName, data, delegate(string err, Hashtable res){ EB.Debug.Log("【商城】校验回调:{0}", transaction.transactionId); isRequest = false; OnVerifyPayout(payout, transaction, err, res); if (chargeSuccessCallBack != null && res != null && string.IsNullOrEmpty(err)) { chargeSuccessCallBack(res); } }); }
///正常验单回调 private void OnVerifyPayout(IAP.Item item, IAP.Transaction trans, string err, Hashtable data) { if (!string.IsNullOrEmpty(err)) { EB.Debug.Log("【商城】订单校验有错误transactionId:{0}", trans.transactionId); if (EB.Dot.Bool("verify.retry", data, true)) { EB.Debug.Log("【商城】订单再次重新尝试校验transactionId:{0}", trans.transactionId); int delay = (int)EB.Dot.Single("verify.delay", data, 3.0f) * 1000; EB.Coroutines.SetTimeout(delegate() { if (!_verify.Contains(trans)) { _verify.Add(trans); } }, delay); } else { EB.Debug.Log("【商城】订单无效移除,并加进补单列表transactionId:{0};err:{1}", trans.transactionId, err); _config.Listener.OnOfferPurchaseFailed(err); CheckSupplementTransaction(trans.transactionId); RemoveSomeTransaction(); _VerifyAgain.Add(new SupplementTransaction(trans)); SparxTransactionHelper.DelTransInLocal(trans); } FetchOffersDelayed(); return; } _lastFetchTime = 0; Fetch(); FetchOffers(); _iapManager.Complete(trans); _config.Listener.OnOfferPurchaseRedeemer(data); _config.Listener.OnOfferPurchaseSuceeded(item, trans); EB.Debug.Log("【商城】订单成功transactionId:{0}", trans.transactionId); SparxTransactionHelper.DelTransInLocal(trans); CheckSupplementTransaction(trans.transactionId); }
void OnVerify(IAP.Transaction transaction) { EB.Debug.Log("【商城】支付去校验:{0}", transaction.transactionId); _verify.Add(transaction); }