private static int?GetInt(ResponseHandler handler, string key) { var txt = handler.GetParameter(key); return(int.TryParse(txt, out var num) ? (int?)num : null); }
static string GetTxt(ResponseHandler handler, string key) { return(handler.GetParameter(key)); }
/// <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) { 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( "在线购买(小程序支付)测试", DateTime.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); } } 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 = 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) { WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); throw; } }
private void Notify(ResponseHandler responseHandler) { var returnCode = responseHandler.GetParameter("return_code"); var returnMsg = responseHandler.GetParameter("return_msg"); LogHelper.Logger.Info("TenPayV3Notify-return-" + returnCode + "-" + returnMsg); if (returnCode != "SUCCESS") { var xml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[" + returnMsg + "]]></return_msg></xml>"; _context.Response.ContentType = "text/xml"; _context.Response.Write(xml); } var resultCode = responseHandler.GetParameter("result_code"); var no = responseHandler.GetParameter("out_trade_no"); var attach = responseHandler.GetParameter("attach"); var transactionId = responseHandler.GetParameter("transaction_id"); var totalFee = responseHandler.GetParameter("total_fee"); var timeEnd = responseHandler.GetParameter("time_end"); try { const string serviceUrl = "{0}/api/services/app/{1}/{2}"; var request = (HttpWebRequest)WebRequest.Create(string.Format(serviceUrl, _serverPath, "AppWeChatPayService", "PayNotify")); LogHelper.Logger.Info("send to:" + request.RequestUri); request.Method = "POST"; request.ContentType = "application/json"; var bytes = new UTF8Encoding().GetBytes("{\"resultCode\": \"" + resultCode + "\", \"no\": \"" + no + "\", \"attach\": \"" + attach + "\", \"transactionId\": \"" + transactionId + "\", \"totalFee\": \"" + totalFee + "\", \"timeEnd\": \"" + timeEnd + "\"}"); request.ContentLength = bytes.Length; var requestStream = request.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); //响应微信服务器 var returnXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; using (var response = (HttpWebResponse)request.GetResponse()) { using (var stream = response.GetResponseStream()) { using (var streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8"))) { LogHelper.Logger.Info("TenPayV3Notify-result-" + resultCode); var readToEnd = streamReader.ReadToEnd(); var deserializeObject = (JObject)JsonConvert.DeserializeObject(readToEnd); if (deserializeObject["Code"].ToString() == "0") { LogHelper.Logger.Info("TenPayV3Notify-" + deserializeObject["Message"]); } else { returnXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[" + deserializeObject["Message"] + "]]></return_msg></xml>"; } } } } _context.Response.ContentType = "text/xml"; _context.Response.Write(returnXml); } catch (Exception ex) { LogHelper.Logger.Info("TenPayV3Notify-No" + no + "-Exception-" + ex.Message); } }
public ActionResult NativeNotifyUrl() { ResponseHandler resHandler = new ResponseHandler(null); //返回给微信的请求 RequestHandler res = new RequestHandler(null); string openId = resHandler.GetParameter("openid"); string productId = resHandler.GetParameter("product_id"); if (openId == null || productId == null) { res.SetParameter("return_code", "FAIL"); res.SetParameter("return_msg", "回调数据异常"); } //创建支付应答对象 //RequestHandler packageReqHandler = new RequestHandler(null); var sp_billno = DateTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(26);//最多32位 var nonceStr = TenPayV3Util.GetNoncestr(); //创建请求统一订单接口参数 //packageReqHandler.SetParameter("appid", TenPayV3Info.AppId); //packageReqHandler.SetParameter("mch_id", TenPayV3Info.MchId); //packageReqHandler.SetParameter("nonce_str", nonceStr); //packageReqHandler.SetParameter("body", "test"); //packageReqHandler.SetParameter("out_trade_no", sp_billno); //packageReqHandler.SetParameter("total_fee", "1"); //packageReqHandler.SetParameter("spbill_create_ip", Request.UserHostAddress); //packageReqHandler.SetParameter("notify_url", TenPayV3Info.TenPayV3Notify); //packageReqHandler.SetParameter("trade_type", TenPayV3Type.NATIVE.ToString()); //packageReqHandler.SetParameter("openid", openId); //packageReqHandler.SetParameter("product_id", productId); //string sign = packageReqHandler.CreateMd5Sign("key", TenPayV3Info.Key); //packageReqHandler.SetParameter("sign", sign); //string data = packageReqHandler.ParseXML(); var xmlDataInfo = new TenPayV3UnifiedorderRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, "test", sp_billno, 1, Request.UserHostAddress, TenPayV3Info.TenPayV3Notify, TenPayV3Type.JSAPI, openId, TenPayV3Info.Key, nonceStr); try { //调用统一订单接口 var result = TenPayV3.Unifiedorder(xmlDataInfo); //var unifiedorderRes = XDocument.Parse(result); //string prepayId = unifiedorderRes.Element("xml").Element("prepay_id").Value; //创建应答信息返回给微信 res.SetParameter("return_code", result.return_code); res.SetParameter("return_msg", result.return_msg ?? "OK"); res.SetParameter("appid", result.appid); res.SetParameter("mch_id", result.mch_id); res.SetParameter("nonce_str", result.nonce_str); res.SetParameter("prepay_id", result.prepay_id); res.SetParameter("result_code", result.result_code); res.SetParameter("err_code_des", "OK"); string nativeReqSign = res.CreateMd5Sign("key", TenPayV3Info.Key); res.SetParameter("sign", result.sign); } catch (Exception) { res.SetParameter("return_code", "FAIL"); res.SetParameter("return_msg", "统一下单失败"); } return(Content(res.ParseXML())); }
/// <summary> /// 代金券类型 CASH-充值代金券 NO_CASH---非充值代金券 /// coupon_type_$n 订单使用了免充值券后有返回(取值:CASH、NO_CASH)。$n为下标,从0开始编号,举例:coupon_type_0 /// </summary> public string GetCouponType(int n) { return(resp.GetParameter("coupon_type_" + n)); }
/// <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"); 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; } }
/// <summary> /// 退款通知地址 /// </summary> /// <returns></returns> public ActionResult RefundNotifyUrl() { WeixinTrace.SendCustomLog("RefundNotifyUrl被访问", "IP" + HttpContext.UserHostAddress()?.ToString()); string responseCode = "FAIL"; string responseMsg = "FAIL"; try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); WeixinTrace.SendCustomLog("跟踪RefundNotifyUrl信息", resHandler.ParseXML()); if (return_code == "SUCCESS") { responseCode = "SUCCESS"; responseMsg = "OK"; string appId = resHandler.GetParameter("appid"); string mch_id = resHandler.GetParameter("mch_id"); string nonce_str = resHandler.GetParameter("nonce_str"); string req_info = resHandler.GetParameter("req_info"); var decodeReqInfo = TenPayV3Util.DecodeRefundReqInfo(req_info, TenPayV3Info.Key); var decodeDoc = XDocument.Parse(decodeReqInfo); //获取接口中需要用到的信息 string transaction_id = decodeDoc.Root.Element("transaction_id").Value; string out_trade_no = decodeDoc.Root.Element("out_trade_no").Value; string refund_id = decodeDoc.Root.Element("refund_id").Value; string out_refund_no = decodeDoc.Root.Element("out_refund_no").Value; int total_fee = int.Parse(decodeDoc.Root.Element("total_fee").Value); int? settlement_total_fee = decodeDoc.Root.Element("settlement_total_fee") != null ? int.Parse(decodeDoc.Root.Element("settlement_total_fee").Value) : null as int?; int refund_fee = int.Parse(decodeDoc.Root.Element("refund_fee").Value); int tosettlement_refund_feetal_fee = int.Parse(decodeDoc.Root.Element("settlement_refund_fee").Value); string refund_status = decodeDoc.Root.Element("refund_status").Value; string success_time = decodeDoc.Root.Element("success_time").Value; string refund_recv_accout = decodeDoc.Root.Element("refund_recv_accout").Value; string refund_account = decodeDoc.Root.Element("refund_account").Value; string refund_request_source = decodeDoc.Root.Element("refund_request_source").Value; WeixinTrace.SendCustomLog("RefundNotifyUrl被访问", "验证通过"); //进行后续业务处理 } } catch (Exception ex) { responseMsg = ex.Message; WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", responseCode, responseMsg); return(Content(xml, "text/xml")); }
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"); var fileStream = System.IO.File.OpenWrite(Server.MapPath("~/1.txt")); fileStream.Write(Encoding.Default.GetBytes(result_code), 0, Encoding.Default.GetByteCount(result_code)); fileStream.Close(); return(Content("success")); }
/// <summary> /// JS-SDK支付回调地址(在统一下单接口中设置notify_url) /// </summary> /// <returns></returns> public ActionResult PayNotifyUrl() { try { RCLog.Info(this, "支付返回"); ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string res = null; resHandler.SetKey(WeiXinConfig.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success"; //正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! string total_fee = resHandler.GetParameter("total_fee"); string out_trade_no = resHandler.GetParameter("out_trade_no"); string openid = resHandler.GetParameter("openid"); string package = resHandler.GetParameter("attach"); Menber owner = _context.Menbers.FirstOrDefault(x => x.WeChatOpenId == openid); AccountInfo accountinfo = _context.AccountInfos.FirstOrDefault(x => x.TradeNo == out_trade_no); accountinfo.BeforeMoney = owner.AccountSum; accountinfo.AfterMoney = owner.AccountSum + int.Parse(total_fee); accountinfo.OwnerId = owner.Id; accountinfo.Money = int.Parse(total_fee); accountinfo.CreateTime = DateTime.Now; accountinfo.TradeNo = out_trade_no; accountinfo.TradeName = package; owner.AccountSum = accountinfo.AfterMoney; //_context.Add(accountinfo); _context.SaveChanges(); } 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); RCLog.Info(this, xml); return(Content(xml, "text/xml")); } catch (Exception ex) { RCLog.Error(this, $"发生错误{ex.ToString()}"); throw; } }
public IHttpActionResult WechatNotify() { string reqKey = TenPayV3Util.BuildRandomStr(8); LogHelper.Payment(reqKey, $"收到微信支付异步通知,准备解析结果..."); try { ResponseHandler resHandler = new ResponseHandler(null); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); LogHelper.Payment(reqKey, $"解析返回结果为return_code:{return_code},return_msg:{return_msg}"); LogHelper.Info($"[{reqKey}]{resHandler.ParseXML()}"); TenPayV3Info TenPayV3Info = new TenPayV3Info(appId, appSecrect, wxmchId, wxmchKey, notifyUrl, notifyUrl); resHandler.SetKey(TenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { //return_code是通信标识,非交易标识,交易是否成功需要查看result_code来判断 if (resHandler.GetParameter("result_code") == "SUCCESS") { string total_fee = resHandler.GetParameter("total_fee"); //订单金额 string out_trade_no = resHandler.GetParameter("out_trade_no"); //商户订单号 string transaction_id = resHandler.GetParameter("transaction_id"); //微信支付订单号 string time_end = resHandler.GetParameter("time_end"); //支付完成时间 string openid = resHandler.GetParameter("openid"); LogHelper.Payment(reqKey, $"微信支付成功,商户订单号:{out_trade_no},支付金额:{total_fee},支付流水号:{transaction_id},openid:{openid}"); //1.判断订单是否存在 2.判断订单支付状态 3.插入修改数据等 var orderEntity = _repositoryFactory.IOrders.Single(x => x.OrderCode == out_trade_no); if (orderEntity == null) { LogHelper.Payment(reqKey, $"查找订单失败,商户订单号:{out_trade_no}"); } else if (orderEntity.OrderStatus != (int)EnumHepler.OrderStatus.Created || orderEntity.PayStatus != (int)EnumHepler.OrderPayStatus.Unpay) { LogHelper.Payment(reqKey, $"订单非待支付状态,当前状态为{orderEntity.OrderStatus},商户订单号:{out_trade_no}"); } else { LogHelper.Payment(reqKey, $"更新订单支付状态为已支付待发货,商户订单号:{out_trade_no}"); DateTime payTime = DateTime.ParseExact(time_end, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault); //更新订单状态 _repositoryFactory.IOrders.ModifyBy(x => x.OrderCode == out_trade_no, new string[] { "OrderStatus", "PayStatus", "PayTime", "PayMode" }, new object[] { (int)EnumHepler.OrderStatus.WaitSendGoods, (int)EnumHepler.OrderPayStatus.Paied, payTime, (int)EnumHepler.OrderPayMode.WechatPay }); _repositoryFactory.SaveChanges(); } } else { LogHelper.Payment(reqKey, $"微信支付失败,err_code:{resHandler.GetParameter("err_code")},err_code_des:{resHandler.GetParameter("err_code_des")}"); } } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); return(Content(HttpStatusCode.OK, xml, Configuration.Formatters.XmlFormatter, "text/xml")); } catch (Exception ex) { return(Content(HttpStatusCode.InternalServerError, ex.Message)); } }
public string GetPaymentResult(ResponseHandler resHandler) { OpenDao openDao = new OpenDao(); string return_code = "SUCCESS"; string return_msg = "OK"; 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"); openDao.writeLog(Global.POSCODE, openid, "payCallBack", return_msg + "#" + out_trade_no + "#" + transaction_id + "#" + total_fee + "#" + time_end); resHandler.SetKey(tenPayV3Info.Key); //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { /* 这里可以进行订单处理的逻辑 */ // transaction_id:微信支付单号 // out_trade_no:商城实际订单号 // openId:用户信息 // total_fee:实际支付价格 if (checkOrderTotalPrice(out_trade_no, Convert.ToDouble(total_fee))) { if (pDao.updateOrderForPay(out_trade_no, transaction_id)) { string SetPayIdResult = SetPayId(Global.POSCODE, out_trade_no, transaction_id); WebBillIdResult web1 = JsonConvert.DeserializeObject <WebBillIdResult>(SetPayIdResult); if (web1.MESSAGE[0].IS_SUCCESS == "TRUE") { string PayTicketDoneResult = PayTicketDone(Global.POSCODE, out_trade_no, transaction_id); WebBillIdResult web2 = JsonConvert.DeserializeObject <WebBillIdResult>(PayTicketDoneResult); if (web2.MESSAGE[0].IS_SUCCESS == "TRUE") { 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 { pDao.insertPayLog(out_trade_no, transaction_id, total_fee, openid, "支付完成-修改订单状态失败"); } } else { pDao.insertPayLog(out_trade_no, transaction_id, total_fee, openid, "支付完成-订单状态不为1或支付金额与订单总金额不符"); } } else { return_code = "FAIL"; return_msg = "不是从微信发过来"; openDao.writeLog(Global.POSCODE, openid, "payCallBack", return_msg + "#" + out_trade_no + "#" + transaction_id + "#" + total_fee + "#" + time_end); } 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 = ex.ToString(); openDao.writeLog(Global.POSCODE, "", "payCallBack", return_msg); return(string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg)); } }
public async Task <ActionResult> PayNotify() { try { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", return_code, return_msg); string res = null; resHandler.SetKey("8FrTmTM1S9i1t0WhIl17AXyEa8L7NUrm");//微信支付密室 //验证请求是否从微信发过来(安全) if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { res = "success"; //正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { res = "wrong";//错误的订单处理 } /* 这里可以进行订单处理的逻辑 */ try { if (res == "success") { string out_trade_no = resHandler.GetParameter("out_trade_no"); YaeherConsultationAdd yaeherConsultationAdd = new YaeherConsultationAdd(); yaeherConsultationAdd.ConsultNumber = "CN-" + out_trade_no.Substring(0, out_trade_no.Length - 6); yaeherConsultationAdd.sp_billno = out_trade_no; yaeherConsultationAdd.Secret = await CreateSecret(); HangfireScheduleJob job = new HangfireScheduleJob(); var JobModel = new JobModel(); JobModel.CallbackUrl = Commons.PatientIp + "api/PayNotifyJob"; JobModel.CallbackContent = JsonHelper.ToJson(yaeherConsultationAdd); job.NotifyEnqueue(JobModel); } //发送支付成功的模板消息 #region 消息模板 // string appId = 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); #endregion } catch (Exception ex) { YaeherOperList yaeherOperList = new YaeherOperList(); yaeherOperList.CreatedOn = DateTime.Now; yaeherOperList.OperExplain = "Message:" + ex.Message.ToString(); yaeherOperList.OperContent = "StackTrace:" + ex.StackTrace.ToString(); yaeherOperList.OperType = "支付回调"; await _YaeherOperListrepository.PatientYaeherOperList(yaeherOperList); } return(Content(xml, "text/xml")); } catch (Exception ex) { YaeherOperList yaeherOperList = new YaeherOperList(); yaeherOperList.CreatedOn = DateTime.Now; yaeherOperList.OperExplain = "Message:" + ex.Message.ToString(); yaeherOperList.OperContent = "StackTrace:" + ex.StackTrace.ToString(); yaeherOperList.OperType = "支付回调"; await _YaeherOperListrepository.PatientYaeherOperList(yaeherOperList); 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("")); } }
/// <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) { } else { //微信公众号支付 var templateData = new WeixinTemplate_PaySuccess("https://weixin.senparc.com", "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(公众号)", appId + " , " + openId); var result = Senparc.Weixin.MP.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; } }
protected void Page_Load(object sender, EventArgs e) { ResponseHandler resHandler = new ResponseHandler(Context); resHandler.Init(); resHandler.SetKey(TenPayInfo.Key, TenPayInfo.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()); } }
IActionResult PayNotifyUrl_Ex(bool isWxOpenPay)//注意:统一下单接口中不能带参数! { 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") { string out_trade_no = resHandler.GetParameter("out_trade_no"); string openid = resHandler.GetParameter("openid"); string total_fee = resHandler.GetParameter("total_fee"); string transaction_id = resHandler.GetParameter("transaction_id"); string end_time = resHandler.GetParameter("time_end"); try { var order = _context.Order.FirstOrDefault(od => od.OrderID == out_trade_no); if (order != null) { if (order.OrderStatus == TradeState.NOTPAY || order.OrderStatus == TradeState.USERPAYING) { order.TransactionId = transaction_id; order.ActPay = decimal.Parse(total_fee); order.OrderStatus = TradeState.SUCCESS; order.PayType = "WeiXin"; order.OpenID = openid; if (DateTime.TryParseExact(end_time, "yyyyMMddHHmmss", null, System.Globalization.DateTimeStyles.None, out DateTime paydatetime_)) { order.PayDateTime = paydatetime_; } else { order.PayDateTime = DateTime.Now; } _context.Order.Update(order); _context.SaveChanges(); paySuccess = true;//正确的订单处理 } else { return_code = "SUCCESS"; return_msg = "订单已支付"; paySuccess = true; } } else { return_code = "FAIL"; return_msg = "订单不存在"; paySuccess = false; } } catch (Exception ex) { return_code = "FAIL"; return_msg = "服务器异常"; paySuccess = false; _logger.LogError(ex, "数据无法保存" + ex.Message); } } else { paySuccess = false;//错误的订单处理 } if (paySuccess) { /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 try { string appId = Config.SenparcWeixinSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。 string openId = resHandler.GetParameter("openid"); if (isWxOpenPay) { 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( "在线购买(小程序支付)测试", DateTime.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); } } else { //微信公众号支付 var templateData = new WeixinTemplate_PaySuccess("https://weixin.senparc.com", "购买商品", "状态:" + return_code); Senparc.Weixin.WeixinTrace.SendCustomLog("支付成功模板消息参数(公众号)", appId + " , " + openId); var result = Senparc.Weixin.MP.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回调", "支付失败"); } 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 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")); }
/// <summary> /// 退款通知地址 /// </summary> /// <returns></returns> public ActionResult RefundNotifyUrl() { WeixinTrace.SendCustomLog("RefundNotifyUrl被访问", "IP" + HttpContext.UserHostAddress()?.ToString()); string responseCode = "FAIL"; string responseMsg = "FAIL"; try { ResponseHandler resHandler = new ResponseHandler(HttpContext); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); WeixinTrace.SendCustomLog("跟踪RefundNotifyUrl信息", resHandler.ParseXML()); if (return_code == "SUCCESS") { responseCode = "SUCCESS"; responseMsg = "OK"; string appId = resHandler.GetParameter("appid"); string mch_id = resHandler.GetParameter("mch_id"); string nonce_str = resHandler.GetParameter("nonce_str"); string req_info = resHandler.GetParameter("req_info"); if (!appId.Equals(Senparc.Weixin.Config.SenparcWeixinSetting.TenPayV3_AppId)) { /* * 注意: * 这里添加过滤只是因为盛派Demo经常有其他公众号错误地设置了我们的地址, * 导致无法正常解密,平常使用不需要过滤! */ SenparcTrace.SendCustomLog("RefundNotifyUrl 的 AppId 不正确", $"appId:{appId}\r\nmch_id:{mch_id}\r\nreq_info:{req_info}"); return(Content("faild")); } SenparcTrace.SendCustomLog("解密 - req_info", req_info); var decodeReqInfo = TenPayV3Util.DecodeRefundReqInfo(req_info, TenPayV3Info.Key); SenparcTrace.SendCustomLog("解密 - decodeReqInfo", decodeReqInfo); var decodeDoc = XDocument.Parse(decodeReqInfo); //获取接口中需要用到的信息 string transaction_id = decodeDoc.Root.Element("transaction_id").Value; string out_trade_no = decodeDoc.Root.Element("out_trade_no").Value; string refund_id = decodeDoc.Root.Element("refund_id").Value; string out_refund_no = decodeDoc.Root.Element("out_refund_no").Value; int total_fee = int.Parse(decodeDoc.Root.Element("total_fee").Value); int? settlement_total_fee = decodeDoc.Root.Element("settlement_total_fee") != null ? int.Parse(decodeDoc.Root.Element("settlement_total_fee").Value) : null as int?; int refund_fee = int.Parse(decodeDoc.Root.Element("refund_fee").Value); int tosettlement_refund_feetal_fee = int.Parse(decodeDoc.Root.Element("settlement_refund_fee").Value); string refund_status = decodeDoc.Root.Element("refund_status").Value; string success_time = decodeDoc.Root.Element("success_time").Value; string refund_recv_accout = decodeDoc.Root.Element("refund_recv_accout").Value; string refund_account = decodeDoc.Root.Element("refund_account").Value; string refund_request_source = decodeDoc.Root.Element("refund_request_source").Value; WeixinTrace.SendCustomLog("RefundNotifyUrl被访问", "验证通过"); //进行后续业务处理 } } catch (Exception ex) { responseMsg = ex.Message; WeixinTrace.WeixinExceptionLog(new WeixinException(ex.Message, ex)); } string xml = string.Format(@"<xml> <return_code><![CDATA[{0}]]></return_code> <return_msg><![CDATA[{1}]]></return_msg> </xml>", responseCode, responseMsg); 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() && return_code.ToUpper() == "SUCCESS") { res = "success";//正确的订单处理 //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! } else { res = "wrong";//错误的订单处理 } /* 这里可以进行订单处理的逻辑 */ //发送支付成功的模板消息 try { string appId = WebConfigurationManager.AppSettings["WeixinAppId"];//与微信公众账号后台的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 = 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 ActionResult Index() { ResponseHandler resHandler = new ResponseHandler(null); resHandler.Init(); resHandler.SetKey(SiteConfig.MCHKEY); if (!resHandler.IsTenpaySign()) { return(Content("签名错误!")); } string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); //即时到账 if (return_code == "SUCCESS") { string result_code = resHandler.GetParameter("result_code"); string err_code = resHandler.GetParameter("err_code"); //验证请求是否从微信发过来(安全) if (!resHandler.IsTenpaySign() || return_code.ToUpper() != "SUCCESS") //支付签名检验 { LogUtility.Order.ErrorFormat("订单支付失败:{0} / {1}", return_code, return_msg); return(Content("wrong"));//错误的订单处理 } else { //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! var orderService = ObjectFactory.GetInstance <OrderService>(); string out_trade_no = resHandler.GetParameter("out_trade_no"); var order = orderService.GetObject(z => z.OrderNumber == out_trade_no); //判断订单是否被处理过 if (order.PayType == (int)Order_PayType.微信支付 && order.Status == (int)Order_Status.已支付) { LogUtility.Order.InfoFormat("订单{0}已被处理", order.OrderNumber); return(Content("SUCCESS")); } lock (PayLock) { //TODO:检查支付信息 var fullSystemConfigCache = ObjectFactory.GetInstance <IFullSystemConfigCache>(); var fullSystemConfig = fullSystemConfigCache.Data; //订单支付成功处理 orderService.OrderFinish(order); LogUtility.Order.InfoFormat("订单{0}支付成功,处理成功", order.OrderNumber); return(Content("SUCCESS")); } } } else { LogUtility.Order.ErrorFormat("订单支付失败:{0} / {1}", return_code, return_msg); return(Content(return_msg)); } }