使用Senparc.Weixin SDK搭建微信公众号服务程序

      之前学过一些关于微信公众号二次开发的教程,偶然的机会接触了Senparc.Weixin SDK,确实是不错的框架,所以想着按照http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 里的教程自己学着从零开始搭建这个框架,中间发现一些问题,在这里做些记录,经供参考。

        关于微信公众号的开发原理,请查看Senparc.Weixin SDK相关教程,在这里就不再累赘。

        下面主要记录在VS2017下一个微信公众号二次开发程序的创建过程:

       1、建立一个空的ASP.NET MVC项目:

使用Senparc.Weixin SDK搭建微信公众号服务程序_第1张图片

使用Senparc.Weixin SDK搭建微信公众号服务程序_第2张图片

         2、引入Senparc.Weixin SDK的dll文件

         一般我们可以使用nuget直接安装到该项目中。右击项目中的引用,点击菜单中的“管理NuGet程序包”。

使用Senparc.Weixin SDK搭建微信公众号服务程序_第3张图片

使用Senparc.Weixin SDK搭建微信公众号服务程序_第4张图片

        在浏览中搜索Senparc.Weixin SDK相关的dll,主要有以下几个dll:

        Senparc.Weixin:基础库

        Senparc.Weixin MP:公众号、微信支付、JS-SDK、摇一摇周边相关的库

        Senparc.Weixin MP Mvc:用于提供基于asp.net mvc的拓展

         备注:安装这些dll的时候,都会有安装版本的选择,刚开始我想着依照以前成熟的demo来查找对应版本的dll,但思来想去,还是用最新的,有问题再继续解决。

3、在global.asax.cs文件中进行设置,主要在Application_Start()中增加以下代码:

  /* CO2NET 全局注册开始
             * 建议按照以下顺序进行注册
             */

            //设置全局 Debug 状态
            var isGLobalDebug = true;
            var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug);

            //CO2NET 全局注册,必须!!
            IRegisterService register = RegisterService.Start(senparcSetting)
                                          .UseSenparcGlobal(false, null);

            /* 微信配置开始
             * 建议按照以下顺序进行注册
             */

            //设置微信 Debug 状态
            var isWeixinDebug = true;
            var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug);

            //微信全局注册,必须!!
            register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);

4、在web.config文件中进行设置,主要在节点中加入以下参数:


   

   
    
   
   
   
   
   
   
   
   
    
   
    
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

   
   
   
   
   
   
   

   

5、创建一个控制器——WeixinControl.cs,并且修改该代码,代码如下:

using System.Web.Mvc;
using Senparc.Weixin;
using Senparc.Weixin.MP;

namespace weixintest.Controllers
{
    using Senparc.Weixin.MP.Entities.Request;
    using Senparc.Weixin.MP.MvcExtension;
    using weixintest.MessageHandlers.CustomMessageHandler;

    //using Senparc.Weixin.MP.Sample.CommonService.CustomMessageHandler;

    public class WeixinController : Controller
    {
        public static readonly string Token = Config.SenparcWeixinSetting.Token;//与微信公众账号后台的Token设置保持一致,区分大小写。
        public static readonly string EncodingAESKey = Config.SenparcWeixinSetting.EncodingAESKey;//与微信公众账号后台的EncodingAESKey设置保持一致,区分大小写。
        public static readonly string AppId = Config.SenparcWeixinSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。

        ///


        /// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://weixin.senparc.com/weixin
        ///

        [HttpGet]
        [ActionName("Index")]
        public ActionResult Get(PostModel postModel, string echostr)
        {
            if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return Content(echostr); //返回随机字符串则表示验证通过
            }
            else
            {
                return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
                    "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
            }
        }

        ///


        /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
        /// PS:此方法为简化方法,效果与OldPost一致。
        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
        ///

        [HttpPost]
        [ActionName("Index")]
        public ActionResult Post(PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return Content("参数错误!");
            }

            postModel.Token = Token;//根据自己后台的设置保持一致
            postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
            postModel.AppId = AppId;//根据自己后台的设置保持一致

            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
            var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息

            messageHandler.Execute();//执行微信处理过程

            return new FixWeixinBugWeixinResult(messageHandler);//返回结果

        }

        // GET: Weixin
        public ActionResult Index()
        {
            return View();
        }
    }
}

6、添加messagehandler,在该项目下新建文件夹,格式和内容如下:

7、CustomMessageContext.cs

namespace weixintest.MessageHandlers.CustomMessageHandler
{
    public class CustomMessageContext : MessageContext
    {
        public CustomMessageContext()
        {
            base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;
        }

        ///


        /// 当上下文过期,被移除的时候触发的时间
        ///

        private void CustomMessageContext_MessageContextRemoved(object sender, WeixinContextRemovedEventArgs e)
        {
            /* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控)
            * 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除
            */
            var messageContext = e.MessageContext as CustomMessageContext;
            if (messageContext == null)
            {
                //如果是正常的调用,messageContext不会为null
                return;
            }
            //TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考
            //Log.InfoFormat("{0}的消息上下文已过期",e.OpenId);
            //api.SendMessage(e.OpenId, "由于长时间未搭理客服,您的客服状态已退出!");
        }
    }
}

8、CustomMessageHandler.cs

using Senparc.NeuChar.Entities;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MessageHandlers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;

namespace weixintest.MessageHandlers.CustomMessageHandler
{
    public class CustomMessageHandler: MessageHandler
    {
        public CustomMessageHandler(Stream inputStream, PostModel postModel)
            : base(inputStream, postModel)
        {

        }

        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
        {
            var responseMessage = base.CreateResponseMessage(); //ResponseMessageText也可以是News等其他类型
            responseMessage.Content = "这条消息来自DefaultResponseMessage。";
            return responseMessage;
        }

        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            var responseMessage = base.CreateResponseMessage();
            responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName      //这里的requestMessage.FromUserName也可以直接写成base.WeixinOpenId
                                    + "。\r\n您发送了文字信息:" + requestMessage.Content;  //\r\n用于换行,requestMessage.Content即用户发过来的文字内容
            return responseMessage;
        }

    }
}

9、基本完成后发布到服务器上,功能如下:

使用Senparc.Weixin SDK搭建微信公众号服务程序_第5张图片

     以上内容写得有点糙,先发布出来大家吐槽吧。有哪些问题的大家一起指正,我随时更新内容。当然如果有朋友也想搭这个demo,也可以联系我,我把之前搭的这个demo发你,一起学习。

你可能感兴趣的:(微信开发点滴)