asp.net实现微信公众账号接口开发教程
说起微信公众帐号,大家都不会陌生,使用这个平台能给网站或系统增加一个新亮点,直接进入正题吧,在使用之前一定要仔细阅读官方API文档。
使用.net实现的方法:
//微信接口地址页面代码:
weixin_wx=newweixin(); stringpostStr=""; if(Request.HttpMethod.ToLower()=="post") { Streams=System.Web.HttpContext.Current.Request.InputStream; byte[]b=newbyte[s.Length]; s.Read(b,0,(int)s.Length); postStr=Encoding.UTF8.GetString(b); if(!string.IsNullOrEmpty(postStr))//请求处理 { _wx.Handle(postStr); } } else { _wx.Auth(); }
具体处理类
///<summary> ///微信公众平台操作类 ///</summary> publicclassweixin { privatestringToken="my_weixin_token";//换成自己的token publicvoidAuth() { stringechoStr=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(); } } } publicvoidHandle(stringpostStr) { //封装请求类 XmlDocumentdoc=newXmlDocument(); doc.LoadXml(postStr); XmlElementrootElement=doc.DocumentElement; //MsgType XmlNodeMsgType=rootElement.SelectSingleNode("MsgType"); //接收的值--->接收消息类(也称为消息推送) RequestXMLrequestXML=newRequestXML(); requestXML.ToUserName=rootElement.SelectSingleNode("ToUserName").InnerText; requestXML.FromUserName=rootElement.SelectSingleNode("FromUserName").InnerText; requestXML.CreateTime=rootElement.SelectSingleNode("CreateTime").InnerText; requestXML.MsgType=MsgType.InnerText; //根据不同的类型进行不同的处理 switch(requestXML.MsgType) { case"text"://文本消息 requestXML.Content=rootElement.SelectSingleNode("Content").InnerText; break; case"image"://图片 requestXML.PicUrl=rootElement.SelectSingleNode("PicUrl").InnerText; break; case"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; break; case"link"://链接 break; case"event"://事件推送支持V4.5+ break; } //消息回复 ResponseMsg(requestXML); } ///<summary> ///验证微信签名 ///*将token、timestamp、nonce三个参数进行字典序排序 ///*将三个参数字符串拼接成一个字符串进行sha1加密 ///*开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 ///</summary> ///<returns></returns> privateboolCheckSignature() { stringsignature=System.Web.HttpContext.Current.Request.QueryString["signature"]; stringtimestamp=System.Web.HttpContext.Current.Request.QueryString["timestamp"]; stringnonce=System.Web.HttpContext.Current.Request.QueryString["nonce"]; //加密/校验流程: //1.将token、timestamp、nonce三个参数进行字典序排序 string[]ArrTmp={Token,timestamp,nonce}; Array.Sort(ArrTmp);//字典排序 //2.将三个参数字符串拼接成一个字符串进行sha1加密 stringtmpStr=string.Join("",ArrTmp); tmpStr=FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr,"SHA1"); tmpStr=tmpStr.ToLower(); //3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 if(tmpStr==signature) { returntrue; } else { returnfalse; } } ///<summary> ///消息回复(微信信息返回) ///</summary> ///<paramname="requestXML">TherequestXML.</param> privatevoidResponseMsg(RequestXMLrequestXML) { try { stringresxml=""; //主要是调用数据库进行关键词匹配自动回复内容,可以根据自己的业务情况编写。 //1.通常有,没有匹配任何指令时,返回帮助信息 AutoResponsemi=newAutoResponse(requestXML.Content,requestXML.FromUserName); switch(requestXML.MsgType) { case"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>"; } break; case"location": stringcity=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>"; } break; case"image": //图文混合的消息具体格式请见官方API“回复图文消息” break; } System.Web.HttpContext.Current.Response.Write(resxml); WriteToDB(requestXML,resxml,mi.pid); } catch(Exceptionex) { //WriteTxt("异常:"+ex.Message+"Struck:"+ex.StackTrace.ToString()); //wx_logs.MyInsert("异常:"+ex.Message+"Struck:"+ex.StackTrace.ToString()); } } ///<summary> ///unix时间转换为datetime ///</summary> ///<paramname="timeStamp"></param> ///<returns></returns> privateDateTimeUnixTimeToTime(stringtimeStamp) { DateTimedtStart=TimeZone.CurrentTimeZone.ToLocalTime(newDateTime(1970,1,1)); longlTime=long.Parse(timeStamp+"0000000"); TimeSpantoNow=newTimeSpan(lTime); returndtStart.Add(toNow); } ///<summary> ///datetime转换为unixtime ///</summary> ///<paramname="time"></param> ///<returns></returns> privateintConvertDateTimeInt(System.DateTimetime) { System.DateTimestartTime=TimeZone.CurrentTimeZone.ToLocalTime(newSystem.DateTime(1970,1,1)); return(int)(time-startTime).TotalSeconds; } ///<summary> ///调用百度地图,返回坐标信息 ///</summary> ///<paramname="y">经度</param> ///<paramname="x">纬度</param> ///<returns></returns> publicstringGetMapInfo(stringx,stringy) { try { stringres=string.Empty; stringparame=string.Empty; stringurl="http://maps.googleapis.com/maps/api/geocode/xml"; parame="latlng="+x+","+y+"&language=zh-CN&sensor=false";//此key为个人申请 res=webRequestPost(url,parame); XmlDocumentdoc=newXmlDocument(); doc.LoadXml(res); XmlElementrootElement=doc.DocumentElement; stringStatus=rootElement.SelectSingleNode("status").InnerText; if(Status=="OK") { //仅获取城市 XmlNodeListxmlResults=rootElement.SelectSingleNode("/GeocodeResponse").ChildNodes; for(inti=0;i<xmlResults.Count;i++) { XmlNodechildNode=xmlResults[i]; if(childNode.Name=="status"){ continue; } stringcity="0"; for(intw=0;w<childNode.ChildNodes.Count;w++) { for(intq=0;q<childNode.ChildNodes[w].ChildNodes.Count;q++) { XmlNodechildeTwo=childNode.ChildNodes[w].ChildNodes[q]; if(childeTwo.Name=="long_name") { city=childeTwo.InnerText; } elseif(childeTwo.InnerText=="locality") { returncity; } } } returncity; } } } catch(Exceptionex) { //WriteTxt("map异常:"+ex.Message.ToString()+"Struck:"+ex.StackTrace.ToString()); return"0"; } return"0"; } ///<summary> ///Post提交调用抓取 ///</summary> ///<paramname="url">提交地址</param> ///<paramname="param">参数</param> ///<returns>string</returns> publicstringwebRequestPost(stringurl,stringparam) { byte[]bs=System.Text.Encoding.UTF8.GetBytes(param); HttpWebRequestreq=(HttpWebRequest)HttpWebRequest.Create(url+"?"+param); req.Method="Post"; req.Timeout=120*1000; req.ContentType="application/x-www-form-urlencoded;"; req.ContentLength=bs.Length; using(StreamreqStream=req.GetRequestStream()) { reqStream.Write(bs,0,bs.Length); reqStream.Flush(); } using(WebResponsewr=req.GetResponse()) { //在这里对接收到的页面内容进行处理 Streamstrm=wr.GetResponseStream(); StreamReadersr=newStreamReader(strm,System.Text.Encoding.UTF8); stringline; System.Text.StringBuildersb=newSystem.Text.StringBuilder(); while((line=sr.ReadLine())!=null) { sb.Append(line+System.Environment.NewLine); } sr.Close(); strm.Close(); returnsb.ToString(); } } ///<summary> ///将本次交互信息保存至数据库中 ///</summary> ///<paramname="requestXML"></param> ///<paramname="_xml"></param> ///<paramname="_pid"></param> privatevoidWriteToDB(RequestXMLrequestXML,string_xml,int_pid) { WeiXinMsgwx=newWeiXinMsg(); 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.Add(); } catch(Exceptionex) { //wx_logs.MyInsert(ex.Message); //ex.message; } } }
响应类MODEL
#region微信请求类RequestXML ///<summary> ///微信请求类 ///</summary> publicclassRequestXML { privatestringtoUserName=""; ///<summary> ///消息接收方微信号,一般为公众平台账号微信号 ///</summary> publicstringToUserName { get{returntoUserName;} set{toUserName=value;} } privatestringfromUserName=""; ///<summary> ///消息发送方微信号 ///</summary> publicstringFromUserName { get{returnfromUserName;} set{fromUserName=value;} } privatestringcreateTime=""; ///<summary> ///创建时间 ///</summary> publicstringCreateTime { get{returncreateTime;} set{createTime=value;} } privatestringmsgType=""; ///<summary> ///信息类型地理位置:location,文本消息:text,消息类型:image ///</summary> publicstringMsgType { get{returnmsgType;} set{msgType=value;} } privatestringcontent=""; ///<summary> ///信息内容 ///</summary> publicstringContent { get{returncontent;} set{content=value;} } privatestringlocation_X=""; ///<summary> ///地理位置纬度 ///</summary> publicstringLocation_X { get{returnlocation_X;} set{location_X=value;} } privatestringlocation_Y=""; ///<summary> ///地理位置经度 ///</summary> publicstringLocation_Y { get{returnlocation_Y;} set{location_Y=value;} } privatestringscale=""; ///<summary> ///地图缩放大小 ///</summary> publicstringScale { get{returnscale;} set{scale=value;} } privatestringlabel=""; ///<summary> ///地理位置信息 ///</summary> publicstringLabel { get{returnlabel;} set{label=value;} } privatestringpicUrl=""; ///<summary> ///图片链接,开发者可以用HTTPGET获取 ///</summary> publicstringPicUrl { get{returnpicUrl;} set{picUrl=value;} } } #endregion
本文已被整理到了《ASP.NET微信开发教程汇总》,欢迎大家学习阅读。
通过阅读这篇文章,大家就大概知道.net如何实现微信公众账号接口开发的,希望这篇文章对大家的学习有所帮助。