JAVA微信开发-新手接入指南

相信很多人对微信开发已经不那么陌生,我也是从一个微信开发的菜鸟经过各种问题的折磨,然后去搜索引擎搜索各种文章阅读,但是基本都是零散的资料,没有一个统一、系统的阐述微信应用如何开发。作者结合自己的实际开发经验,归纳整理出来分享给微信开发的入门者或正在研究的开发者。

这篇文章主要阐述如何搭建一个微信开发平台。古人云:“磨刀不负砍才工”。我们开发应用也需要准备一些必要的条件


 准备工作


 1.  下载 Jdk1.7  安装

 2.  下载 Tomcat 7.0

 3.  下载 Myeclipse 6.5

 4.  下载 Json-lib第三方jar .

1.      申请一个公网IP地址,发布自己的应用。

例如: 192.168.1.102

 

2.      打开myeclipse 创建一个工程

如下图所示:

JAVA微信开发-新手接入指南

3.  创建一个微信应用接入Servlet类

JAVA微信开发-新手接入指南

JAVA实现类 :WeixinServlet

    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;  
       
    /** 
     * @author haibing.xiao 
     * @since jdk1.6 
     * @version 1.0 
     */  
    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);  
        }  
      
           
          
        /** 
         *@author haibing.xiao 
         *@return   
         *@exception  
         *@param 
         *  
         * <p>接入连接生效验证</p> 
         */  
        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);//完成相互认证  
            }  
        }  
        /** 
         * @author haibing.xiao 
         * Date 2013-05-29 
         * @return boolean 
         * @exception ServletException, IOException 
         * @param 
         * 
         *<p>用来接收微信公众平台的验证</p>  
         */  
        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;  
        }  
        /** 
         *@author haibing.xiao 
         *@return   
         *@exception ServletException, IOException 
         *@param 
         *  
         * <p>XML组装组件</p> 
         */  
         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();  
                }  
                  
            }  
       
           
        /** 
         * @author haibing.xiao 
         * @return  
         * @exception ServletException, IOException 
         * @param 
         *  
         * <p>业务转发组件</p> 
         *  
         */  
          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 

JAVA微信开发-新手接入指南

5  .申请成为开发者

访问 http://mp.weixin.qq.com   ,开启开发者模式。填入URL和taken,申请成功,如下所示:

JAVA微信开发-新手接入指南

填入URL:http://外网IP/TestWeixin/weixin 【必须80端】

填入token :  test123【需要与代码中的token保持一致,Token的长度是有限制的,根据笔者的经验最好不超过10个字符。】


上一篇:微信高级群发接口demo


下一篇:SSH集成开发积分商城 之 11.3 实现积分商城层