/// <summary> /// 支付成功 支付订单(充值订单、商城订单)更新操作 /// </summary> /// <param name="view">支付单信息</param> /// <returns>操作结果</returns> public ResultModel PaymentOrder(PaymentOrderView view) { var result = new ResultModel() { IsValid = false }; PaymentOrderView tempPaymentOrder = base._database.Db.PaymentOrder.Find(base._database.Db.PaymentOrder.paymentOrderId == view.PaymentOrderID); if (tempPaymentOrder != null && (OrderEnums.PaymentFlag)tempPaymentOrder.Flag == OrderEnums.PaymentFlag.NonPaid) { view.PayType = tempPaymentOrder.PayType; switch ((OrderEnums.PaidType)tempPaymentOrder.PayType) { //商城订单处理 case OrderEnums.PaidType.Mall: result = this.PaymentMallOrder(view); break; //充值订单处理 case OrderEnums.PaidType.Recharge: default: ZJ_UserBalanceServiceWeb zjbsw = new ZJ_UserBalanceServiceWeb(); result = zjbsw.AccountRechargeWeb(view.PaymentOrderID, view.outOrderId); break; } } return(result); }
/// <summary> /// 更新支付单 /// </summary> /// <param name="view">支付单</param> /// <param name="db">数据Db</param> /// <returns></returns> private ResultModel UpdatePrivate(PaymentOrderView view, dynamic db) { ResultModel resultModel = new ResultModel() { IsValid = db.PaymentOrder.Update(view) > 0 }; return(resultModel); }
/// <summary> /// 获取支付单信息 /// </summary> /// <param name="paymentOrderView">查询支付对象(需提供PaymengOrderId,UserID)</param> /// <param name="db">数据Db</param> /// <returns></returns> private ResultModel GetPaymentOrderPrivate(PaymentOrderView paymentOrderView, dynamic db) { ResultModel result = new ResultModel() { IsValid = false }; PaymentOrderView view = db.PaymentOrder.Find(db.PaymentOrder.PaymentOrderID == paymentOrderView.PaymentOrderID && db.PaymentOrder.UserID == paymentOrderView.UserID); result.IsValid = view != null; result.Data = view; return(result); }
/// <summary> /// 货到付款 支付处理 /// </summary> /// <param name="view">支付单信息(PaymentOrderID,UserID)</param> /// <returns></returns> public ResultModel PaymentCODOrder(PaymentOrderView view) { ResultModel result = new ResultModel(); dynamic orderDetails = base._database.Db.PaymentOrder.All() .Join(base._database.Db.PaymentOrder_Orders, PaymentOrderID: base._database.Db.PaymentOrder.PaymentOrderID) .Join(base._database.Db.Order, OrderID: base._database.Db.PaymentOrder_Orders.OrderID) .Join(base._database.Db.OrderDetails, OrderID: base._database.Db.PaymentOrder_Orders.OrderID) .Where(base._database.Db.PaymentOrder.PaymentOrderID == view.PaymentOrderID && base._database.Db.PaymentOrder.UserID == view.UserID && base._database.Db.Order.OrderStatus == (int)OrderEnums.OrderStatus.Obligation ) .Select(base._database.Db.OrderDetails.ProductId, base._database.Db.OrderDetails.Quantity, base._database.Db.OrderDetails.OrderID).ToList(); List <string> sqls = new List <string>(); List <string> orderIds = new List <string>(); foreach (var orderDetail in orderDetails) { sqls.Add( productService.GenerateUpdateSaleCountSql(new ProductView() { ProductId = orderDetail.ProductId, SaleCount = orderDetail.Quantity })); if (!orderIds.Any(x => x == orderDetail.OrderID)) { orderIds.Add(orderDetail.OrderID); } } foreach (string orderId in orderIds) { sqls.Add(orderService.GenerateUpdateOrderStatusSql(new OrderView() { OrderID = orderId, OrderStatus = (int)OrderEnums.OrderStatus.WaitDeliver })); } string sql = SqlTransactionUtil.GenerateTransSql(sqls); //执行sql var queryResult = _database.RunSqlQuery(x => x.ToResultSets(sql)); dynamic source = queryResult[0][0]; result.IsValid = source.Count > 0; return(result); }
/// <summary> /// 根据支付通道、第三方订单号获取支付单 /// </summary> /// <param name="payChannel">支付通道</param> /// <param name="outerOrderId">第三方订单号</param> /// <param name="userId">用户Id</param> /// <returns>Data:PaymentOrderView</returns> public ResultModel GetPaymentOrderBy(OrderEnums.PayChannel payChannel, string outerOrderId, long userId) { ResultModel result = new ResultModel() { IsValid = false }; PaymentOrderView view = _database.Db.PaymentOrder.Find(_database.Db.PaymentOrder.PayChannel == (int)payChannel && _database.Db.PaymentOrder.outOrderId == outerOrderId && _database.Db.PaymentOrder.UserID == userId ); result.IsValid = view != null; result.Data = view; return(result); }
/// <summary> /// 根据订单ID,用户ID获取支付单 /// </summary> /// <param name="paymentOrderView">查询支付单对象(需提供 PaymentOrderID,UserID)</param> /// <returns>Data:PaymentOrderView</returns> public ResultModel GetPaymentOrderByOrderNO(PaymentOrderView paymentOrderView) { ResultModel result = new ResultModel() { IsValid = false }; string sql = string.Format( "SELECT TOP 1 * FROM dbo.PaymentOrder WHERE OrderNO IN (SELECT b.OrderID FROM PaymentOrder AS a INNER JOIN PaymentOrder_Orders AS b ON a.PaymentOrderID=b.PaymentOrderID WHERE a.PaymentOrderID={0} AND a.UserID={1}) AND UserID={1}", paymentOrderView.PaymentOrderID, paymentOrderView.UserID); //执行sql var queryResult = _database.RunSqlQuery(x => x.ToResultSets(sql)); PaymentOrderView paymentOrder = queryResult[0].Count > 0 ? queryResult[0][0] : null; result.IsValid = paymentOrder != null; result.Data = paymentOrder; return(result); }
/// <summary> /// 获取支付单数据 /// </summary> /// <param name="view">支付单查找条件(需要提供 PaymentOrderID,UserID)</param> /// <param name="languageID">Id</param> /// <returns></returns> public ResultModel GetPaymentActionData(PaymentOrderView view, int languageID) { ResultModel resultModel = new ResultModel() { IsValid = false }; PaymentActionPageView paymentAction = null; view.Flag = (int)OrderEnums.PaymentFlag.NonPaid; string sql = string.Format(@"SELECT TOP 1 a.PaymentOrderID, a.PayChannel, a.Flag,a.UserID, a.ProductAmount, c.OrderID,c.OrderAddressId,c.PostalCode,c.Mobile,c.THAreaID,c.Email,c.DetailsAddress,c.Receiver FROM PaymentOrder AS a INNER JOIN PaymentOrder_Orders AS b ON a.PaymentOrderID=b.PaymentOrderID INNER JOIN OrderAddress AS c ON b.OrderID=c.OrderID WHERE a.PaymentOrderID='{0}' AND a.Flag={1} AND a.UserID={2} ", SqlFilterUtil.ReplaceSqlChar(view.PaymentOrderID), view.Flag, view.UserID); //执行sql var queryResult = _database.RunSqlQuery(x => x.ToResultSets(sql)); if (queryResult[0].Count > 0) { resultModel.IsValid = true; dynamic paymentData = queryResult[0][0]; paymentAction = new PaymentActionPageView(); paymentAction.PaymentOrderView = new PaymentOrderView() { PaymentOrderID = paymentData.PaymentOrderID, ProductAmount = paymentData.ProductAmount, PayChannel = paymentData.PayChannel, Flag = paymentData.Flag, UserID = paymentData.UserID }; paymentAction.OrderAddressView = new OrderAddressView() { OrderID = paymentData.OrderID, OrderAddressId = paymentData.OrderAddressId, PostalCode = paymentData.PostalCode, Mobile = paymentData.Mobile, THAreaID = paymentData.THAreaID, Email = paymentData.Email, DetailsAddress = paymentData.DetailsAddress, Receiver = paymentData.Receiver }; //获取 省、市、区 Dictionary <string, string> userAreas = thAreaService.GetSingleTierAreaNames(new SearchUserAddressModel() { THAreaID = paymentAction.OrderAddressView.THAreaID }, languageID).Data; paymentAction.OrderAddressView.DetailsAddress = AddressHelper.ShowUserAddress(userAreas["Country"], userAreas["Sheng"], userAreas["Shi"], userAreas["Qu"], paymentAction.OrderAddressView.DetailsAddress, languageID); paymentAction.OrderDetailsForPayResultView = orderService.GetOrderDetailsByPaymentOrderId(paymentAction.PaymentOrderView.PaymentOrderID).Data; } resultModel.Data = paymentAction; return(resultModel); }
/// <summary> /// 余额支付 /// </summary> /// <param name="view">支付单信息(需提供 PaymentOrderID,UserID)</param> /// <param name="userInfo">>用户信息(用户支付 需提供 UserId,PayPassword,LanguageID)</param> /// <param name="isCheckPayPassword">是否检查交易密码(如果是混合支付,充值回来,无需检查交易密码)</param> /// <returns></returns> public ResultModel PaymentBalanceOrder(PaymentOrderView view, UserInfoViewForPayment userInfo, bool isCheckPayPassword) { var resultModel = new ResultModel() { IsValid = false, //"服务器繁忙,请稍候再试" Messages = new List <string>() { CultureHelper.GetAPPLangSgring("PAYMENT_NETWORK_BUSY", userInfo.LanguageId) } }; using (var trans = _database.Db.BeginTransaction()) { try { //获取用户数据 UserInfoViewForPayment userInfoView = userService.GetYH_UserForPayment(userInfo.UserID, trans).Data; //检查用户是否删除、锁定等 ResultModel userInfoResultModel = userService.GetYH_UserForPaymentMessage(userInfoView, isCheckPayPassword ? userInfo : null, trans); //用户、交易密码错误等信息 if (!userInfoResultModel.IsValid) { trans.Rollback(); resultModel.Messages = new List <string>() { userInfoResultModel.Messages[0] }; return(resultModel); } //从数据库中获取支付单 PaymentOrderView paymentOrder = this.GetPaymentOrderPrivate(view, trans).Data; //余额不足 if (paymentOrder.ProductAmount > userInfoView.ConsumeBalance) { trans.Rollback(); resultModel.Messages = new List <string>() { CultureHelper.GetAPPLangSgring("MONEY_ORDER_NSUFFICIENT_BALANCE", userInfo.LanguageId) }; return(resultModel); } //查询该支付单下,所有订单 List <OrderView> orderViews = base._database.Db.PaymentOrder.Query() .LeftJoin(_database.Db.PaymentOrder_Orders, PaymentOrderID: base._database.Db.PaymentOrder.PaymentOrderID) .LeftJoin(_database.Db.Order, OrderID: _database.Db.PaymentOrder_Orders.OrderID) .Where(base._database.Db.PaymentOrder.PaymentOrderID == view.PaymentOrderID && base._database.Db.PaymentOrder.UserID == view.UserID) .Select( _database.Db.Order.UserID, _database.Db.Order.OrderID, _database.Db.Order.TotalAmount).ToList <OrderView>(); //循环订单 扣除余额 foreach (OrderView orderView in orderViews) { ZJ_UserBalanceModel zjmodel = new ZJ_UserBalanceModel(); zjmodel.Account = userInfoView.Account; zjmodel.AddOrCutAmount = -orderView.TotalAmount.Value; zjmodel.AddOrCutType = 2; zjmodel.CreateBy = userInfoView.Account; zjmodel.IsDisplay = 1; zjmodel.Remark = "购物消费"; zjmodel.UserID = view.UserID; zjmodel.OrderNo = orderView.OrderID; userBalanceService.UpdateZJ_UserBalance(zjmodel, trans); } trans.Commit(); resultModel.IsValid = true; } catch (Exception ex) { trans.Rollback(); } } return(resultModel); }
/// <summary> /// 支付商城订单 /// </summary> /// <param name="view">支付单实体</param> /// <returns>支付结果</returns> private ResultModel PaymentMallOrder(PaymentOrderView view) { var result = new ResultModel(); DateTime now = DateTime.Now; //操作时间 List <string> sqls = new List <string>(); //查询需要更新的商品集合 List <OrderDetailsViewT1> orderDetails = base._database.Db.PaymentOrder.Query() .LeftJoin(_database.Db.PaymentOrder_Orders, PaymentOrderID: base._database.Db.PaymentOrder.PaymentOrderID) .LeftJoin(_database.Db.OrderDetails, OrderID: _database.Db.PaymentOrder_Orders.OrderID) .Where(base._database.Db.PaymentOrder.PaymentOrderID == view.PaymentOrderID) .Select( _database.Db.OrderDetails.OrderID, _database.Db.OrderDetails.ProductId, _database.Db.OrderDetails.Quantity).ToList <OrderDetailsViewT1>(); if (orderDetails != null && orderDetails.Count > 0) { List <string> orderIds = orderDetails.Select(x => x.OrderID).Distinct().ToList(); //更新订单状态 foreach (var orderId in orderIds) { sqls.Add(orderService.GenerateUpdateOrderStatusSql(new OrderView() { OrderID = orderId, OrderStatus = (int)OrderEnums.OrderStatus.WaitDeliver, PaidDate = now })); sqls.Add(orderTrackingLogService.GenerateInsertSql(new OrderTrackingLogView() { CreateBy = "用户", CreateTime = now, OrderID = orderId, OrderTrackingId = MemCacheFactory.GetCurrentMemCache().Increment("commonId"), TrackingContent = "用户付款", OrderStatus = (int)OrderEnums.OrderStatus.WaitDeliver })); } //更新产品销售量 foreach (var orderDetail in orderDetails) { sqls.Add(productService.GenerateUpdateSaleCountSql(new ProductView() { SaleCount = orderDetail.Quantity, ProductId = orderDetail.ProductId })); } } view.PaymentDate = now; view.Flag = (int)OrderEnums.PaymentFlag.Paid; //更新支付单状态 sqls.Add(this.GenerateUpdatePaymentSuccessSql(view)); string sql = SqlTransactionUtil.GenerateTransSql(sqls); //执行sql var queryResult = _database.RunSqlQuery(x => x.ToResultSets(sql)); dynamic source = queryResult[0][0]; result.IsValid = source.Count > 0; return(result); }
/// <summary> /// 根据支付单号查找支付单 /// </summary> /// <param name="paymentOrderView">支付单实体(需提供PaymengOrderId,UserID)</param> /// <returns>支付单实体</returns> public ResultModel GetPaymentOrderBy(PaymentOrderView paymentOrderView) { return(this.GetPaymentOrderPrivate(paymentOrderView, this._database.Db)); }
/// <summary> /// 生成支付单 支付成功Sql /// </summary> /// <param name="view">订单支付信息</param> /// <returns>语句</returns> internal string GenerateUpdatePaymentSuccessSql(PaymentOrderView view) { string sql = string.Format(" UPDATE [PaymentOrder] SET [RealAmount] = {0},[Flag] = {1},[PaymentDate] ='{2}',[outOrderId] = '{3}' WHERE [PaymentOrderID] ='{4}'", view.RealAmount, view.Flag, view.PaymentDate.Value.DateTimeToString(), SqlFilterUtil.ReplaceSqlChar(view.outOrderId), SqlFilterUtil.ReplaceSqlChar(view.PaymentOrderID)); return(sql); }
/// <summary> /// 更新支付单 /// </summary> /// <param name="view">支付单</param> /// <returns></returns> public ResultModel Update(PaymentOrderView view) { return(this.UpdatePrivate(view, this._database.Db)); }
/// <summary> /// Omise 泰国支付 /// </summary> /// <param name="omisePaymentModel">omise支付对象</param> /// <returns>处理结果</returns> public static ResultModel OmisePayment(OmisePaymentService.OmisePaymentModel omisePaymentModel) { Logger.Error("Omise_Log", string.Format("进入OmisePayment PaymentOrderID:{0}", omisePaymentModel.PaymentOrderId)); PaymentOrderView requestPaymentOrder = new PaymentOrderView() { PaymentOrderID = omisePaymentModel.PaymentOrderId, UserID = Convert.ToInt64(omisePaymentModel.UserId) }; //处理结果 OmisePaymentResultType resultCode = OmisePaymentResultType.Fail; ResultModel result = _paymentOrderService.GetPaymentOrderBy(requestPaymentOrder); if (!result.IsValid || result.Data == null || result.Data.Flag != (int)(OrderEnums.PaymentFlag.NonPaid) || omisePaymentModel.Amount != result.Data.ProductAmount) { resultCode = OmisePaymentResultType.ParamError; Logger.Error("Omise_Log", string.Format("参数异常 PaymentOrderID={0},UserId={1},Amount={2}", requestPaymentOrder.PaymentOrderID, requestPaymentOrder.UserID, omisePaymentModel.Amount)); } else { requestPaymentOrder = result.Data; var chargeInfo = new ChargeCreateInfo(); chargeInfo.Amount = (int)(requestPaymentOrder.ProductAmount * 100); //Create a charge with amount 100 THB, here we are passing with the smallest currency unit which is 10000 satangs 交易金额 必须是整数(真实金额*100)。 chargeInfo.Currency = "THB"; chargeInfo.Description = requestPaymentOrder.PaymentOrderID; //目前这个参数很有可能是我们的订单号或支付单号用这个。 chargeInfo.Capture = true; //TRUE means auto capture the charge, FALSE means authorize only. Default is FALSE chargeInfo.CardId = omisePaymentModel.Token; //Token generated with Omise.js or Card.js //var client = new Omise.Client(YOUR_SECRET_KEY, [YOUR_PUBLIC_KEY]); //chargeInfo.ReturnUri = "http://localhost:54741/Home/complete"; try { Client c = new Client(GetConfig.OmiseSecretKey());//new Client("skey_test_50xql6uiv02pemu8z9o"); //chargeInfo //c.ChargeService.CreateCharge(chargeInfo); var charge = c.ChargeService.CreateCharge(chargeInfo); //charge.Description //charge.FailureCode //charge.Captured if (charge.Captured && string.IsNullOrEmpty(charge.FailureCode)) { var paymentOrder = new PaymentOrderView() { PaymentOrderID = charge.Description, outOrderId = charge.TransactionId, RealAmount = charge.Amount / 100.00m }; requestPaymentOrder.RealAmount = paymentOrder.RealAmount; if (paymentOrder.RealAmount != requestPaymentOrder.ProductAmount) { Logger.Error("Omise_Log", string.Format("支付成功,但是支付金额小于需要支付的金额 PaymentOrderID={0},outOrderId={1},RealAmount={2}", paymentOrder.PaymentOrderID, paymentOrder.outOrderId, paymentOrder.RealAmount)); resultCode = OmisePaymentResultType.LessAmount; } else { //支付成功 Logger.Error("Omise_Log", string.Format("支付成功 PaymentOrderID={0},outOrderId={1},RealAmount={2}", paymentOrder.PaymentOrderID, paymentOrder.outOrderId, paymentOrder.RealAmount)); ResultModel updateResult = _paymentOrderService.PaymentOrder(paymentOrder); //日志记录 if (updateResult.IsValid) { //支付成功,更新数据库成功 Logger.Error("Omise_Log", string.Format("支付成功,更新数据库成功 PaymentOrderID={0},outOrderId={1},RealAmount={2}", paymentOrder.PaymentOrderID, paymentOrder.outOrderId, paymentOrder.RealAmount)); resultCode = OmisePaymentResultType.Success; } else { //支付成功,更新数据库失败 Logger.Error("Omise_Log", string.Format("支付成功,更新数据库失败 PaymentOrderID={0},outOrderId={1},RealAmount={2}", paymentOrder.PaymentOrderID, paymentOrder.outOrderId, paymentOrder.RealAmount)); resultCode = OmisePaymentResultType.UpdateDataError; } } } else { resultCode = OmisePaymentResultType.Fail; Logger.Error("Omise_Log", string.Format("支付失败 PaymentOrderID:{0}", requestPaymentOrder.PaymentOrderID)); } //var result = c.ChargeService.Capture(charge.Id); //Client.ChargeService.CreateCharge(chargeInfo); //charge.Id //是否是交易ID(这个字段可能性大一些) //charge.TransactionId 是否是交易ID // charge.LiveMode是否是生产环境 //charge.FailureCode错误代码 //charge.FailureMessage错误信息 //var result = c.ChargeService.GetCharge("chrg_test_4xso2s8ivdej29pqnhz"); } catch (Exception ex) { resultCode = OmisePaymentResultType.Fail; Logger.Error("Omise_Log", string.Format("支付异常 Error:{0} PaymentOrderID:{1}", ex.Message, requestPaymentOrder.PaymentOrderID)); } } ResultModel resultModel = new ResultModel() { Status = (int)resultCode, Data = requestPaymentOrder }; resultModel.Messages.Add(EnumDescription.GetFieldText(resultCode)); return(resultModel); }