微信认证signature timestamp nonce echostr

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  1. 微信认证原理

    2.填写服务器配置

    3.验证服务器地址的有效性,验证原理,Token, timestamp, nonce三个参数按照字典排序,拼接成string,然后判断是否和signature相等

    4.依据接口文档实现业务逻辑

package com.xp.cn.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
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 WeiXinParamServlet 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);  
	    }  
	  
	    @Override  
	    public void init() throws ServletException {  
	        Token="xp******************";  
	    } 
	      
	    /** 
	     *@author xp
	     *@desc 接入连接生效验证

       */       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 xp      * Date 2013-04-19       * @desc用来接收微信公众平台的验证       */       private boolean accessing(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。         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());         //pwd 8052946b7c82d34982bcfcf04ddaa065917dd33f         //signature 8052946b7c82d34982bcfcf04ddaa065917dd33f                     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 xp      *@desc XML组装组件

       */        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");               revert.append("");               revert.append("");               revert.append(""+jsonObject.get("CreateTime")+"");               revert.append("");               revert.append("");               revert.append("0");               revert.append("");               return revert.toString();           }            private boolean isEmpty(String str){           return null ==str || "".equals(str) ? true :false;       }           private String trim(String str){           return null !=str  ? str.trim() : str;       }          }


转载于:https://my.oschina.net/u/2253438/blog/662414

你可能感兴趣的:(微信认证signature timestamp nonce echostr)