.net微信公众号开发——快速入门【转载】

摘要:
最近在学习微信公众号开发,将学习的成果做成了一个类库,方便重复使用。现在微信公众号多如牛毛,开发微信的高手可以直接无视这个系列的文章了。本文的源代码主要在: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.asax1引用微信公众号类库引用xrwang.weixin.PublicAccount。username=gh_5dbae931ec49);针对每个公众号单独建立一个页面来处理。RequestMessageHelperhelper=newRequestMessageHelper;3.3回复响应解析完微信服务器分发给我们的消息之后,我们要做出回应。

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

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

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

.net微信公众号开发——快速入门【转载】第1张.net微信公众号开发——快速入门【转载】第2张

本文的源代码主要在: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”的一般处理页,并在其中与微信服务器进行通信,包括:校验请求、处理请求、回复适当的响应。代码如下:

.net微信公众号开发——快速入门【转载】第3张.net微信公众号开发——快速入门【转载】第4张
    public voidProcessRequest(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, "校验消息失败。
地址:" +context.Request.RawUrl));

        context.Response.Write(result);

    }
与微信服务器通信

3.1 校验请求

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

.net微信公众号开发——快速入门【转载】第5张.net微信公众号开发——快速入门【转载】第6张
    /// <summary>

    ///验证消息的有效性

    /// </summary>

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

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

    private boolValidate(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;

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

    }
校验请求

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

3.2 处理请求

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

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

.net微信公众号开发——快速入门【转载】第7张.net微信公众号开发——快速入门【转载】第8张
    /// <summary>

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

    /// </summary>

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

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

    private stringHandleGet(HttpContext context)

    {

        return RequestEx.TryGetQueryString("echostr");

    }
处理GET请求

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

RequestMessageHelper helper = new RequestMessageHelper(context.Request);

3.3 回复响应

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

.net微信公众号开发——快速入门【转载】第9张.net微信公众号开发——快速入门【转载】第10张
    /// <summary>

    ///处理微信的POST请求

    /// </summary>

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

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

    private stringHandlePost(HttpContext context)

    {

        RequestMessageHelper helper = newRequestMessageHelper(context.Request);

        if (helper.Message != null)

        {

            ResponseBaseMessage responseMessage =HandleRequestMessage(helper.Message);

            returnresponseMessage.ToXml(helper.EncryptType);

        }

        else

            return string.Empty;

    }

 

    /// <summary>

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

    /// </summary>

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

    privateResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage)

    {

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

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

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

        returnresponse;

    }
回复响应

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

4 微信公众号类库简介

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

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

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

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

5 体验测试号

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

测试号

.net微信公众号开发——快速入门【转载】第11张

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

我的公众号

xrwang

.net微信公众号开发——快速入门【转载】第12张

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

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

免责声明:文章转载自《.net微信公众号开发——快速入门【转载】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MAT工具定位分析Java堆内存泄漏问题方法CPU 内存 硬盘的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java中判断String不为空的问题性能比较

 function 1: 最多人使用的一个方法, 直观, 方便, 但效率很低. function 2: 比较字符串长度, 效率高, 是我知道的最好一个方法. function 3: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 不推荐使用    以下是三种方法在机器上的运行结果: (机器性能不一, 仅供参考) fu...

dynamic-insert和dynamic-update属性

dynamic-insert 作用:设置对象中没有值的字段 insert并不会对其进行插入. 实体类映射配置如下 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.o...

Java探针

  使用java代理来实现java字节码注入 使用JavaSsist可以对字节码进行修改 使用ASM可以修改字节码 使用Java代理和ASM字节码技术开发java探针工具可以修改字节码 备注:javassist是一个库,实现ClassFileTransformer接口中的transform()方法。ClassFileTransformer 这个接口的目的...

C-Sharp网络编程案例解析(Socket类的使用)

Server端: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace Server {     class Program     {         static v...

xStream完美转换XML、JSON(转)

xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换; 前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html 以及Jackson这个框架,在线博文:ht...

ElasticSearch 问题分析:No data nodes with HTTP-enabled available

环境:ES-5.4.0版本,部署方式:3master node+2client node+3data node 说明:data node和client node都配置了http.enabled: false,程序在写数据时报错:No data nodes with HTTP-enabled available 源码分析: 1 public static...