前言:微信公众平台支持将普通客户发送过来的消息,转发到你自己的WEB服务器上,你可以根据自己的业务判断逻辑,回复不同的消息内容给普通客户。下面开始讲我的实战过程:
1、登陆微信公众平台后,进入菜单"高级功能",选择进入"开发模式",此时,它会提示你输入你的消息转发的网址和token,如下图所示:
在这个例子里头,我们的URL采用的方式是用JAVA写一个servlet,然后填上该servlet在公网的地址(servlet是什么我就不解释了,java最基础的东西),Token可以随便写。这个步骤最重要的一点是,URL只支持80端口,如果你提供的的URL不是80端口,就不要做后续步骤了。
2、在第一个步骤点击"提交"按钮的时候,微信会向你的serlet以GET协议向你发四个参数,如果要让微信相信你的URL,最简单的方式就是获取echostr参数并直接返回。上doGet的代码段:
3、如果这个微信那边能提交成功,恭喜你,第一步成功完成了,下面就可以在你的代码中接收普通客户发送过来的消息了。不过你得先在微信平台中将你的模式改成"开发者模式",修改方式如下:
先进入"高级功能",选择进入"编辑模式",将"编辑模式"关闭;
在进入"高级功能",选择进入"开发者模式",将"开发者模式"开启;
4、开始编写接收消息的JAVA代码了,微信以POST方式,将普通用户发送的消息转发到你的servlet上,所以我们现在要在doPost里头写接收和回复消息的代码:
这时候你用你的普通账户,向你的公众账户发个"hello"的消息,这时候在你的控制台会打印出类似以下的内容:
偷懒一下,自行去写XML解析代码去获取各个数据项的内容,下面我们该向该客户端回复消息了,上代码:
此时,在我的普通微信客户端,收到了"hello ,thank you to call me"的字样,连接成功!
5、微信支持图片、声音等回复,详细请见微信的官方API网址:
http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97
6、贴上整个JAVA代码:
import java.io.BufferedInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WXService extends HttpServlet {
private static final long serialVersionUID = 2L;
/**
* 普通账户向微信发送的消息,以POST方式提交
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从流里头获取普通用户发送的XML消息串
BufferedInputStream bf = new BufferedInputStream(request.getInputStream());
byte receiveByte[] = new byte[bf.available()];
bf.read(receiveByte);
bf.close();
//将收到消息内容打印出来
String receiveMsg = new String(receiveByte);
System.out.println("receiveMsg="+receiveMsg);
//TODO 解析XML串中的各个数据项
//回复消息给发送者
String responseXML = " <xml> "+
"<ToUserName><![CDATA[oltnBjmU5oK1MK9LKp1lBSY3gitA]]></ToUserName>"+
"<FromUserName><![CDATA[gh_0b26c3950f24]]></FromUserName>"+
"<CreateTime>12345678</CreateTime>"+
"<MsgType><![CDATA[text]]></MsgType>"+
"<Content><![CDATA[hello ,thank you to call me]]></Content>"+
"<FuncFlag>0</FuncFlag>"+
"</xml>";
response.getWriter().println(responseXML);
}
/**
* 微信对你的服务认证方式采用GET协议
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String signature = request.getParameter("signature");//微信加密签名
String timestamp = request.getParameter("timestamp");//时间戳
String nonce = request.getParameter("nonce");//随机数
String echostr = request.getParameter("echostr");//随机字符串
//TODO 对接收到的参数做数据验证,来确认该请求来自微信,避免被第三方随意攻击
//验证通过后,需要将随机字符串原样返回给微信,微信才确认你的这个服务正常
response.getWriter().print(echostr);
}
}
import java.io.BufferedInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WXService extends HttpServlet {
private static final long serialVersionUID = 2L;
/**
* 普通账户向微信发送的消息,以POST方式提交
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从流里头获取普通用户发送的XML消息串
BufferedInputStream bf = new BufferedInputStream(request.getInputStream());
byte receiveByte[] = new byte[bf.available()];
bf.read(receiveByte);
bf.close();
//将收到消息内容打印出来
String receiveMsg = new String(receiveByte);
System.out.println("receiveMsg="+receiveMsg);
//TODO 解析XML串中的各个数据项
//回复消息给发送者
String responseXML = " <xml> "+
"<ToUserName><![CDATA[oltnBjmU5oK1MK9LKp1lBSY3gitA]]></ToUserName>"+
"<FromUserName><![CDATA[gh_0b26c3950f24]]></FromUserName>"+
"<CreateTime>12345678</CreateTime>"+
"<MsgType><![CDATA[text]]></MsgType>"+
"<Content><![CDATA[hello ,thank you to call me]]></Content>"+
"<FuncFlag>0</FuncFlag>"+
"</xml>";
response.getWriter().println(responseXML);
}
/**
* 微信对你的服务认证方式采用GET协议
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String signature = request.getParameter("signature");//微信加密签名
String timestamp = request.getParameter("timestamp");//时间戳
String nonce = request.getParameter("nonce");//随机数
String echostr = request.getParameter("echostr");//随机字符串
//TODO 对接收到的参数做数据验证,来确认该请求来自微信,避免被第三方随意攻击
//验证通过后,需要将随机字符串原样返回给微信,微信才确认你的这个服务正常
response.getWriter().print(echostr);
}
}
7、我的的测试的公众平台,要不你关注下?:)