PageRenderTime 23ms CodeModel.GetById 16ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/Senparc.Weixin.MP.Sample/Senparc.Weixin.MP.Sample/Controllers/WeixinController.cs

https://github.com/mjhuangzk/WeiXinMPSDK
C# | 126 lines | 82 code | 16 blank | 28 comment | 5 complexity | c6f3ff63701e62a41920a2cb1a185c1a MD5 | raw file
  1using System;
  2using System.Collections.Generic;
  3using System.IO;
  4using System.Linq;
  5using System.Text;
  6using System.Web;
  7using System.Web.Mvc;
  8using System.Xml.Linq;
  9using Senparc.Weixin.MP.MessageHandlers;
 10
 11namespace Senparc.Weixin.MP.Sample.Controllers
 12{
 13    using Senparc.Weixin.MP.Entities;
 14    using Senparc.Weixin.MP.Helpers;
 15    using Senparc.Weixin.MP.MvcExtension;
 16    //using Senparc.Weixin.MP.Sample.Service;
 17    //using Senparc.Weixin.MP.Sample.CustomerMessageHandler;
 18    using Senparc.Weixin.MP.Sample.CommonService;
 19    using Senparc.Weixin.MP.Sample.CommonService.CustomMessageHandler;
 20
 21    public partial class WeixinController : Controller
 22    {
 23        public readonly string Token = "weixin";//与微信公众账号后台的Token设置保持一致,区分大小写。
 24
 25        public WeixinController()
 26        {
 27
 28        }
 29
 30        /// <summary>
 31        /// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://weixin.senparc.com/weixin
 32        /// </summary>
 33        [HttpGet]
 34        [ActionName("Index")]
 35        public ActionResult Get(string signature, string timestamp, string nonce, string echostr)
 36        {
 37            if (CheckSignature.Check(signature, timestamp, nonce, Token))
 38            {
 39                return Content(echostr); //返回随机字符串则表示验证通过
 40            }
 41            else
 42            {
 43                return Content("failed:" + signature + "," + MP.CheckSignature.GetSignature(timestamp, nonce, Token)+"。如果您在浏览器中看到这条信息,表明此Url可以填入微信后台。");
 44            }
 45        }
 46
 47        /// <summary>
 48        /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
 49        /// PS:此方法为简化方法,效果与OldPost一致。
 50        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
 51        /// </summary>
 52        [HttpPost]
 53        [ActionName("Index")]
 54        public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
 55        {
 56            if (!CheckSignature.Check(signature, timestamp, nonce, Token))
 57            {
 58                return Content("参数错误!");
 59            }
 60
 61            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
 62            var messageHandler = new CustomMessageHandler(Request.InputStream);
 63
 64            try
 65            {
 66                //测试时可开启此记录,帮助跟踪数据
 67                messageHandler.RequestDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + messageHandler.RequestMessage.FromUserName + ".txt"));
 68                //执行微信处理过程
 69                messageHandler.Execute();
 70                //测试时可开启,帮助跟踪数据
 71                messageHandler.ResponseDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + messageHandler.ResponseMessage.ToUserName + ".txt"));
 72
 73                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
 74                return new WeixinResult(messageHandler);//v0.8+
 75            }
 76            catch (Exception ex)
 77            {
 78                using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt")))
 79                {
 80                    tw.WriteLine("ExecptionMessage:" + ex.Message);
 81                    tw.WriteLine(ex.Source);
 82                    tw.WriteLine(ex.StackTrace);
 83                    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);
 84
 85                    if (messageHandler.ResponseDocument != null)
 86                    {
 87                        tw.WriteLine(messageHandler.ResponseDocument.ToString());
 88                    }
 89                    tw.Flush();
 90                    tw.Close();
 91                }
 92                return Content("");
 93            }
 94        }
 95
 96
 97        /// <summary>
 98        /// 最简化的处理流程
 99        /// </summary>
100        [HttpPost]
101        [ActionName("MiniPost")]
102        public ActionResult MiniPost(string signature, string timestamp, string nonce, string echostr)
103        {
104            if (!CheckSignature.Check(signature, timestamp, nonce, Token))
105            {
106                //return Content("参数错误!");//v0.7-
107                return new WeixinResult("参数错误!");//v0.8+
108            }
109
110            var messageHandler = new CustomMessageHandler(Request.InputStream);
111
112            messageHandler.Execute();//执行微信处理过程
113
114            //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
115            return new WeixinResult(messageHandler);//v0.8+
116        }
117
118        /*
119         * v0.3.0之前的原始Post方法见:WeixinController_OldPost.cs
120         * 
121         * 注意:虽然这里提倡使用CustomerMessageHandler的方法,但是MessageHandler基类最终还是基于OldPost的判断逻辑,
122         * 因此如果需要深入了解Senparc.Weixin.MP内部处理消息的机制,可以查看WeixinController_OldPost.cs中的OldPost方法。
123         * 目前为止OldPost依然有效,依然可用于生产。
124         */
125    }
126}