Jfinalweixin源码分析--签名检测的那些事儿
2016-01-29 00:00
281 查看
摘要: 你想知道微信传递消息的过程么?你知道假如让你编写一个weixin消息处理框架的时候,你需要注意些什么样的问题么?你想知道一个好的开源框架的评判标准么?假如你想,来吧,老司机带你庖丁解牛,脱光了,让你看!!
所有的Jfinal微信sdk的方法和理论依据,他都是来自https://mp.weixin.qq.com/wiki/home/index.html,所以,当你结合这个文档看的时候,你会发现,作者仅仅是用自己的方式将这里的接口请求包装了一层,让我们不用太关心底层的实现而又能够完成我们的开发任务。
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
(不懂的自己去看文档)
在这里,我们关键是去看第二步,这一个是我们今天的重点,有人说,这个过程我知道,你不用给我说,我只想问你一句,假如我让你实现这么个过程,你怎么做?我现在就掰开Jfinalweixin这个开源框架的代码,脱光了给你看,免得你们说我忽悠你。
signature
微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp
时间戳
nonce
随机数
echostr
随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
通过以上过程,我们可以猜出来,我们需要接受上述的四个参数,然后对其进行加密,然后在进行比对,为什么要这样?就是为了确定,这个信息,他真的是从微信来的,不从什么别的什么异性来的?
什么?你不信?别急,准备好锄头和黑驴蹄子,兄弟我带你去挖坟盗墓!!!
怎么样,释怀了吧?这就是检测的全过程,这里只是列出了一点点东西,如果你有兴趣,先到这里玩一下,你就知道我刚刚说的是什么了?
好了,这个第一步关于微信的检查 我就说到这里。不懂的留言吧。明天继续挖坟,绝对让你通透!!如果觉得好,赏个赞,留个言鼓励下吧!!挖坟其实能挖到不少好东西了!
框架的理论参考从哪儿来?
很多人刚刚看是看源码的时候,都会想到一个问题,就是说,作者这些个思路都是从哪儿来的?为什么他有思路,我就没有思路,是不是我自己就比别人要笨了?其实这个问题,我也思考过很久,直到我看到这个,我才发现,不是我笨,是我眼界不够开阔。所有的Jfinal微信sdk的方法和理论依据,他都是来自https://mp.weixin.qq.com/wiki/home/index.html,所以,当你结合这个文档看的时候,你会发现,作者仅仅是用自己的方式将这里的接口请求包装了一层,让我们不用太关心底层的实现而又能够完成我们的开发任务。
微信的运行原理
1、填写服务器配置2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
(不懂的自己去看文档)
在这里,我们关键是去看第二步,这一个是我们今天的重点,有人说,这个过程我知道,你不用给我说,我只想问你一句,假如我让你实现这么个过程,你怎么做?我现在就掰开Jfinalweixin这个开源框架的代码,脱光了给你看,免得你们说我忽悠你。
如何验证服务器地址的有效性?
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:signature
微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp
时间戳
nonce
随机数
echostr
随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
通过以上过程,我们可以猜出来,我们需要接受上述的四个参数,然后对其进行加密,然后在进行比对,为什么要这样?就是为了确定,这个信息,他真的是从微信来的,不从什么别的什么异性来的?
什么?你不信?别急,准备好锄头和黑驴蹄子,兄弟我带你去挖坟盗墓!!!
开始挖坟,首先得找到洞口
MsgInterceptor.java public void intercept(Invocation inv) { Controller controller = inv.getController(); if (controller instanceof MsgController == false) throw new RuntimeException("控制器需要继承 MsgController"); try { // 将 ApiConfig 对象与当前线程绑定,以便在后续操作中方便获取该对象: ApiConfigKit.getApiConfig(); ApiConfigKit.setThreadLocalApiConfig(((MsgController)controller).getApiConfig()); // 如果是服务器配置请求,则配置服务器并返回 if (isConfigServerRequest(controller)) { configServer(controller); return ; } // 对开发测试更加友好 if (ApiConfigKit.isDevMode()) { inv.invoke(); } else { // 签名检测 if (checkSignature(controller)) { inv.invoke(); } else { controller.renderText("签名验证失败,请确定是微信服务器在发送消息过来"); } } } finally { ApiConfigKit.removeThreadLocalApiConfig(); } } /** * 检测签名 */ private boolean checkSignature(Controller controller) { String signature = controller.getPara("signature"); String timestamp = controller.getPara("timestamp"); String nonce = controller.getPara("nonce"); if (StrKit.isBlank(signature) || StrKit.isBlank(timestamp) || StrKit.isBlank(nonce)) { controller.renderText("check signature failure"); return false; } if (SignatureCheckKit.me.checkSignature(signature, timestamp, nonce)) { return true; } else { log.error("check signature failure: " + " signature = " + controller.getPara("signature") + " timestamp = " + controller.getPara("timestamp") + " nonce = " + controller.getPara("nonce")); return false; } }
怎么样,释怀了吧?这就是检测的全过程,这里只是列出了一点点东西,如果你有兴趣,先到这里玩一下,你就知道我刚刚说的是什么了?
好了,这个第一步关于微信的检查 我就说到这里。不懂的留言吧。明天继续挖坟,绝对让你通透!!如果觉得好,赏个赞,留个言鼓励下吧!!挖坟其实能挖到不少好东西了!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序