Exemple #1
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"));
                }
            }
        }
Exemple #2
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);
        }
Exemple #3
0
 public void RefundAction(string name, PayOrRefundType payorrefundtype, int orderid, OrderType ordertype, T initiateparameter, SwiftpassPayResponseHandler notifyparameter, string errormsg = "")
 {
     hchh.PayOrRefundLog.Add(new BLL.Log.PayOrRefundLog()
     {
         Name              = name,
         PayOrRefundType   = payorrefundtype,
         OrderId           = orderid,
         OrderType         = ordertype,
         InitiateParameter = initiateparameter == null ? "" : JsonConvert.SerializeObject(initiateparameter),
         NotifyParameter   = notifyparameter == null ? "" : JsonConvert.SerializeObject(notifyparameter.parameters),
         AddTime           = DateTime.Now,
         ErrorMsg          = errormsg
     });
     hchh.SaveChanges();
 }