zoukankan      html  css  js  c++  java
  • Spring Boot 微信公众号开发(一)

    一、接入概述

    进行微信公众号开发,进行服务器配置是必不可少的,通过配置,公众号粉丝与公众号交互的消息将发送至开发者服务器,开发者对消息进行处理,例如:配置后,用户关注公众号或取关时,消息将发送至开发者配置的URL上,开发者即可根据事件类型进行处理,并且,开发者可获取用户openid、unionid,给粉丝发送模板消息等。

    接入微信公众平台开发,开发者需要按照如下步骤完成:

    1、填写服务器配置

    2、验证服务器地址的有效性

    3、依据接口文档实现业务逻辑

    二、实现

    1、配置

    1.配置入口:微信公众号官网 -> 基本配置

    2.点击修改配置

    3.填写参数

    2、代码

    1.工具类,校验token工具类,此处的token要和服务器配置里的token保持一致:

    
    
    /**
     * @author yh
     * @date 2020/8/20 16:05
     * @description: token验证工具类
     */
    public class SignUtil {
        //与服务器保持一致
        private static String token = "*********";
    
       /**
        * @author: yh
        * @description: 校验签名
        * @date: 2020/8/20
        * @param signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        * @param timestamp 时间戳
        * @param nonce 随机数
        * @return boolean
        **/
        public static boolean checkSignature(String signature,String timestamp,String nonce){
            String checkText = null;
            if (null != signature) {
                //对ToKen,timestamp,nonce 按字典排序
                String[] paramArr = new String[]{token,timestamp,nonce};
                Arrays.sort(paramArr);
                //将排序后的结果拼成一个字符串
                String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
    
                try {
                    MessageDigest md = MessageDigest.getInstance("SHA-1");
                    //对接后的字符串进行sha1加密
                    byte[] digest = md.digest(content.toString().getBytes());
    
                    checkText = byteToStr(digest);
                } catch (NoSuchAlgorithmException e){
                    e.printStackTrace();
                }
            }
            //将加密后的字符串与signature进行对比
            return checkText != null ? checkText.equals(signature.toUpperCase()) : false;
        }
    
        /**
         * @author: yh
         * @description: 将字节数组转化我16进制字符串
         * @date: 2020/8/20
         * @param byteArrays 字符数组
         * @return java.lang.String
         **/
        private static String byteToStr(byte[] byteArrays){
            String str = "";
            for (int i = 0; i < byteArrays.length; i++) {
                str += byteToHexStr(byteArrays[i]);
            }
            return str;
        }
    
       /**
        * @author: yh
        * @description: 将字节转化为十六进制字符串
        * @date: 2020/8/20
        * @param myByte 字节
        * @return java.lang.String
        **/
        private static String byteToHexStr(byte myByte) {
            char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
            char[] tampArr = new char[2];
            tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
            tampArr[1] = Digit[myByte & 0X0F];
            String str = new String(tampArr);
            return str;
        }
    
    }
    
    

    2.接口路径

    api包

    
    /**
     * @author yh
     * @date 2020/8/20 16:13
     * @description:
     */
    @RequestMapping("/WeChatApi")
    public interface WeChatApi {
        /**
         * @author: yh
         * @description: token验证
         * @date: 2020/8/20
         * @param request
         * @return void
         **/
        @GetMapping("/checkToken")
        String checkToken(HttpServletRequest request);
    }
    
    

    controller:

    
    /**
     * @author yh
     * @date 2020/8/20 16:15
     * @description:
     */
    @RestController
    @Slf4j
    public class WeChatController implements WeChatApi {
        /**
         * @author: yh
         * @description:
         * @date: 2020/8/20
         * @param request
         * @return void
         **/
        @Override
        public String checkToken(HttpServletRequest request) {
            String signature = request.getParameter("signature");
            String timestamp = request.getParameter("timestamp");
            String nonce = request.getParameter("nonce");
            String echostr = request.getParameter("echostr");
            log.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
            if(SignUtil.checkSignature(signature, timestamp, nonce)){
                log.info("数据源为微信后台,将echostr[{}]返回!", echostr);
                return echostr;
            }
            return "";
        }
    }
    
    

    3.提交

    点击配置图中的·提交·按钮,并测试

    3、常见问题

    ​ 最常见的问题就是提示token验证失败了,token验证失败可能是接口访问不到,也可能是接口内代码校验失败,注意检查token与代码中是否一致。如果代码确认无误,只需保证接口可以访问到就可以了,所以可以先在浏览器中输入URL,看服务器是否可以打印日志。

  • 相关阅读:
    动态svg图片简单制作
    5418.二叉树中的伪回文路径
    5417.定长子串中元音的最大数目
    76.最小覆盖子串
    1371.每个元音包含偶数次的最长子字符串
    680.验证回文字符串II
    152.乘积最大子数组
    5397.最简分数
    5398.统计二叉树中好节点的数目
    5413.重新排列句子中的单词
  • 原文地址:https://www.cnblogs.com/yyanghang/p/13536363.html
Copyright © 2011-2022 走看看