1.设置成为开发者模式
登录微信工作平台,选择高级功能-进入开发模式,成为开发者。需要做如下图配置。URL配置的信息是指,微信的后台服务器把您的用户消息发送到该URL处理。Token是你和微信之间的一个密码,用来验证消息是否是从微信的服务发送而来,而不是其他来攻击你的系统。
现在你还不能设置,在设置时微信会GET请求你设置的URL,已检测接口是否可以使用。只有等你准备好GET方法之后才可以进行设置。
2.实现GET方法
从文档中知道,我们需要实现POST和GET方法,GET方法用于验证微信和你的通讯验证,POST用于消息处理。
新建Servlet HelloWeChat,先实现其中的GET方法
protected
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
// TODO 为了简单起见,先不对消息来源进行校验
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String echo = request.getParameter( " echostr " );
echo = new String(echo.getBytes( " ISO-8859-1 " ), " UTF-8 " );
pw.println(echo);
}
可以在本地使用http://localhost:8080/QiyadengWeb/HelloWeChat?echostr=hello中文,先进行测试,如果没有问题,可以部署到服务器上,然后在微信公众平台进行设置了。
// TODO 为了简单起见,先不对消息来源进行校验
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String echo = request.getParameter( " echostr " );
echo = new String(echo.getBytes( " ISO-8859-1 " ), " UTF-8 " );
pw.println(echo);
}
3.实现POST方法
POST方法首先接收到微信公众平台传送过来的XML,从中提取消息发送人和消息内容。更加消息发送内容,你可以增加自己的处理逻辑,最后拼装成回复消息XML,返回给微信公众平台。
protected
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String wxMsgXml = IOUtils.toString(request.getInputStream(), " utf-8 " );
WeChatTextMessage textMsg = null ;
try {
textMsg = getWeChatTextMessage(wxMsgXml);
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer replyMsg = new StringBuffer();
if (textMsg != null ){
// 增加你所需要的处理逻辑,这里只是简单重复消息
replyMsg.append( " 您给我的消息是: " );
replyMsg.append(textMsg.getContent());
}
else {
replyMsg.append( " :)不是文本的消息,我暂时看不懂 " );
}
String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
pw.println(returnXml);
}
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String wxMsgXml = IOUtils.toString(request.getInputStream(), " utf-8 " );
WeChatTextMessage textMsg = null ;
try {
textMsg = getWeChatTextMessage(wxMsgXml);
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer replyMsg = new StringBuffer();
if (textMsg != null ){
// 增加你所需要的处理逻辑,这里只是简单重复消息
replyMsg.append( " 您给我的消息是: " );
replyMsg.append(textMsg.getContent());
}
else {
replyMsg.append( " :)不是文本的消息,我暂时看不懂 " );
}
String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
pw.println(returnXml);
}
关于调试,这里推荐一个工具Fiddler,你可以模拟微信的POST消息到你的本地,而不必每次部署到服务器上进行调试。关于Fiddler的POST数据使用方法,可以参考下图标注内容。
4.部署并测试
完成第一步,并和你的公众帐号好进行对话,回复消息没有问题的话,那就恭喜你了。
5.依赖库
使用maven的同学,添加以下依赖即可。非maven用户,找到这些库添加到buider path中即可。
<
dependency
>
< groupId > joda-time </ groupId >
< artifactId > joda-time </ artifactId >
< version > 2.2 </ version >
</ dependency >
< dependency >
< groupId > org.apache.commons </ groupId >
< artifactId > commons-io </ artifactId >
< version > 1.3.2 </ version >
</ dependency >
< dependency >
< groupId > com.thoughtworks.xstream </ groupId >
< artifactId > xstream </ artifactId >
< version > 1.4.3 </ version >
</ dependency >
6.完整的代码
< groupId > joda-time </ groupId >
< artifactId > joda-time </ artifactId >
< version > 2.2 </ version >
</ dependency >
< dependency >
< groupId > org.apache.commons </ groupId >
< artifactId > commons-io </ artifactId >
< version > 1.3.2 </ version >
</ dependency >
< dependency >
< groupId > com.thoughtworks.xstream </ groupId >
< artifactId > xstream </ artifactId >
< version > 1.4.3 </ version >
</ dependency >
package
com.qiyadeng.wechat;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* Servlet implementation class HelloWeChat
*/
public class HelloWeChat extends HttpServlet {
private static final long serialVersionUID = 1L ;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloWeChat() {
super ();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO 为了简单起见,先不对消息来源进行校验
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String echo = request.getParameter( " echostr " );
echo = new String(echo.getBytes( " ISO-8859-1 " ), " UTF-8 " );
pw.println(echo);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String wxMsgXml = IOUtils.toString(request.getInputStream(), " utf-8 " );
WeChatTextMessage textMsg = null ;
try {
textMsg = getWeChatTextMessage(wxMsgXml);
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer replyMsg = new StringBuffer();
if (textMsg != null ){
// 增加你所需要的处理逻辑,这里只是简单重复消息
replyMsg.append( " 您给我的消息是: " );
replyMsg.append(textMsg.getContent());
}
else {
replyMsg.append( " :)不是文本的消息,我暂时看不懂 " );
}
String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
pw.println(returnXml);
}
private WeChatTextMessage getWeChatTextMessage(String xml){
XStream xstream = new XStream( new DomDriver());
xstream.alias( " xml " , WeChatTextMessage. class );
xstream.aliasField( " ToUserName " , WeChatTextMessage. class , " toUserName " );
xstream.aliasField( " FromUserName " , WeChatTextMessage. class , " fromUserName " );
xstream.aliasField( " CreateTime " , WeChatTextMessage. class , " createTime " );
xstream.aliasField( " MsgType " , WeChatTextMessage. class , " messageType " );
xstream.aliasField( " Content " , WeChatTextMessage. class , " content " );
xstream.aliasField( " MsgId " , WeChatTextMessage. class , " msgId " );
WeChatTextMessage wechatTextMessage = (WeChatTextMessage)xstream.fromXML(xml);
return wechatTextMessage;
}
private String getReplyTextMessage(String content, String weChatUser){
WeChatReplyTextMessage we = new WeChatReplyTextMessage();
we.setMessageType( " text " );
we.setFuncFlag( " 0 " );
we.setCreateTime( new Long( new Date().getTime()).toString());
we.setContent(content);
we.setToUserName(weChatUser);
we.setFromUserName( " shanghaiweather " ); // TODO 你的公众帐号微信号
XStream xstream = new XStream( new DomDriver());
xstream.alias( " xml " , WeChatReplyTextMessage. class );
xstream.aliasField( " ToUserName " , WeChatReplyTextMessage. class , " toUserName " );
xstream.aliasField( " FromUserName " , WeChatReplyTextMessage. class , " fromUserName " );
xstream.aliasField( " CreateTime " , WeChatReplyTextMessage. class , " createTime " );
xstream.aliasField( " MsgType " , WeChatReplyTextMessage. class , " messageType " );
xstream.aliasField( " Content " , WeChatReplyTextMessage. class , " content " );
xstream.aliasField( " FuncFlag " , WeChatReplyTextMessage. class , " funcFlag " );
String xml = xstream.toXML(we);
return xml;
}
}
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* Servlet implementation class HelloWeChat
*/
public class HelloWeChat extends HttpServlet {
private static final long serialVersionUID = 1L ;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloWeChat() {
super ();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO 为了简单起见,先不对消息来源进行校验
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String echo = request.getParameter( " echostr " );
echo = new String(echo.getBytes( " ISO-8859-1 " ), " UTF-8 " );
pw.println(echo);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType( " text/html;charset=UTF-8 " );
PrintWriter pw = response.getWriter();
String wxMsgXml = IOUtils.toString(request.getInputStream(), " utf-8 " );
WeChatTextMessage textMsg = null ;
try {
textMsg = getWeChatTextMessage(wxMsgXml);
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer replyMsg = new StringBuffer();
if (textMsg != null ){
// 增加你所需要的处理逻辑,这里只是简单重复消息
replyMsg.append( " 您给我的消息是: " );
replyMsg.append(textMsg.getContent());
}
else {
replyMsg.append( " :)不是文本的消息,我暂时看不懂 " );
}
String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
pw.println(returnXml);
}
private WeChatTextMessage getWeChatTextMessage(String xml){
XStream xstream = new XStream( new DomDriver());
xstream.alias( " xml " , WeChatTextMessage. class );
xstream.aliasField( " ToUserName " , WeChatTextMessage. class , " toUserName " );
xstream.aliasField( " FromUserName " , WeChatTextMessage. class , " fromUserName " );
xstream.aliasField( " CreateTime " , WeChatTextMessage. class , " createTime " );
xstream.aliasField( " MsgType " , WeChatTextMessage. class , " messageType " );
xstream.aliasField( " Content " , WeChatTextMessage. class , " content " );
xstream.aliasField( " MsgId " , WeChatTextMessage. class , " msgId " );
WeChatTextMessage wechatTextMessage = (WeChatTextMessage)xstream.fromXML(xml);
return wechatTextMessage;
}
private String getReplyTextMessage(String content, String weChatUser){
WeChatReplyTextMessage we = new WeChatReplyTextMessage();
we.setMessageType( " text " );
we.setFuncFlag( " 0 " );
we.setCreateTime( new Long( new Date().getTime()).toString());
we.setContent(content);
we.setToUserName(weChatUser);
we.setFromUserName( " shanghaiweather " ); // TODO 你的公众帐号微信号
XStream xstream = new XStream( new DomDriver());
xstream.alias( " xml " , WeChatReplyTextMessage. class );
xstream.aliasField( " ToUserName " , WeChatReplyTextMessage. class , " toUserName " );
xstream.aliasField( " FromUserName " , WeChatReplyTextMessage. class , " fromUserName " );
xstream.aliasField( " CreateTime " , WeChatReplyTextMessage. class , " createTime " );
xstream.aliasField( " MsgType " , WeChatReplyTextMessage. class , " messageType " );
xstream.aliasField( " Content " , WeChatReplyTextMessage. class , " content " );
xstream.aliasField( " FuncFlag " , WeChatReplyTextMessage. class , " funcFlag " );
String xml = xstream.toXML(we);
return xml;
}
}
原创文章,转载请注明: 转载自http://www.qiyadeng.com/
本文链接地址: 微信公众平台开发(二)–简单的聊天机器人