前言:微信公众平台支持将普通客户发送过来的消息,转发到你自己的WEB服务器上,你可以根据自己的业务判断逻辑,回复不同的消息内容给普通客户。下面开始讲我的实战过程:

1、登陆微信公众平台后,进入菜单"高级功能",选择进入"开发模式",此时,它会提示你输入你的消息转发的网址和token,如下图所示:


java 公众号 发送图片 java 微信公众号推送消息_java 公众号 发送图片

在这个例子里头,我们的URL采用的方式是用JAVA写一个servlet,然后填上该servlet在公网的地址(servlet是什么我就不解释了,java最基础的东西),Token可以随便写。这个步骤最重要的一点是,URL只支持80端口,如果你提供的的URL不是80端口,就不要做后续步骤了。

2、在第一个步骤点击"提交"按钮的时候,微信会向你的serlet以GET协议向你发四个参数,如果要让微信相信你的URL,最简单的方式就是获取echostr参数并直接返回。上doGet的代码段:


java 公众号 发送图片 java 微信公众号推送消息_微信_02

3、如果这个微信那边能提交成功,恭喜你,第一步成功完成了,下面就可以在你的代码中接收普通客户发送过来的消息了。不过你得先在微信平台中将你的模式改成"开发者模式",修改方式如下:

先进入"高级功能",选择进入"编辑模式",将"编辑模式"关闭;

在进入"高级功能",选择进入"开发者模式",将"开发者模式"开启;

4、开始编写接收消息的JAVA代码了,微信以POST方式,将普通用户发送的消息转发到你的servlet上,所以我们现在要在doPost里头写接收和回复消息的代码:


这时候你用你的普通账户,向你的公众账户发个"hello"的消息,这时候在你的控制台会打印出类似以下的内容:


偷懒一下,自行去写XML解析代码去获取各个数据项的内容,下面我们该向该客户端回复消息了,上代码:

java 公众号 发送图片 java 微信公众号推送消息_java_03

此时,在我的普通微信客户端,收到了"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、我的的测试的公众平台,要不你关注下?:)