微信公众号开发-接入微信-1

微信公众号开发-接入微信

  1. 注册微信测试公众号
  2. 填写服务器配置接口配置
  3. 点击提交时,微信公众号会发送一个请求到配置的URL地址上,这个地址也作为接收用户发送微信消息和公众号菜单栏事件
  4. 代码实现
	/**
     * 接收微信消息和事件
     *
     * @return java.lang.String
     * @author marke.huang
     * @date 2018/9/26 0026 下午 4:29
     */
    @RequestMapping(value = "/doWxMsgOrEvent")
    public String doWxMsgOrEvent(HttpServletRequest request) {
        // 微信加密签名
        String signature = request.getParameter("signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        //  随机字符串 (基础配置使用)
		String echostr = request.getParameter("echostr");
        // 验证是否是微信的请求
        if (this.checkSignature(signature, timestamp, nonce)) {
            // 校验是否接入了微信
            // sysConfiguration.getPWxJoin()为自己实现的一个获取是否已经接入了微信公众号
            if (GlobalConstants.Flag.TRUE.equals(sysConfiguration.getPWxJoin()) ) {
                // TODO 处理消息和事件
            } else {
                // TODO 更新微信接入值
                // TODO 刷新缓存
                // 第一次接入微信,基础配置时返回
                return echostr;
            }
        }
        return null;
    }
	/**
     * 校验请求来源为微信
     *
     * @param signature
     * @param timestamp
     * @param nonce
     * @return boolean
     * @author marke.huang
     * @date 2018/9/26 0026 下午 4:33
     */
    private boolean checkSignature(String signature, String timestamp, String nonce) {
        // 与接口配置信息中的Token要一致
        String token = "123456";
        // 从请求中(也就是微信服务器传过来的)拿到的token, timestamp, nonce
        String[] arr = {token, timestamp, nonce};
        // 1.将token、timestamp、nonce三个参数进行字典序排序
        Arrays.sort(arr);
        try {
            // 2.将三个参数字符串拼接成一个字符串进行sha1加密
            StringBuilder content = new StringBuilder();
            for (int i = 0; i < arr.length; i++) {
                content.append(arr[i]);
            }
            MessageDigest md = MessageDigest.getInstance(GlobalConstants.SecureHashAlgorithm.SHA_1);
            // 将三个参数字符串拼接成一个字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            // 将加密字节数组转成16进制字符串
            StringBuffer hexstr = new StringBuffer();
            String shaHex = "";
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            String tmpStr = hexstr.toString();
            // 3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
            return tmpStr != null ? tmpStr.equals(signature) : false;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return false;
    }
  1. 参考资料微信公众号官方文档-接入指南

猜你喜欢

转载自blog.csdn.net/marke_huang/article/details/82907639