微信公众号开发-----验证消息的确来自微信服务器(明文模式下)

本文主要是介绍微信公众号开发-----验证消息的确来自微信服务器(明文模式下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阅读本文前,请先认真阅读微信官方文档:微信公众号技术文档之接入指南

接入概述

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

1、填写服务器配置

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

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

本文主要介绍第二个步骤的代码实现。

第二步:验证消息的确来自微信服务器

  1. 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上
    (由于消息加解密方式选择的为明文模式,需加密模式时从官方文档下载Java部分代码,去除注释部分代码即可)

    /*** 消息加解密接入*/
    public class EntryController extends Controller {public void accept() throws IOException {String method = getRequest().getMethod();if ("GET".equals(method)) {doGet();//开发者模式验证}else {doPost();//接收消息}}/** 响应get请求,微信默认token校验时使用get请求*/private void doGet(){//接收微信用来校验信息的内置规定参数String msgSignature =getPara("signature");   // 微信加密签名String timeStamp = getPara("timestamp");  // 时间戳String nonce = getPara("nonce"); // 随机数String echoStr = getPara("echostr"); // 随机字符串创建加密类//WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WechartConst.Token, WechartConst.EncodingAESKey,WechartConst.appId);// // 比对msgSignature 用token, timeStamp, nonce加密的参数是否一致,一致证明该接口来自微信,异常则不是来自微信//String echostr = wxcpt.verifyUrl(msgSignature, timeStamp, nonce, echoStr);// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败//获取微信服务器中配置的Token的值String token = SystemConfig.WECHAT_TOKEN;if (WechatUtil.checkSignature(msgSignature,token, timeStamp, nonce)){//原样返回echostr参数内容renderJson(echoStr);}}
    }
    
  2. 开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
    1)将token、timestamp、nonce三个参数进行字典序排序
    2)将三个参数字符串拼接成一个字符串进行sha1加密
    3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    public class WechatUtil {/*** 验证消息的确来自微信服务器* @param msgSignature 微信加密签名* @param token 开发者填写的token参数* @param timeStamp 时间戳* @param nonce 随机数* @return* @throws*/public static boolean checkSignature(String msgSignature, String token,String timeStamp, String nonce) {// 1.将token、timestamp、nonce三个参数进行字典序排序String[] arr = new String[]{token, timeStamp, nonce};Arrays.sort(arr);// 2. 将三个参数字符串拼接成一个字符串进行sha1加密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 = BytesParserUtil.byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(msgSignature.toUpperCase()) : false;}
    }
    

    注:代码中使用到的工具类请参考: 字节转换工具---- BytesParserUtil

这篇关于微信公众号开发-----验证消息的确来自微信服务器(明文模式下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592327

相关文章

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M