00:02
接下来呢,我们这堂课就来分析一下我们的微信支付的SDK的底层是如何获取平台证书的。我们打开我们的后台代码。找到微信配。那么在这个代码当中呢,我们有两个并对象创建出来了一个呢,是。签名验证器一个是HTTP请求对象,那么HTTP请求对象的创建呢,要依赖于这个签名验证器。签名验证器它主要的功能呢,就是做签名验证,签名验证的前提就是获取平台证书,所以我们来看一下这个代码当中,它的底层是如何获取平台证书的,我们在这个位置设一个断点,并且呢用debug的模式启动我们的应用程序。好,我们的应用程序的启动了,因为呢,我们是在这个配置文件当中添加了B这样的一个注解,所以呢,应用程序启动的时候呢,代码呢就会被执行,那么现在呢,我们的代码已经执行到了第八十五行这个位置,所以呢,我们来看一下啊,在第八十五行这个位置呢,我们进入到这个代码的源码当中,我们点击。
01:21
Step into。好,我们进入到了我们的schedule update CIF very啊这个构造函数当中,那么这个构造函数呢,它接收了两个参数,一个呢是我们之前传递进来的一个叫身份认证对象啊身份认证对象里面呢,封装了我们的商户号以及商户的私钥,还有一个呢,就是我们的商户的对称加密的密钥。好,接下来呢,我们往下执行,那这块呢,是获取了一把锁。再往下,那这面呢,是通过一个模式获取了一个证书管理器。
02:00
再往下这面呢,就是通过我们的身份认证对象和我们的API的对称加密的密钥呢,然后传进去之后呢,去初始化我们的证书管理器,我们进去看一下step into。好在这面呢,先对前面的这个参数进行了一个校验,非空校验好,然后呢,我们来到下一步。那么如果参数校验没有问题的话呢,我们呢,在证书管理器这个单利对象当中呢,进行一个初始化的方法,那么这个初始化方法呢,它传递了三个参数,除了前面我们的这两个参数之外呢,还有第三个参数,第三个参数的值呢是60,那这个60呢,是60分钟,什么意思呢?啊,它会每隔一个小时检查一下是否有新的平台证书,那么如果有新的平台证书的话呢,它会每隔一个小时进行自动的下载,所以呢,这个地方传的是时间啊这样的一个参数,那我们进入到我们的这个方法当中来。
03:06
好,进来之后呢,首先也是对几个参数进行校验,如果参数没有问题的话,我们来到下一个步骤,那下一个步骤当中呢,我们呢,就对这些实例进行初始化,也就是说使用这些参数呢,对我们当前这个类当中的成员呢进行初始化。好,所以呢,我们来依次的进行初始化操作。那么这里面呢,最重要的两个对象呢,其实是后面这两个,一个呢是执行定时任务的这么一个执行器对象,还有一个呢,是存储商户证书列表的这么一个证书列表对象。接下来呢,我们来看下面这个步骤,叫初始化证书,我们进去。Download and update,那么通过这个名字我们也可以猜测到这个方法真正执行的就是的下载和更新了。好,我们进入到这个方法当中。
04:05
那上面这个地方,很显然这是一个htp client对象的一个创建的过程,那这个类叫TP client。见过他对不对,所以他呢是实际上初始化了一个htp client对象,那么在这个地方为什么要初始化这个对象呢?因为他要发送远程请求啊,这个远程请求是什么呢?我们来看一下文档,就是我们获取平台证书的这个API,那么我们获取平台证书的API呢,是这个地址。所以现在呢,他要用这个地址呢,去做一个远程API的调用。把平台证书呢下载下来,那下载平台证书的API呢,和我们其他API的调用方式呢是一样的,同样也都要先初始化htt client对象啊,然后接下来呢,我们对这个htt对象呢,做一系列的初始化之后,在这个地方它使用get方式啊进行平台证书的下载,那么这个。
05:14
常亮,你会发现就是我们下载平台证书的地址。对比一下。是不是就是它呀,所以呢,我们的后台的源码当中,正是在用这个API地址发起远程连接,帮助我们去下载平台证书。好,我们再回到源码当中来。在接下来呢,在这面就执行了这个远程请求的发送,并且呢得到了响应,然后我们从响应当中呢,先获取响应码啊,然后这个位置对响应码进行判断啊,然后呢,这个位置对响应体进行获取,那么这面响应码一旦是成功的响应的话,那么我们就从我们的响应题当中去解析出内容了,那么。
06:10
微信在给我们发送响应的时候呢,他把证书的内容放在了响应题当中,那响应体当中的这个内容呢,是被微信加密之后发送过来的,那他加密的方式呢,用的是我们商户端的对称加密的密钥。所以呢,我们这边要用我们商户端的对称加密的密钥进行解密。那这个过程呢,实际上就是。微信端给我们返回平台证书的一个过程,那你会发现我们下载平台证书也是一样的,先向微信服务器发起一个请求,然后微信服务器呢,在给我们返回平台证书之前呢,他先用我们的商户的对称加密的密钥对内容呢进行加密,加密完了之后呢,把响应给我们返回回来,我们拿到这个响应之后呢,要先用对称加密的密钥对这个响应内容呢进行解密,解密之后呢,我们才能真正的拿到这个平台证书。
07:20
好,我们回到代码当中来。所以呢,这个位置呢,就是对我们的响应的内容呢,这个是响应题,这个呢是我们的对称加密的密钥,好然后呢进行解密,解完密之后呢,就生成了一个证书列表,那么这个证书列表呢,我们会判断一下它是不是空,如果不是空的话呢,那么我们就清除以往的旧的证书列表,那么把新的证书列表呢,放在我们的certificate这个属性当中,所以这个certific这个属性呢,存储的就是我们的证书列表了,那么到这为止,我们的证书呢,就下载下来了,好,我们回到前面的代码。
08:09
好,回来了,回来之后呢,我们再往上一步。然后初始化证书之后呢,这面就是启动定时更新任务了,那么在这个位置我们会创建一个新的线程,这个线程的名字呢,叫做schedule update thread啊,专门啊启用定时任务去更新证书的这么一个线程,然后接下来这个位置就是来进行证书的更新。好,那么这个runable对象呢,就是一个定时更新证书列表的这么一个对象了,那我们怎么启动它呢?我们通过前面我们定义的这个executor这个对象啊,用它呢来定时执行,那定时的时间呢,在这就是分钟,然后呢啊具体是分呢,十分那个。
09:04
定义的时候传进来的这个60啊,这个数值好,那意思呢,就是每隔60分钟执行一下这个runable里面定义的这个自动更新证书列表的功能,好,那这个方法呢,就执行完了。然后我们再回到上一级代码。再回到上一集代码。好,那整个这个update certific very呢就执行完毕了,再回来就回到了我们啊,自己编写的这个微心配肯这个地方,那接下来。就可以行获client步骤。好,那所以接下来呢,我们就进入到了获取htp client方法当中。那么。
10:13
好,那现在呢?我们的应用程序已经准备好要发送远程请求的htp client对象了,并且在这个流程当中,我们已经下载好了我们验签所需要的平台证书。
我来说两句