.net实现微信公众账号接口开发

说起微信公众帐号,大家都不会陌生,使用这个平台能给网站或系统增加一个新亮点,直接进入正题吧,在使用之前一定要仔细阅读官方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, 0, (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 == 1)

                    {

                        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 == "0")

                    {

                        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) == 0)

                {

                    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(1970, 1, 1));

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

            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(1970, 1, 1));

            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 = 0; i < xmlResults.Count; i++)

                    {

                        XmlNode childNode = xmlResults[i];

                        if (childNode.Name == "status")

                        {

                            continue;

                        }

                        string city = "0";

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

                        {

                            for (int q = 0; 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 "0";

            }

            return "0";

        }

        /// <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 = 120 * 1000;

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

            req.ContentLength = bs.Length;

            using (Stream reqStream = req.GetRequestStream())

            {

                reqStream.Write(bs, 0, 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实现微信公众账号接口开发,布布扣,bubuko.com

时间: 2024-08-05 17:59:36

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

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

前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并且C#.NET微信接口开发又比php开源的项目少很多,腾讯官方还经常给其他的语言的jdk唯独缺少.NET的,所以整理自己开发的一些代码.心得并且附带完整源码:https://github.com/xiejun-net/weixin,希望可以减少大家开发的时间,同时如有问题希望可以指出交流.后续还会更

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

文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们的绑定的地址上,通过解析XML数据,获取到微信用户发送的消息,让根据微信消息(文本:关键字,图片,语音等等)回复XML格式的数据给微信服务器,微信服务器再将接收到的消息返回给用户微信. 我们所需要做的:接收消息和返回消息 一.创建实体类 首先看文档http://mp.weixin.qq.com/wi

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

C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码) 一.拼凑回复的XML字符串 微信被动回复的形式有一下六种: 1 回复文本消息 2 回复图片消息 3 回复语音消息 4 回复视频消息 5 回复音乐消息 6 回复图文消息 分别对应不同的XML形式,这里以文本消息和图文为例,读者举一反三其他的类似,不再赘述:

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

一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号密码.作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里分享一些我开发的用户绑定和验证码的一些心得.所需要的接口有基础的回复.网页授权.带参数二维码.

微信公众平台接口开发(全面认识接口)

微信公众平台接口的整体介绍 接口API的定义 不同功能层之间的通个信规则称为接口API 微信接口请求返回格式介绍: 微信接口是通过GET方法请求的,如: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

C#微信公众号接口开发之从零开发(一) 接入微信公众平台

微信公众平台接入:其实很简单,把两个参数(地址和token)填入微信公众平台后台,暂时选择明文模式 ,其中token自己定义.微信服务器会根据后台填写的地址访问,并且带上对于的参数 如 url+&signature=0dab3e6f983b6bdccfdbe3ceca01526f1522748a&timestamp=1436257899&nonce=1868246535&echostr=echostr 根据参数用微信文档中指定的方法加密检验是否来自微信然后返回随机数echo

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

最近公司涉及到微信绑定用户,做了高级接口-申请带参数的二维码,总结了下微信开发接口.微信接口开发都是除了消息用的xml 回复基本上都是用json的形式传递信息(post/get),开发的方法基本都是一样的,以下以高级接口获取带参数的二维码为例,怎么做微信接口开发. 第一步:获取access_token,access_token是获取其他接口信息的钥匙,所有接口都需要调用access_token /// <summary> /// 拉取AccessToken,微信每天公共2000次AccessT

微信公众账号开发接口实现 - java servlet

原文:微信公众账号开发接口实现 - java servlet 源代码下载地址:http://www.zuidaima.com/share/1550463697898496.htm 微信公众平台开发接口验证token.收取.回复消息实现 其实只需要两个类:DeiponseMessage.java.Wechat.java 项目截图 缺少的jar包下载列表: http://mirrors.ibiblio.org/pub/mirrors/maven2/commons-beanutils/commons-

微信公众账号开发教程

微信公众账号开发教程 一.第1篇-引言 本文转载来自柳峰老师的博客,在这里非常感谢柳峰老师的分享和贡献! 内容方面,大概会涉及到: 1)前沿知识:微信公众帐号的分类.两种模式各自的特点和区别.开发模式的配置使用等: 2)API中各类消息的使用(我已经对api进行封装并打成了jar包,到时候会考虑分享出来): 3)微信公众帐号开发中的小技巧(如换行.通过代码发送表情.屏幕飘雪花.表情的接收识别.在Android和iOS上表现不一致等等): 4)与业务系统对接的方法(链接.短信等,除了技术讲解还会做