说起微信公众帐号,大家都不会陌生,使用这个平台能给网站或系统增加一个新亮点,直接进入正题吧,在使用之前一定要仔细阅读官方API文档。

API文档地址:http://mp.weixin.qq.com/wiki/index.php
 
使用.net实现的方法:

 //微信接口地址代码:

  weixin _wx = new weixin();

                string postStr = "";

                if (Request.HttpMethod.ToLower() == "post")

                {

                    Stream s = System.Web.HttpContext.Current.Request.InputStream;

                    byte[] b = new byte[s.Length];

                    s.Read(b, , (int)s.Length);

                    postStr = Encoding.UTF8.GetString(b);

                    if (!string.IsNullOrEmpty(postStr)) //请求处理

                    {

                        _wx.Handle(postStr); 

                    }

                }

                else

                {

                    _wx.Auth();

                }

//微信处理类:

public class weixin

    {

        private string Token = "weixin_token"; //换成自己的token

        public void Auth()

        {

            string echoStr = System.Web.HttpContext.Current.Request.QueryString["echoStr"];

            if (CheckSignature())

            {

                if (!string.IsNullOrEmpty(echoStr))

                {

                    System.Web.HttpContext.Current.Response.Write(echoStr);

                    System.Web.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.Label = rootElement.SelectSingleNode("Label").InnerText;

            }

            else if (requestXML.MsgType == "image")

            {

                requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;

            }

            //回复消息

            ResponseMsg(requestXML);

        }

        /// <summary>

        /// 验证微信签名

        /// </summary>

        /// * 将token、timestamp、nonce三个参数进行字典序排序

        /// * 将三个参数字符串拼接成一个字符串进行sha1加密

        /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。

        /// <returns></returns>

        private bool CheckSignature()

        {

            string signature = System.Web.HttpContext.Current.Request.QueryString["signature"];

            string timestamp = System.Web.HttpContext.Current.Request.QueryString["timestamp"];

            string nonce = System.Web.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)

        {

            try

            {

                string resxml = "";

                mijiya mi = new mijiya(requestXML.Content,requestXML.FromUserName);

                if (requestXML.MsgType == "text")

                {

                    //在这里执行一系列操作,从而实现自动回复内容. 

                    string _reMsg = mi.GetReMsg();

                    if (mi.msgType == )

                    {

                        resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>2</ArticleCount><Articles>";

                        resxml += mi.GetRePic(requestXML.FromUserName);

                        resxml += "</Articles><FuncFlag>1</FuncFlag></xml>";

                    }

                    else

                    {

                        resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + _reMsg + "]]></Content><FuncFlag>1</FuncFlag></xml>";

                    }

                }

                else if (requestXML.MsgType == "location")

                {

                    string city = GetMapInfo(requestXML.Location_X, requestXML.Location_Y);

                    if (city == "")

                    {

                        resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[好啦,我们知道您的位置啦。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";

                    }

                    else

                    {

                        resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[好啦,我们知道您的位置啦。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";

                    }

                }

                else if (requestXML.MsgType == "image")

                {

                    resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,我没有看懂你的意思。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";

                    //返回10以内条

                    //int size = 10;

                    //resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>" + size + "</ArticleCount><Articles>";

                    //List<string> list = new List<string>();

                    ////假如有20条查询的返回结果

                    //for (int i = 0; i < 20; i++)

                    //{

                    //    list.Add("1");

                    //}

                    //string[] piclist = new string[] { "/Abstract_Pencil_Scribble_Background_Vector_main.jpg", "/balloon_tree.jpg", "/bloom.jpg", "/colorful_flowers.jpg", "/colorful_summer_flower.jpg", "/fall.jpg", "/fall_tree.jpg", "/growing_flowers.jpg", "/shoes_illustration.jpg", "/splashed_tree.jpg" };

                    //for (int i = 0; i < size && i < list.Count; i++)

                    //{

                    //    resxml += "<item><Title><![CDATA[沈阳-黑龙江]]></Title><Description><![CDATA[元旦特价:¥300 市场价:¥400]]></Description><PicUrl><![CDATA[" + "http://www.hougelou.com" + piclist[i] + "]]></PicUrl><Url><![CDATA[http://www.hougelou.com]]></Url></item>";

                    //}

                    //resxml += "</Articles><FuncFlag>1</FuncFlag></xml>";

                }

                else if (wx_tmsg.GetMsgCount(requestXML.FromUserName) == )

                {

                    resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + mi.GetFirst() + "]]></Content><FuncFlag>1</FuncFlag></xml>";

                }

                else

                {

                    resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,我没有看懂你的意思。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";

                }

                //WriteTxt(resxml);

                System.Web.HttpContext.Current.Response.Write(resxml);

                WriteToDB(requestXML, resxml,mi.pid);

            }

            catch (Exception ex)

            {

                //WriteTxt("异常:" + ex.Message + "Struck:" + ex.StackTrace.ToString());

                wx_logs.MyInsert("异常:" + ex.Message + "Struck:" + ex.StackTrace.ToString());

            }

        }

        /// <summary>

        /// unix时间转换为datetime

        /// </summary>

        /// <param name="timeStamp"></param>

        /// <returns></returns>

        private DateTime UnixTimeToTime(string timeStamp)

        {

            DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(, , ));

            long lTime = long.Parse(timeStamp + "");

            TimeSpan toNow = new TimeSpan(lTime);

            return dtStart.Add(toNow);

        }

        /// <summary>

        /// datetime转换为unixtime

        /// </summary>

        /// <param name="time"></param>

        /// <returns></returns>

        private int ConvertDateTimeInt(System.DateTime time)

        {

            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , ));

            return (int)(time - startTime).TotalSeconds;

        }

        /// <summary>

        /// 调用百度地图,返回坐标信息

        /// </summary>

        /// <param name="y">经度</param>

        /// <param name="x">纬度</param>

        /// <returns></returns>

        public string GetMapInfo(string x, string y)

        {

            try

            {

                string res = string.Empty;

                string parame = string.Empty;

                string url = "http://maps.googleapis.com/maps/api/geocode/xml";

                parame = "latlng=" + x + "," + y + "&language=zh-CN&sensor=false";//此key为个人申请

                res = webRequestPost(url, parame);

                XmlDocument doc = new XmlDocument();

                doc.LoadXml(res);

                XmlElement rootElement = doc.DocumentElement;

                string Status = rootElement.SelectSingleNode("status").InnerText;

                if (Status == "OK")

                {

                    //仅获取城市

                    XmlNodeList xmlResults = rootElement.SelectSingleNode("/GeocodeResponse").ChildNodes;

                    for (int i = ; i < xmlResults.Count; i++)

                    {

                        XmlNode childNode = xmlResults[i];

                        if (childNode.Name == "status")

                        {

                            continue;

                        }

                        string city = "";

                        for (int w = ; w < childNode.ChildNodes.Count; w++)

                        {

                            for (int q = ; q < childNode.ChildNodes[w].ChildNodes.Count; q++)

                            {

                                XmlNode childeTwo = childNode.ChildNodes[w].ChildNodes[q];

                                if (childeTwo.Name == "long_name")

                                {

                                    city = childeTwo.InnerText;

                                }

                                else if (childeTwo.InnerText == "locality")

                                {

                                    return city;

                                }

                            }

                        }

                        return city;

                    }

                }

            }

            catch (Exception ex)

            {

                //WriteTxt("map异常:" + ex.Message.ToString() + "Struck:" + ex.StackTrace.ToString());

                return "";

            }

            return "";

        }

        /// <summary>

        /// Post 提交调用抓取

        /// </summary>

        /// <param name="url">提交地址</param>

        /// <param name="param">参数</param>

        /// <returns>string</returns>

        public string webRequestPost(string url, string param)

        {

            byte[] bs = System.Text.Encoding.UTF8.GetBytes(param);

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + "?" + param);

            req.Method = "Post";

            req.Timeout =  * ;

            req.ContentType = "application/x-www-form-urlencoded;";

            req.ContentLength = bs.Length;

            using (Stream reqStream = req.GetRequestStream())

            {

                reqStream.Write(bs, , bs.Length);

                reqStream.Flush();

            }

            using (WebResponse wr = req.GetResponse())

            {

                //在这里对接收到的页面内容进行处理 

                Stream strm = wr.GetResponseStream();

                StreamReader sr = new StreamReader(strm, System.Text.Encoding.UTF8);

                string line;

                System.Text.StringBuilder sb = new System.Text.StringBuilder();

                while ((line = sr.ReadLine()) != null)

                {

                    sb.Append(line + System.Environment.NewLine);

                }

                sr.Close();

                strm.Close();

                return sb.ToString();

            }

        }

        private void WriteToDB(RequestXML requestXML,string _xml,int _pid)

        {

            wx_tmsg wx = new wx_tmsg();

            wx.AddNew();

            wx.FromUserName = requestXML.FromUserName;

            wx.ToUserName = requestXML.ToUserName;

            wx.MsgType = requestXML.MsgType;

            wx.Msg = requestXML.Content;

            wx.Creatime = requestXML.CreateTime;

            wx.Location_X = requestXML.Location_X;

            wx.Location_Y = requestXML.Location_Y;

            wx.Label = requestXML.Label;

            wx.Scale = requestXML.Scale;

            wx.PicUrl = requestXML.PicUrl;

            wx.reply = _xml;

            wx.pid = _pid;

            try

            {

                wx.Update();

            }

            catch (Exception ex)

            {

                wx_logs.MyInsert(ex.Message);

                //ex.message;

            }

        }

    }

    //微信请求类

    public class RequestXML

    {

        private string toUserName="";

        /// <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 = "";

        /// <summary>

        /// 创建时间

        /// </summary>

        public string CreateTime

        {

            get { return createTime; }

            set { createTime = value; }

        }

        private string msgType = "";

        /// <summary>

        /// 信息类型 地理位置:location,文本消息:text,消息类型:image

        /// </summary>

        public string MsgType

        {

            get { return msgType; }

            set { msgType = value; }

        }

        private string content = "";

        /// <summary>

        /// 信息内容

        /// </summary>

        public string Content

        {

            get { return content; }

            set { content = value; }

        }

        private string location_X = "";

        /// <summary>

        /// 地理位置纬度

        /// </summary>

        public string Location_X

        {

            get { return location_X; }

            set { location_X = value; }

        }

        private string location_Y = "";

        /// <summary>

        /// 地理位置经度

        /// </summary>

        public string Location_Y

        {

            get { return location_Y; }

            set { location_Y = value; }

        }

        private string scale = "";

        /// <summary>

        /// 地图缩放大小

        /// </summary>

        public string Scale

        {

            get { return scale; }

            set { scale = value; }

        }

        private string label = "";

        /// <summary>

        /// 地理位置信息

        /// </summary>

        public string Label

        {

            get { return label; }

            set { label = value; }

        }

        private string picUrl = "";

        /// <summary>

        /// 图片链接,开发者可以用HTTP GET获取

        /// </summary>

        public string PicUrl

        {

            get { return picUrl; }

            set { picUrl = value; }

        }

}

.net实现微信公众账号接口开发的更多相关文章

  1. C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询

    前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...

  2. C#.net 微信公众账号接口开发

    微信越来越火,微信公众平台成为开发成新宠,本文用C#.net开发微信公众信号接口. 微信接口地址代码: weixin _wx = new weixin(); string postStr = &quo ...

  3. C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

    一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...

  4. C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  5. C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)

    文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们 ...

  6. C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  7. C#微信公众号接口开发实例-高级接口-申请带参数的二维码

    最近公司涉及到微信绑定用户,做了高级接口-申请带参数的二维码,总结了下微信开发接口.微信接口开发都是除了消息用的xml 回复基本上都是用json的形式传递信息(post/get),开发的方法基本都是一 ...

  8. C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台

    微信公众平台接入:其实很简单,把两个参数(地址和token)填入微信公众平台后台,暂时选择明文模式 ,其中token自己定义.微信服务器会根据后台填写的地址访问,并且带上对于的参数 如 url+&am ...

  9. 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

随机推荐

  1. Beta版本——第一次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  2. web前端环境搭建

    第一部分:浏览器 浏览器推荐chrome浏览器.FireFox浏览器. 1. chrome浏览器因为集成了Google Developer Tools(谷歌开发者工具),因此大受欢迎. 下载地址:ht ...

  3. 什么是xmlschema

    XML Schema定义(XML Schema Definition,XSD)是一套W3C标准,用于基于XML的称为XML Schema的类型系统.用于定义的语言是一种称为XML模式定义语言(XML ...

  4. 《Struts2.x权威指南》学习笔记1

    第2章 Struts的hello world 在介绍hello world项目前,文中要求下载和安装Struts2,主要是下载lib库和文档,可用于通过命令行进行代码编译.由于公司采用IntelliJ ...

  5. JS数组类型检测

    在强类型语言,数组类型检测是非常容易的事情(typeof就可以解决),而在弱语言JS数据类型就很容易混淆了. JS中常见的数据类型有:number.string.boolean.undefined.f ...

  6. QQ客服出现“企业QQ在线咨询无权限在当前场景使用!” 问题

    加入了QQ“多客服”功能 会出现这个问题 解决办法: 在平台http://wp.qq.com/ 上设置,只需两步骤 步骤一:在http://wp.qq.com/set.html 里,安全级别选项,选择 ...

  7. MySQL取每组的前N条记录

    一.对分组的记录取前N条记录:例子:取前 2条最大(小)的记录 .用子查询: SELECT * FROM right2 a WHERE > (SELECT COUNT(*) FROM right ...

  8. .net mvc web api 返回 json 内容,过滤值为null的属性

    原文:http://blog.csdn.net/xxj_jing/article/details/49508557 版权声明:本文为博主原创文章,未经博主允许不得转载. .net mvc web ap ...

  9. typecho除了首页其他大部分网页404怎么办?

    server { listen ; server_name blog.localhost; #绑定域名 index index.htm index.html index.php; #默认文件 root ...

  10. 在linux下运行apt-get update 时,报错/var/lib/apt/lists/lock

    在运行apt-get update 时,报下面的错误: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: Resource temporarily unavai ...