微信公众平台开发(二)--简单的聊天机器人

标签: 微信 公众 平台 | 发表时间:2013-03-17 20:41 | 作者:qiyadeng
出处:http://www.blogjava.net/
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中即可。


      <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.完整的代码
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;
    }

}

原创文章,转载请注明: 转载自 http://www.qiyadeng.com/

本文链接地址: 微信公众平台开发(二)–简单的聊天机器人



qiyadeng 2013-03-17 20:41 发表评论

相关 [微信 公众 平台] 推荐:

浅谈微信公众平台

- - 微博之博
过去的这个周末,应该大部分人都在家里调戏 微信公共 平台. 有人幸灾乐祸,有人稍作恐慌:芸芸众生相. 注册尝试了一个微信 公众平台,总结一句话:龙生龙,凤生凤. 以前曾经有人说中国的互联网,要么生要么死要么被腾讯. 企鹅家族优良的传统,势必不会放过 微博帝国的3亿用户群的潜在商业价值,所以这次爱起哄的企鹅家族,又一次决定露出起哄天性,悄悄的推出了微信公众平台.

微信公众平台开发(一)

- - BlogJava-首页技术区
  开始微信公众平台的开发,我们首先要了解微信平台可以帮助我们做哪些事情. 使用您的公众账号登陆http://mp.weixin.qq.com/,选择菜单--高级功能-开发模式--查看文档,即能看到微信公众平台目前所能开发的功能. 接受用户发送给您公众账号的消息. 需要特别说明的是,发送消息和回复消失是一个连贯的过程,只能在一个对话中完成.

微信公众平台接口开发

- - CSDN博客互联网推荐文章
随着微信公众平台的开放,微信营销推广也越发受到重视. 现在企业越来越注重求职者是否拥有“微信公众平台接口开发”的经验. 现在参考资料介绍下微信公众平台接口开发模式:. 首先你得有个微信公众平台账号,注册地址:http://mp.weixin.qq.com/. 开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:.

微信公众平台开发入门

- - Web前端 - ITeye博客
在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序、MySQL数据库、计算机网络通讯、及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务:. 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境.

微信公众平台:移动推送(Push)平台

- - 天涯海阁|Web2.0Share
之前曾经写过一个文章《 移动互联网的未来:基于情境/兴趣的推送》,至今我也觉得这个在未来会是有着巨大想想空间的移动生活方式. 之前其实也有不少初创企业在Push这个领域努力,不过效果却都不好,所以其实本质而言,要构建Push这样的平台,需要吸引大量的内容、媒体、品牌来提供Push内容,而对于内容、媒体、品牌而言,最在意的是这个平台有没有用户,而微信可能已经到了可以去构建这样一个信息推送平台的阶段.

微信公众平台为什么会火

- - 月光博客
  在某IT评论网站看到一篇号称是微信公共平台干货分享的文章,立马点进去查看,结果却大失所望. 仅仅是微信公共平台如何开通的介绍. 文章名字可以适当夸大,但必须真有内容,否则你就是在浪费别人的时间. 今天讨论为什么 微信公共平台能火. 微信从一诞生就拥有真实的基因,一开始就严格限定与手机号绑定. 微信可以说是中国最严谨的实名认证社交平台.

微信公众平台开发(三)--位置信息的识别

- - BlogJava-首页技术区
位置识别这是实际应用经常应用的消息,特别是很多商家,通过了解用户位置,给用户提供特别的产品或是商场的推荐. 其中用户可能发送两种类型的消息:. 2.路名、标志性建筑或是商场名称. 认识一下,微信地理位置消息,包含一些什么信息. . 包含的主要信息有经度纬度和Label的位置.

JavaWeb发送信息到微信公众平台的企业号

- - 行业应用 - ITeye博客
首先到微信公众平台申请微信企业号: https://qy.weixin.qq.com. 申请后需要在管理平台做如下几个步骤:. 1、在通讯录里添加一个成员并使这个成员关注这个微信企业号;. 2、在应用中心里新建一个应用并记录appid;. 3、在设置里的权限管理中新建管理组;. 新建一个JavaWeb工程并导入如下几个jar文件:.

微信公众平台增加微信小店功能 可快速开店

- - TechWeb 今日焦点 RSS阅读
微信公众平台增加微信小店功能 可快速开店(TechWeb配图). 【TechWeb报道】5月29日消息,腾讯今日发布消息称,微信公众平台更新增加了微信小店功能,微信小店基于微信支付,包括添加商品、商品管理、订单管理、货架管理、维权等功能,开发者可使用接口批量添加商品,快速开店. 已接入微信支付的公众号,可在服务中心中申请开通微信小店功能.

微信公众平台开发(二)--简单的聊天机器人

- - BlogJava-首页技术区
1.设置成为开发者模式 登录微信工作平台,选择高级功能-进入开发模式,成为开发者. URL配置的信息是指,微信的后台服务器把您的用户消息发送到该URL处理. Token是你和微信之间的一个密码,用来验证消息是否是从微信的服务发送而来,而不是其他来攻击你的系统. 现在你还不能设置,在设置时微信会GET请求你设置的URL,已检测接口是否可以使用.