Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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));
        }
Пример #5
0
 void OnPurchaseCanceled(IAP.Transaction transaction)
 {
     EB.Debug.Log("【商城】支付取消");
     _config.Listener.OnOfferPurchaseCanceled();
     if (transaction != null)
     {
         SparxTransactionHelper.DelTransInLocal(transaction);
     }
 }
Пример #6
0
 void OnPurchaseFailed(string error, IAP.Transaction transaction)
 {
     EB.Debug.Log("【商城】支付失败:{0}" + error);
     _config.Listener.OnOfferPurchaseFailed(error);
     if (transaction != null)
     {
         SparxTransactionHelper.DelTransInLocal(transaction);
     }
 }
Пример #7
0
 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));
 }
Пример #8
0
        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);
        }
Пример #9
0
        /// <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));
        }
Пример #10
0
        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);
                }
            });
        }
Пример #11
0
        ///正常验单回调
        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);
        }
Пример #12
0
 void OnVerify(IAP.Transaction transaction)
 {
     EB.Debug.Log("【商城】支付去校验:{0}", transaction.transactionId);
     _verify.Add(transaction);
 }