




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】微信开发消息应答方法的示例
这篇文章将为大家详细讲解有关微信开发消息应答方法的示例,在下觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。请注意:1、关于重试的消息排重,推荐使用msgid排重。
2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
3、为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“消息加解密说明”。各消息类型的推送XML数据包结构如下:<xml>文本消息
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this
is
a
test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>图片消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[this
is
a
url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
<MsgId>1234567890123456</MsgId>
</xml>语音消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段(注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recognition><![CDATA[腾讯微信团队]]></Recognition>
<MsgId>1234567890123456</MsgId>
</xml>多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。视频消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>小视频消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[shortvideo]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>地理位置消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml>链接消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[公众平台官网链接]]></Title>
<Description><![CDATA[公众平台官网链接]]></Description>
<Url><![CDATA[url]]></Url>
<MsgId>1234567890123456</MsgId>
</xml>消息id,64位整型接上篇,看ResponseXML(postString);方法如下///<summary>
///获取用户发送的消息
///</summary>
///<paramname="postString"></param>
privatevoidResponseXML(stringpostString)
{
//使用XMLDocument加载信息结构
XmlDocumentxmlDoc=newXmlDocument();
xmlDoc.LoadXml(postString);
XmlElementrootElement=xmlDoc.DocumentElement;//获取文档的根
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;//消息类型
///对消息的不同类型进行赋值
if(requestXML.MsgType=="text")
{
//赋值文本信息内容
requestXML.Content=rootElement.SelectSingleNode("Content").InnerText;
}
if(requestXML.MsgType.Trim()=="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;
}
if(requestXML.MsgType.Trim().ToLower()=="event")
{
///赋值事件名称和事件key值
requestXML.EventName=rootElement.SelectSingleNode("Event").InnerText;
requestXML.EventKey=rootElement.SelectSingleNode("EventKey").InnerText;
}if(requestXML.MsgType.Trim().ToLower()=="voice")
{
///赋值语音识别结果,赋值之前一定要记得在开发者模式下,把语音识别功能开启,否则获取不到
requestXML.Recognition=rootElement.SelectSingleNode("Recognition").InnerText;
}
ResponseMsg(requestXML);}语音识别功能开启如下:requestXML是我单独创建的一个类,该类声明了消息中常用的属性字段,如下:///<summary>
///接收消息的实体类
///</summary>
publicclassRequestXML
{
privateStringtoUserName=String.Empty;
///<summary>
///本公众号
///</summary>
publicStringToUserName{get;set;}
///<summary>
///用户微信号
///</summary>
publicStringFromUserName{get;set;}
///<summary>
///创建时间
///</summary>
publicStringCreateTime{get;set;}
///<summary>
///信息类型
///</summary>
publicStringMsgType{get;set;}
///<summary>
///信息内容
///</summary>
publicStringContent{get;set;}
/*以下为事件类型的消息特有的属性*/
///<summary>
///事件名称
///</summary>
publicStringEventName{get;set;}
///<summary>
///事件值
///</summary>
publicstringEventKey{get;set;}
/*以下为图文类型的消息特有的属性*/
///<summary>
///图文消息的个数
///</summary>
publicintArticleCount{get;set;}
///<summary>
///图文消息的标题
///</summary>
publicstringTitle{get;set;}
///<summary>
///图文消息的简介
///</summary>
publicstringDescription{get;set;}
///<summary>
///图文消息图片的链接地址
///</summary>
publicstringPicUrl{get;set;}
///<summary>
///图文消息详情链接地址
///</summary>
publicstringUrl{get;set;}
///<summary>
///图文消息集合
///</summary>
publicList<RequestXML>Articles{get;set;}
/*以下为地理位置类型的消息特有的属性*/
///<summary>
///地理位置纬度
///</summary>
publicStringLocation_X{get;set;}
///<summary>
///地理位置经度
///</summary>
publicStringLocation_Y{get;set;}
///<summary>
///地图缩放比例
///</summary>
publicStringScale{get;set;}
///<summary>
///地图位置说明
///</summary>
publicStringLabel{get;set;}///<summary>
///语音消息特有字段
///</summary>
publicStringRecognition{get;set;}
}继续关注
ResponseMsg(requestXML);方法如下,privatevoidResponseMsg(RequestXMLrequestXML)
{
stringMsgType=requestXML.MsgType;
try
{
//根据消息类型判断发送何种类型消息
switch(MsgType)
{
case"text":
SendTextCase(requestXML);//发送文本消息
break;
case"event"://发送事件消息
if(!string.IsNullOrWhiteSpace(requestXML.EventName)&&requestXML.EventName.ToString().Trim().Equals("subscribe"))
{
SendWelComeMsg(requestXML);//关注时返回的图文消息
}
elseif(!string.IsNullOrWhiteSpace(requestXML.EventName)&&requestXML.EventName.ToString().Trim().Equals("CLICK"))
{
SendEventMsg(requestXML);//发送事件消息
}
break;case"voice":
SendVoiceMsg(requestXML);//发送语音消息
break;
case"location"://发送位置消息
SendMapMsg(requestXML);
break;
default:
break;
}
}
catch(Exceptionex)
{
HttpContext.Current.Response.Write(ex.ToString());
}
}先来关注发送文本消息,SendTextCase(requestXML);//发送文本消息///<summary>
///发送文本
///</summary>
///<paramname="requestXML"></param>
privatevoidSendTextCase(RequestXMLrequestXML)
{
stringresponseContent=FormatTextXML(requestXML.FromUserName,requestXML.ToUserName,requestXML.Content);
HttpContext.Current.Response.ContentType="text/xml";
HttpContext.Current.Response.ContentEncoding=Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
}FormatTextXML方法制定格式///<summary>
///返回格式化的Xml格式内容
///</summary>
///<paramname="p1">公众号</param>
///<paramname="p2">用户号</param>
///<paramname="p3">回复内容</param>
///<returns></returns>
privatestringFormatTextXML(stringp1,stringp2,stringp3)
{
return"<xml><ToUserName><![CDATA["+p1+"]]></ToUserName><FromUserName><![CDATA["+p2+"]]></FromUserName><CreateTime>"+DateTime.Now.Subtract(newDateTime(1970,1,1,8,0,0)).TotalSeconds.ToString()+"</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA["+p3+"]]></Content><FuncFlag>1</FuncFlag></xml>";
}这样就能实现消息的应答,如果用户点击的按钮,如下代码:case"event"://发送事件消息
if
(!string.IsNullOrWhiteSpace(requestXML.EventName)&&
requestXML.EventName.ToString().Trim().Equals("subscribe"))
{
SendWelComeMsg(requestXML);//关注时返回的图文消息
}
elseif(!string.IsNullOrWhiteSpace(requestXML.EventName)&&
requestXML.EventName.ToString().Trim().Equals("CLICK"))
{
SendEventMsg(requestXML);//发送事件消息
}
break;///<summary>
///发送响应事件消息
///</summary>
///<paramname="requestXML"></param>
privatevoidSendEventMsg(RequestXMLrequestXML)
{
stringkeyStr=requestXML.EventKey.ToString();
switch(keyStr)
{
case"mypay":
SendPayDetails(requestXML);//发送薪资账单
break;
case"tianqiyubao":
SendWeaterMessage(requestXML);//发送天气预报
break;
case"kaixinyixiao":
SendKaiXinMessage(requestXML);//发送开心一笑结果集
break;
case
"updateMessage":
SendUpdateMessage(requestXML);//发送修改信息链接
break;
case"yuangonghuodong":
SendYuanGongHuoDong(requestXML);//发送学生活动
break;
case"yuangongtongzhi":
SendYuanGongTongZhi(requestXML);//发送员工通知
break;
case"youwenbida":
SendWenti(requestXML);//发送员工提交问题链接
break;
case"mywen":
SendWentiList(requestXML);//发送问题列表链接
break;
case"PhoneSerices":
SendKeFuMessage(requestXML);//接入客服
break;
default:
StringresponseContent=String.Empty;
responseContent=FormatTextXML(requestXML.FromUserName,requestXML.ToUserName,"此功能暂未开放!敬请期待!");
HttpContext.Current.Response.ContentType="text/xml";
HttpContext.Current.Response.ContentEncoding=Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
break;
}
}SendWelComeMsg(requestXML);//关注时返回的图文消息///<summary>
///发送关注时的图文消息
///</summary>
///<paramname="requestXML"></param>
privatevoidSendWelComeMsg(RequestXMLrequestXML)
{
StringresponseContent=String.Empty;
stringnewdate=DateTime.Now.Subtract(newDateTime(1970,1,1,8,0,0)).TotalSeconds.ToString();
stringPUrlfileName="/weixin/welcome.jpg";
responseContent=string.Format(Message_News_Main,requestXML.FromUserName,requestXML.ToUserName,newdate,"1",
string.Format(Message_News_Item,"欢迎关注德桥员工服务中心","苏州德桥人力资源创立于2002年...",PUrlfileName,"/weixin/WxGsjianjie.aspx"));
HttpContext.Current.Response.ContentType="text/xml";
HttpContext.Current.Response.ContentEncoding=Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
}Message_News_Main和Message_News_Item是图文消息格式化///<summary>
///返回图文消息主体
///</summary>
publicstaticstringMessage_News_Main
{
get
{
return@"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[news]]></MsgTy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年合同管理工程师《合同法务》模拟题
- 复印机租赁协议
- 高龄用工免责协议书
- 拆迁征收补偿协议书
- 2025年03月山东华宇工学院博士人才公开招聘(50人)笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025年03月大兴安岭地区“地委书记进校园”引才149人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025年03月南通市海门区事业单位工作人员52人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 天津市武清区高中学2024-2025学年高三下学期3月模拟测试生物试题含解析
- 颜料红系列项目安全风险评价报告
- 长治医学院《形势与政策(5)》2023-2024学年第一学期期末试卷
- (二模)咸阳市2025年高考模拟检测(二)语文试卷(含答案)
- 2025高校教资《高等教育法规》核心备考题库(含典型题、重点题)
- 行政事业单位财务知识培训
- 2025-2030中国探地雷达行业发展分析及发展趋势预测与投资价值研究报告
- 智慧共享中药房建设与运行规范
- 东湖高新区2023-2024学年下学期期中七年级数学试题(含答案)
- 2025年中国信达资产管理股份有限公司招聘笔试参考题库含答案解析
- 《中医骨伤科学》课件- 外治法
- 统编版小学语文六年级下册第二单元快乐读书吧:《昆虫记》读中推进课课件(共19张)
- 医学会议准备流程
- 2025年上海新徐汇集团有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论