这篇文章主要介绍了C# .网微信公众账号接口开发,需要的朋友可以参考下
微信越来越火,微信公众平台成为开发成新宠,本文用C# .网开发微信公众信号接口。
微信接口地址代码:
weixin _ wx=new weixin();
字符串postStr=
如果(请求HttpMethod。ToLower()=='post ')
{
流s=系统web . com。httpcontext。当前。请求。inputstream
字节[] b=新字节[长度];
南Read(b,0,(int)s . Length);
postStr=编码10 . UTF8。GetString(b);
如果(!字符串IsNullOrEmpty(postStr)) //请求处理
{
_wx .handle(postStr);
}
}
其他
{
_wx .auth();
}
微信处理类:
公共课微信
{
私有字符串Token=' weixin _ token//换成自己的代币
公共void Auth()
{
string echoStr=System .网络。httpcontext。当前。请求。查询字符串[' echoStr '];
if (CheckSignature())
{
如果(!字符串IsNullOrEmpty(echoStr))
{
系统web . com。httpcontext。当前。回应。write(echoStr);
系统web . com。httpcontext。当前。回应。end();
}
}
}
公共空句柄(字符串postStr)
{
//封装请求类
XML文档doc=new XML document();
医生加载XML(postStr);
XmlElement rootElement=doc .DocumentElement
XmlNode MsgType=rootElement .SelectSingleNode(' msg type ');
请求XML请求XML=新请求XML();
请求XML .ToUserName=rootElement .SelectSingleNode('ToUserName ').内部文本
请求XML .FromUserName=rootElement .SelectSingleNode('FromUserName ').内部文本
请求XML .CreateTime=rootElement .SelectSingleNode('CreateTime ').内部文本
请求XML .MsgType=MsgType .内部文本
if (requestXML .MsgType=='text ')
{
请求XML .内容=根元素.SelectSingleNode('Content ').内部文本
}
else if (requestXML .MsgType=='location ')
{
请求XML .Location_X=rootElement .SelectSingleNode('Location_X ').内部文本
请求XML .Location_Y=rootElement .SelectSingleNode('Location_Y ').内部文本
请求XML .Scale=rootElement .SelectSingleNode('Scale ').内部文本
请求XML .Label=rootElement .SelectSingleNode('Label ').内部文本
}
else if (requestXML .MsgType=='image ')
{
请求XML .PicUrl=rootElement .SelectSingleNode('PicUrl ').内部文本
}
//回复消息
响应消息(请求XML);
}
///摘要
///验证微信签名
////摘要
///* 将令牌、时间戳、随机数三个参数进行字典序排序
///* 将三个参数字符串拼接成一个字符串进行sha1加密
///* 开发者获得加密后的字符串可与签名对比,标识该请求来源于微信。
///返回/返回
私有布尔校验签名()
{
字符串签名=系统web . com。httpcontext。当前。请求。查询字符串['签名'];
字符串时间戳=系统web . com。httpcontext。当前。请求。查询字符串[' timestamp '];
字符串nonce=系统.网络。httpcontext。当前。请求。查询字符串[' nonce '];
string[] ArrTmp={ Token,timestamp,nonce };
数组. sort(ArrTmp);//字典排序
string tmpStr=string .Join(',ArrTmp);
tmpStr=FormsAuthentication .hashpasswordforstoringconfigfile(tmpStr,“SHA1”);
tmpStr=tmpStr .降低();
if (tmpStr==签名)
{
返回真实的
}
其他
{
返回错误的
}
}
///摘要
///回复消息(微信信息返回)
////摘要
///param name='weixinXML'/param
私有void响应消息(请求XML请求XML)
{
尝试
{
字符串resxml=
mijiya mi=new mijiya(requestXML .内容,请求XML .来自用户名);
if (requestXML .MsgType=='text ')
{
//在这里执行一系列操作,从而实现自动回复内容。
string _reMsg=mi .getrmsg();
如果(mi。msgid类型==1)
{
resxml='xmlToUserName![CDATA[request XML .from username ']/to用户名from username![CDATA[request XML .to username ']/from username create time ' convertdatetimeint(datetime).now)'/createtimemsgid类型![CDATA[新闻]]/msgid类型内容![CDATA[]/内容文章数2/文章'中的内容;
resxml=mi .获取pic(请求XML).发件人用户名(发件人用户名):
resxml='/article sfuncflag 1/func flag/XML ';
}
其他语句
{
resxml='xmlToUserName![CDATA[request XML .from username ']/to用户名from username![CDATA[request XML .to username ']/from username create time ' convertdatetimeint(datetime).now)'/createtimemsgid类型![CDATA[文本]]/msgid类型内容![CDATA[' _ remsg ']/content func flag 1/func flag/XML ';
}
}
else if (requestXML).msgid type==location "
{
string city=getmapiinfo(request XML).Location_X,requestXML .位置_Y:
如果(城市='0')
{
resxml='xmlToUserName![CDATA[request XML .from username ']/to用户名from username![CDATA[request XML .to username ']/from username create time ' convertdatetimeint(datetime).now)'/createtimemsgid类型![CDATA[文本]]/msgid类型内容![CDATA[好啦,我们知道您的位置啦。您可以*我. get default()']/content func flag 1/func flag/XML ';
}
其他语句
{
resxml='xmlToUserName![CDATA[request XML .from username ']/to用户名from username![CDATA[request XML .to username ']/from username create time ' convertdatetimeint(datetime).now)'/createtimemsgid类型![CDATA[文本]]/msgid类型内容![CDATA[好啦,我们知道您的位置啦。您可以*我. get default()']/content func flag 1/func flag/XML ';
}
}
else if (requestXML).msgid type==image "
{
resxml='xmlToUserName![CDATA[request XML .from username ']/to用户名from username![CDATA[request XML .to username ']/from username create time ' convertdatetimeint(datetime).now)'/createtimemsgid类型![CDATA[文本]]/msgid类型内容![CDATA[亲,我没有看懂你的意思。您可以*我. get default()']/content func flag 1/func flag/XML ';
//返回10以内条
//int size=10;
//resxml='xmlToUserName![CDATA[request XML .from username ']/to用户名from username![CDATA[request XML .to username ']/from username create time ' convertdatetimeint(datetime).now)'/createtimemsgid类型![CDATA[新闻]]/msgid类型内容![CDATA[]/contentarticlecount ' size '/文章计数';
//list string list=new liststring();
////假如有20条查询的返回结果
//for(int I=0);i 20(一)
//
//列表.添加(' 1 ');
//}
//string[] piclist=新字串[]{ '/abstract _ pencil _ scribble _ background _ vector _ main。jpg ','/balloon_tree.jpg ','/bloom.jpg ','/colorful _ summer _ flowers。jpg ','/fall_tree.jpg ','/growing_flowers.jpg ','/shoes _ illustration。jpg ' };
//for(int I=0);我的名单。计数;(一)
//
//resxml='itemTitle![CDATA[沈阳-黑龙江]/TitleDescription![CDATA[元旦特价* 6550 300市场价* 6550 400]]/description picurl![CDATA[' ' http://www。后阁楼。com ' piclist[I]]/picurlurl![CDATA[http://www .后阁楼。com]]/URL/item ";
//}
//resxml='/article sfuncflag 1/func flag/XML ';
}
else if (wx_tmsg).GetMsgCount(requestXML).from用户名)==0)
{
resxml='xmlToUserName![CDATA[request XML .from username ']/to用户名from username![CDATA[request XML .to username ']/from username create time ' convertdatetimeint(datetime).now)'/createtimemsgid类型![CDATA[文本]]/msgid类型内容!CDATA[mi .get first()']/content func lag 1/func lag/XML ';
}
其他
{
resxml='xmlToUserName![CDATA[request XML .from username ']]/tousernamefromsusername![CDATA[request XML .to用户名']]/from用户名创建时间' ConvertDateTimeInt(DateTime .Now) '/CreateTimeMsgType![CDATA[text]]/MsgTypeContent![CDATA[亲,我没有看懂你的意思。您可以:'米. get default()']]/content func flag 1/func flag/XML ';
}
//写txt(resxml);
系统web . com。httpcontext。当前。回应。write(resxml);
WriteToDB(requestXML,resxml,mi。PID);
}
接住(例外ex)
{
//WriteTxt('异常:'例如."信息"被删除:"例如堆栈跟踪。ToString());
wx_logs .我的插入('异常:'例如."信息"被删除:"例如堆栈跟踪。ToString());
}
}
///摘要
///unix时间转换为日期时间
////摘要
///param name='timeStamp'/param
///返回/返回
私有DateTime UnixTimeToTime(字符串时间戳)
{
日期时间dtStart=时区CurrentTimeZone。ToLocalTime(新日期时间(1970,1,1));
长时间=长解析(时间戳"0000000");
TimeSpan to now=new TimeSpan(lTime);
返回dtStart .添加(toNow);
}
///摘要
///日期时间转换为统一时间
////摘要
///param name='time'/param
///返回/返回
private int ConvertDateTimeInt(System .日期时间)
{
系统。日期时间开始时间=时区CurrentTimeZone。ToLocalTime(新系统DateTime(1970,1,1));
return (int)(time - startTime).总秒数;
}
///摘要
///调用百度地图,返回坐标信息
////摘要
///param name='y '经度/param
///param name='x '纬度/param
///返回/返回
公共字符串GetMapInfo(字符串x,字符串y)
{
尝试
{
字符串分辨率=字符串。空的;
字符串参数=字符串。空的;
字符串URL='http://maps.googleapis.com/maps/api/geocode/xml';
parame='latlng=' x ',' y ' language=zh-cn sensor=false//此键为个人申请
res=webRequestPost(url,parame);
XML文档doc=new XML document();
医生加载XML(RES);
XmlElement rootElement=doc .DocumentElement
字符串状态=rootElement .SelectSingleNode('status ').内部文本
if (Status=='OK ')
{
//仅获取城市
XML模型列表XML结果=根元素.SelectSingleNode('/GeocodeResponse ').子节点;
for(int I=0;我xmlResults .数数;我)
{
XmlNode子节点=XML results[I];
if (childNode .Name=='status ')
{
继续;
}
字符串city=" 0
for(int w=0;w子节点ChildNodes。Countw)
{
for(int q=0;q子节点子节点[w]。子节点。数数;问)
{
XmlNode childeTwo=childNode .子节点[医]医.子节点[q];
如果(孩子二.Name=='long_name ')
{
city=childeTwo .内部文本
}
else if(孩子二.InnerText=='locality ')
{
返回城市;
}
}
}
返回城市;
}
}
}
接住(例外ex)
{
//WriteTxt('map异常:'例如.消息。ToString()' strike:'例如.堆栈跟踪。ToString());
返回"0";
}
返回"0";
}
///摘要
///发布提交调用抓取
////摘要
///param name='url '提交地址/param
///param name='param '参数/param
///returnsstring/returns
公共字符串webRequestPost(字符串url,字符串参数)
{
字节[] bs=系统正文。编码。utf8。getbytes(param);
http webrequest req=(http webrequest)http webrequest .创建(网址'?'param);
请求. method=" Post
请求。超时=120 * 1000;
请求content type=' application/x-www-form-urlencoded;';
请求。内容长度=bs .长度;
使用(流请求流=请求.GetRequestStream())
{
请求流。写(废话,0,废话.长度);
请求流flush();
}
使用(WebResponse wr=req .GetResponse())
{
//在这里对接收到的页面内容进行处理
Stream strm=wr .GetResponseStream();
StreamReader sr=新的StreamReader(strm,System .文字。编码。utf8);
弦线;
系统正文。StringBuilder sb=新系统正文。StringBuilder();
while ((line=sr.ReadLine())!=空)
{
某人(有人的简写)追加(行系统。环境。换行符);
}
Sr . Close();
strm .close();
归还某人ToString();
}
}
私有void写入到数据库(请求XML请求XML,string _xml,int _pid)
{
wx _ tmsg wx=new wx _ tmsg();
wx .add new();
wx .从用户名=requestXML .从用户名;
wx .ToUserName=requestXML .ToUserName
wx .MsgType=requestXML .MsgType
wx .Msg=requestXML .内容;
wx .Creatime=requestXML .创建时间
wx .location _ X=requestXMLlocation _ X;
wx .location _ Y=requestXMLlocation _ Y;
wx .Label=requestXML .标签;
wx .Scale=requestXML .规模;
wx .PicUrl=requestXML .皮库尔
wx.reply=_ xml
wx.pid=_ pid
尝试
{
wx .update();
}
接住(例外ex)
{
wx_logs .我的插件(例如消息);
//ex。消息;
}
}
}
//微信请求类
公共类RequestXML
{
私有字符串到sername=
///摘要
///消息接收方微信号,一般为公众平台账号微信号
////摘要
公共字符串到用户名
{
获取{返回用户名}
设置{ toUserName=value}
}
用户名=" "中的私有字符串;
///摘要
///消息发送方微信号
////摘要
用户名中的公共字符串
{
获取{ return用户名;}
设置{ fromUserName=value}
}
私有字符串创建时间=" ";
///摘要
///创建时间
////摘要
公共字符串创建时间
{
获取{ return createTime}
设置{ createTime=value}
}
私有字符串msgType=
///摘要
///信息类型地理位置:位置,文本消息:文本,消息类型:图像
////摘要
公共字符串MsgType
{
获取{ return msgType}
设置{ msgType=value}
}
私有字符串内容="";
///摘要
///信息内容
////摘要
公共字符串内容
{
获取{返回内容;}
设置{ content=value}
}
私有字符串location _ X=
///摘要
///地理位置纬度
////摘要
公共字符串位置_X
{
get { return location _ X;}
设置{ location _ X=value}
}
私有字符串location _ Y=
///摘要
///地理位置经度
////摘要
公共字符串位置_Y
{
get { return location _ Y;}
设置{ location _ Y=value}
}
私有字符串小数位数="";
///摘要
///地图缩放大小
////摘要
公共弦音阶
{
获取{返回比例}
设置{ scale=value}
}
私有字符串标签="";
///摘要
///地理位置信息
////摘要
公共字符串标签
{
获取{退货标签}
设置{ label=value}
}
私有字符串pic URL=
///摘要
///图片链接,开发者可以用HTTP GET获取
////摘要
公共字符串图片
{
获取{ return picUrl}
设置{ picUrl=value}
}
}
说明:其中用到的米吉亚类,主要是调用数据库进行关键词匹配自动回复内容,可以根据自己的业务情况编写。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。