微信 - 接口配置及外网映射《巨详细》

作者: 司鑫 | 来源:发表于2017-01-07 17:49 被阅读639次

    1成为微信开发者

    • 申请微信公众号
    • 补全基本资料,公众帐号头像、描述和运营地区。

    2 接口配置

    • 进入配置页面:基本配置 > 修改配置

    其中

    • URL:指的是能够接收处理微信服务器发送的GET/POST请求的地址,并且是已经存在的,现在就能够在浏览器访问到的地址,这就要求我们先把公众帐号后台处理程序开发好(至少应该完成了对GET请求的处理)并部署在公网服务器上,如果是测试的话可以使用ngrok(一会详细会讲使用说明 )

    • Token :可以自己随意填,但是要和后面服务器的保持一致

    3 填写服务器配置


    点击提交后,服务器会收到由微信服务器发送过来的GET请求,请求参数如下:

    • signature :微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    • timestamp 时间戳
    • nonce 随机数
    • echostr 随机字符串

    服务器需会对signature进行校验,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

    4 具体代码(JAVA)

    DealServlet.class 核心处理类

    @WebServlet("/do")
    public class DealServletextends HttpServlet {  
        private static final long serialVersionUID = 4440739483644821986L;  
      
        /** 
         * 确认请求来自微信服务器 
         */  
        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");  
      
            PrintWriter out = response.getWriter();  
            // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,
                否则接入失败  
            if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
                out.print(echostr);  
            }  
            out.close();  
            out = null;  
        }  
      
        /** 
         * 处理微信服务器发来的消息 
         */  
        public void doPost(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException {  
            // TODO 消息的接收、处理、响应  
        }  
      
    } 
    

    SignUtil.class 校验工具类

    public class SignUtil {  
        // 与接口配置信息中的Token要一致  
        private static String token = "weixinhaha";  
      
        /** 
         * 验证签名 
         *  
         * @param signature 
         * @param timestamp 
         * @param nonce 
         * @return 
         */  
        public static boolean checkSignature(String signature, 
            String timestamp, String nonce) {  
            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) {  
                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;  
        }  
    }  
    

    其中需要注意的一点就是SignUtil类中的Token需要和服务器配置的Token保持一致,这样编码就结束了。

    果在服务器配置的时候填的是外网地址,那么点击提交后会显示提交成功了。

    没有外网地址的童靴可以往下看咯

    5 ngrok外网映射


    1. 首先我们需要先下载ngrok,自行百度下载。
    2. 下载完后,进行解压。
    3. 创建一个批处理文件,并进行编辑
    ngrok
    1. 运行该批处理
    运行成功

    这样整个配置就结束了

    测试

    当我们看到这个页面就说明我们配置成功了,只需要将该地址放入服务器配置中的url点击提交即可

    提交成功

    《待续》
    喜欢的话戳一下喜欢呗。
    有什么建议的话希望大家能在下方回复😋

    相关文章

      网友评论

        本文标题:微信 - 接口配置及外网映射《巨详细》

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