public ActionResult Notify() { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success"; //正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { res = "wrong";//错误的订单处理 } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); }
public ActionResult Callback() { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign()) { res = "success"; //正确的订单处理 //商户在收到后台通知后根据通知ID向财付通发起验证确认,采用后台系统调用交互模式 string notify_id = resHandler.GetParameter("notify_id"); //取结果参数做业务处理 string out_trade_no = resHandler.GetParameter("out_trade_no"); //财付通订单号 string transaction_id = resHandler.GetParameter("transaction_id"); //金额,以分为单位 string total_fee = resHandler.GetParameter("total_fee"); //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee string discount = resHandler.GetParameter("discount"); //支付结果 string result_code = resHandler.GetParameter("result_code"); if (result_code == "SUCCESS") { var buy = Config.Helper.CreateWhere <DbBuy>() .Where(o => o.OrderNo == out_trade_no) .SingleOrDefault(); if (buy != null) { buy.PayTime = DateTime.Now; Config.Helper.Save(buy); } } } else { res = "wrong"; //错误的订单处理 } var fileStream = System.IO.File.OpenWrite(Server.MapPath("~/1.txt")); fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Close(); string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); }
/// <summary> /// 统一下单回调 /// </summary> /// <param name="context"></param> /// <param name="outTradeNo">返回的订单号</param> /// <returns></returns> public static bool PayNotifyUrl(HttpContext context, out string outTradeNo) { try { ResponseHandler resHandler = new ResponseHandler(context); Log.WriteLogToTxt("统一下单回调:" + resHandler.ParseXML(), LogType.Debug); string returnCode = resHandler.GetParameter("return_code"); resHandler.GetParameter("return_msg"); outTradeNo = ""; resHandler.SetKey(MchIdkey); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && returnCode.ToUpper() == "SUCCESS") { outTradeNo = resHandler.GetParameter("out_trade_no"); return(true); //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } } catch (Exception ex) { WxWriteLogError(ex); } outTradeNo = ""; return(false); }
/// <summary> /// 订单支付验证, /// 返回 XML 字符串, XML字符串将包含 SUCCESS 或者 FAIL /// </summary> /// <param name="successAction">传入接收到的的 orderNumber, orderGuid, Money 三个参数用来进行验证; /// 验证成功返回 null,,此时 XML字符串将包含 SUCCESS; /// 验证失败返回失败字符串,此时 XML字符串将包含 FAIL; /// </param> /// <returns></returns> public string VerifyPayResult(Func <string, string, int, string> successAction) { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); //支付的结果 string return_msg = resHandler.GetParameter("return_msg"); resHandler.SetKey(Config.TenPayKey); string verifyCode = "SUCCESS", verifyMsg = "OK"; string resultXml = @"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>"; //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { //正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! var successFuncResult = successAction(resHandler.GetParameter("out_trade_no"), resHandler.GetParameter("attach"), Int32.Parse(resHandler.GetParameter("total_fee"))); if (successFuncResult != null) { verifyCode = "FAIL"; verifyMsg = successFuncResult; } } return(string.Format(resultXml, verifyCode, verifyMsg)); }
public HttpResult PayNotifyUrl() { try { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { //正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { //错误的订单处理 } /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 try { string appId = Config.SenparcWeixinSetting.TenPayV3_AppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 string openId = resHandler.GetParameter("openid"); var templateData = new Weixin_PaySuccess("https://yufaquan.cn", "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数", appId + " , " + openId); var result = TemplateApi.SendTemplateMessage(appId, openId, templateData); } catch (Exception ex) { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息", ex.ToString()); } #region 记录日志 #endregion var res = new { return_code, return_msg }; return(HttpResult.Success(res)); } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }
public ActionResult PayNotifyUrl() { try { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPyConfigRead.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success";//正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { res = "wrong";//错误的订单处理 } #region 记录日志 var logDir = ServerUtility.ContentRootMapPath(string.Format("~/App_Data/TenPayNotify/{0}", SystemTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", SystemTime.Now.ToString("yyyyMMdd"), SystemTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }
//微信支付回调地址 public ActionResult Notify() { LogHelper.AddLog("支付回调地址");//记录日志 ResponseHandler rspHandler = new ResponseHandler(null); rspHandler.SetKey(WeixinConfig.Key); LogHelper.AddLog(rspHandler.ParseXML());//记录日志 //SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 SUCCESS string return_code = rspHandler.GetParameter("return_code"); string return_msg = rspHandler.GetParameter("return_msg"); if (rspHandler.IsTenpaySign()) { if (return_code == "SUCCESS") { //订单号 string orderSn = rspHandler.GetParameter("out_trade_no"); OrdersEntity order = ordersbll.GetEntityByOrderSn(orderSn); if (order != null) { order.PayDate = DateTime.Now; order.PayStatus = (int)PayStatus.已支付; order.Status = (int)OrderStatus.未发货; ordersbll.SaveForm(order.Id, order); } else { LogHelper.AddLog("订单号不存在:" + orderSn); } //不同步 TelphoneLiangH5Entity tel = tlbll.GetEntity(order.TelphoneID);//根据靓号id获取靓号,修改售出状态 if (tel != null) { tel.SellMark = 1; tel.SellerName = order.Host; } tlbll.SaveForm(tel.TelphoneID, tel); //头条url回调 if (!string.IsNullOrEmpty(order.TouUrl)) { TouTiaoApi(order.TouUrl); } } } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public ActionResult PayNotifyUrl() { try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign()) { res = "success"; //正确的订单处理 } else { res = "wrong"; //错误的订单处理 } var logDir = Server.MapPath(string.Format("~/App_Data/TenPayNotify/{0}", DateTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { new WeixinException(ex.Message, ex); throw; } }
/// <summary> /// 支付成功后回调通知 /// </summary> /// <returns></returns> public ActionResult PayNotifyUrl() { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign()) { res = "success"; //正确的订单处理 string orderno = resHandler.GetParameter("out_trade_no"); var item = OrderService.LoadEntities(n => n.order_number == orderno).FirstOrDefault(); if (item != null) { PaySuccess(item.id); } else { SaveSyslog($"order_number={orderno}的订单回调产生错误_未找到订单对象", SysLogType.前台日志, "支付系统"); } } else { res = "wrong"; //错误的订单处理 SaveSyslog($"用户付款失败", SysLogType.前台日志, "支付系统"); } try { var fileStream = System.IO.File.OpenWrite(Server.MapPath("~/1.txt")); fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Close(); } catch (Exception) { } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public IActionResult Index() { try { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); //string return_msg = res.Element("xml").Element("return_msg").Value; resHandler.SetKey(_senparcWeixinSetting.TenPayV3_Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { var resultCode = resHandler.GetParameter("result_code"); if (resultCode == "SUCCESS") { var model = new pay_history(); model.out_trade_no = resHandler.GetParameter("out_trade_no"); model.transaction_id = resHandler.GetParameter("transaction_id"); model.openid = resHandler.GetParameter("openid"); model.total_fee = resHandler.GetParameter("total_fee").ToInt(); model.time_end = resHandler.GetParameter("time_end").ToInt64(); model.pay_time = DateTime.ParseExact(model.time_end.ToString(), "yyyyMMddHHmmss", CultureInfo.CurrentCulture); model.device_info = resHandler.GetParameter("device_info"); //string json = model.ToJson(); //LogNHelper.Info(json); } } //else //{ // // _userApp.UpdatePayOrder(transaction_id, orderId.ToInt64(), openid); // // res = "wrong";//错误的订单处理 //} string success = $"<xml>< return_code >< ![CDATA[SUCCESS]]></ return_code >< return_msg >< ![CDATA[ok]]></ return_msg ></ xml > "; return(Content(success, "text/xml")); } catch (Exception ex) { LogNHelper.Exception(ex); string err = $"<xml>< return_code >< ![CDATA[FAIL]]></ return_code >< return_msg >< ![CDATA[f**k]]></ return_msg ></ xml > "; return(Content(err, "text/xml")); } }
/// <summary> /// 回调处理 /// </summary> /// <param name="wxKey">微信支付授权KEY</param> /// <param name="success"></param> /// <param name="fail"></param> /// <returns></returns> public static string ProcessNotify(string wxKey, NotifySuccess success, NotifyFail fail) { NotyfyResult result = new NotyfyResult(); ResponseHandler resHandler = new ResponseHandler(null); try { result.Content = resHandler.ParseXML(); string openid = resHandler.GetParameter("openid"); string out_trade_no = resHandler.GetParameter("out_trade_no"); string transaction_id = resHandler.GetParameter("transaction_id"); string total_fee = resHandler.GetParameter("total_fee"); result = new NotyfyResult() { Content = resHandler.ParseXML(), out_trade_no = out_trade_no, openid = openid, transaction_id = transaction_id, total_fee = total_fee, appid = resHandler.GetParameter("appid"), fee_type = resHandler.GetParameter("fee_type"), is_subscribe = resHandler.GetParameter("is_subscribe"), mch_id = resHandler.GetParameter("mch_id"), result_code = resHandler.GetParameter("result_code"), time_end = resHandler.GetParameter("time_end"), }; resHandler.SetKey(wxKey); bool signResult = resHandler.IsTenpaySign(); if (signResult) { success(result); return("success"); } else { fail(result); return("error"); } } catch (Exception ex) { result.Content = ex.Message; fail(result); return("error"); } }
public ActionResult PayNotifyUrl() { ResponseHandler resHandler = new ResponseHandler(null); //string result_code = resHandler.GetParameter("result_code"); //string appid = resHandler.GetParameter("appid"); //string mch_id = resHandler.GetParameter("mch_id"); //string device_info = resHandler.GetParameter("device_info"); //string nonce_str = resHandler.GetParameter("nonce_str"); //string sign = resHandler.GetParameter("sign"); //string err_code = resHandler.GetParameter("err_code"); //string err_code_des = resHandler.GetParameter("err_code_des"); //string openid = resHandler.GetParameter("openid"); //string is_subscribe = resHandler.GetParameter("is_subscribe"); //string trade_type = resHandler.GetParameter("trade_type"); //string bank_type = resHandler.GetParameter("bank_type"); //string total_fee = resHandler.GetParameter("total_fee"); //string coupon_fee = resHandler.GetParameter("coupon_fee"); //string fee_type = resHandler.GetParameter("fee_type"); //string transaction_id = resHandler.GetParameter("transaction_id"); //string out_trade_no = resHandler.GetParameter("out_trade_no"); //string attach = resHandler.GetParameter("attach"); //string time_end = resHandler.GetParameter("time_end"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign()) { res = "success"; //正确的订单处理 } else { res = "wrong"; //错误的订单处理 } var fileStream = System.IO.File.OpenWrite(Server.MapPath("~/1.txt")); fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Close(); return(Content("success")); }
public async Task <ContentResult> PayNotify() { ResponseHandler responseHandler = new ResponseHandler(null); string return_code = responseHandler.GetParameter("return_code"); string return_msg = responseHandler.GetParameter("return_msg"); string openid = responseHandler.GetParameter("openid"); using (CurrentUnitOfWork.DisableFilter(DataFilters.MayHaveTenant)) { UserLogin userLogin = _userLoginRepository.GetAll().Where(model => model.ProviderKey == openid).FirstOrDefault(); TenPayV3Info tenPayV3Info = await GetTenPayV3Info(userLogin.TenantId.Value); responseHandler.SetKey(tenPayV3Info.Key); } //验证请求是否从微信发过来(安全) if (responseHandler.IsTenpaySign()) { if (return_code == "SUCCESS") { string result_code = responseHandler.GetParameter("result_code"); if (result_code == "SUCCESS") { string out_trade_no = responseHandler.GetParameter("out_trade_no"); using (CurrentUnitOfWork.DisableFilter(DataFilters.MustHaveTenant, DataFilters.MayHaveTenant)) { Order order = _orderRepository.GetAll().Where(model => model.Number == out_trade_no).FirstOrDefault(); if (order.PaymentStatus == PaymentStatus.ToPay) { await OrderManager.PayCallback(order, PayType.WeChat); } } } } } string xml = string.Format( @"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg); return(Content(xml, "text/xml")); }
public ActionResult PayNotifyUrl() { var returntmpl = @"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>"; try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); if (return_code == "SUCCESS") { string mpid = resHandler.GetParameter("attach"); string openid = resHandler.GetParameter("openid"); string out_trade_no = resHandler.GetParameter("out_trade_no"); string total_fee = resHandler.GetParameter("total_fee"); #region 校验公众号 var account = GetAccount(mpid); if (account == null) { LogWriter.Info(string.Format("mpid为“{0}”的收款回调验证失败,原因:公众号不存在", mpid)); return(Content(string.Format(returntmpl, "FAIL", "Validate Error"), "text/xml")); } #endregion resHandler.SetKey(account.WxPayAppSecret); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign()) { return(Content(string.Format(returntmpl, return_code, return_msg), "text/xml")); } } return(Content(string.Format(returntmpl, "FAIL", "Validate Error"), "text/xml")); } catch (Exception ex) { LogWriter.Error(ex, "微信支付回调验证失败"); return(Content(string.Format(returntmpl, "FAIL", "System Error"), "text/xml")); } }
public ActionResult PayNotifyUrl() { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign()) { res = "success"; //正确的订单处理 } else { res = "wrong"; //错误的订单处理 } var resXml = resHandler.ParseXML(); var pay_jsapi_notify = Senparc.Weixin.XmlUtility.XmlUtility.Deserialize <pay_jsapi_notify>(resXml); var cbll = new CoinBLL(); cbll.Resolve(pay_jsapi_notify.AsDictionary()); var fileStream = System.IO.File.OpenWrite(Server.MapPath("~/1.txt")); fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Close(); //return Content("SUCCESS"); string xml = string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", "SUCCESS", "OK"); return(Content(xml, "text/xml")); }
public ActionResult PayNotifyUrl() { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign()) { res = "success"; //正确的订单处理 } else { res = "wrong"; //错误的订单处理 } var fileStream = System.IO.File.OpenWrite(Server.MapPath("~/1.txt")); fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Close(); string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); }
/// <summary> /// 支付结果通知 /// </summary> /// <returns></returns> public string Notify() { ResponseHandler responseHandler = new ResponseHandler(Cat.Foundation.CatContext.HttpContext); string return_code = responseHandler.GetParameter("return_code"); string return_msg = responseHandler.GetParameter("return_msg"); AllLogService.SysActionLogService.AddLog(Log.Services.Enum.LogLevel.INFO, string.Format("return_msg={0},return_msg={1}", return_code, return_msg), "支付结果通知"); try { responseHandler.SetKey(WechatAppConfig.Mch_id_secret); if (responseHandler.IsTenpaySign()) { if (return_code.ToUpper() == "SUCCESS") { string out_trade_no = responseHandler.GetParameter("out_trade_no"); //检查数据库中订单状态 var instance = AllPublicService.WechatPayOrderService.GetByOutTradeNo(out_trade_no); if (instance != null && instance.IsPaySuccessed != true) { instance.IsPaySuccessed = true; instance.PayResult = "requestPayment:ok"; instance.Update_Time = DateTime.Now; AllPublicService.WechatPayOrderService.Update(instance); //ServiceRepository.SysActionLogRepository.AddLog("支付结果通知", "SUCCESS", string.Empty); var user = AllServices.BookUserService.GetSingle(instance.Openid); var MM_Currency_Ratio = Foundation.ConfigManager.BookSettings.Currency_Ratio; var MM_Currency = instance.TotalFee * 0.01 * MM_Currency_Ratio; //新增充值记录 AllServices.BookUserRechargeService.Add(user.Openid, (int)Cat.Enums.Book.RechargeType.微信支付充值, (int)MM_Currency, "微信支付充值"); //调整用户账户余额 user.Currency = user.Currency + (int)MM_Currency; AllServices.BookUserService.Update(user); } else { AllLogService.SysActionLogService.AddLog(Log.Services.Enum.LogLevel.ERROR, "找不到订单out_trade_no:" + out_trade_no, "支付结果通知-失败"); } } else { AllLogService.SysActionLogService.AddLog(Log.Services.Enum.LogLevel.ERROR, string.Format("return_msg={0},return_msg={1}", return_code, return_msg), "支付结果通知-失败"); } } else { AllLogService.SysActionLogService.AddLog(Log.Services.Enum.LogLevel.ERROR, "签名不对", "支付结果通知-失败"); } } catch (Exception ex) { AllLogService.SysExceptionLogService.AddLog(Log.Services.Enum.ExceptionType.BussinessException, ex, "支付结果通知-异常"); } var res = @"<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>"; return(res); }
//微信支付回调地址 public ActionResult Notify() { LogHelper.AddLog("支付回调地址");//记录日志 ResponseHandler rspHandler = new ResponseHandler(null); rspHandler.SetKey(WeixinConfig.Key); LogHelper.AddLog(rspHandler.ParseXML());//记录日志 //SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 SUCCESS string return_code = rspHandler.GetParameter("return_code"); string return_msg = rspHandler.GetParameter("return_msg"); if (rspHandler.IsTenpaySign()) { if (return_code == "SUCCESS") { //订单号 string orderSn = rspHandler.GetParameter("out_trade_no"); if (orderSn.Contains("LX-")) { OrdersEntity order = ordersbll.GetEntityByOrderSn(orderSn); if (order != null) { order.PayDate = DateTime.Now; order.PayStatus = (int)PayStatus.已支付; order.Status = (int)OrderStatus.未发货; ordersbll.SaveForm(order.Id, order); } else { LogHelper.AddLog("订单号不存在:" + orderSn); } //同步下架 TelphoneLiangH5Entity tel = tlbll.GetEntity(order.TelphoneID);//根据靓号id获取靓号,修改售出状态 if (tel != null) { tel.SellMark = 1; tel.SellerName = order.Host; } tlbll.SaveForm(tel.TelphoneID, tel); LogHelper.AddLog("同步下架:" + tel.Telphone); //头条url回调 if (!string.IsNullOrEmpty(order.TouUrl)) { TouTiaoApi(order.TouUrl); } } else if (orderSn.Contains("JM-"))//加盟订单 { var order = ordersJMbll.GetEntityByOrderSn(orderSn); if (order != null) { LogHelper.AddLog("微信支付加盟订单FX-异步调用orderSn:" + orderSn); //支付成功,修改加盟订单表 order.PayDate = DateTime.Now; order.PayStatus = (int)PayStatus.已支付; ordersJMbll.SaveForm(order.Id, order); //修改会员表级别 var agent = agentbll.GetEntityByOpenId(order.OpenId);//订单里面的OpenId,不是当前微信OpenId if (agent != null) { agent.LV = order.LV; agentbll.SaveForm(agent.Id, agent); decimal direct = 0; decimal indirect = 0; //上级不等于本身,才进行返佣,如果上级就是自己则为顶级 if (agent.Pid != agent.Id) { Wechat_AgentEntity agentPid = agentbll.GetEntity(agent.Pid);//上级 if (agentPid != null) { Wechat_AgentEntity agentPid2 = agentbll.GetEntity(agentPid.Pid);//上上级 if (agentPid2 != null) { //如果父级不等于上上级,则对上上级进行返佣 if (agent.Pid != agentPid2.Id) { //获取返佣规则金额 DirectHelper.getJMDirect(order.LV, agentPid.LV, agentPid2.LV, out direct, out indirect); //上级返佣 agentPid.profit += direct; agentbll.SaveForm(agentPid.Id, agentPid); //直接返佣日志 ComissionLogEntity logEntity = new ComissionLogEntity() { agent_id = agentPid.Id, agent_name = agentPid.nickname, indirect = 0, invited_agent_id = order.AgentId, phonenum = order.LV, profit = direct, status = 2,//已入账 orderno = order.OrderSn }; comissionLogBll.SaveForm(null, logEntity); LogHelper.AddLog("升级订单直接返佣:" + direct); //上上级返佣 agentPid2.profit += indirect; agentbll.SaveForm(agentPid2.Id, agentPid2); //间接返佣日志 ComissionLogEntity logEntity2 = new ComissionLogEntity() { agent_id = agentPid2.Id, agent_name = agentPid2.nickname, indirect = 1, invited_agent_id = order.AgentId, phonenum = order.LV, profit = indirect, status = 2,//已入账 orderno = order.OrderSn }; comissionLogBll.SaveForm(null, logEntity2); LogHelper.AddLog("升级订单间接返佣:" + indirect); } else { //获取返佣规则金额 DirectHelper.getJMDirect(order.LV, agentPid.LV, null, out direct, out indirect); //上级返佣 agentPid.profit += direct; agentbll.SaveForm(agentPid.Id, agentPid); //直接返佣日志 ComissionLogEntity logEntity = new ComissionLogEntity() { agent_id = agentPid.Id, agent_name = agentPid.nickname, indirect = 0, invited_agent_id = order.AgentId, phonenum = order.LV, profit = direct, status = 2,//已入账 orderno = order.OrderSn }; comissionLogBll.SaveForm(null, logEntity); LogHelper.AddLog("升级订单上级和顶级同一人只直接返佣:" + direct); } } else { //获取返佣规则金额 DirectHelper.getJMDirect(order.LV, agentPid.LV, null, out direct, out indirect); //上级返佣 agentPid.profit += direct; agentbll.SaveForm(agentPid.Id, agentPid); //直接返佣日志 ComissionLogEntity logEntity = new ComissionLogEntity() { agent_id = agentPid.Id, agent_name = agentPid.nickname, indirect = 0, invited_agent_id = order.AgentId, phonenum = order.LV, profit = direct, status = 2,//已入账 orderno = order.OrderSn }; comissionLogBll.SaveForm(null, logEntity); LogHelper.AddLog("升级订单上上级为空只返上级直接返佣:" + direct); } } } } } else { LogHelper.AddLog("订单号不存在:" + orderSn); } } else if (orderSn.Contains("FX-"))//分销销售 { OrdersEntity order = ordersbll.GetEntityByOrderSn(orderSn); if (order != null) { LogHelper.AddLog("微信支付分销订单FX-异步调用orderSn:" + orderSn); //支付成功,修改加盟订单表 order.PayDate = DateTime.Now; order.PayStatus = (int)PayStatus.已支付; ordersbll.SaveForm(order.Id, order); //同步下架 TelphoneLiangH5Entity tel = tlbll.GetEntity(order.TelphoneID);//根据靓号id获取靓号,修改售出状态 if (tel != null) { tel.SellMark = 1; tel.SellerName = order.Host; } tlbll.SaveForm(tel.TelphoneID, tel); LogHelper.AddLog("同步下架:" + tel.Telphone); var logList = comissionLogBll.GetList("{\"orderno\":\"" + orderSn + "\"}"); if (logList.Count() > 0) { foreach (var item in logList) { LogHelper.AddLog(item.agent_id + "支付状态修改1已支付,佣金:" + item.profit); //返佣?不能直接返佣,需要等到开卡之后再返佣 item.status = 1;//已支付,不入账 comissionLogBll.SaveForm(item.id, item); } } } else { LogHelper.AddLog("订单号不存在:" + orderSn); } } } } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); LogHelper.AddLog("正常返回回调xml信息:" + xml); return(Content(xml, "text/xml")); }
public ActionResult PayNotifyUrl() { ResponseHandler resHandler = new ResponseHandler(null); resHandler.Init(); resHandler.SetKey(TenPayInfo.Key, TenPayInfo.AppKey); string message; //判断签名 if (resHandler.IsTenpaySign()) { if (resHandler.IsWXsign()) { //商户在收到后台通知后根据通知ID向财付通发起验证确认,采用后台系统调用交互模式 string notify_id = resHandler.GetParameter("notify_id"); //取结果参数做业务处理 string out_trade_no = resHandler.GetParameter("out_trade_no"); //财付通订单号 string transaction_id = resHandler.GetParameter("transaction_id"); //金额,以分为单位 string total_fee = resHandler.GetParameter("total_fee"); //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee string discount = resHandler.GetParameter("discount"); //支付结果 string trade_state = resHandler.GetParameter("trade_state"); string payMessage = null; //即时到账 if ("0".Equals(trade_state)) { //------------------------------ //处理业务开始 //------------------------------ //处理数据库逻辑 //注意交易单不要重复处理 //注意判断返回金额 //------------------------------ //处理业务完毕 //------------------------------ //给财付通系统发送成功信息,财付通系统收到此结果后不再进行后续通知 payMessage = "success 后台通知成功"; } else { payMessage = "支付失败"; } ViewData["payMessage"] = payMessage; //回复服务器处理成功 message = "success"; } else {//SHA1签名失败 message = "SHA1签名失败" + resHandler.GetDebugInfo(); } } else {//md5签名失败 message = "md5签名失败" + resHandler.GetDebugInfo(); } ViewData["message"] = message; return(Content("Success")); }
// GET: Pay public ActionResult PayNotify() { try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; var payInfo = TenPayV3InfoCollection.Data[System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"]]; resHandler.SetKey(payInfo.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success";//正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! var orderCode = resHandler.GetParameter("out_trade_no"); var wxOrderCode = resHandler.GetParameter("transaction_id"); var fee = resHandler.GetParameter("total_fee"); var vipFee = _dal.Get <VipFee>(orderCode); if (vipFee != null) { vipFee.FeeTime = DateTime.Now; vipFee.WXFee = decimal.Parse(fee); vipFee.WXOrderCode = wxOrderCode; vipFee.Status = 1; vipFee.UpdatedBy = "paycallback"; vipFee.Remark = "支付成功"; _dal.Update(vipFee); var vip = _dal.Get <Vip>(vipFee.VipId); if (vip != null) { vip.FeeStatus = (int)PayStatus.支付成功; vip.ExpireDate = vip.ExpireDate == null?DateTime.Now.AddYears(1) : vip.ExpireDate.Value.AddYears(1); //vip.WXStatus = (int)WXStatus.待审核; _dal.Update(vip); } } } else { res = "wrong";//错误的订单处理 } #region 注释 /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 //try //{ // string appId = AppConfig.Instance.AppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 // string openId = resHandler.GetParameter("openid"); // var templateData = new WeixinTemplate_PaySuccess("https://weixin.senparc.com", "购买商品", "状态:" + return_code); // Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数", appId + " , " + openId); // var result = AdvancedAPIs.TemplateApi.SendTemplateMessage(appId, openId, templateData); //} //catch (Exception ex) //{ // Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息", ex.ToString()); //} #endregion #region 记录日志 var logDir = Server.MapPath(string.Format("~/App_Data/TenPayNotify/{0}", DateTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { new WeixinException(ex.Message, ex); throw; } }
protected void Page_Load(object sender, EventArgs e) { ResponseHandler resHandler = new ResponseHandler(Context); resHandler.Init(); resHandler.SetKey(WeixinPayUtil.Key, WeixinPayUtil.AppKey); //判断签名 if (resHandler.IsTenpaySign()) { if (resHandler.IsWXsign()) { //商户在收到后台通知后根据通知ID向财付通发起验证确认,采用后台系统调用交互模式 string notify_id = resHandler.GetParameter("notify_id"); //取结果参数做业务处理 string out_trade_no = resHandler.GetParameter("out_trade_no"); //财付通订单号 string transaction_id = resHandler.GetParameter("transaction_id"); //金额,以分为单位 string total_fee = resHandler.GetParameter("total_fee"); //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee string discount = resHandler.GetParameter("discount"); //支付结果 string trade_state = resHandler.GetParameter("trade_state"); //即时到账 if ("0".Equals(trade_state)) { //------------------------------ //处理业务开始 //------------------------------ //处理数据库逻辑 //注意交易单不要重复处理 //注意判断返回金额 //------------------------------ //处理业务完毕 //------------------------------ //给财付通系统发送成功信息,财付通系统收到此结果后不再进行后续通知 Response.Write("success 后台通知成功"); } else { Response.Write("支付失败"); } //回复服务器处理成功 Response.Write("success"); } else {//SHA1签名失败 Response.Write("fail -SHA1 failed"); Response.Write(resHandler.GetDebugInfo()); } } else {//md5签名失败 Response.Write("fail -md5 failed"); Response.Write(resHandler.GetDebugInfo()); } }
protected void Page_Load(object sender, EventArgs e) { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); resHandler.SetKey(TenPayV3Info.Key); //写日志 StringBuilder sb = new StringBuilder(); sb.Append("\r\n 测试日志 微信支付支付 异步通知消息 notify_url -----------------------------------------------------------------------------------"); sb.Append("\r\n out_trade_no=" + resHandler.GetParameter("out_trade_no")); sb.Append("\r\n return_code=" + resHandler.GetParameter("return_code")); sb.Append("\r\n return_msg=" + resHandler.GetParameter("return_msg")); sb.Append("\r\n result_code=" + resHandler.GetParameter("result_code")); sb.Append("\r\n total_fee=" + resHandler.GetParameter("total_fee")); sb.Append("\r\n--------------------------------------------------------------------------------------------------"); SimonLog.WriteLog(sb.ToString(), "/Log/", "log_Weixinpay_" + DateTime.Now.ToString("yyyyMMdd")); string xmlfmt = @"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>"; if (!resHandler.IsTenpaySign() || return_code != "SUCCESS") { ResponseStr(string.Format(xmlfmt, "FAIL", "FAIL"), "text/xml"); } string result_code = resHandler.GetParameter("result_code"); if (result_code == "SUCCESS") { //交易成功 string out_trade_no = resHandler.GetParameter("out_trade_no"); string total_fee = resHandler.GetParameter("total_fee"); total_fee = (decimal.Parse(total_fee) / 100).ToString(); //单位分转换为单位元 DataTable RMBCostDT = SimonDB.DataTable(@"select * from Web_RMBCost where OrderID=@OrderID", new DbParameter[] { SimonDB.CreDbPar("@OrderID", out_trade_no) }); if (RMBCostDT.Rows.Count <= 0) { Response.Write("订单不存在"); return; } DataRow RMBCostDR = RMBCostDT.Rows[0]; if (RMBCostDR["UpdateFlag"].ToString() == "1") { Response.Write("订单已处理"); return; } if (Convert.ToInt32(decimal.Parse(RMBCostDR["PayMoney"].ToString())) != Convert.ToInt32(decimal.Parse(total_fee))) { Response.Write("充值金额不符"); return; } //判断玩家账号是否存在 DbParameter[] userparms = new DbParameter[] { SimonDB.CreDbPar("@userid", RMBCostDR["Users_ids"]) }; DataTable UserDT = SimonDB.DataTable(@"select * from TUsers as a inner join TUserInfo as b on a.userid=b.userid where a.userid=@userid", userparms); if (UserDT.Rows.Count <= 0) { Response.Write("用户不存在"); return; } DataRow UserDR = UserDT.Rows[0]; //判断充值兑换率 DataTable RechargeRateDT = SimonDB.DataTable(@"select * from RechargeRate where RechargeRMB=@RechargeRMB", new DbParameter[] { SimonDB.CreDbPar("@RechargeRMB", RMBCostDR["PayMoney"].ToString()) }); if (RechargeRateDT.Rows.Count <= 0) { Response.Write("此充值金额的金币兑换率不存在"); return; } DataRow RechargeRateDR = RechargeRateDT.Rows[0]; //充值动作 SimonDB.ExecuteNonQuery(@"update TUserInfo set WalletMoney=WalletMoney+@ChangeMoney where UserID=@UserID", new DbParameter[] { SimonDB.CreDbPar("@ChangeMoney", RechargeRateDR["RechargeGold"].ToString()), SimonDB.CreDbPar("@UserID", UserDR["UserID"].ToString()) }); //金币日志 SimonDB.ExecuteNonQuery(@"insert into Web_MoneyChangeLog (UserID,UserName,StartMoney,ChangeMoney,ChangeType,DateTime,Remark) values (@UserID,@UserName,@StartMoney,@ChangeMoney,2,getdate(),@Remark)", new DbParameter[] { SimonDB.CreDbPar("@UserID", UserDR["UserID"].ToString()), SimonDB.CreDbPar("@UserName", UserDR["UserName"].ToString()), SimonDB.CreDbPar("@StartMoney", UserDR["WalletMoney"].ToString()), SimonDB.CreDbPar("@ChangeMoney", RechargeRateDR["RechargeGold"].ToString()), SimonDB.CreDbPar("@Remark", "微信充值,订单号:" + out_trade_no) }); //充值赠送金币 SimonDB.ExecuteNonQuery(@"update TUserInfo set WalletMoney=WalletMoney+@ChangeMoney where UserID=@UserID", new DbParameter[] { SimonDB.CreDbPar("@ChangeMoney", RechargeRateDR["RegiveGold"].ToString()), SimonDB.CreDbPar("@UserID", UserDR["UserID"].ToString()) }); //充值赠送金币日志 SimonDB.ExecuteNonQuery(@"insert into Web_MoneyChangeLog (UserID,UserName,StartMoney,ChangeMoney,ChangeType,DateTime,Remark) values (@UserID,@UserName,@StartMoney,@ChangeMoney,2,getdate(),@Remark)", new DbParameter[] { SimonDB.CreDbPar("@UserID", UserDR["UserID"].ToString()), SimonDB.CreDbPar("@UserName", UserDR["UserName"].ToString()), SimonDB.CreDbPar("@StartMoney", UserDR["WalletMoney"].ToString()), SimonDB.CreDbPar("@ChangeMoney", RechargeRateDR["RegiveGold"].ToString()), SimonDB.CreDbPar("@Remark", "充值赠送金币,关联微信订单号:" + out_trade_no) }); ResponseStr(string.Format(xmlfmt, "SUCCESS", "OK"), "text/xml"); } else { ResponseStr(string.Format(xmlfmt, "FAIL", "FAIL"), "text/xml"); } }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public ActionResult PayNotifyUrl() { try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success";//正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! string channelOrderID = resHandler.GetParameter("out_trade_no"); string wxOrderID = resHandler.GetParameter("transaction_id"); try { dynamic job = new OrderService().UPdateOrderByOrderID(channelOrderID, wxOrderID, 1, resHandler.GetParameter("attach")); } catch (Exception ex) { res = "wrong";//错误的订单处理 } } else { res = "wrong";//错误的订单处理 } #region 记录日志 var logDir = Server.MapPath(string.Format("~/App_Data/TenPayNotify/{0}", DateTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", DateTime.Now.ToString("yyyyMMdd"), DateTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { new WeixinException(ex.Message, ex); throw; } }
public ContentResult WexinPayNotify() { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); resHandler.SetKey(PayKey); string res = null; //TODO:这里需要验证签名 ////验证请求是否从微信发过来(安全) //logger.Info("IsTenpaySign:" + resHandler.IsTenpaySign()); if (resHandler.IsTenpaySign()) { try { //订单处理 if (return_code.ToLower() == "SUCCESS".ToLower()) { string out_trade_no = resHandler.GetParameter("out_trade_no"); long orderId = 0; if (!string.IsNullOrEmpty(out_trade_no)) { orderId = Convert.ToInt64(out_trade_no); } logger.Info("orderId:" + orderId + "|out_trade_no=" + out_trade_no); //判断老订单和预售订单 var flag = OrderService.CheckOrderExist(orderId); if (flag) { OrderService.UpdateOrderPay(new OrderPayModel() { OrdeId = orderId, //long.Parse(resHandler.GetParameter("out_trade_no")), Status = OrderStatus.Paid.GetHashCode() }); } else { PreSaleOrderService.ModifyPreOrder(new PreSaleOrder() { OrderId = orderId, Status = 1 }); var preOrder = PreSaleOrderService.GetPreSaleOrder(orderId); var mobile = preOrder.Phone; SMSService.SendSMSPreOrderCreated(mobile, "12月19日"); } } res = "SUCCESS"; } catch (Exception e) { logger.Error("微信支付回调错误:" + e); res = "FAIL"; } string xml = string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", res, return_msg); return(Content(xml, "text/xml")); } else { return(Content("")); } }
public override async Task <PayResult> PayResultNotify( IEnumerable <KeyValuePair <string, string> > query, IDictionary <string, string> header, IDictionary <string, string> form, Stream body) { var notifyResult = new PayResult() { Success = false }; string xml = await body.ReadToStringAsync(); if (xml.IsNullOrWhiteSpace()) { notifyResult.Message = "微信支付回调,xml请求数据为空!"; Logger.LogError(notifyResult.Message); return(notifyResult); } ResponseHandler resHandler; OrderQueryResult result; try { // 获取微信回调数据 // ResponseHandler读取body时没有seek,先seek下 HttpContextAccessor.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin); resHandler = new ResponseHandler(HttpContextAccessor.HttpContext); Logger.LogInformation($"微信支付回调:" + xml); // 转换为对象 result = new OrderQueryResult(xml); } catch (XmlException) { // xml格式异常直接不管 notifyResult.Message = "微信支付回调,xml数据异常!"; //logger.LogError(notifyResult.Message); return(notifyResult); } catch (Exception ex) { notifyResult.Message = "微信支付回调,数据解析错误!"; Logger.LogError(ex, notifyResult.Message); return(notifyResult); } var secret = MchOptions.Value.Get(result.mch_id)?.MchKey; if (secret.IsNullOrWhiteSpace()) { notifyResult.Message = $"微信支付回调,未找到商户密钥,mchId:{result.mch_id},result:{xml}"; return(notifyResult); } // 设置appkey,用于验证参数签名 resHandler.SetKey(secret); // 参数签名验证 if (!resHandler.IsTenpaySign()) { notifyResult.Message = $"微信支付回调:签名错误,result:{xml}"; Logger.LogError(notifyResult.Message); return(notifyResult); } // 支付回调结果是否正确 if (!result.IsReturnCodeSuccess() || !result.IsResultCodeSuccess()) { notifyResult.Message = $"微信支付回调,支付失败:return error,result:{xml}"; Logger.LogError(notifyResult.Message); return(notifyResult); } notifyResult.Success = true; notifyResult.RealPayAmount = notifyResult.Amount = result.total_fee.ConvertTo <int>(); notifyResult.LocalTradeNo = result.out_trade_no; notifyResult.TransactionId = result.transaction_id; notifyResult.Attach = result.attach; notifyResult.TraderId = result.openid; notifyResult.PayData = xml; notifyResult.MchId = result.mch_id; notifyResult.AppId = result.appid; return(await Task.FromResult(notifyResult)); }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public ActionResult PayNotifyUrl(bool isWxOpenPay = false)//注意:统一下单接口中不能带参数! { WeixinTrace.SendCustomLog("微信支付回调", "来源:" + (isWxOpenPay ? "微信支付" : "小程序支付")); try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); bool paySuccess = false; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { paySuccess = true;//正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { paySuccess = false;//错误的订单处理 } if (paySuccess) { /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 try { string appId = Config.SenparcWeixinSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 string openId = resHandler.GetParameter("openid"); if (isWxOpenPay) { //DPBMARK MiniProgram var cacheStrategy = CacheStrategyFactory.GetObjectCacheStrategyInstance(); var unifiedorderRequestData = cacheStrategy.Get <TenPayV3UnifiedorderRequestData>($"WxOpenUnifiedorderRequestData-{openId}"); //获取订单请求信息缓存 var unifedorderResult = cacheStrategy.Get <UnifiedorderResult>($"WxOpenUnifiedorderResultData-{openId}"); //获取订单信息缓存 if (unifedorderResult != null || !string.IsNullOrEmpty(unifedorderResult.prepay_id)) { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(小程序)", appId + " , " + openId); //小程序支付,发送小程序模板消息 var templateData = new WxOpenTemplateMessage_PaySuccessNotice( "在线购买(小程序支付)测试", SystemTime.Now, "小程序支付 | 注意:这条消息来自微信服务器异步回调,官方证明支付成功! | prepay_id:" + unifedorderResult.prepay_id, unifiedorderRequestData.OutTradeNo, unifiedorderRequestData.TotalFee, "400-031-8816", "https://weixin.senparc.com"); //微信官方已停用此接口 //Senparc.Weixin.WxOpen.AdvancedAPIs // .Template.TemplateApi // .SendTemplateMessage( // Config.SenparcWeixinSetting.WxOpenAppId, openId, templateData.TemplateId, templateData, unifedorderResult.prepay_id, "pages/index/index", "图书", "#fff00"); } else { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(小程序)", "prepayId未记录:" + appId + " , " + openId); } //DPBMARK_END } else { //微信公众号支付 var templateData = new WeixinTemplate_PaySuccess("https://weixin.senparc.com", "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(公众号)", appId + " , " + openId); var result = AdvancedAPIs.TemplateApi.SendTemplateMessage(appId, openId, templateData); } } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException("支付成功模板消息异常", ex)); //WeixinTrace.SendCustomLog("支付成功模板消息", ex.ToString()); } WeixinTrace.SendCustomLog("PayNotifyUrl回调", "支付成功"); } else { Senparc.Weixin.WeixinTrace.SendCustomLog("PayNotifyUrl回调", "支付失败"); } #region 记录日志 var logDir = ServerUtility.ContentRootMapPath(string.Format("~/App_Data/TenPayNotify/{0}", SystemTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", SystemTime.Now.ToString("yyyyMMdd"), SystemTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public async Task <ActionResult> PayNotifyUrl(Guid id) { try { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); resHandler.SetKey(TenPayV3Info.Key); bool succeed = resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS"; /* 这里可以进行订单处理的逻辑 */ string out_trade_no = resHandler.GetParameter("out_trade_no"); var pay = _paySrv.UpdatePaymentResult(GuidEncoder.Decode(out_trade_no), succeed); if (succeed) { var result = await ExecuteOrder((Guid)pay.OrderId, pay.Id, true); } //发送支付成功的模板消息 try { string appId = Config.SenparcWeixinSetting.TenPayV3_AppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 string openId = resHandler.GetParameter("openid"); var templateData = new WeixinTemplate_PaySuccess(_siteUrl, "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数", appId + " , " + openId); // var result = Senparc.Weixin.MP.AdvancedAPIs.TemplateApi.SendTemplateMessage(appId, openId, templateData); } catch (Exception ex) { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息", ex.ToString()); } #region 记录日志 var logDir = ServerUtility.ContentRootMapPath(string.Format("~/App_Data/TenPayNotify/{0}", SystemTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", SystemTime.Now.ToString("yyyyMMdd"), SystemTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }
public string GetPaymentResult(ResponseHandler resHandler) { string return_code = ""; string return_msg = ""; try { return_code = resHandler.GetParameter("return_code"); return_msg = resHandler.GetParameter("return_msg"); string openid = resHandler.GetParameter("openid"); string total_fee = resHandler.GetParameter("total_fee"); string time_end = resHandler.GetParameter("time_end"); string out_trade_no = resHandler.GetParameter("out_trade_no"); string transaction_id = resHandler.GetParameter("transaction_id"); Console.WriteLine(); Console.WriteLine("return_code:" + return_code); Console.WriteLine("out_trade_no:" + out_trade_no); Console.WriteLine("openId:" + openid); Console.WriteLine("total_fee:" + total_fee); Console.WriteLine("time_end:" + time_end); Console.WriteLine("transaction_id:" + transaction_id); Console.WriteLine("------------------------------------------"); resHandler.SetKey(tenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { /* 这里可以进行订单处理的逻辑 */ // transaction_id:微信支付单号 // out_trade_no:商城实际订单号 // openId:用户信息 // total_fee:实际支付价格 if (pDao.checkOrderTotalPrice(out_trade_no, Convert.ToDouble(total_fee))) { if (pDao.updateOrderForPay(out_trade_no, transaction_id)) { pDao.insertPayLog(out_trade_no, transaction_id, total_fee, openid, "支付完成-成功"); } else { pDao.insertPayLog(out_trade_no, transaction_id, total_fee, openid, "支付完成-修改订单状态失败"); } } else { pDao.insertPayLog(out_trade_no, transaction_id, total_fee, openid, "支付完成-支付金额与订单总金额不符"); } } else { return_code = "FAIL"; return_msg = "签名失败"; } return(string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg)); } catch (Exception ex) { return_code = "FAIL"; return_msg = "签名失败"; return(string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg)); } }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public ActionResult PayNotifyUrl() { try { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success";//正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { res = "wrong";//错误的订单处理 } /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 try { string appId = Config.SenparcWeixinSetting.TenPayV3_AppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 string openId = resHandler.GetParameter("openid"); var templateData = new WeixinTemplate_PaySuccess("https://weixin.senparc.com", "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数", appId + " , " + openId); var result = AdvancedAPIs.TemplateApi.SendTemplateMessage(appId, openId, templateData); } catch (Exception ex) { Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息", ex.ToString()); } #region 记录日志 var logDir = ServerUtility.ContentRootMapPath(string.Format("~/App_Data/TenPayNotify/{0}", SystemTime.Now.ToString("yyyyMMdd"))); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); } var logPath = Path.Combine(logDir, string.Format("{0}-{1}-{2}.txt", SystemTime.Now.ToString("yyyyMMdd"), SystemTime.Now.ToString("HHmmss"), Guid.NewGuid().ToString("n").Substring(0, 8))); using (var fileStream = System.IO.File.OpenWrite(logPath)) { var notifyXml = resHandler.ParseXML(); //fileStream.Write(Encoding.Default.GetBytes(res), 0, Encoding.Default.GetByteCount(res)); fileStream.Write(Encoding.Default.GetBytes(notifyXml), 0, Encoding.Default.GetByteCount(notifyXml)); fileStream.Close(); } #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }
/// <summary> /// 微信支付异步通知 /// </summary> /// <returns></returns> public IActionResult notify() { XTrace.WriteLine("微信支付异步通知开始:"); try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); //配置 Core.Config cfg = Core.Config.GetSystemConfig(); string appId = cfg.WXAppId; // ConfigurationManager.AppSettings["WeixinAppId"]; string appSecrect = cfg.WXAppSecret; // ConfigurationManager.AppSettings["WeixinAppSecrect"]; string wxmchId = cfg.MCHId; // ConfigurationManager.AppSettings["WeixinMCHId"]; string wxmchKey = cfg.MCHKey; // ConfigurationManager.AppSettings["WeixinMCHKey"]; TenPayV3Info TenPayV3Info = new TenPayV3Info(appId, appSecrect, wxmchId, wxmchKey, Utils.GetServerUrl() + "/wxpayment/notify", Utils.GetServerUrl() + "/wxpayment/notify"); string res = null; resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success"; //正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! string out_trade_no = resHandler.GetParameter("out_trade_no"); //商户订单号 XTrace.WriteLine("微信异步通知订单号:" + out_trade_no + ";" + JsonConvert.SerializeObject(resHandler)); OnlinePayOrder payOrder = OnlinePayOrder.Find(OnlinePayOrder._.PayOrderNum == out_trade_no); if (payOrder == null) { XTrace.WriteLine($"支付成功,但是支付订单不存在:{out_trade_no}"); res = "wrong";//错误的订单处理 } else { if (payOrder.PaymentStatus == Utils.PaymentState[0]) { //更新支付订单 payOrder.PaymentStatus = Utils.PaymentState[1]; payOrder.ReceiveTime = DateTime.Now; payOrder.IsOK = 1; payOrder.Update(); //获取订单 Order order = Order.Find(Order._.OrderNum == payOrder.OrderNum); if (order != null) { order.PaymentStatus = Utils.PaymentState[1]; order.PayType = "微信支付"; if (order.MyType == (int)Utils.MyType.分销商认证) { order.OrderStatus = Utils.OrdersState[2]; } order.Update(); //如果是属于升级会员的,那要修改会员状态 if (order.MyType == (int)Utils.MyType.分销商认证 && order.OrderType > 0) { Member he = Member.FindById(order.UId); if (he.RoleId != order.OrderType) { he.RoleId = order.OrderType; he.IsVerifySellers = 1; he.Update(); } } //写入订单记录 OrderLog log = new OrderLog(); log.AddTime = DateTime.Now; log.OrderId = order.Id; log.OrderNum = order.OrderNum; log.UId = order.UId; log.Actions = "微信支付成功;订单号:" + order.OrderNum + ";金额:" + order.TotalPay.ToString("N2"); log.Insert(); } } } } else { res = "wrong";//错误的订单处理 } #region 记录日志 XTrace.WriteLine($"微信支付回调处理结果:{res}"); #endregion string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(xml, "text/xml")); } catch (Exception ex) { new WeixinException(ex.Message, ex); throw; } }