예제 #1
0
 public void TestMethod1()
 {
     using (var shopDb = TShopDbContxtFactory.MarkShopDb())
     {
         using (var db = TShopDbContxtFactory.MarkFinanceDb())
         {
             BeginRechangeArgsModel args = new BeginRechangeArgsModel();
             if (args.ShopFlag == null)
             {
                 throw new ArgumentNullException("ShopFlag");
             }
             if (!args.ShopOrderId.HasValue)
             {
                 throw new ArgumentNullException("ShopOrderId");
             }
             var       memberId  = 113;
             ShopOrder shopOrder = shopDb.GetSingle <ShopOrder>(args.ShopOrderId.Value);
             if (shopOrder == null)
             {
                 throw new Exception("订单不存在");
             }
             ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                       .Where(m => !m.IsDel)
                                       .Where(m => m.ShopFlag == args.ShopFlag && m.IsEnable)
                                       .FirstOrDefault();
             if (shopPayInfo == null)
             {
                 throw new Exception("当前商铺没有设置好支付信息。");
             }
             PayProxyBase payProxy  = FactoryUtil.GetPayProxyFactory().GetProxy(shopPayInfo);
             var          tradeNo   = "SP" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);
             var          tradeDate = DateTime.Now.ToString("yyyyMMddHHmmss");
             var          model     = new MemberTradeForRechange()
             {
                 AddTime        = DateTime.Now,
                 MemberId       = memberId,
                 Detail         = "用户支付" + shopOrder.Payment.Value + "分",
                 OutBank        = "",
                 PayChannel     = payProxy.PayChannel,
                 Status         = MemberTradeForRechangeStatus.未完成,
                 TimeExpire     = DateTime.Now,
                 TimeStart      = DateTime.Now,
                 Title          = "用户支付",
                 TotalFee       = shopOrder.Payment.Value,
                 ShopOrderId    = args.ShopOrderId.Value,
                 MoneyOffRuleId = shopOrder.MoneyOffRuleId,
                 TradeNo        = tradeNo,
                 PayWay         = (int)shopPayInfo.PayWay,
                 //ShopType = shopOrder
                 RowVersion = DateTime.Now
             };
             db.AddToMemberTradeForRechange(model);
             var payInfo = payProxy.GetPayInfo(model, "");
         }
     }
 }
예제 #2
0
        private void ExPayInfo(SetPayInfoArgsModel args, ShopPayInfo model)
        {
            if (model == null)
            {
                ShopPayInfo shopPayInfo = new ShopPayInfo()
                {
                    ShopId    = args.shopid.Value,
                    MchId     = args.mchid,
                    SecretKey = args.secretkey,
                    PayWay    = args.payway,
                    IsEnable  = args.isenable
                };
                string shopFlag = db.Query <Shop>()
                                  .Where(m => !m.IsDel)
                                  .Where(m => m.Id == args.shopid.Value)
                                  .Select(m => m.Flag)
                                  .FirstOrDefault();

                string appid = db.Query <ShopWechatOpenAuthorizer>()
                               .Where(m => !m.IsDel)
                               .Where(m => m.ShopId == args.shopid.Value)
                               .Select(m => m.WechatOpenAuthorizer)
                               .Select(m => m.AuthorizerAppId)
                               .FirstOrDefault();

                if (string.IsNullOrEmpty(appid))
                {
                    throw new Exception("请先在商户后台进行授权");
                }

                shopPayInfo.ShopFlag = shopFlag;
                shopPayInfo.AppId    = appid;
                shopPayInfo.AddTime  = DateTime.Now;
                db.AddTo <ShopPayInfo>(shopPayInfo);
                db.SaveChanges();
            }
            else
            {
                model.PayWay   = args.payway;
                model.MchId    = args.mchid;
                model.IsEnable = args.isenable;        //args.isenable;
                string appid = db.Query <ShopWechatOpenAuthorizer>()
                               .Where(m => !m.IsDel)
                               .Where(m => m.ShopId == args.shopid.Value)
                               .Select(m => m.WechatOpenAuthorizer)
                               .Select(m => m.AuthorizerAppId)
                               .FirstOrDefault();
                model.AppId = appid;
                Regex regex = new Regex(@"^\*+$");
                if (!regex.IsMatch(args.secretkey))
                {
                    model.SecretKey = args.secretkey;
                }
            }
        }
예제 #3
0
        public APIResult BeginRefund(RefundArgsModel args)
        {
            if (string.IsNullOrEmpty(args.ShopFlag) || string.IsNullOrEmpty(args.TradeNo))
            {
                throw new ArgumentNullException("缺少必须参数");
            }
            var memberrechanges = finaceDb.MemberTradeForRechanges.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRechangeStatus.成功);

            if (memberrechanges == null)
            {
                return(Error("未找到支付记录,请检查数据是否正确!"));
            }
            var memberrefundobj = finaceDb.memberTradeForRefunds.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRefundStatus.成功);

            if (memberrefundobj != null)
            {
                throw new ArgumentNullException($"订单{args.TradeNo}已成功退款,不能重复退款!");
            }
            ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                      .Where(m => !m.IsDel)
                                      .Where(m => m.ShopFlag == args.ShopFlag && m.IsEnable)
                                      .FirstOrDefault();

            if (shopPayInfo == null)
            {
                throw new Exception("当前商铺没有设置好退款信息。");
            }
            PayProxyBase payProxy = proxyFactory.GetProxy(shopPayInfo);

            var Refundno = "TK" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);

            var model = new MemberTradeForRefund()
            {
                AddIP            = GetIp(),
                AddTime          = DateTime.Now,
                AddUser          = GetUsername(),
                MemberId         = memberrechanges.MemberId,
                Detail           = "用户退款" + memberrechanges.TotalFee + "分",
                OutBank          = "",
                PayChannel       = payProxy.PayChannel,
                Status           = MemberTradeForRefundStatus.退款中,
                TimeExpire       = DateTime.Now,
                TimeStart        = DateTime.Now,
                Title            = "用户退款",
                TotalFee         = memberrechanges.TotalFee,
                TradeNo          = memberrechanges.TradeNo,
                MechanismTradeNo = memberrechanges.MechanismTradeNo,
                RefundTradeNo    = Refundno
            };

            finaceDb.AddToMemberTradeForRefund(model);
            var obj = payProxy.Refund(model);

            return(Success(obj));
        }
예제 #4
0
        public APIResult GetRechangeResult([FromBody] GetRechangeResultArgsModel args)
        {
            if (string.IsNullOrEmpty(args.TradeNo))
            {
                throw new ArgumentNullException("TradeNo");
            }
            if (args.ShopFlag == null)
            {
                throw new ArgumentNullException("ShopFlag");
            }
            var         memberId    = GetMemberId();
            ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                      .Where(m => !m.IsDel)
                                      .Where(m => m.ShopFlag == args.ShopFlag)
                                      .FirstOrDefault();

            if (shopPayInfo == null)
            {
                throw new Exception("当前商铺没有设置好支付信息。");
            }
            PayProxyBase payProxy = proxyFactory.GetProxy(shopPayInfo);
            var          rechange = db.Query <MemberTradeForRechange>()
                                    .Where(m => m.MemberId == memberId && m.TradeNo == args.TradeNo)
                                    .FirstOrDefault();

            if (rechange == null)
            {
                throw new Exception("指定的纪录不存在");
            }
            _logger.LogInformation($"获取到rechange{rechange.Id},状态 {rechange.Status}");

            if (rechange.Status == MemberTradeForRechangeStatus.未完成)
            {
                var result = payProxy.GetPayResult(rechange);
                _logger.LogInformation($"获取到result{result.Xml}");
                //rechange.SetFinish(shopDb,db,options, result,_logger);
                db.SaveChanges();
            }
            return(Success(rechange));
        }
예제 #5
0
 public SwiftpassPayProxy(ShopPayInfo payinfo, IPayOption payOption, ILogger _logger) : base(payOption, _logger)
 {
     //            options.WftPublicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKF4mYjBMHkRqwNWWJ5t9sMriHPBOfMpJLUhMJE6ri28RHHEbYoRWYV7g3Lt2BZpcopoIpblcC07Kn9Mgur3/RcCAwEAAQ==";
     //options.MchPrivateKey = @"MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAoXiZiMEweRGrA1ZY
     //nm32wyuIc8E58ykktSEwkTquLbxEccRtihFZhXuDcu3YFmlyimgiluVwLTsqf0yC
     //6vf9FwIDAQABAkBANuTgNOwhCby33AvsHZEn9tUSK8LvB+q4OdXFu89vEjFttOLJ
     //9yyACYvOjmii6e5ThqDjX1codbXuzbXE06KpAiEAztVBPzd/ZDJReOQq4raYIRhX
     //eYkay8ko2f1mIdiRrnMCIQDH2tyUQqiGhtHMerjKW+mgSP0KguGwpC7u1rWqHY3J
     //zQIgMsHs0Cm7bohWrBc6Wwa6UKzbkqzN0aLdDpn7/WRbY/cCIQC8V9O8nT042mFp
     //NNZlTk1T0rU1bLbIw1G/n/TABu4SmQIgH7UBuIqvA6b2O4RANl+c97PuC9+Mdmpr
     //TBP3JwCg5yE=";
     // options.NotifyUrl = "https://wxapi.91huichihuihe.com/SwiftpassPay/Notify";
     //options.ReqUrl = "https://pay.swiftpass.cn/pay/gateway";
     // this.options = options;
     this.payinfo     = payinfo;
     this._logger     = _logger;
     this.shopDb      = ZRui.Web.BLL.DbContextFactory.ShopDb;
     this.swifpasskey = shopDb.SwiftpassKey.FirstOrDefault(r => r.ShopFlag == payinfo.ShopFlag && r.IsEnable);
     if (swifpasskey == null)
     {
         throw new Exception("商家支付密钥未配置");
     }
 }
예제 #6
0
        public PayProxyBase GetProxy(ShopPayInfo payInfo)
        {
            PayProxyBase rtn;
            ILogger      logger;

            switch (payInfo.PayWay)
            {
            case PayWay.Wechat:
                logger = loggerFactory.CreateLogger <WechatPayProxy>();
                rtn    = new WechatPayProxy(payInfo, wechatPayOptions, logger);
                break;

            case PayWay.Swiftpass:
                logger = loggerFactory.CreateLogger <SwiftpassPayProxy>();
                rtn    = new SwiftpassPayProxy(payInfo, null, logger);
                break;

            default:
                logger = loggerFactory.CreateLogger <WechatPayProxy>();
                rtn    = new WechatPayProxy(payInfo, wechatPayOptions, logger);
                break;
            }
            return(rtn);
        }
예제 #7
0
        public MemberTradeForRefund RefundAction(RefundArgsModel args)
        {
            var orderid = 0;

            var Refundno = string.Empty;

            if (string.IsNullOrEmpty(args.TradeNo))
            {
                throw new ArgumentNullException("缺少必须参数");
            }
            var memberrechanges = db.MemberTradeForRechanges.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRechangeStatus.成功);

            if (memberrechanges == null)
            {
                throw new ArgumentNullException("未找到支付记录,请检查数据是否正确!");
            }
            orderid = memberrechanges.OrderId;
            var memberrefundobj = db.memberTradeForRefunds.FirstOrDefault(r => r.TradeNo == args.TradeNo && r.Status == MemberTradeForRefundStatus.成功);

            if (memberrefundobj != null)
            {
                throw new ArgumentNullException($"订单{args.TradeNo}已成功退款,不能重复退款!");
            }
            ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                      .Where(m => !m.IsDel)
                                      .Where(m => m.ShopId == memberrechanges.ShopId && (int)m.PayWay == memberrechanges.PayWay)
                                      .FirstOrDefault();

            if (shopPayInfo == null)
            {
                throw new Exception("当前商铺没有设置好退款信息。");
            }
            var payProxy = proxyFactory.GetProxy(shopPayInfo);

            if (memberrechanges.OrderType == OrderType.普通订单)
            {
                Refundno = "TK" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);
            }
            else
            {
                Refundno = "PTTK" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);
            }


            var model = new MemberTradeForRefund()
            {
                //AddIP = GetIp(),
                AddTime = DateTime.Now,
                //AddUser = GetUsername(),
                MemberId         = memberrechanges.MemberId,
                Detail           = "用户退款" + memberrechanges.TotalFee + "分",
                OutBank          = "",
                PayChannel       = payProxy.PayChannel,
                Status           = MemberTradeForRefundStatus.退款中,
                TimeExpire       = DateTime.Now,
                TimeStart        = DateTime.Now,
                Title            = "用户退款",
                TotalFee         = memberrechanges.TotalFee,
                TradeNo          = memberrechanges.TradeNo,
                MechanismTradeNo = memberrechanges.MechanismTradeNo,
                RefundTradeNo    = Refundno,
                OrderType        = memberrechanges.OrderType,
                OrderId          = memberrechanges.OrderId
            };

            SwiftpassPayResponseHandler obj = payProxy.Refund(model) as SwiftpassPayResponseHandler;

            if (obj.Status != 0)
            {
                new RefundLog <object>(hchhLog).RefundAction("Refund"
                                                             , BLL.Log.PayOrRefundType.退款, memberrechanges.OrderId, memberrechanges.OrderType, model, obj, obj.ErrMsg);

                model.Status = MemberTradeForRefundStatus.失败;
                db.AddToMemberTradeForRefund(model);
                db.SaveChanges();

                return(model);
            }

            if (obj.ResultCode != 0)
            {
                model.Detail = obj.ErrCode;
                #region 添加短信余额不足发短信
                if (obj.ErrCode == "BALANCE_NOT_ENOUGH")
                {
                    var shop = shopDb.Shops.FirstOrDefault(m => m.Flag.Equals(args.ShopFlag));
                    if (!string.IsNullOrWhiteSpace(shop.Phone))
                    {
                        model.Detail = "账户余额不足,用户无法申请退款";
                        SMSHelper.Send(shop.Phone, model.Detail);
                    }
                }
                new RefundLog <object>(hchhLog).RefundAction("Refund"
                                                             , BLL.Log.PayOrRefundType.退款, memberrechanges.OrderId, memberrechanges.OrderType, model, obj, obj.ErrMsg);
                #endregion
                model.Status = MemberTradeForRefundStatus.失败;
                db.AddToMemberTradeForRefund(model);
                db.SaveChanges();
                return(model);
            }

            var refundresult = payProxy.GetRefundResult(model) as SwiftpassPayResponseHandler;



            string returnCode = refundresult.parameters["refund_status_0"].ToString();
            if (returnCode == "SUCCESS")
            {
                model.Status = MemberTradeForRefundStatus.成功;
            }
            else if (returnCode == "FAIL")
            {
                model.Status = MemberTradeForRefundStatus.失败;
            }
            else if (returnCode == "PROCESSING")
            {
                model.Status = MemberTradeForRefundStatus.退款中;
            }
            else
            {
                model.Detail = returnCode;
                model.Status = MemberTradeForRefundStatus.失败;
            }
            db.AddToMemberTradeForRefund(model);
            db.SaveChanges();
            return(model);
        }
예제 #8
0
        public ActionResult Notify()
        {
            string body = new StreamReader(Request.Body).ReadToEnd();

            byte[] requestData = Encoding.UTF8.GetBytes(body);
            Stream inputStream = new MemoryStream(requestData);

            using (StreamReader sr = new StreamReader(inputStream))
            {
                var         xml         = sr.ReadToEnd();
                var         notify      = new WechatPayResponseHandler(xml);
                ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                          .Where(m => !m.IsDel)
                                          .Where(m => m.AppId == notify.Appid)
                                          .Where(m => m.MchId == notify.Mchid)
                                          .FirstOrDefault();
                if (shopPayInfo == null)
                {
                    return(Fail());
                }
                PayProxyBase payProxy = proxyFactory.GetProxy(shopPayInfo);
                if (notify.isTenpaySign(payProxy.MakeSign))
                {
                    if (notify.ReturnCode == "SUCCESS" && notify.ResultCode == "SUCCESS")
                    {
                        try
                        {
                            //此处可以在添加相关处理业务,校验通知参数中的商户订单号out_trade_no和金额total_fee是否和商户业务系统的单号和金额是否一致,一致后方可更新数据库表中的记录。
                            var rechange = db.Query <MemberTradeForRechange>()
                                           .Where(m => m.TradeNo == notify.OutTradeNo)
                                           .FirstOrDefault();
                            if (rechange == null)
                            {
                                return(Fail());
                            }
                            if (rechange.TotalFee != notify.TotalFee)
                            {
                                return(Fail());
                            }

                            var result = payProxy.GetPayResult(rechange);
                            if (result.ReturnCode == "SUCCESS" && result.ResultCode == "SUCCESS" &&
                                result.TradeState == "SUCCESS")
                            {
                                rechange.SetFinish(printDbContext, thirdConfig, shopDb, db, options, result, _logger);
                                db.SaveChanges();
                                shopDb.SaveChanges();
                                return(Success());
                            }
                            else
                            {
                                _logger.LogError("微信支付通知错误,查询支付结果:{0}", Newtonsoft.Json.JsonConvert.SerializeObject(result));
                                return(Fail());
                            }
                        }
                        catch (Exception e)
                        {
                            _logger.LogError("微信支付通知错误:{0}\n{1}", e.Message, e.StackTrace);
                            return(Fail());
                        }
                    }
                    return(Fail());
                }
                else
                {
                    return(Fail());
                }
            }
        }
예제 #9
0
        public APIResult BeginRechange([FromBody] BeginRechangeArgsModel args)
        {
            //if (args.TotalFee <= 0) throw new Exception("充值金额需要大于0");
            if (args.ShopFlag == null)
            {
                throw new ArgumentNullException("ShopFlag");
            }
            if (!args.ConglomerationOrderId.HasValue)
            {
                throw new ArgumentNullException("ConglomerationOrderId");
            }
            var memberId = GetMemberId();
            ConglomerationOrder conglomerationOrder = shopDb.GetSingle <ConglomerationOrder>(args.ConglomerationOrderId.Value);

            if (conglomerationOrder == null)
            {
                throw new Exception("订单不存在");
            }
            ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                      .Where(m => !m.IsDel)
                                      .Where(m => m.ShopFlag == args.ShopFlag)
                                      .Where(m => m.ShopFlag == args.ShopFlag && m.IsEnable)
                                      .FirstOrDefault();

            if (shopPayInfo == null)
            {
                throw new Exception("当前商铺没有设置好支付信息。");
            }
            if (shopPayInfo.PayWay == PayWay.Wechat)
            {
                throw new Exception("拼团功能暂不支持,请联系商户修改支付模式");
            }
            PayProxyBase payProxy  = proxyFactory.GetProxy(shopPayInfo);
            var          tradeNo   = "SP" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);
            var          tradeDate = DateTime.Now.ToString("yyyyMMddHHmmss");
            var          model     = new MemberTradeForRechange()
            {
                AddIP                 = GetIp(),
                AddTime               = DateTime.Now,
                AddUser               = GetUsername(),
                MemberId              = memberId,
                Detail                = "拼团订单支付" + conglomerationOrder.Payment.Value + "分",
                OutBank               = "",
                PayChannel            = payProxy.PayChannel,
                Status                = MemberTradeForRechangeStatus.未完成,
                TimeExpire            = DateTime.Now,
                TimeStart             = DateTime.Now,
                Title                 = "拼团订单支付",
                TotalFee              = conglomerationOrder.Payment.Value,
                ConglomerationOrderId = args.ConglomerationOrderId.Value,
                MoneyOffRuleId        = 0,
                TradeNo               = tradeNo,
                OrderType             = OrderType.拼团订单,
                OrderId               = args.ConglomerationOrderId.Value,
                ShopOrderId           = 0,
                PayWay                = (int)shopPayInfo.PayWay,
                ShopId                = shopPayInfo.ShopId
            };

            db.AddToMemberTradeForRechange(model);
            var openId  = GetOpenId();
            var payInfo = payProxy.GetPayInfo(model, openId);

            db.SaveChanges();
            if (shopPayInfo.PayWay == PayWay.Wechat)
            {
                new PayOrRefundUtil <object>(LogDbContext).PayAction("Pay"
                                                                     , BLL.Log.PayOrRefundType.支付, args.ConglomerationOrderId.Value, OrderType.拼团订单, model, payInfo);
                return(Success(new
                {
                    payInfo,
                    TradeNo = tradeNo
                }));
            }
            else
            {
                PayInfoModel infoModel = new PayInfoModel();
                var          payinfo   = JsonConvert.DeserializeObject <PayInfo>(payInfo.ToString());
                infoModel.payInfo = payinfo;
                new PayOrRefundUtil <object>(LogDbContext).PayAction("Pay"
                                                                     , BLL.Log.PayOrRefundType.支付, args.ConglomerationOrderId.Value, OrderType.拼团订单, model, payInfo);
                return(Success(
                           infoModel
                           ));
            }
        }
예제 #10
0
        public ActionResult Notify()
        {
            _logger.LogInformation("=====================支付回调开始======================");

            //var logDb = ZRui.Web.BLL.DbContextFactory.LogDbContext;
            //logDb.Add<TaskLog>(new TaskLog() { AddTime = DateTime.Now, TaskName = "进入Notify" });

            string body = new StreamReader(Request.Body).ReadToEnd();

            byte[] requestData = Encoding.UTF8.GetBytes(body);
            Stream inputStream = new MemoryStream(requestData);


            using (StreamReader sr = new StreamReader(inputStream))
            {
                try
                {
                    var xml = sr.ReadToEnd();
                    _logger.LogInformation($"获取到result{xml}");
                    //logDb.Add<TaskLog>(new TaskLog() { AddTime = DateTime.Now, TaskName = "Notify", ExeResult = xml });
                    //logDb.SaveChanges();


                    var         notify      = new SwiftpassPayResponseHandler(null, xml);
                    ShopPayInfo shopPayInfo = shopdb.Query <ShopPayInfo>()
                                              .Where(m => !m.IsDel)
                                              .Where(m => m.AppId == notify.SwiftpassAppid)
                                              .Where(m => m.MchId == notify.SwiftpassMchid)
                                              .FirstOrDefault();
                    if (shopPayInfo == null)
                    {
                        return(Content("failure1"));
                    }

                    PayProxyBase payProxy = proxyFactory.GetProxy(shopPayInfo);
                    // if (notify.isTenpaySign())
                    //{
                    if (notify.Status == 0 && notify.ResultCode == 0 && notify.TradeState != "NOTPAY")
                    {
                        _logger.LogInformation("支付成功");

                        //此处可以在添加相关处理业务,校验通知参数中的商户订单号out_trade_no和金额total_fee是否和商户业务系统的单号和金额是否一致,一致后方可更新数据库表中的记录。
                        var rechange = db.Query <MemberTradeForRechange>()
                                       .Where(m => m.TradeNo == notify.OutTradeNo)
                                       .FirstOrDefault();
                        if (rechange == null)
                        {
                            throw new Exception("指定的OutTradeNo不存在");
                        }
                        if (rechange.TotalFee != notify.TotalFee)
                        {
                            throw new Exception("指定的金额不对应");
                        }
                        rechange.OutBank          = notify.Xml;
                        rechange.MechanismTradeNo = notify.TransactionId;
                        if (notify.getAllParameters()["result_code"].ToString() == "0")
                        {
                            rechange.SetFinish(printDbContext, shopdb, db, woptions, thirdConfig, _logger);
                            db.SaveChanges();
                            shopdb.SaveChanges();
                            _logger.LogInformation("回调成功返回success");
                            if (rechange.ConglomerationOrderId.HasValue)
                            {
                                ShopConglomerationOrderOptions.MemberInform(shopdb, _memberDbContext, rechange.ConglomerationOrderId.Value, _logger);
                                ShopConglomerationActivityOptions.NotifyOkRemoveList(rechange, shopdb, _logger);
                            }
                            _logger.LogInformation("=====================支付回调结束======================");
                            return(Content("success"));
                        }
                        else
                        {
                            _logger.LogInformation("回调失败返回failure1");
                            _logger.LogInformation("=====================支付回调结束======================");
                            return(Content("failure1"));
                        }
                        //var result = payProxy.GetPayResult(rechange);
                        //_logger.LogInformation($"获取到result{result.Xml}");

                        //
                        //if (result.TradeState != "NOTPAY")
                        //{
                        //    if (rechange.Status == MemberTradeForRechangeStatus.未完成)
                        //    {

                        //        if (rechange.TotalFee != result.TotalFee) throw new Exception("指定的金额不对应");
                        //        rechange.OutBank = result.Xml;
                        //        rechange.MechanismTradeNo = result.TransactionId;
                        //        switch (result.TradeState)
                        //        {
                        //            case "SUCCESS":
                        //                rechange.SetFinish(printDbContext, shopdb, db, woptions, _logger);
                        //                break;
                        //            case "CLOSED":
                        //                rechange.Status = MemberTradeForRechangeStatus.取消;
                        //                break;
                        //            default:
                        //                db.SetMemberTradeForRechangeFail(rechange, result.TradeState);
                        //                break;
                        //        }
                        //    }
                        //}
                    }
                    else
                    {
                        _logger.LogInformation($"=====================支付回调结束======================");
                        return(Content("failure1"));
                    }
                    // }
                    //else
                    //{
                    //  return Content("failure2");
                    //}
                }
                catch (Exception e)
                {
                    _logger.LogInformation($"回调错误{e}");
                    return(Content("failure1"));
                }
            }
        }
예제 #11
0
        public APIResult BeginRecharge([FromBody] BeginRechangeArgsModel args)
        {
            try
            {
                if (args.ShopFlag == null)
                {
                    throw new ArgumentNullException("ShopFlag");
                }
                var         memberId    = GetMemberId();
                Shop        shop        = shopDb.Query <Shop>().FirstOrDefault(m => !m.IsDel && m.Flag == args.ShopFlag);
                ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                          .Where(m => !m.IsDel)
                                          .Where(m => m.ShopFlag == args.ShopFlag && m.IsEnable)
                                          .FirstOrDefault();
                if (shopPayInfo == null)
                {
                    throw new Exception("当前商铺没有设置好支付信息。");
                }

                int rechangeAmount, presentedAmount;
                if (args.RechargeType == RechargeType.固定金额)
                {
                    if (!args.TopUpId.HasValue)
                    {
                        throw new Exception("TopUpId不能为空");
                    }
                    var topUpSet = shopDb.Query <ShopTopUpSet>()
                                   .FirstOrDefault(m => !m.IsDel && m.Id == args.TopUpId.Value && m.ShopId == shop.Id);
                    if (topUpSet == null)
                    {
                        throw new Exception("该商铺不存在此项充值");
                    }
                    rechangeAmount  = topUpSet.FixationTopUpAmount;
                    presentedAmount = topUpSet.PresentedAmount;
                }
                else
                {
                    if (!args.Amount.HasValue)
                    {
                        throw new Exception("充值金额不能为空");
                    }
                    rechangeAmount = args.Amount.Value;
                    var customTopUpSet = shopDb.Query <ShopCustomTopUpSet>()
                                         .FirstOrDefault(m => !m.IsDel && m.ShopId == shop.Id);
                    if (customTopUpSet == null)
                    {
                        throw new Exception("该商铺不存在此项充值");
                    }
                    if (args.Amount.Value < customTopUpSet.StartAmount)
                    {
                        throw new Exception("充值金额少于起充金额");
                    }
                    if (args.Amount.Value > customTopUpSet.MeetAmount)
                    {
                        presentedAmount = (int)((args.Amount.Value - customTopUpSet.MeetAmount) * (customTopUpSet.Additional / 100.00D));
                    }
                    else
                    {
                        presentedAmount = 0;
                    }
                }
                var shopMember     = BLL.Servers.ShopMemberServer.GetShopMember(shopDb, shop.Id, memberId);
                var memberRecharge = new ShopMemberRecharge()
                {
                    Amount          = rechangeAmount,
                    PresentedAmount = presentedAmount,
                    ShopMemberId    = shopMember.Id,
                    TransactionTime = DateTime.Now,
                    Status          = ShopMemberTransactionStatus.未完成
                };
                shopDb.Add(memberRecharge);
                shopDb.SaveChanges();
                PayProxyBase payProxy  = proxyFactory.GetProxy(shopPayInfo);
                var          tradeNo   = "SP" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);
                var          tradeDate = DateTime.Now.ToString("yyyyMMddHHmmss");
                var          model     = new MemberTradeForRechange()
                {
                    AddIP                 = GetIp(),
                    AddTime               = DateTime.Now,
                    AddUser               = GetUsername(),
                    MemberId              = memberId,
                    Detail                = $"用户支付{rechangeAmount}分",
                    OutBank               = "",
                    PayChannel            = payProxy.PayChannel,
                    Status                = MemberTradeForRechangeStatus.未完成,
                    TimeExpire            = DateTime.Now,
                    TimeStart             = DateTime.Now,
                    Title                 = "用户充值",
                    ShopOrderId           = memberRecharge.Id,
                    TotalFee              = rechangeAmount,
                    TradeNo               = tradeNo,
                    PayWay                = (int)shopPayInfo.PayWay,
                    RowVersion            = DateTime.Now,
                    OrderType             = OrderType.充值订单,
                    ConglomerationOrderId = 0,
                    ShopId                = shopPayInfo.ShopId
                };
                finaceDb.AddToMemberTradeForRechange(model);
                var openId  = GetOpenId();
                var payInfo = payProxy.GetPayInfo(model, openId);
                finaceDb.SaveChanges();
                if (shopPayInfo.PayWay == PayWay.Wechat)
                {
                    new PayOrRefundUtil <object>(LogDbContext).PayAction("Pay"
                                                                         , BLL.Log.PayOrRefundType.支付, rechangeAmount, OrderType.普通订单, model, payInfo);
                    return(Success(new
                    {
                        payInfo,
                        TradeNo = tradeNo
                    }));
                }
                else
                {
                    var infoModel = new Core.Finance.WechatPay.PayAPIModels.PayInfoModel();
                    var payinfo   = JsonConvert.DeserializeObject <ZRui.Web.Core.Finance.WechatPay.PayAPIModels.PayInfo>(payInfo.ToString());
                    infoModel.payInfo = payinfo;
                    //new PayOrRefundUtil<object>(LogDbContext).PayAction("Pay"
                    //     , BLL.Log.PayOrRefundType.支付, args.ShopOrderId.Value, OrderType.普通订单, model, payInfo);
                    return(Success(
                               infoModel
                               ));
                }
            }
            catch (Exception ex)
            {
                //new PayOrRefundUtil<object>(LogDbContext).PayAction("Pay"
                //        , BLL.Log.PayOrRefundType.支付, args.ShopOrderId.Value, OrderType.普通订单, null, null, ex.Message + "【StackTrace】" + ex.StackTrace);
                throw new Exception(ex.Message);
            }
        }
예제 #12
0
 public WechatPayProxy(ShopPayInfo shopPayInfo, IPayOption options, ILogger logger) : base(options, logger)
     => this.shopPayInfo = shopPayInfo;
예제 #13
0
        public APIResult BeginRechange([FromBody] BeginRechangeArgsModel args)
        {
            try
            {
                if (args.ShopFlag == null)
                {
                    throw new ArgumentNullException("ShopFlag");
                }
                if (!args.ShopOrderId.HasValue)
                {
                    throw new ArgumentNullException("ShopOrderId");
                }
                var       memberId  = GetMemberId();
                ShopOrder shopOrder = shopDb.GetSingle <ShopOrder>(args.ShopOrderId.Value);
                if (shopOrder == null)
                {
                    throw new Exception("订单不存在");
                }
                ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                          .Where(m => !m.IsDel)
                                          .Where(m => m.ShopFlag == args.ShopFlag && m.IsEnable)
                                          .FirstOrDefault();
                if (shopPayInfo == null)
                {
                    throw new Exception("当前商铺没有设置好支付信息。");
                }


                //排除扫码 自助点餐
                var checkThirdResult = CheckThird(shopOrder, shopOrder.ShopId);
                if (!checkThirdResult.Success)
                {
                    throw new Exception(checkThirdResult.Message);
                }

                PayProxyBase payProxy  = proxyFactory.GetProxy(shopPayInfo);
                var          tradeNo   = "SP" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);
                var          tradeDate = DateTime.Now.ToString("yyyyMMddHHmmss");
                var          model     = new MemberTradeForRechange()
                {
                    AddIP          = GetIp(),
                    AddTime        = DateTime.Now,
                    AddUser        = GetUsername(),
                    MemberId       = memberId,
                    Detail         = "用户支付" + shopOrder.Payment.Value + "分",
                    OutBank        = "",
                    PayChannel     = payProxy.PayChannel,
                    Status         = MemberTradeForRechangeStatus.未完成,
                    TimeExpire     = DateTime.Now,
                    TimeStart      = DateTime.Now,
                    Title          = "用户支付",
                    TotalFee       = shopOrder.Payment.Value,
                    ShopOrderId    = args.ShopOrderId.Value,
                    MoneyOffRuleId = shopOrder.MoneyOffRuleId,
                    TradeNo        = tradeNo,
                    PayWay         = (int)shopPayInfo.PayWay,
                    //ShopType = shopOrder
                    RowVersion            = DateTime.Now,
                    OrderType             = OrderType.普通订单,
                    OrderId               = args.ShopOrderId.Value,
                    ConglomerationOrderId = 0,
                    ShopId = shopPayInfo.ShopId
                };
                finaceDb.AddToMemberTradeForRechange(model);
                // var openId = "oYBBo5PUP3TF37pUNiVvc7j5gJ6k"; //"oYBBo5PUP3TF37pUNiVvc7j5gJ6k";//
                var openId  = GetOpenId(); //"oYBBo5PUP3TF37pUNiVvc7j5gJ6k";//
                var payInfo = payProxy.GetPayInfo(model, openId);
                finaceDb.SaveChanges();
                if (shopPayInfo.PayWay == PayWay.Wechat)
                {
                    new PayOrRefundUtil <object>(LogDbContext).PayAction("Pay"
                                                                         , BLL.Log.PayOrRefundType.支付, args.ShopOrderId.Value, OrderType.普通订单, model, payInfo);
                    return(Success(new
                    {
                        payInfo,
                        TradeNo = tradeNo
                    }));
                }
                else
                {
                    PayInfoModel infoModel = new PayInfoModel();
                    var          payinfo   = JsonConvert.DeserializeObject <ZRui.Web.Core.Finance.WechatPay.PayAPIModels.PayInfo>(payInfo.ToString());
                    infoModel.payInfo = payinfo;
                    new PayOrRefundUtil <object>(LogDbContext).PayAction("Pay"
                                                                         , BLL.Log.PayOrRefundType.支付, args.ShopOrderId.Value, OrderType.普通订单, model, payInfo);
                    return(Success(
                               infoModel
                               ));
                }
            }
            catch (Exception ex)
            {
                new PayOrRefundUtil <object>(LogDbContext).PayAction("Pay"
                                                                     , BLL.Log.PayOrRefundType.支付, args.ShopOrderId.Value, OrderType.普通订单, null, null, ex.Message + "【StackTrace】" + ex.StackTrace);
                throw new Exception(ex.Message);
            }
            //if (args.TotalFee <= 0) throw new Exception("充值金额需要大于0");
        }
예제 #14
0
        public void RefundQuery()
        {
            //  shoporderid is not null and shoporderid> 0 and `Status`= 1 and PayWay = 1
            foreach (var refund in finaceDb.memberTradeForRefunds.Where(p => p.Status == MemberTradeForRefundStatus.退款中))
            {
                var memberrechanges = finaceDb.MemberTradeForRechanges.FirstOrDefault(r => r.TradeNo == refund.TradeNo && r.Status == MemberTradeForRechangeStatus.成功);
                if (memberrechanges == null || memberrechanges.ShopId == 0)
                {
                    // throw new ArgumentNullException("未找到支付记录,请检查数据是否正确!");
                    continue;
                }

                ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                          .Where(m => !m.IsDel)
                                          .Where(m => m.ShopId == memberrechanges.ShopId && (int)m.PayWay == memberrechanges.PayWay)
                                          .FirstOrDefault();
                if (shopPayInfo == null)
                {
                    continue;
                } //throw new Exception("当前商铺没有设置好退款信息。");

                var payProxy = proxyFactory.GetProxy(shopPayInfo);

                var result = payProxy.GetRefundResult(refund) as SwiftpassPayResponseHandler;
                if (result.Status != 0)
                {
                    refund.Detail = result.Message;
                    refund.Status = MemberTradeForRefundStatus.失败;
                }
                else
                {
                    string returnCode = result.parameters["refund_status_0"].ToString();
                    if (returnCode == "SUCCESS")
                    {
                        refund.Status     = MemberTradeForRefundStatus.成功;
                        refund.TimeExpire = DateTime.Now;
                    }
                    else if (returnCode == "FAIL")
                    {
                        refund.Detail = returnCode;
                        refund.Status = MemberTradeForRefundStatus.失败;
                    }
                    else if (result.parameters["refund_status_0"].ToString() != "PROCESSING")
                    {
                        refund.Detail = returnCode;
                        refund.Status = MemberTradeForRefundStatus.失败;
                    }
                }
                //update bussine order status

                if (refund.Status == MemberTradeForRefundStatus.成功)
                {
                    if (memberrechanges.OrderType == OrderType.普通订单)
                    {
                        var order = shopDb.ShopOrders.FirstOrDefault(p => p.Id == memberrechanges.OrderId);
                        if (order != null)
                        {
                            order.Status = ShopOrderStatus.已退款;
                        }
                    }
                    else if (memberrechanges.OrderType == OrderType.拼团订单)
                    {
                        var order = shopDb.ConglomerationOrder.FirstOrDefault(p => p.Id == memberrechanges.OrderId);
                        if (order != null)
                        {
                            order.Status = ShopOrderStatus.已退款;
                        }
                    }
                }

                shopDb.SaveChanges();
                finaceDb.SaveChanges();
            }
        }
예제 #15
0
        public APIResult PayApp([FromBody] BeginRechangeArgsModel args)
        {
            ShopOrder shopOrder = shopDb.GetSingle <ShopOrder>(args.ShopOrderId.Value);

            if (shopOrder == null)
            {
                throw new Exception("订单不存在");
            }
            ShopPayInfo shopPayInfo = shopDb.Query <ShopPayInfo>()
                                      .Where(m => !m.IsDel)
                                      .Where(m => m.ShopFlag == args.ShopFlag && m.IsEnable)
                                      .FirstOrDefault();

            if (shopPayInfo == null)
            {
                throw new Exception("当前商铺没有设置好支付信息。");
            }


            //排除扫码 自助点餐
            var checkThirdResult = CheckThird(shopOrder, shopOrder.ShopId);

            if (!checkThirdResult.Success)
            {
                throw new Exception(checkThirdResult.Message);
            }

            PayProxyBase payProxy  = proxyFactory.GetProxy(shopPayInfo);
            var          tradeNo   = "SP" + DateTime.Now.Ticks + CommonUtil.CreateNoncestr(5);
            var          tradeDate = DateTime.Now.ToString("yyyyMMddHHmmss");
            var          model     = new MemberTradeForRechange()
            {
                AddIP          = GetIp(),
                AddTime        = DateTime.Now,
                AddUser        = GetUsername(),
                MemberId       = 0,
                Detail         = "用户支付" + shopOrder.Payment.Value + "分",
                OutBank        = "",
                PayChannel     = payProxy.PayChannel,
                Status         = MemberTradeForRechangeStatus.未完成,
                TimeExpire     = DateTime.Now,
                TimeStart      = DateTime.Now,
                Title          = "用户支付",
                TotalFee       = shopOrder.Payment.Value,
                ShopOrderId    = args.ShopOrderId.Value,
                MoneyOffRuleId = shopOrder.MoneyOffRuleId,
                TradeNo        = tradeNo,
                PayWay         = (int)shopPayInfo.PayWay,
                //ShopType = shopOrder
                RowVersion            = DateTime.Now,
                OrderType             = OrderType.普通订单,
                OrderId               = args.ShopOrderId.Value,
                ConglomerationOrderId = 0,
                ShopId = shopPayInfo.ShopId
            };

            finaceDb.AddToMemberTradeForRechange(model);
            var payInfo = payProxy.GetPayAppInfo(model, "2018");

            finaceDb.SaveChanges();
            return(Success());
        }