/// <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(); } } }
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); }
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)); } }
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(); } } }
/// <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(); } } }