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