这篇文章还不错,使用  .net , 对微信用户的想公众号发送的文字进行回复。比较简单,自己可以修改更复杂的回复。

微信公众号开发笔记(C#)

原文地址

需求分析

根据用户在微信上发送至价值中国公众号的消息,查询与该消息相关的内容返回给用户。
例如,用户发送【美国经济】后收到包含【美国经济】的内容,点击可查看全文。若没有查询到相关内容,则返回默认消息。
 

运行环境

.NET
 

准备工作

1.在微信公众平台申请开发者。
2.功能页面完成后上传至自己的网站并能正常访问该URL(以下统称:目标接口)
3.在微信公众平台开启开发模式。
 

开发流程

1.验证签名,微信服务器会发一个GET请求到目标接口,接收参数后开始验证。
2.首先接收微信服务器发送的请求,然后进行处理,请求为xml格式,携带公众号、发送方微信号、消息类型,消息内容等结点。
3.根据消息类型,从数据库读取相关预设内容返回,要求响应时间在5秒内,返回格式同样是xml格式。
 

备注

输出内容一定要使用UTF-8的编码方式,否则中文会产生乱码。
如果消息中需要换行,使用\r\n来换行。
支持html的a标签,但是如果是换行是紧邻关系的话可能无法识别换行。
 
 完整代码
using System;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Xml;
 
public class WeChat : IHttpHandler
{    
    public void ProcessRequest(HttpContext context)
    {
        weixin wx = new weixin();
        String postStr = String.Empty;
 
        if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
        {
            Stream s = HttpContext.Current.Request.InputStream;
            Byte[] b = new Byte[s.Length];
            s.Read(b, 0, (Int32)s.Length);
            postStr = Encoding.UTF8.GetString(b);
 
            if (!String.IsNullOrEmpty(postStr))
            {
                wx.Handle(postStr);
            }
        }
        else
        {
            wx.Auth();
        }
    }
 
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
 
public class weixin
{
    private String Token = "改写为自己的Token";
    private String DefaultResponseContent = "欢迎关注价值中国\r\n价值中国是中国领先的财经商业领域社会化媒体";
 
    public void Auth()
    {
        String echoStr = HttpContext.Current.Request.QueryString["echoStr"];
 
        if (CheckSignature())
        {
            if (!String.IsNullOrEmpty(echoStr))
            {
                HttpContext.Current.Response.Write(echoStr);
                HttpContext.Current.Response.End();
            }
        }
    }
 
    public void Handle(String postStr)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(postStr);
 
        XmlElement rootElement = doc.DocumentElement;
        XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
 
        RequestXML requestXML = new RequestXML();
        requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
        requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
        requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
        requestXML.MsgType = MsgType.InnerText;
 
        if (requestXML.MsgType == "text")
        {
            requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
        }
 
        else if (requestXML.MsgType == "location")
        {
            requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
            requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
            requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
            requestXML.MapInfo = rootElement.SelectSingleNode("Label").InnerText;
        }
 
        else if (requestXML.MsgType == "image")
        {
            requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
        }
 
        ResponseMsg(requestXML);
    }
 
    /// 验证微信签名
    private bool CheckSignature()
    {
        String signature = HttpContext.Current.Request.QueryString["signature"];
        String timestamp = HttpContext.Current.Request.QueryString["timestamp"];
        String nonce = HttpContext.Current.Request.QueryString["nonce"];
        String[] ArrTmp = { Token, timestamp, nonce };
 
        Array.Sort(ArrTmp);
        String tmpStr = String.Join("", ArrTmp);
 
        tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
        tmpStr = tmpStr.ToLower();
 
        if (tmpStr == signature)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
 
    /// <summary>
    /// 回复消息
    /// </summary>
    /// <param name="weixinXML"></param>
    private void ResponseMsg(RequestXML requestXML)
    {
        String responseContent = String.Empty;
        
        if (requestXML.MsgType == "text")
        {
            responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "从数据库读取的内容");
        }
 
        HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
        HttpContext.Current.Response.Write(responseContent);
    }
 
    /// 返回格式化文本XML内容
    private String FormatTextXML(String fromUserName, String toUserName, String content)
    {
        return "<xml><ToUserName><![CDATA[" + fromUserName + "]]></ToUserName><FromUserName><![CDATA[" + toUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + content + "]]></Content><FuncFlag>1</FuncFlag></xml>";
    }
 
    private int ConvertDateTimeInt(System.DateTime time)
    {
        System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
        return (int)(time - startTime).TotalSeconds;
    }
}
 
 
//微信请求类
public class RequestXML
{
    private String toUserName = String.Empty;
 
    /// <summary>
    /// 公众号
    /// </summary>
    public String ToUserName
    {
        get { return toUserName; }
        set { toUserName = value; }
    }
 
    private String fromUserName = "";
 
    /// <summary>
    /// 发送方微信号
    /// </summary>
    public String FromUserName
    {
        get { return fromUserName; }
        set { fromUserName = value; }
    }
 
    private String createTime = String.Empty;
 
    /// <summary>
    /// 创建时间
    /// </summary>
    public String CreateTime
    {
        get { return createTime; }
        set { createTime = value; }
    }
 
    private String msgType = String.Empty;
 
    /// <summary>
    /// 信息类型 地理位置:location,文本消息:text,消息类型:image
    /// </summary>
    public String MsgType
    {
        get { return msgType; }
        set { msgType = value; }
    }
 
    private String content = String.Empty;
 
    /// <summary>
    /// 信息内容
    /// </summary>
    public String Content
    {
        get { return content; }
        set { content = value; }
    }
 
    private String location_X = String.Empty;
 
    /// <summary>
    /// 地理位置纬度
    /// </summary>
    public String Location_X
    {
        get { return location_X; }
        set { location_X = value; }
    }
 
    private String location_Y = String.Empty;
 
    /// <summary>
    /// 地理位置经度
    /// </summary>
    public String Location_Y
    {
        get { return location_Y; }
        set { location_Y = value; }
    }
 
    private String scale = String.Empty;
 
    /// <summary>
    /// 地图缩放大小
    /// </summary>
    public String Scale
    {
        get { return scale; }
        set { scale = value; }
    }
 
    private String mapInfo = String.Empty;
 
    /// <summary>
    /// 地理位置信息
    /// </summary>
    public String MapInfo
    {
        get { return mapInfo; }
        set { mapInfo = value; }
    }
 
    private String picUrl = String.Empty;
 
    /// <summary>
    /// 图片链接
    /// </summary>
    public String PicUrl
    {
        get { return picUrl; }
        set { picUrl = value; }
    }
 }
 
 
 
台州人在杭州 IT交流群 416194041

欢迎在杭州的台州老乡加入交流!

 
 
 
 
 
 
 
 
 
 
 
 
 

微信公众号开发笔记(C#)的更多相关文章

  1. 微信公众号开发笔记1(nodejs开发的)

    本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...

  2. 微信公众号开发笔记1(nodejs开发)

    本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...

  3. 微信公众号开发笔记-验证token

    开发 话不多说我们直接进入主题 我们先去微信公众号申请一个公众号: 申请完成之后我们找到开发下的基本配置 然后找到进行基本配置,我们需要一个url地址来验证,这里的地址必需要是外网,Token是我们任 ...

  4. 微信公众号开发笔记2(nodejs)

    本篇主要记录调用微信各种api和功能实现 一.始于access_token 无论调用微信的什么api,都需要一个查询参数,就是我们每隔1小时或者2小时获取的access_token,笔记1中已经保证了 ...

  5. 集智robot微信公众号开发笔记

    开发流程 公众号基本配置(首先得有公众平台账号) 在开发菜单的基本配置中填写好基本配置项 首先配置服务器地址.Token.和消息加密密钥(地址为开发者为微信验证留的接口.token可以随便填写,只要在 ...

  6. 微信公众号开发笔记3-sdk接入(nodejs)

    另一个2小时 access_token是需要2小时更新一次,在这里,又引入了一个2小时获取一次的字段,这个字段是: jsapi_ticket,这个字段是接入sdk的前提.与access_token类似 ...

  7. 微信公众号开发笔记1-获取Access Token

    获取你的Access Token a)可以采用网址的形式: 用appid和appsecert获得access token,接口为https://api.weixin.qq.com/cgi-bin/to ...

  8. 微信公众号开发--.net core接入

    .net进行微信公众号开发的例子好像比较少,这里做个笔记 首先,我们需要让微信能访问到我们的项目,所以要么需要有一个可以部署项目的连接到公网下的服务器,要么可以通过端口转发将请求转发到我们的项目,总之 ...

  9. 微信公众号开发(一)--验证服务器地址的Java实现

    现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...

随机推荐

  1. 【转】互联网全站HTTPS的时代已经到来

    原文地址:http://blog.csdn.net/luocn99/article/details/39777707 前言 我目前正在从事HTTPS方面的性能优化工作.在HTTPS项目的开展过程中明显 ...

  2. NBU 2475 Survivors(RMQ线段树)

    NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...

  3. 如何在.NET MVC中使用jQuery并返回JSON数据

    http://blog.csdn.net/dingxingmei/article/details/9092249 开始实践 - jQuery端 假设我们要从服务器端获取一个文章列表,并把文章条目显示在 ...

  4. Http权威指南(二)---读书笔记

    Chart4 ====连接管理==== 一.TCP连接 1.  Http和Https的网络协议栈: 2.  Http在TCP/IP传输中的位置:   3.  Http怎么利用TCP传输: 二.Http ...

  5. HDU 1001 Sum Problem(AC代码)

    #include <stdio.h> int main(){ int k,sum; while(scanf("%d",&k)!=EOF){ ==){ sum=( ...

  6. dede取子栏目时重复显示同级栏目的终极解决方法

    使用channelartlist标签时,当栏目没有子栏目是,会出现重复同级栏目的问题,解决方法如下: 先看下面的代码{dede:channelartlist typeid='2'}  {dede:ty ...

  7. IDOC、ALE、EDI三者之间的区别于联系

    EDI (Electronic data interchange) - 是指按照同一规定的一套通用标准格式,将标准的经济信息,通过通信网络传输,在贸易伙伴的电子计算机系统之间进行数据交换和自动处理.由 ...

  8. 安装sklearn时出现 "ImportError: DLL load failed" 的解决方法

    如果sklearn是从 http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn 中下的whl包装的 必须装他家的numpy+MKL库.如果你装的 ...

  9. python3获取当前目录(转)

    转自:http://www.elias.cn/Python/GetPythonPath?from=Develop.GetPythonPath 1.  以前的方法 如果是要获得程序运行的当前目录所在位置 ...

  10. 工作中遇到的问题--Hibernate注解添加在一方和多方的区别

    以Good和GoodStatus为例: 一.注解仅添加在一方: @Entity@Table(name = "GOOD")@Where(clause="enabled=1& ...