您的位置:首页 > 编程语言 > Java开发

Jfinalweixin源码分析--签名检测的那些事儿

2016-01-29 00:00 281 查看
摘要: 你想知道微信传递消息的过程么?你知道假如让你编写一个weixin消息处理框架的时候,你需要注意些什么样的问题么?你想知道一个好的开源框架的评判标准么?假如你想,来吧,老司机带你庖丁解牛,脱光了,让你看!!

框架的理论参考从哪儿来?

很多人刚刚看是看源码的时候,都会想到一个问题,就是说,作者这些个思路都是从哪儿来的?为什么他有思路,我就没有思路,是不是我自己就比别人要笨了?其实这个问题,我也思考过很久,直到我看到这个,我才发现,不是我笨,是我眼界不够开阔。

所有的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 html