public NormalResult <CreatePayOrderResult> DonationPay(DonationPayArgs args, AuthorizerPayConfig config) { //创建支付信息 CreatePayOrderArgs createPayOrderArgs = new CreatePayOrderArgs(); createPayOrderArgs.MemberId = args.MemberId; createPayOrderArgs.OpenId = args.OpenId; createPayOrderArgs.Fee = args.Fee; createPayOrderArgs.SpbillCreateIp = args.SpbillCreateIp; createPayOrderArgs.OrderType = EnumPayOrderType.Donation; createPayOrderArgs.Body = "在线捐款"; createPayOrderArgs.OutTradeNo = Guid.NewGuid().ToString().Replace("-", ""); NormalResult <CreatePayOrderResult> result = _payManager.CreatePayOrder(createPayOrderArgs, config); //捐款记录 Campaign_DonationLogEntity log = new Campaign_DonationLogEntity(); log.CampaignId = args.CampaignId; log.Domain = args.DomainId; log.PayOrder = result.Data.PayOrderId; log.Member = args.MemberId; log.CreateTime = DateTime.Now; log.Name = args.Name; log.Contact = args.Contact; log.Description = args.Description; _campaignManager.DataBase.Insert(log); return(result); }
/// <summary> /// 通过微信支付充值 /// </summary> /// <param name="args"></param> /// <param name="config"></param> /// <returns></returns> public NormalResult <CreatePayOrderResult> Deposit(CashAccountDepositArgs args, AuthorizerPayConfig config) { CreatePayOrderArgs createPayOrderArgs = new CreatePayOrderArgs(); createPayOrderArgs.MemberId = args.MemberId; createPayOrderArgs.OpenId = args.OpenId; createPayOrderArgs.Fee = args.Fee; createPayOrderArgs.SpbillCreateIp = args.SpbillCreateIp; createPayOrderArgs.OrderType = EnumPayOrderType.Deposit; createPayOrderArgs.Body = "会员充值"; createPayOrderArgs.OutTradeNo = Guid.NewGuid().ToString().Replace("-", ""); NormalResult <CreatePayOrderResult> result = CreatePayOrder(createPayOrderArgs, config); return(result); }
/// <summary> /// 发起订单支付 /// 0 支付成功 1 积分不足 2 账户余额不足(小于想使用的金额) /// 3 需要微信支付,微信支付下单成功(返回微支付订单号需转入微信支付画面) /// 4 订单状态不是待支付 5 订单已经过期 6 订单不存在 7 微信支付下单失败 /// 8 已经有待支付的微信支付订单了且微信支付金额同这次一样(返回微支付订单号需转入微信支付画面) /// </summary> /// <returns></returns> public NormalResult <PointCommodityOrderPayResult> OrderPay(PointCommodityOrderPayArgs args, AuthorizerPayConfig config) { NormalResult <PointCommodityOrderPayResult> result = new NormalResult <PointCommodityOrderPayResult>(false); //判断订单状态 PointCommodityOrderEntity order = GetOrder(args.OrderId); if (order == null) { result.Reason = 6; return(result); } if (order.Status != PointCommodityOrderStatus.NoPayment) { result.Reason = 4; InsertOrderLog(order, 4); return(result); } //判断订单是否已经过期 if (order.ExpireTime <= DateTime.Now) { result.Reason = 5; InsertOrderLog(order, 5); return(result); } //积分是否足够在前端提交时就判断了,到这里后不会再次判断 //在存储过程中判断即可 //判断账户余额是否足够,是否大于想使用的金额 //这里初步判断,存储过程中还要判断(行锁定) int cashAccount = _memberManager.GetMemberCashAccountBalances(args.MemberId); if (cashAccount < args.CashAccountFee) { result.Reason = 2; InsertOrderLog(order, 2); return(result); } //判断是否已经有待支付的微信支付订单了 //如果有,但已过期,则关闭原订单 //如果有,但金额和这次不一样,则关闭原订单 //如果有,且未过期且金额与本次一致,返回微支付订单号需转入微信支付画面 string outTradeNo = args.OrderId.ToString().Replace("-", ""); List <PayOrderEntity> existPayOrderList = _payManager.GetPayOrderByOutTradeNo(outTradeNo); foreach (PayOrderEntity existPayOrder in existPayOrderList) { if (existPayOrder.TimeExpire <= DateTime.Now) { _payManager.ClosePayOrder(existPayOrder.OutTradeNo, config); continue; } if (existPayOrder.TotalFee != args.WeixinPayFee) { _payManager.ClosePayOrder(existPayOrder.OutTradeNo, config); continue; } result.Reason = 8; result.Data = new PointCommodityOrderPayResult(); result.Data.PayOrderId = existPayOrder.Id; result.Success = true; return(result); } //判断是否需要微信支付,如果需要则直接生成微信支付订单并返回订单号到前端跳转 //订单的完成在支付成功的回调中处理 //微信支付成功后,还是先把钱存到账户余额,然后再从余额中下帐成单 if (args.WeixinPayFee > 0) { #region 创建微信支付定单 CreatePayOrderArgs createPayOrderArgs = new CreatePayOrderArgs(); createPayOrderArgs.MemberId = args.MemberId; createPayOrderArgs.OpenId = args.OpenId; createPayOrderArgs.Fee = args.WeixinPayFee; createPayOrderArgs.SpbillCreateIp = args.SpbillCreateIp; createPayOrderArgs.OrderType = EnumPayOrderType.PointCommodity; createPayOrderArgs.Body = order.OrderNumber; createPayOrderArgs.OutTradeNo = outTradeNo; NormalResult <CreatePayOrderResult> createPayOrderResult = _payManager.CreatePayOrder(createPayOrderArgs, config); if (createPayOrderResult.Success == false) { InsertOrderLog(order, 7, createPayOrderResult.Message); result.Reason = 7; result.Message = createPayOrderResult.Message; return(result); } InsertOrderLog(order, 3); result.Reason = 3; result.Data = new PointCommodityOrderPayResult(); result.Data.PayOrderId = createPayOrderResult.Data.PayOrderId; result.Success = true; return(result); #endregion } //如果不需要微信支付,则转到存储过程开始处理 NormalResult checkoutResult = Checkout(order); result.Reason = checkoutResult.Reason; if (result.Reason == 0) { result.Success = true; } return(result); }
/// <summary> /// 创建一个微信支付订单 /// 默认在2小时后过期 /// </summary> /// <param name="args"></param> /// <param name="config"></param> /// <returns></returns> public NormalResult <CreatePayOrderResult> CreatePayOrder(CreatePayOrderArgs args, AuthorizerPayConfig config) { NormalResult <CreatePayOrderResult> result = new NormalResult <CreatePayOrderResult>(false); if (config == null) { result.Message = "当前公众号没有微信支付所需配置信息。"; return(result); } //TODO:这里只判断了 Deposit if (ExistUnfinishedOrder(config.Domain, config.AppId, args.MemberId, EnumPayOrderType.Deposit)) { result.Message = "存在尚未结束的订单,请先完成当前订单的支付或将其关闭。"; return(result); } //string outTradeNo =Guid.NewGuid().ToString().Replace("-", ""); DateTime timeStart = DateTime.Now; DateTime timeExpire = DateTime.Now.AddHours(2); Guid payOrderId = Guid.NewGuid(); WeixinPayUnifiedOrderArgs unifiedOrderArgs = new WeixinPayUnifiedOrderArgs(); unifiedOrderArgs.AppId = config.AppId; unifiedOrderArgs.MchId = config.MchId; unifiedOrderArgs.DeviceInfo = "WEB"; unifiedOrderArgs.Body = args.Body; //"会员充值"; unifiedOrderArgs.OutTradeNo = args.OutTradeNo; // outTradeNo; unifiedOrderArgs.TotalFee = (int)args.Fee; unifiedOrderArgs.SpbillCreateIp = args.SpbillCreateIp; if (unifiedOrderArgs.SpbillCreateIp == "::1") { unifiedOrderArgs.SpbillCreateIp = "127.0.0.1"; } unifiedOrderArgs.TimeStart = timeStart.ToString("yyyyMMddHHmmss"); unifiedOrderArgs.TimeExpire = timeExpire.ToString("yyyyMMddHHmmss"); unifiedOrderArgs.NotifyUrl = ""; unifiedOrderArgs.TradeType = "JSAPI"; unifiedOrderArgs.OpenId = args.OpenId; unifiedOrderArgs.NotifyUrl = SettingsManager.Instance.GetClientAddress(config.AppId) + "Api/Pay/PayNotify/" + config.Domain; unifiedOrderArgs.Attach = payOrderId.ToString(); WxPayArgs wxPayArgs = config.GetWxPayArgs(false); RequestPayApiResult <WeixinPayUnifiedOrderResult> unifiedOrderResult = WxPayApi.UnifiedOrder(unifiedOrderArgs, wxPayArgs); if (unifiedOrderResult.Success == false) { _log.Write("UnifiedOrder 失败", unifiedOrderResult.Message + "\r\n" + JsonHelper.Serializer(unifiedOrderArgs) + " " + JsonHelper.Serializer(unifiedOrderResult), TraceEventType.Warning); result.Success = false; result.Message = unifiedOrderResult.Message; return(result); } PayOrderEntity orderEntity = new PayOrderEntity(); orderEntity.Id = payOrderId; orderEntity.Domain = config.Domain; orderEntity.Member = args.MemberId; orderEntity.Type = args.OrderType; orderEntity.AppId = config.AppId; orderEntity.MchId = config.MchId; orderEntity.DeviceInfo = unifiedOrderArgs.DeviceInfo; orderEntity.Body = unifiedOrderArgs.Body; orderEntity.OutTradeNo = args.OutTradeNo;//outTradeNo; orderEntity.TotalFee = unifiedOrderArgs.TotalFee; orderEntity.SpbillCreateIp = unifiedOrderArgs.SpbillCreateIp; orderEntity.TimeStart = timeStart; orderEntity.TimeExpire = timeExpire; orderEntity.TradeType = unifiedOrderArgs.TradeType; orderEntity.OpenId = unifiedOrderArgs.OpenId; orderEntity.PrepayId = unifiedOrderResult.ApiResult.PrepayId; orderEntity.TradeState = EnumPayTradeState.NOTPAY; _dataBase.Insert(orderEntity); CreatePayOrderResult depositPayResult = new CreatePayOrderResult(); depositPayResult.PayOrderId = orderEntity.Id; depositPayResult.PrepayId = unifiedOrderResult.ApiResult.PrepayId; result.Data = depositPayResult; result.Success = true; return(result); }