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

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

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

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

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

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

在浏览中搜索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文件中进行设置,主要在<appSetting>节点中加入以下参数:

<!-- 以下信息会被自动识别,如无特殊说明,不用的参数可以删除,但修改 key 后将会无法自动识别! -->
    <!-- 自动识别参数开始 -->

<!-- 以下为 CO2NET 的 SenparcSetting 全局配置,请勿修改 key,勿删除任何项 -->
    
    <!-- 默认缓存命名空间配置 -->
    <add key="DefaultCacheNamespace" value="DefaultCache" />
    <!-- Cache.Redis连接配置 -->
    <add key="Cache_Redis_Configuration" value="Redis配置" />
    <!--<add key="Cache_Redis_Configuration" value="localhost:6379" />-->
    <!-- Cache.Memcached连接配置 -->
    <add key="Cache_Memcached_Configuration" value="Memcached配置" />
    <add key="SenparcUnionAgentKey" value="SenparcUnionAgentKey" />
    
    <!-- 以下为 Senparc.Weixin 的 SenparcWeixinSetting 微信配置,不使用的参数可以删除  -->
    
    <!-- 微信公众号URL对接信息 -->
    <add key="WeixinToken" value="应用服务器(开发者服务器)URL对应的Token" />
    <add key="WeixinEncodingAESKey" value="应用服务器(开发者服务器)URL对应的消息加解密密钥" />
    <!-- 高级接口信息 -->
    <add key="WeixinAppId" value="微信AppId" />
    <add key="WeixinAppSecret" value="微信AppSecret" />
    <!-- SDK提供的代理功能设置 -->
    <add key="WeixinAgentUrl" value="外部代理Url" />
    <add key="WeixinAgentToken" value="外部代理Token" />
    <add key="SenparcAgentKey" value="盛派代理系统通用Key" />
    <add key="WeixinAgentWeiweihiKey" value="外部代理WeiWeiHiKey" />
    <!-- 微信支付相关参数 -->
    <!-- 微信支付V2 -->
    <add key="WeixinPay_Tenpay" value="WeixinPay_Tenpay" />
    <add key="WeixinPay_PartnerId" value="WeixinPay_PartnerId" />
    <add key="WeixinPay_Key" value="WeixinPay_Key" />
    <add key="WeixinPay_AppId" value="WeixinPay_AppId" />
    <add key="WeixinPay_AppKey" value="WeixinPay_AppKey" />
    <add key="WeixinPay_TenpayNotify" value="WeixinPay_TenpayNotify" />
    <!-- 微信支付V3 -->
    <add key="TenPayV3_MchId" value="TenPayV3_MchId" />
    <add key="TenPayV3_Key" value="TenPayV3_Key" />
    <add key="TenPayV3_AppId" value="TenPayV3_AppId" />
    <add key="TenPayV3_AppSecret" value="TenPayV3_AppSecret" />
    <add key="TenPayV3_TenpayNotify" value="http://YourDomainName/TenpayV3/PayNotifyUrl" />
    <!-- 开放平台 -->
    <add key="Component_Appid" value="Component_Appid" />
    <add key="Component_Secret" value="Component_Secret" />
    <add key="Component_Token" value="Component_Token" />
    <add key="Component_EncodingAESKey" value="Component_EncodingAESKey" />
    <!-- 微信企业号 -->
    <add key="WeixinCorpId" value="WeixinCorpId" />
    <add key="WeixinCorpSecret" value="WeixinCorpSecret" />

<!-- 小程序 -->
    <!-- 小程序消息URL对接信息 -->
    <add key="WxOpenToken" value="小程序消息URL对应的Token" />
    <add key="WxOpenEncodingAESKey" value="小程序消息URL对应的消息加解密密钥" />
    <!-- 小程序秘钥信息 -->
    <add key="WxOpenAppId" value="微信小程序AppId" />
    <add key="WxOpenAppSecret" value="微信小程序AppSecret" />

<!-- 自动识别参数结束 -->

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设置保持一致,区分大小写。

/// <summary>
        /// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://weixin.senparc.com/weixin
        /// </summary>
        [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一致。");
            }
        }

/// <summary>
        /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
        /// PS:此方法为简化方法,效果与OldPost一致。
        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
        /// </summary>
        [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<IRequestMessageBase, IResponseMessageBase>
    {
        public CustomMessageContext()
        {
            base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;
        }

/// <summary>
        /// 当上下文过期,被移除的时候触发的时间
        /// </summary>
        private void CustomMessageContext_MessageContextRemoved(object sender, WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> 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<CustomMessageContext>
    {
        public CustomMessageHandler(Stream inputStream, PostModel postModel)
            : base(inputStream, postModel)
        {

}

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

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

}
}

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

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

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

  1. 公众号开发(2) —— 盛派.net SDK + vue搭建微信公众号网页开发框架

    需求:通过微信公众号菜单跳转到手机端网页,跳转后通过微信授权登录获取微信公众号用户的OpenId(用户关注公众号后,用户在公众号的唯一凭证),通过OpenId和后台数据库用户信息绑定起来并实现一些业务 ...

  2. 如何用阿里云服务器搭建微信公众号机器人?

    我们经常在一些公众号里回复信息,微信公众号都会自动回复信息,区别于微信平台的自动回复,有的公众号上面的自动回复,则更像是一个机器人客服.下面小编就教大家如何搭建微信公众号机器人. 所需材料: 微信公众 ...

  3. sae微信公众平台php,SAE 上使用PHP搭建微信公众号后台

    SAE 上使用PHP搭建微信公众号后台 准备阶段 SAE准备 SAE的应用平台提供了一个语言环境.比如提供了PHP环境的应用即可运行PHP代码.当然环境中也可以放HTML和CSS,将要展示的页面命名为 ...

  4. [python]用flask框架搭建微信公众号的后台

    用flask框架搭建微信公众号的后台 最近用python写了点爬虫,为了要让爬取的数据能够随时显示在我眼前,并实时根据我的指令返回数据.于是采用微信公众号做这个显示窗口,既能发送指令也能显示简单的相关 ...

  5. SpringBoot搭建微信公众号后台(一):消息接收与响应

    关注作者,更多动态实时掌握,微信公众号:隔壁的程序员 上一篇我们经过接口验证,已经可以与微信的服务器进行通信,错过的可以通过下面链接来进行回顾,这一篇就来实现一个基本的消息接收与响应. SpringB ...

  6. 手把手教大家搭建微信公众号查题功能

    手把手教大家搭建微信公众号查题功能 本平台优点: 多题库查题.独立后台.响应速度快.全网平台可查.功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转) ...

  7. php虚拟主机搭建微信公众号服务器

    @版权声明:本文为博主原创文章,未经博主允许不得转载https://blog.csdn.net/qq_40758535/article/details/89606716 php虚拟主机搭建微信公众号服 ...

  8. 虚拟主机搭建微信公众号服务器

    一.前言 搭建微信公众号服务器的方式不只一种,可以用java等其他语言或是其他云空间来搭建服务器,这里总结的是用虚拟主机(主机公园中的虚拟主机)搭建微信公众号服务器的大概思路.不管用什么方式,配置微信 ...

  9. 华为云服务器如何搭建微信公众号后台-收发文本信息?

    概述 在本教程中,您将学会使用弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果给最终用户,如图 ...

最新文章

  1. 设计模式-行为-Iterator(迭代器)模式
  2. 关于JAVA编译时找不到自定义包的问题
  3. 常见的复杂网络模型都有哪些?
  4. java forEach使用
  5. RANSAC与 最小二乘(LS, Least Squares)拟合直线的效果比较
  6. centos的防火墙配置
  7. 并发编程-基础概念介绍
  8. crc java_求这个CRC16算法的java版实现!!!
  9. Oracle 11g数据库基础教程(第2版)-课后习题-第六章
  10. php根据两点经纬度计算距离
  11. github如何开启两步验证
  12. elementUI中el-table树形与el-tree树形结构的一键折叠与展开
  13. 蓝牙耳机什么牌子好?2020年度热销高人气五款蓝牙耳机测评
  14. 如果早晚都要死去,为什么还要活着?
  15. [技术讨论]为什么运算放大器有共模输入电压范围限制呢,详解在这里
  16. 剑麻的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. Linux中使用命令分类型统计系统光盘中rpm包数量
  18. Flutter--分组列表实现思路
  19. 数字逻辑综合工具-DC-11——一些其它命令和综合之后的文件
  20. Python中下载RF(RobotFramework)的几行命令

热门文章

  1. 将谷歌网盘的文件搬运到百度网盘
  2. pathon中的元组与序列
  3. vue中的prop验证
  4. SAP中税码、税率、税务科目的几个表及其中的勾稽关系
  5. 又拍云叶靖:基于Docker的云处理服务平台
  6. 《一年学完mit计算机课程》,用了这种学习方法,他一年学完了33门MIT计算机课程...
  7. 公众号资源方法,数据集,绘图学习持续更新记录~~~
  8. Leetcode 第 201 场周赛 (2020 滴滴校招专场)
  9. # 2gether 在一起 # 2 号星际碎片现身,全军出击!
  10. H5微信公众号关闭页面