00:02
上堂课呢,我们了解到了微信支付平台的平台证书的一个下载,那么这堂课呢,我们继续上堂课的内容,当我们已经成功的下载到了平台证书的时候,此时如果我们能够拿到微信的响应的话,那么我们呢,就可以从已有的平台证书当中解析出微信公钥,然后呢,从微信给我们发送的响应当中获取出签名,接下来呢,用公钥对签名进行验证,那实现一个验签的流程,所以呢,我们这堂课来分析一下这个验签的具体的流程,以及它的底层的代码是如何实现的。那我们先来在我们的应用程序当中呢,以debug的形式把它启动起来,那我已经启动了哈,然后接下来呢,我们再找到我们的源码当中验签的源码。还是找到微信支付的。
01:01
源代码,com.github。在这个位置啊好,然后接下来呢,我们找到这个里面的O,那么这个呢,就是执行验签的源代码了,我们打开它。那这里面呢,有一个方法叫validate,这个呢就是验签方法,我们在这儿呢,设置一个断点,然后接下来呢,我们在我们的后台吧,先将我们的控制台。的日志清空一下,我们在我们的网站端啊,点击一下确认支付,这个时候呢,他就开始进入到我们的确认支付的API的接口调用当中,就会进入到我们的。源代码当中好进来了,那么我们先来看一下它是如何一步一步的进到我们的这个two这个源代码当中的,啊,我们先找到我们的方法调用站第八个。
02:02
那么在方法调用站当中呢,首先我们点击前端确认支付的时候,那么一定是来到了我们的controller层的native配这个方法对不对?接下来呢,从我们的native pay调用我们的service的native pay,也就是这方法调用站的上一个方法,好,那么进入到native之后呢,他在native当中最终执行的是这个微信配client的Q的方法,那么在这个Q的方法当中呢。好,进来,他又继续执行了当前这个对象当中的另一个SQ的方法,然后一层一层的向上执行。再往上。那么执行到这儿之后呢,实际上就是咱们前面曾经看见过的这个方法了,叫做TE with signature,那么之前我们分析这个方法的时候呢,分析的是这个步骤。
03:01
接下来就是执行,执行完了之后得到一个响应,那么响应之后就是我们的。对应答的这个验签了,好,所以整个这个流程其实就是一个验签的流程,那现在到这儿为止,我们的代码已经走到这个第79行这了,所以呢,整个的流程在这个地方就体现出来它的。签名流程。请求发送的流程以及响应拿到之后的这个验签流程了,那么验签的细节在哪呢?验签的细节呢,就在这个validd的方法里,所以进一步我们再来看刚才我们设置端点的这个方法,就是这个validate方法,那么在这个validate方法里面呢,首先第一个步骤,它先对啊所有的响应里面的这个数据做一个校验,好我们进入到这个valid parater这个方法当中。好在这个方法当中呢,他首先拿到了我们整个这个请求响应流程当中的请求的ID,对这个ID呢,做一个。
04:10
非空校验啊,如果这个ID为空的话,那么就直接报错了,如果ID不为空的话,那么就把这个ID呢先获取出来。所以这个地方呢,我们获取ID,获取ID之后呢,他组织了一个字符串数组。接下来呢,他对这个这个数组进行遍历。好便利的过程当中呢,首先啊,拿到了我们的。We进行判断,看它是不是,如果是那的话呢,那就报错了,如果不是的话呢,那么就进行下一个数据的获取,那么下一个数据获取出来之后呢,是签名,好那么判断一下微信给我们发送的响应是否携带了签名,如果没有携带签名,那么就报错,好如果携带签名,那再来判断一下有没有携带一个随机数过来啊,如果没有随机数,那么就报错,如果有随机数的话,那么在下一个啊最后一个呢,就是这个里面配置的叫时间戳啊好,那如果时间戳定义了的话,那么就直接执行下面的代码,如果时间戳没有定义的话,那么就报错啊,也就是说整个的这个for循环里面,它要检验的就是微信在它的响应当中有没有给我们携带。
05:40
这几部分的信息如果携带了,那么就继续执行,如果微信给我们的响应没有携带这个部分的信息,那么我们就拒绝执行了,那也就意味着实际上可能远程的服务器并不是微信,是黑客。因为微信给我们发回的响应呢,一定是合法的啊,一定是根据我们的这个约定发送的,好接下来呢,我们再继续往下执行。
06:07
那整个四部分的内容我们已经遍历完了,遍历完了之后呢,他从ER呢,目前为止就是最后啊一项内容了,那最后一项内容呢,刚才啊,我们是获取了时间戳,那也就是说在这个位置呢,他把时间戳字符串获取出来。所以这个是时间字符串,然后呢,通过这个时间字符串创建了一个时间的实例。好,这个实例是什么呢?代表的是这个微信给咱们发送响应的时候,那个时间错。他用微信给咱们发送响应的时候的那个时间戳实例和此时此刻做对比。对比,如果发现这个时间大于,这是多长时间大于五分钟了,那么怎么样呢?往下走,你现在肯定已经大于五分钟了啊,我因为我这边已经讲了好几分钟了,好往下走,那么你会发现他就会报告错误,报告什么错误呢?报告超时错误啊。
07:17
那这个地方呢,就是超时错误,是超时的意思。那么再往下执行呢,就报错了啊好,那我们把这个代码执行完,所以刚才我们执行的流程呢。走了一个什么样的一个具体的一个路径呢?首先进入到valid这个方法当中,然后对微信在响应当中携带的各项基本数据做校验,那么校验的过程呢,要判断啊,他们是不是空,除了判断这几个数据是不是正确的携带了之外呢,还要判断它的这个响应返回的时间和我们真正接收到这个响应的此时此刻有没有超过五分钟,如果这个响应发送的时间和我们接到的时间中间时间隔的太长了,就证明中间好像经过拦截了,经过处理了,对不对?那么我们认为呢,这个响应是不安全的啊,那么我们可以拒绝应答,所以这个呢叫拒绝过期应。
08:20
在我们的微信的文档当中,这边呢,有一个叫做呃接口规则。常见问题,签名相关这一块呢,有一个。明确的说明叫htp authorization中的与发起请求的时间不超过分钟。如果超过五分钟了的话,那么就要报错了,所以他这个是报错啊,那他这块描述的是我们签名的时候,就是我们这个。商户端的请求啊,向微信发送的时候,那如果我们这边发的时候,和微信这边接的时候。
09:02
中间超过五分钟了,那么微信这面呢,就会给我们返回一个401。就是这个401啊,当然了,同样的道理,如果微信这一端给我们发响应的时候,我们这边接收的时间和微信这边发送的时间中间如果也超过五分钟了,那么呢,我们也拒绝微信的这样的一个响应啊,我们就退出程序就不做处理了。
我来说两句