美文网首页
微信小程序客服消息token验证

微信小程序客服消息token验证

作者: 毛于晏 | 来源:发表于2018-08-21 11:11 被阅读846次

    最近公司项目要求, 搞个微信小程序的客服功能!!! 因为这个要牵扯到token的验证, 当时我就极力反对做这个功能(因为之前自己玩的时候设置token一直没搞好,心里有些阴影,), 不过既然是公司的业务需要, 自己又是负责这方面的, 也只能顶着头皮上咯; 在网上也找了好多, 不知道为什么, 每次在网上找的, 都不能直接用, 还得自己各种调试, 看文档; 都上网拷别人代码了, 肯定不想自己再看文档了>, <.... 下面不废话了, 直接上代码吧, 我这个人就是喜欢简单粗暴直接的,~ 哈哈哈哈!

    1534820253(1).jpg
    package controller;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import util.SignUtil;
    
    /**
     * 小程序消息模板 token校验
     * @author MaoLG
     *
     * @2018-8-17下午4:48:33
     */
    @RestController
    @RequestMapping("")//这里填自己的访问路径, 要和url(访问地址一致)
    public class PushMessage {
    
        
        @RequestMapping("")//上面是前半段, 这是后半段, 不多做解释了
        public void session(HttpServletRequest request, HttpServletResponse response){
            boolean isGet = request.getMethod().toLowerCase().equals("get");
            PrintWriter print;
            if (isGet) {//下面从请求中获取校验需要的参数
                // 微信加密签名
                String signature = request.getParameter("signature");
                // 时间戳
                String timestamp = request.getParameter("timestamp");
                // 随机数
                String nonce = request.getParameter("nonce");
                // 随机字符串
                String echostr = request.getParameter("echostr");
                // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
                if (signature != null && SignUtil.checkSignature(signature, timestamp, nonce)) {
                    try {
                        print = response.getWriter();
                        print.write(echostr);
                        print.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
    }
    //上面代码是controller层
    -----------------------------------------------------------------------------------------------------
    //我是分割线
    -----------------------------------------------------------------------------------------------------
    //下面为工具类
    package util;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    
    /**
     * 验证签名使用的工具
     * @author MaoLG
     *
     * @2018-8-17下午4:54:34
     */
    public class SignUtil {
        
        private  String token = "token";//token(令牌)和网页上配置的一致
        
        public static boolean checkSignature(String signature, String timestamp, String nonce) {  
            
            //与token 比较
            String[] arr = new String[] { token, timestamp, nonce };  
     
            // 将token、timestamp、nonce三个参数进行字典排序  
            Arrays.sort(arr); 
            
            StringBuilder content = new StringBuilder();  
            
            for (int i = 0; i < arr.length; i++) {  
                content.append(arr[i]);  
            }
            
            MessageDigest md = null;  
            String tmpStr = null;  
      
            try {  
                md = MessageDigest.getInstance("SHA-1");  
                
                // 将三个参数字符串拼接成一个字符串进行sha1加密
                byte[] digest = md.digest(content.toString().getBytes());
                tmpStr = byteToStr(digest); 
            } catch (NoSuchAlgorithmException e) {  
                ErrorLogUtil.log(e);
                e.printStackTrace();  
            }  
     
            content = null;  
            // 将sha1加密后的字符串可与signature对比  
            return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
        }  
        
        /**
         * 将字节数组转换为十六进制字符串
         * 
         * @param byteArray
         * @return
         */
        private static String byteToStr(byte[] byteArray) {
            String strDigest = "";
            for (int i = 0; i < byteArray.length; i++) {
                strDigest += byteToHexStr(byteArray[i]);
            }
            return strDigest;
        }
        
        /**
         * 将字节转换为十六进制字符串
         * 
         * @param mByte
         * @return
         */
        private static String byteToHexStr(byte mByte) {
            char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
            char[] tempArr = new char[2];
            tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
            tempArr[1] = Digit[mByte & 0X0F];
            String s = new String(tempArr);
            return s;
        }
        public static void sort(String a[]) {
            for (int i = 0; i < a.length - 1; i++) {
                for (int j = i + 1; j < a.length; j++) {
                    if (a[j].compareTo(a[i]) < 0) {
                        String temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                    }
                }
            }
        }
    }
    

    好啦, 就这两块代码, 拷过去就直接用了!

    相关文章

      网友评论

          本文标题:微信小程序客服消息token验证

          本文链接:https://www.haomeiwen.com/subject/tjediftx.html