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));
 }
Exemple #3
0
        /// <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;
            }
        }
Exemple #4
0
        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()));
        }
Exemple #6
0
 /// <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"));
        }
Exemple #9
0
        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"));
        }
Exemple #10
0
        /// <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;
            }
        }
Exemple #11
0
        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));
            }
        }
Exemple #12
0
        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));
            }
        }
Exemple #13
0
        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;
            }
        }
Exemple #16
0
    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());
        }
    }
Exemple #17
0
        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));
            }
        }