申请公众号后,对公众号里的开发工具进行了设置。设置了服务器配置以后,接收到的用户消息就不会通过自动回复来发送了,只能通过你所设置的
服务器地址来进行交互。
需要注意的是,没有通过认证的个人订阅号无法实现自定义菜单功能,只能和用户通过命令方式进行交互。
那么,如何来接收用户通过微信平台发来的消息呢?
实际上,设置了服务器配置URL后,微信平台的消息发送过程是这样的:
(图)
微信平台收到用户发来的消息之后,对这个消息进行固定格式的xml封包,然后post到开发者填写的URL上。
这个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>
其中,ToUserName是开发者微信号;FromUserName是发送者的账号(不是微信号,是一个OpenID,微信平台根据这个能找到是谁发送的);
CreateTIme就是发送的时间,MsgType是text,表示为文本型的消息;Content就是所发送的消息内容;而MsgId是微信用来记录的发送的消息id。
我们的asp文件就可以通过读取以上xml数据包,得到是谁(FromUserName)给我们发送了什么类型(MsgType)的消息(Content)。
asp读取xml数据包的代码如下:
set xml_dom=server.CreateObject("MSXML2.DOMDocument")'创建一个MSXML2.DOMDocument对象
xml_dom.load request '载入post过来的数据包,也可以是xml格式的文件
ToUserName=xml_dom.getElementsByTagName("ToUserName").item(0).text '用getElementByTagName方法得到标签ToUserName的值,下同
FromUserName=xml_dom.getElementsByTagName("FromUserName").item(0).text
content=xml_dom.getElementsByTagName("Content").item(0).text
select case content
case "绑定账号"
'处理绑定账号相关代码
case else
'其他命令相关代码
end select
在以上代码中,我们可以通过一些分隔符将交互信息隔开,形成命令。比如:
arrcontent=split(content," ")'关键字用空格进行隔开
select case arrcontent(0)
case "绑定账号"
if ubound(arrcontent)=0 then
strsend="绑定账号格式不正确,正确格式为:绑定账号 手机号码(中间用空格隔开)"
else
'处理绑定账号相关代码
end if
end select
用户发送过来的命令处理完之后,接下来是要将处理结果返回到微信。返回的数据也是一个xml格式的数据包。
格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
参数含义和接收到的xml数据参数含义是一样的,需要注意的是,FromUserName需要填写微信平台的OpenID,这个ID可以在处理接收到的xml数据里获
取到。
那么,我们就可以构造一个发送的xml数据回传给微信服务器了。
strresponse="<xml>"&vbcrlf
strresponse=strresponse&"<ToUserName><![CDATA["&fromusername&"]]></ToUserName>"&vbcrlf
strresponse=strresponse&"<FromUserName><![CDATA["&tousername&"]]></FromUserName>"&vbcrlf
strresponse=strresponse&"<CreateTime>"&now&"</CreateTime>"&vbcrlf
strresponse=strresponse&"<MsgType><![CDATA[text]]></MsgType>"&vbcrlf
strresponse=strresponse&"<Content><![CDATA["&strsend&"]]></Content>"&vbcrlf '反馈的消息
strresponse=strresponse&"</xml>"
response.write strresponse
这样一来,我们就制作了一个完整的asp版微信公众平台应答程序。需要注意的是,必须以utf-8格式进行编码,否则微信收到的中文将会出现乱码,
并且保存的asp文档也要以utf-8格式进行保存。
完整代码如下:
<%
response.Charset="utf-8" '注意这句
set xml_dom=server.CreateObject("MSXML2.DOMDocument")'创建一个MSXML2.DOMDocument对象
xml_dom.load request '载入post过来的数据包,也可以是xml格式的文件
ToUserName=xml_dom.getElementsByTagName("ToUserName").item(0).text '用getElementByTagName方法得到标签ToUserName的值,下同
FromUserName=xml_dom.getElementsByTagName("FromUserName").item(0).text
content=xml_dom.getElementsByTagName("Content").item(0).text
arrcontent=split(content," ")'关键字用空格进行隔开
select case arrcontent(0)
case "绑定账号"
if ubound(arrcontent)=0 then
strsend="绑定账号格式不正确,正确格式为:绑定账号 手机号码(中间用空格隔开)"
else
'处理绑定账号相关代码
end if
end select
strresponse="<xml>"&vbcrlf
strresponse=strresponse&"<ToUserName><![CDATA["&fromusername&"]]></ToUserName>"&vbcrlf
strresponse=strresponse&"<FromUserName><![CDATA["&tousername&"]]></FromUserName>"&vbcrlf
strresponse=strresponse&"<CreateTime>"&now&"</CreateTime>"&vbcrlf
strresponse=strresponse&"<MsgType><![CDATA[text]]></MsgType>"&vbcrlf
strresponse=strresponse&"<Content><![CDATA["&strsend&"]]></Content>"&vbcrlf '反馈的消息
strresponse=strresponse&"</xml>"
response.write strresponse
%>