最近有没有在玩微信公众账号?很多公众账号有自动回复功能,比如爱范儿的appsolution发送Android或者IOS,它就会想你推荐好玩的app.

微信对公众账号提供了api接口来自定义回复介绍到的消息,并且提供了PHP的demo.这里我使用JAVA来实现接口的调用。

能够实现本demo中描述的功能,你需要满足的下面的条件:

  1. 有一个微信公众账号
  2. 有能够运行在公网上的服务器(推荐使用新浪的SAE)
  3. 了解最基本的JAVA EE编程(会编写servlet)

(一)注册微信公众账号

公众账号需要与你的QQ号进行绑定。并且该QQ没有与其它的微信号绑定过(当然你可以先解除与其它微信的绑定)

(二)设置公众平台接口信息

注册成功后,进入微信公众账号管理界面,点击设置->自定义回复->前往设置。填写相关信息,其中需要注意的是URL和Token. 如果你随便填写URL的话,会提示下面的信息:你的服务器没有正确响应Token验证,请阅读消息接口使用指南。如图所示:


这也是为什么要求“有能够运行在公网上的服务器”。本文以新浪的SAE作为服务器环境(好消息,SAE已经开放JAVA应用,不需要满世界找邀请码了),在SAE上创建一个JAVA应用,并上传已经写好的JAVA WEB应用war包,该应用中只有一个Servlet.

其中doGet方法如图所示


这里只是简单的把接收到的echostr字符串原样的返回回去了。这样写是为了能够先通过微信服务器的验证。在SAE上部署好应用后,在回到微信公众账号设置界面,URL添加该servlet的访问地址,token随便填写一个字符串,点击提交。

出现“提交成功”提示,说明接口配置成功了。如图所示


(三)实现自定义消息回复

微信服务器会在公众账号收到用户消息的时候,把消息通过post方法发送到你的服务器,也就是servlet的doPost方法,如图所示:


doPost方法中主要实现3个功能:1、从输入流中获取到消息xml。2、通过业务逻辑得到回复的消息xml(具体逻辑后面会讲解)。3、把回复xml写给服务器服务器。

(四)消息xml的格式

消息分为文本消息、图文消息、位置消息。

文本消息xml格式


<xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName>

 <CreateTime>1348831860</CreateTime>

 <MsgType><![CDATA[text]]></MsgType>

 <Content><![CDATA[this is a test]]></Content>

 </xml>


 ToUserName 消息接收方微信号,一般为公众平台账号微信号  FromUserName 消息发送方微信号  CreateTime 消息创建时间  MsgType 文本消息为text  Content 消息内容


地理位置消息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>

 </xml>


 ToUserName 消息接收方微信号,一般为公众平台账号微信号  FromUserName 消息发送方微信号  CreateTime 消息创建时间  MsgType 消息类型,地理位置为location  Location_X 地理位置纬度  Location_Y 地理位置经度  Scale 地图缩放大小  Label 地理位置信息


图片消息结构


<xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName>

 <CreateTime>1348831860</CreateTime>

 <MsgType><![CDATA[image]]></MsgType>

 <PicUrl><![CDATA[this is a url]></PicUrl>

 </xml>



 ToUserName 消息接收方微信号,一般为公众平台账号微信号  FromUserName 消息发送方微信号  CreateTime 消息创建时间  MsgType 消息类型image  PicUrl 图片链接,开发者可以用HTTP GET获取


 

 

(五) 回复消息xml的格式

对于每一个POST请求,开发者在响应包中返回特定xml结构,对该消息进行相应操作(现支持回复文本消息 、 回复图文消息和星标操作)。xml结构如下:

回复文本消息格式

<xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName>

 <CreateTime>12345678</CreateTime>

 <MsgType><![CDATA[text]]></MsgType>

 <Content><![CDATA[content]]></Content>

 <FuncFlag>0</FuncFlag>

 </xml>


 FromUserName 消息发送方  ToUserName 消息接收方  CreateTime 消息创建时间  MsgType 消息类型,文本消息必须填写text  Content 消息内容,大小限制在2048字节,字段为空为不合法请求


回复图文消息格式


<xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName>

 <CreateTime>12345678</CreateTime>

 <MsgType><![CDATA[news]]></MsgType>

 <Content><![CDATA[]]></Content>

 <ArticleCount>2</ArticleCount>

 <Articles>

 <item>

 <Title><![CDATA[title1]]></Title>

 <Description><![CDATA[description1]]></Description>

 <PicUrl><![CDATA[picurl]]></PicUrl>

 <Url><![CDATA[url]]></Url>

 </item>

 <item>

 <Title><![CDATA[title]]></Title>

 <Description><![CDATA[description]]></Description>

 <PicUrl><![CDATA[picurl]]></PicUrl>

 <Url><![CDATA[url]]></Url>

 </item>

 </Articles>

 <FuncFlag>1</FuncFlag>

 </xml>



 FromUserName 消息发送方  ToUserName 消息接收方  CreateTime 消息创建时间  MsgType 消息类型,图文消息必须填写news  Content 消息内容,图文消息可填空  ArticleCount 图文消息个数,限制为10条以内  Articles 多条图文消息信息,默认第一个item为大图  Title 图文消息标题  Description 图文消息描述  PicUrl 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致  Url 点击图文消息跳转链接


星标消息

在xml结构中,有一个FuncFlag字段,开发者可以通过填写FuncFlag字段为1来对消息进行星标,你可以在实时消息的星标消息分类中找到该消息

(六)自定义消息回复

在doPost方法中的第二步,我们要处理请求的xml得到回复的xml,具体的逻辑是: 1. 解析xml。 2. 保存消息到数据库(便于分析数据,你也可以不保存)。 3. 处理消息。如图所示:


  1. 解析xml,把解析到的数据保存到HashMap中


  • 保存数据到数据库,如果你不想保存到数据库,这一步可以省略
  • 处理消息,不同类型的消息可以通过MsgType来识别


  • 处理文本消息,这里演示回应一个文本消息,实际的处理是你的具体业务决定的


  • 生成xml文件


结束语:解析与生成xml使用的是dom4j,如果你也使用它,需要添加相关jar包。