準備工作
1. 下載下傳 Jdk1.7 安裝
2. 下載下傳 Tomcat 7.0
3. 下載下傳 Myeclipse 6.5
4. 下載下傳 Json-lib第三方jar .
1. 申請一個公網IP位址,釋出自己的應用。
例如: 192.168.1.102
2. 打開myeclipse 建立一個工程
如下圖所示:

3. 建立一個微信應用接入Servlet類
JAVA實作類 :WeixinServlet
[java] view plain copy
- package com.wx.servlet;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.Arrays;
- import java.util.logging.Logger;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import net.sf.json.JSONObject;
- import net.sf.json.xml.XMLSerializer;
- public class WeixinServlet extends HttpServlet{
- private Logger log =Logger.getLogger(this.getClass().getName());
- private static final long serialVersionUID = 1L;
- private String Token;
- private String echostr;
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- connect(request,response);
- }
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- message(request,response);
- }
- private void connect(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
- log.info("RemoteAddr: "+ request.getRemoteAddr());
- log.info("QueryString: "+ request.getQueryString());
- if(!accessing(request, response)){
- log.info("伺服器接入失敗.......");
- return ;
- }
- String echostr=getEchostr();
- if(echostr!=null && !"".equals(echostr)){
- log.info("伺服器接入生效..........");
- response.getWriter().print(echostr);//完成互相認證
- }
- }
- private boolean accessing(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");
- if( isEmpty(signature)){
- return false;
- }
- if(isEmpty(timestamp)){
- return false;
- }
- if(isEmpty(nonce)){
- return false;
- }
- if(isEmpty(echostr)){
- return false;
- }
- String[] ArrTmp = { Token, timestamp, nonce };
- Arrays.sort(ArrTmp);
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < ArrTmp.length; i++) {
- sb.append(ArrTmp[i]);
- }
- String pwd = Encrypt(sb.toString());
- log.info("signature:"+signature+"timestamp:"+timestamp+"nonce:"+nonce+"pwd:"+pwd+"echostr:"+echostr);
- if(trim(pwd).equals(trim(signature))){
- this.echostr =echostr;
- return true;
- }else{
- return false;
- }
- }
- private String Encrypt(String strSrc) {
- MessageDigest md = null;
- String strDes = null;
- byte[] bt = strSrc.getBytes();
- try {
- md = MessageDigest.getInstance("SHA-1");
- md.update(bt);
- strDes = bytes2Hex(md.digest()); //to HexString
- } catch (NoSuchAlgorithmException e) {
- System.out.println("Invalid algorithm.");
- return null;
- }
- return strDes;
- }
- public String bytes2Hex(byte[] bts) {
- String des = "";
- String tmp = null;
- for (int i = 0; i < bts.length; i++) {
- tmp = (Integer.toHexString(bts[i] & 0xFF));
- if (tmp.length() == 1) {
- des += "0";
- }
- des += tmp;
- }
- return des;
- }
- public String getEchostr(){
- return echostr;
- }
- private void message(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
- InputStream is = request.getInputStream();
- // 取HTTP請求流長度
- int size = request.getContentLength();
- // 用于緩存每次讀取的資料
- byte[] buffer = new byte[size];
- // 用于存放結果的數組
- byte[] xmldataByte = new byte[size];
- int count = 0;
- int rbyte = 0;
- // 循環讀取
- while (count < size) {
- // 每次實際讀取長度存于rbyte中
- rbyte = is.read(buffer);
- for(int i=0;i<rbyte;i++) {
- xmldataByte[count + i] = buffer[i];
- }
- count += rbyte;
- }
- is.close();
- String requestStr = new String(xmldataByte, "UTF-8");
- try{
- manageMessage(requestStr,request,response);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- private void manageMessage(String requestStr,HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
- String responseStr;
- try {
- XMLSerializer xmlSerializer=new XMLSerializer();
- JSONObject jsonObject =(JSONObject) xmlSerializer.read(requestStr);
- String event =jsonObject.getString("Event");
- String msgtype =jsonObject.getString("MsgType");
- if("CLICK".equals(event) && "event".equals(msgtype)){ //菜單click事件
- String eventkey =jsonObject.getString("EventKey");
- if("hytd_001".equals(eventkey)){ // hytd_001 這是好友團隊按鈕的标志值
- jsonObject.put("Content", "歡迎使用好友團隊菜單click按鈕.");
- }
- }
- responseStr =creatRevertText(jsonObject);//建立XML
- log.info("responseStr:"+responseStr);
- OutputStream os =response.getOutputStream();
- os.write(responseStr.getBytes("UTF-8"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private String creatRevertText(JSONObject jsonObject){
- StringBuffer revert =new StringBuffer();
- revert.append("<xml>");
- revert.append("<ToUserName><![CDATA["+jsonObject.get("ToUserName")+"]]></ToUserName>");
- revert.append("<FromUserName><![CDATA["+jsonObject.get("FromUserName")+"]]></FromUserName>");
- revert.append("<CreateTime>"+jsonObject.get("CreateTime")+"</CreateTime>");
- revert.append("<MsgType><![CDATA[text]]></MsgType>");
- revert.append("<Content><![CDATA["+jsonObject.get("Content")+"]]></Content>");
- revert.append("<FuncFlag>0</FuncFlag>");
- revert.append("</xml>");
- return revert.toString();
- }
- @Override
- public void init() throws ServletException {
- Token="test123";
- }
- private boolean isEmpty(String str){
- return null ==str || "".equals(str) ? true :false;
- }
- private String trim(String str){
- return null !=str ? str.trim() : str;
- }
- }
4. 本地部署應用 通路http://localhost:端口号/上下文/wenxin
5 .申請成為開發者
通路 http://mp.weixin.qq.com ,開啟開發者模式。填入URL和taken,申請成功,如下所示:
填入URL:http://外網IP/TestWeixin/weixin 【必須80端】
填入token : test123【需要與代碼中的token保持一緻,Token的長度是有限制的,根據筆者的經驗最好不超過10個字元。】