第二步:验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

第一步将token,timestamp和nonce这三个参数进行字典序排序,其实就是整体的用Arrays.sort()

// 1.将token、timestamp、nonce三个参数进行字典序排序
String[] arr = new String[] { token, timestamp, nonce };
Arrays.sort(arr);

第二部拼成字符串并进行sha1加密

// 2. 将三个参数字符串
StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}//sha1加密
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);

byteToStr()方法作用:将字节数组转换为十六进制字符串

private static String byteToStr(byte[] byteArray) {StringBuilder strDigest = new StringBuilder();for (int i = 0; i < byteArray.length; i++) {strDigest.append(byteToHexStr(byteArray[i]));}return strDigest.toString();}

byteToHexStr()方法作用:将字节转换为十六进制字符串

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;}

下面是完整的验证消息来自微信的方法:

/*** 方法名:checkSignature</br> * 详述:验证签名</br> * 开发人员:sony</br> * 创建时间:2017-12-29 </br>* * @param signature* @param timestamp* @param nonce* @return* @throws*/public static boolean checkSignature(String signature, 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 = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}

Servlet中的doGet方法中验证:

/*** 确认请求来自微信服务器*/@Overridepublic 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)) {System.out.print("echostr=" + echostr);out.print(echostr);}out.close();out = null;}

记录在这边防止忘记,希望能给需要的人带来帮助!

微信公众号开发入门 --验证消息来自微信服务器 (java)相关推荐

  1. 第四章 微信公众号开发之验证消息的确来自微信服务器

    之前直接写了怎么开发,忘了写怎么知道验证消息来自微信服务器,否则无法进行开发,先来看一下官方的开发文档怎么描述的 接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器 ...

  2. Java微信公众号开发入门:一、微信公众号简介

    微信公众号 微信公众号,是微信公众平台的一种账户类型,旨在为特定或公开用户群体提供信息.营销等服务.用户可通过关注公众号来使用特定服务,进行不同活动. 微信公众号主要包括三类:订阅号.服务号.企业号( ...

  3. 微信公众号开发入门教程第一篇

    微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...

  4. 微信公众号php编程,PHP编程:微信公众号开发之文本消息自动回复php代码

    搜索热词 <微信公众号开发之文本消息自动回复PHP代码>要点: 本文介绍了微信公众号开发之文本消息自动回复PHP代码,希望对您有用.如果有疑问,可以联系我们. 本文实例为大家分享了PHP微 ...

  5. 微信公众 php代码,微信公众号开发之文本消息自动回复php代码_php实例

    本文实例为大家分享了php微信文本消息自动回复 别代码,供大家参考,具体内容如下 1.PHP示例代码下载 下载地址1:http://xiazai.php.net/201608/yuanma/phpwx ...

  6. 微信开发学习总结(一)——微信公众号开发入门指引

    本节要求: ①微信公众号申请 ②测试公众号的注册 ③准备微信公众号开发的环境 微信公众号开发入门指引 微信公众号的接入在微信公众平台-微信公众平台技术文档中有着详细的介绍.在进行微信开发前,建议先完整 ...

  7. java微信公众号开发token验证失败的问题及解决办法

    java微信公众号开发token验证失败的问题及解决办法 参考文章: (1)java微信公众号开发token验证失败的问题及解决办法 (2)https://www.cnblogs.com/beardu ...

  8. 微信公众号开发接收图片消息,获取用户发送图片的media_id

    现在的手机都有拍照功能, 而且人们拍完照后, 喜欢跟朋友分享. 微信公众号也提供了一个功能, 允许你的粉丝在后台回复图片, 你可以通过公众平台提供的api接口, 获取到图片media_id, 然后把图 ...

  9. 微信公众号开发C#系列-12、微信前端开发利器:WeUI

    本文目录 1.前言 2.WeUI基本介绍 2.1 WeUI概述 2.2 为什么选择jQuery WeUI 3.jQuery WeUI基本用法 4.其他基础组件展示 4.1.switch开关 4.2.文 ...

最新文章

  1. window.location.href如何多次请求_RabbitMQ如何保证幂等性?
  2. Linux ps aux指令詳解--转
  3. VTK:可视化之FrogSlice
  4. python论坛app_理解python web开发,轻松搭建web app!
  5. 利用Python实现用户群组分析!
  6. 使用WINPE在硬盘安装WIN7系统
  7. 无人驾驶五 使用pure pursuit实现无人车轨迹追踪(python)
  8. Android内容提供者(读取手机联系人信息)
  9. 自动驾驶_ROS简介
  10. 苹果平板怎么录屏_使用平板快速设计制作书写类教学视频
  11. u盘盘符不显示 win10_Win10不显示U盘的盘符怎么办丨Win10不显示U盘的盘符解决方法...
  12. 弹窗代码大全 弹窗广告代码
  13. 项目经理之项目经理应该做什么
  14. teamviewer 黑屏 linux,Teamviewer 在 Linux 下无法启动?
  15. 一文读懂什么是CTO、技术VP、技术总监、首席架构师
  16. CodeForces 1000A Codehorses T-shirts
  17. POI操作Excel实现导出
  18. 去了北京大兴机场后,我果断抛弃首都机场,去北京,首选大兴
  19. 『Origin』软件如何切换中英文界面?
  20. 一个简单的SpringMVC需要哪些jar包[Spring4]

热门文章

  1. MediaPipe Hands: On-device Real-time Hand Tracking 论文阅读笔记
  2. 炸穿地心?中科大软件学院出分了!
  3. 光时域反射仪OTDR性能、应用及工作原理
  4. python制作英语字典_Pyqt5实现英文学习词典
  5. openlayers学习——14、openlayers结合echarts图表和地图
  6. 两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一)
  7. 光电编码器的原理及应用场合_【技术浅析】编码器原理在数控系统维修中的应用...
  8. 听说你还在点击图片,然后鼠标右键设置电脑壁纸,小编教你如何实现自动更换电脑壁纸操作
  9. 计算机无法设置壁纸黑屏,Win7电脑壁纸变黑屏怎么办?不妨试试设置这些地方吧...
  10. 利用腾讯云进行上传文件