qiyadeng

专注于Java示例及教程
posts - 84, comments - 152, trackbacks - 0, articles - 34
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/

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

Feedback

# re: 微信公众平台开发(二)--简单的聊天机器人[未登录]  回复  更多评论   

2013-03-19 12:49 by 大海
正在学习javaweb的内容,感觉作者写的这个不错.既有趣还可以练习所学内容.不知道作者还会不会继续去写微信开放平台的代码.我好继续向博主学习

# re: 微信公众平台开发(二)--简单的聊天机器人  回复  更多评论   

2013-04-27 09:16 by 微信公众平台开发者
微信公众平台开发者 qq群127860053

# re: 微信公众平台开发(二)--简单的聊天机器人  回复  更多评论   

2013-06-19 18:13 by 河南锐骑
微信借助LBS可以开发出公众平台的一些本地化便民服务。如:利用LBS,我可以让用户发送一个位置,然后查询附近的酒店,然后通过微信预定酒店。也可以通过LBS显示附近的店铺,娱乐优惠信息,用户凭借绑定微信号后,可以到这些店里面享受购物娱乐优惠活动。这些功能不仅为用户提供了极大的便利,还可以让用户感受到良好的体验。这样,用户就会对您们的店铺产生更好的印象,无形之中,就做到了宣传的作用。

http://www.weixindev.com

# re: 微信公众平台开发(二)--简单的聊天机器人  回复  更多评论   

2013-07-25 15:05 by bokix
post请求里面不用做校验了?如果是其他网站post过来的虚假消息呢?

只有注册用户登录后才能发表评论。


网站导航: