作者:王先荣

最近在学习微信公众号开发,将学习的成果做成了一个类库,方便重复使用。

现在微信公众号多如牛毛,开发微信的高手可以直接无视这个系列的文章了。

使用该类库的流程及寥寥数行代码得到的结果如下。

 

本文的源代码主要在:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/xrwang.net/WeixinInterface.ashx以及http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/xrwang.net/Global.asax

1 引用微信公众号类库

引用xrwang.weixin.PublicAccount。

2 添加公众号信息

添加提供服务的公众号的信息,包括:原始id、AppId、AppSecret、EncodingAESKey。代码如下:

AccountInfoCollection.SetAccountInfo(new AccountInfo("YourOriginalId", "AppId", "AppSecret", "Token", "EncodingAESKey"));

如果需要同时给多个公众号提供服务,重复上面这行代码就可以了。

注:由于微信服务器的原因,如果在一个站点中要同时给多个公众号提供服务,有两种方法:如果用同一页面处理多个公众号,那么Token必须一致(1)可以在接口配置信息的URL中加入区分公众号的参数(例如:http://www.xrwang.net/WeixinInterface.ashx?username=gh_5dbae931ec49);(2)针对每个公众号单独建立一个页面来处理。我目前采用了第一种方式,这样更简便。

我喜欢将添加公众号信息的工作放到Gobal.asax的Application_Start方法中。

3 与微信服务器通信

我添加了名为“WeixinInterface.ashx”的一般处理页,并在其中与微信服务器进行通信,包括:校验请求、处理请求、回复适当的响应。代码如下:

    public void ProcessRequest(HttpContext context)

    {

        string result = string.Empty;

        if (Validate(context))

        {

            if (context.Request.HttpMethod == WebRequestMethods.Http.Get)

                result = HandleGet(context);

            else if (context.Request.HttpMethod == WebRequestMethods.Http.Post)

                result = HandlePost(context);

        }

        else

            Message.Insert(new Message(MessageType.Exception, "校验消息失败。\r\n地址:" + context.Request.RawUrl));

        context.Response.Write(result);

    }

与微信服务器通信

3.1 校验请求

首先,我们需要校验接收到的请求是否来自微信服务器,方法如下:

    /// <summary>

    /// 验证消息的有效性

    /// </summary>

    /// <param name="context"></param>

    /// <returns>如果消息有效,返回true;否则返回false。</returns>

    private bool Validate(HttpContext context)

    {

        string token = AccountInfoCollection.First.Token;   //由于在校验微信签名时,微信未传入公众号,因此这里用第一个公众号的TOKEN

        string signature = RequestEx.TryGetQueryString("signature");

        string timestamp = RequestEx.TryGetQueryString("timestamp");

        string nonce = RequestEx.TryGetQueryString("nonce");

        if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce))

            return false;

        return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce);

    }

校验请求

当然,如果你对世界充满爱,相信没有欺骗;如果你厉行节约,急需提高性能;不校验也是可以的。

3.2 处理请求

校验完请求之后,我们分两种情况处理请求:

(1)微信服务器的GET请求,用来验证我们的服务器是否正在工作,我们直接返回echostr就可以了;

    /// <summary>

    /// 处理微信的GET请求,校验签名

    /// </summary>

    /// <param name="context"></param>

    /// <returns>返回echostr</returns>

    private string HandleGet(HttpContext context)

    {

        return RequestEx.TryGetQueryString("echostr");

    }

处理GET请求

(2)微信服务器的POST请求,这是服务器分发给我们的消息,我们需要解析消息。

RequestMessageHelper helper = new RequestMessageHelper(context.Request);

3.3 回复响应

解析完微信服务器分发给我们的消息之后,我们要做出回应。我这里把收到的消息直接发回去,偷懒~\(≧▽≦)/~啦啦啦

    /// <summary>

    /// 处理微信的POST请求

    /// </summary>

    /// <param name="context"></param>

    /// <returns>返回xml响应</returns>

    private string HandlePost(HttpContext context)

    {

        RequestMessageHelper helper = new RequestMessageHelper(context.Request);

        if (helper.Message != null)

        {

            ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message);

            return responseMessage.ToXml(helper.EncryptType);

        }

        else

            return string.Empty;

    }

    /// <summary>

    /// 处理请求消息,返回响应消息

    /// </summary>

    /// <returns>返回响应消息</returns>

    private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage)

    {

        ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName,

            DateTime.Now, string.Format("自动回复,请求内容如下:\r\n{0}", requestMessage));

        response.Content += "\r\n<a href=\"http://www.cnblogs.com\">博客园</a>";

        return response;

    }

回复响应

当然了,正常情况下,我们需要兵来将挡水来土掩,根据不同的请求,回复对应的响应。如果需要对请求排队,再一一回复客服消息,可以先直接回复空字符串。回复客服消息的方法请看后面的文章。

4 微信公众号类库简介

xrwang.weixin.PublicAccount是一套简化微信公众号开发的类库,由王先荣开发,并且正在添砖加瓦中。采用MIT开源协议,大家可以随便用,别删掉我的名字就可以啦。

源代码的地址是:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount

如果发现BUG,请在博客中留言,或者给我发电子邮件:xrwang(a)126.com。

千万不要用QQ或者阿里旺旺聊天,打扰我玩游戏,我会骂人的  >.<

5 体验测试号

下面分别是我的测试号和公众号,您可以对照文章来体验哦。

测试号

测试号权限多,几乎可以测试公众平台的所有功能。

我的公众号

xrwang

个人订阅号,功能较少,不过我会特别优化。

好了,感谢您看完本文,希望对您有所帮助。本文来自xrwang的博客http://xrwang/cnblogs.com,欢迎在不篡改作者的前提下转载以传播知识。

.net微信公众号开发——快速入门的更多相关文章

  1. 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...

  2. C#微信公众号开发入门教程

    首先打开开发文档: 微信公众号开发者文档:http://mp.weixin.qq.com/wiki/home/index.html 一.创建测试账号 可以先申请一个开发者测试账号

  3. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  4. 微信公众号开发C#系列-12、微信前端开发利器:WeUI

    1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...

  5. 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转

    线程安全使用(四)   这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...

  6. .NET开发者如何愉快的进行微信公众号开发

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这篇文章只是一个如何提高开发效率的简单指导和记录,不会涉及具体的微信公众号开发内容. ...

  7. 微信公众号开发C#系列-11、生成带参数二维码应用场景

    1.概述 我们在微信公众号开发C#系列-7.消息管理-接收事件推送章节有对扫描带参数二维码事件的处理做了讲解.本篇主要讲解通过微信公众号开发平台提供的接口生成带参数的二维码及应用场景. 微信公众号平台 ...

  8. 微信公众号开发C#系列-9、多公众号集中管理

    1.概述 通过前面8篇关于微信开发相关文章的学习,我们已经对微信常用开发有了一个比较深入的了解.前面的文章都是基于某一特定公众号的,在现实业务中同一单位个体运营着不至一个公众号,此时就需要对多个公众号 ...

  9. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

随机推荐

  1. [转]oracle 10g数据泵之impdp-同时导入多个文件

    要了解impdp,请先了解导出,我之前作过导出的笔记:oracle 10g数据泵之expdp.这两个笔记也许只对程序员有用,通常用于把正式区的数据导入到测试区,对数据库管理员也许帮助不大,他们使用这些 ...

  2. Robot Framework-DatabaseLibrary数据库(MySql)

    Robot Framework-Mac版本安装 Robot Framework-Windows版本安装 Robot Framework-工具简介及入门使用 Robot Framework-Databa ...

  3. "产品测试管理&敏捷项目管理"研讨会在深圳成功举办!

    2016年1月9日,由深圳市共创力企业管理咨询发起的"产品测试管理&敏捷项目管理"研讨会在深圳南山科技园创新谷咖啡成功举办!参加此次研讨会的企业有华为.中兴.烽火.腾讯.康 ...

  4. git clone 错误ca-certificates.crt

    git clone https://github.com/baoyiluo/selfblog.git Cloning into 'selfblog'... error: server certific ...

  5. CPU相关知识---物理CPU数、物理核数、逻辑核数、逻辑CPU数 ?

    一.物理CPU数.物理核数.逻辑核数.逻辑CPU数 相互关系??? 物理CPU数 ---> 每个物理CPU对应物理核数 ---> (每个物理核数对应逻辑核数)物理CPU对应逻辑核数 --- ...

  6. haskell debug

    最近在学习haskell这门神奇的语言,但是由于print不方便,程序出错的时候都不知道是怎么回事.网上搜了一把发现有这么一个好东西 import Debug.Trace funct :: Integ ...

  7. C#函数式编程之递归调用

    关于递归相信大家已经熟悉的不能再熟悉了,所以笔者在这里就不多费口舌,不懂的读者们可以在博客园中找到很多与之相关的博客.下面我们直接切入正题,开始介绍尾递归. 尾递归 普通递归和尾递归如果仅仅只是从代码 ...

  8. ArcServer 10.0 “No Content”、“Server Host Cannot be null” 错误

    问题一:"No Content" 问题描述: 在输入服务地址时:http://192.168.1.180/arcgis/services   结果出现下面的错误:   解决办法: ...

  9. centos基本操作

    yum install nodejs npm install -g shadowsocks nohup ssserver & 后台运行 vi /usr/lib/node_modules/sha ...

  10. 3-MSP430引脚中断

    为了写一篇文章做铺垫--提醒着自己,,,,,, 这两天一直在寻找 #pragma vector = PORT1_VECTOR __interrupt void P1_Interrupt()//P1口中 ...