• 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,看服务器是否可以打印日志。

  • 相关阅读:
    《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
    《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
    《CMake实践》第三部分的示例代码的错误
    利用 autoconf 和 automake 生成 Makefile 文件
    如何安装 罗技“优联技术”无线鼠标、无线键盘?
    make 和 makefile 的关系
    编译器 cc、gcc、g++、CC 的区别
    如何撤销 PhpStorm/Clion 等 JetBrains 产品的 “Mark as Plain Text” 操作 ?
    Linux/Ubuntu tree 命令以树形结构显示文件夹目录结构
    C/C++ 静态链接库(.a) 与 动态链接库(.so)
  • 原文地址:https://www.cnblogs.com/yyanghang/p/13536363.html
Copyright © 2020-2023  润新知