展会信息港展会大全

微信公众平台开发简单的聊天机器人
来源:互联网   发布日期:2016-01-19 12:05:07   浏览:3284次  

导读:1 设置成为开发者模式登录微信工作平台,选择高级功能-进入开发模式,成为开发者。需要做如下图配置。URL配置的信息是指,微信的后台服务器把您的用户消息发送到该 URL处理。Token是你和微信之间的一个密码,用 ...

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中文, 先进行测试,如果没有问题,可以部署到服务器上,然后在微信公众平台进行设置了。

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);

}

关于调试,这里推荐一个工具Fiddler,你可以模拟微信的POST消息到你的本地,而不必每次部署到服务器上进行调试。关于Fiddler的 POST数据使用方法,可以参考下图标注内容。

4.部署并测试

完成第一步,并和你的公众帐号好进行对话,回复消息没有问题的话,那就恭喜你了

5.依赖库

使用maven的同学,添加以下依赖即可。非maven用户,找到这些库添加到buider path中即可。

joda-time

joda-time

2.2

org.apache.commons

commons-io

1.3.2

com.thoughtworks.xstream

xstream

1.4.3

6.完整的代码

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;

}

}

赞助本站

人工智能实验室

相关热词: 微信 机器人

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港