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如何实现微信公众账号接口开发的,希望这篇文章对大家的学习有所帮助。