Пример #1
0
        /// <summary>
        /// RESULTCODE_ORDER_NOT_EXIST; RESULTCODE_EXCEPTION; RESULTCODE_ORDER_NOT_BE_LOCKED; RESULTCODE_ORDER_NOT_BELONE_CURRENT_PLAYER; RESULTCODE_TRUE; RESULTCODE_FALSE;
        /// </summary>
        /// <param name="buyerUserName"></param>
        /// <param name="orderNumber"></param>
        /// <returns></returns>
        public int SetStoneOrderPayException(string buyerUserName, string orderNumber)
        {
            int result = OperResult.RESULTCODE_FALSE;
            var trans  = MyDBHelper.Instance.CreateTrans();

            try
            {
                StoneOrderRunnable runnable = GetLockedOrderByOrderNumber(orderNumber);
                if (runnable == null)
                {
                    var finishedOrders = DBProvider.StoneOrderDBProvider.GetBuyStonesOrderList("", orderNumber, buyerUserName, 0, null, null, null, null, 0, 0);
                    if (finishedOrders != null && finishedOrders.Length == 1)
                    {
                        if (finishedOrders[0].StonesOrder.OrderState == SellOrderState.Finish)
                        {
                            return(OperResult.RESULTCODE_ORDER_BUY_SUCCEED);
                        }
                    }

                    return(OperResult.RESULTCODE_ORDER_NOT_EXIST);
                }

                return(runnable.SetSellOrderPayException(buyerUserName));
            }
            catch (Exception exc)
            {
                result = OperResult.RESULTCODE_EXCEPTION;
                trans.Rollback();
                LogHelper.Instance.AddErrorLog("PayStoneTrade Exception. OrderNumber: " + orderNumber, exc);
                return(result);
            }
            finally
            {
                if (trans != null)
                {
                    trans.Dispose();
                }
            }
        }
Пример #2
0
        public int RejectExceptionStoneOrder(string orderNumber)
        {
            StoneOrderRunnable order = null;

            lock (this._lockListSellOrders)
            {
                this.dicSellOrders.TryGetValue(orderNumber, out order);
            }

            if (order == null)
            {
                return(OperResult.RESULTCODE_ORDER_NOT_EXIST);
            }
            if (order.OrderState != SellOrderState.Exception)
            {
                return(OperResult.RESULTCODE_ORDER_ISNOT_EXCEPTION);
            }

            string buyerUserName = order.GetLockedByUserName();

            order.SetOrderState(SellOrderState.Wait);
            bool isOK = order.ReleaseLock();

            if (isOK)
            {
                if (!string.IsNullOrEmpty(buyerUserName))
                {
                    string tokenBuyer = ClientManager.GetToken(buyerUserName);
                    if (!string.IsNullOrEmpty(tokenBuyer) && this.StoneOrderAppealFailed != null)
                    {
                        this.StoneOrderAppealFailed(tokenBuyer, order.OrderNumber);
                    }
                }
                return(OperResult.RESULTCODE_TRUE);
            }

            return(OperResult.RESULTCODE_FALSE);
        }
Пример #3
0
        public LockSellStonesOrder AutoMatchLockSellStone(string userName, int stoneCount)
        {
            lock (_lockListSellOrders)
            {
                StoneOrderRunnable runnable = null;
                foreach (var item in dicSellOrders.Values)
                {
                    if (item.OrderState == SellOrderState.Wait && item.StoneCount <= stoneCount)
                    {
                        if (runnable == null)
                        {
                            runnable = item;
                        }
                        else
                        {
                            if (item.StoneCount > runnable.StoneCount)
                            {
                                runnable = item;
                            }
                        }

                        if (runnable != null && runnable.StoneCount == stoneCount)
                        {
                            break;
                        }
                    }
                }

                if (runnable == null)
                {
                    return(null);
                }

                return(runnable.Lock(userName));
            }
        }
Пример #4
0
        public int AlipayCallback(AlipayRechargeRecord alipayRecord)
        {
            StoneOrderRunnable runnable = FindOrderByOrderName(alipayRecord.out_trade_no);
            int result = CheckOrderStateBeforePay(runnable, alipayRecord.out_trade_no, alipayRecord.user_name, alipayRecord.value_rmb);

            if (result == OperResult.RESULTCODE_ORDER_BUY_SUCCEED)
            {
                return(result);
            }
            if (result != OperResult.RESULTCODE_TRUE)
            {
                LogHelper.Instance.AddInfoLog("玩家[" + alipayRecord.user_name + "] 支付宝购买矿石失败。原因为:" + OperResult.GetMsg(result) + "。支付宝信息:" + alipayRecord.ToString() + (runnable == null ? "" : "LockedByUserName:" + runnable.LockedOrder.LockedByUserName));

                return(result);
            }

            string sellerUserName = "";
            var    trans          = MyDBHelper.Instance.CreateTrans();

            try
            {
                DBProvider.AlipayRecordDBProvider.SaveAlipayRechargeRecord(alipayRecord, trans);

                //订单处理
                var buyOrder = runnable.Pay(trans);
                if (buyOrder == null)
                {
                    trans.Rollback();

                    LogHelper.Instance.AddInfoLog("支付宝支付矿石订单失败1。原因为:订单支付失败。alipayRecord: " + alipayRecord.ToString());
                    //如果支付失败,先将订单设为异常。
                    this.SetStoneOrderPayException(alipayRecord.user_name, alipayRecord.out_trade_no);
                    return(OperResult.RESULTCODE_FALSE);
                }

                sellerUserName = buyOrder.StonesOrder.SellerUserName;

                //更新用户信息
                result = PlayerController.Instance.PayStoneOrder(true, alipayRecord.user_name, buyOrder, trans);
                if (result != OperResult.RESULTCODE_TRUE)
                {
                    trans.Rollback();

                    PlayerController.Instance.RefreshFortune(alipayRecord.user_name);
                    PlayerController.Instance.RefreshFortune(sellerUserName);
                    LogHelper.Instance.AddInfoLog("支付宝支付矿石订单失败2。原因为:" + OperResult.GetMsg(result) + "。alipayRecord: " + alipayRecord.ToString());

                    //如果支付失败,先将订单设为异常。
                    this.SetStoneOrderPayException(alipayRecord.user_name, alipayRecord.out_trade_no);
                    return(result);
                }
                this.RemoveRecord(buyOrder.StonesOrder.OrderNumber);

                trans.Commit();

                LogHelper.Instance.AddInfoLog("玩家[" + alipayRecord.user_name + "] 用支付宝成功购买了,玩家[" + runnable.SellOrder.SellerUserName + "] 出售的矿石" + runnable.SellOrder.SellStonesCount + ", no: " + runnable.SellOrder.OrderNumber);
                AddLogNotifyPlayer(alipayRecord.user_name, runnable.OrderNumber, buyOrder);

                return(OperResult.RESULTCODE_TRUE);
            }
            catch (Exception exc)
            {
                result = OperResult.RESULTCODE_EXCEPTION;
                trans.Rollback();

                PlayerController.Instance.RefreshFortune(alipayRecord.user_name);
                if (!string.IsNullOrEmpty(sellerUserName))
                {
                    PlayerController.Instance.RefreshFortune(sellerUserName);
                }
                //如果支付失败,先将订单设为异常。
                this.SetStoneOrderPayException(alipayRecord.user_name, alipayRecord.out_trade_no);
                LogHelper.Instance.AddErrorLog("玩家[" + alipayRecord.user_name + "] 支付宝购买矿石回调异常. 支付宝信息: " + alipayRecord.ToString(), exc);
                return(result);
            }
            finally
            {
                if (trans != null)
                {
                    trans.Dispose();
                }
            }
        }
Пример #5
0
        /// <summary>
        /// 此处只需处理RMB支付。Alipay支付的情况,在锁定订单时已经将支付链接返回,客户端可直接链接支付。
        /// </summary>
        /// <param name="buyer"></param>
        /// <param name="orderNumber"></param>
        /// <param name="rmb"></param>
        /// <returns></returns>
        public int PayStoneOrderByRMB(string buyerUserName, string orderNumber, decimal rmb)
        {
            int    result         = OperResult.RESULTCODE_FALSE;
            var    trans          = MyDBHelper.Instance.CreateTrans();
            string sellerUserName = "";

            try
            {
                StoneOrderRunnable runnable = FindOrderByOrderName(orderNumber);
                result = CheckOrderStateBeforePay(runnable, orderNumber, buyerUserName, rmb);
                if (result == OperResult.RESULTCODE_ORDER_BUY_SUCCEED)
                {
                    return(result);
                }
                if (result != OperResult.RESULTCODE_TRUE)
                {
                    LogHelper.Instance.AddInfoLog("玩家[" + buyerUserName + "] 灵币购买矿石失败。原因为:" + OperResult.GetMsg(result) + "。" + (runnable == null ? "" : "LockedByUserName:" + runnable.LockedOrder.LockedByUserName));
                    return(result);
                }

                result = PlayerController.Instance.CheckSellStone_BeforeBuy(buyerUserName, orderNumber, rmb);
                if (result != OperResult.RESULTCODE_TRUE)
                {
                    return(result);
                }

                var buyOrder = runnable.Pay(trans);
                if (buyOrder == null)
                {
                    trans.Rollback();
                    LogHelper.Instance.AddInfoLog("灵币支付矿石订单失败1。原因为:" + OperResult.GetMsg(result) + "。OrderNumber: " + orderNumber + "; buyerUserName:"******"灵币支付矿石订单失败2。原因为:" + OperResult.GetMsg(result) + "。OrderNumber: " + orderNumber + "; buyerUserName:"******"PayStoneTrade Exception. OrderNumber: " + orderNumber, exc);
                return(result);
            }
            finally
            {
                if (trans != null)
                {
                    trans.Dispose();
                }
            }
        }