00:00
上堂课呢,我们引入了微信支付的SDK,并且呢获取了商户的私钥,那么这堂课呢,我们先来看一下微信支付的接口规则当中的证书密钥使用说明。好,我们来看一下这个图啊,这个图的这一部分内容完整的描述了一个我们的商户和微信支付平台之间的一个请求和响应的流程,那么你会发现呢,在这个地方,M代表的是商户,W代表的是微信支付平台,所以呢,当我们的商户向微信支付平台发送请求的时候,我们的商户这侧呢,要用商户的私钥对我们的请求进行签名,然后将请求发送出去之后呢,微信支付平台那一端用商户的公钥进行签名的验证,这是一个很典型的非对称加密的一个过程哈,好,那么微信支付呢,对请求进行处理之后,再给我们发回响应之前。
01:04
他先要用平台的私钥对响应的数据进行签名,签完名之后呢,把响应发送回来,然后接下来呢,我们商户这一侧要用平台的公钥对响应的数据呢,进行签名的验证,验证成功了之后,我们才会做进一步的处理啊,所以这个呢,是一个完整的请求和响应的流程,那么对于我们商户这一端的编程的过程来说呢,那实际上我们编程的过程呢,要实现计算签名和验证签名的过程,那我们之前引入的这个SDK呢,它能够帮助我们去完成复杂的计算签名和验证签名的过程,但是呢,需要我们为这个SDK里面的啊一些组件提供一些必要的参数,比如说你要完成签名的计算,那你是不是要给人家提供私钥啊,对不对啊,比如说你要完成签名的验证,那么我们是不是得拿到。
02:05
商户的公钥啊好,这样的话呢,我们就来看一看,通过SDK一个完整的请求和响应的这样的一个代码应该怎么去写。SKSK。实现了请求签名的生成和应答签名的验证的这样的一个过程,那我们来找一下实现整个的啊,这一个过程的完整的代码。他已经给我写好了,我们把它引入到项目当中就可以了。这块。这块呢,就是实现了一个完整的请求发送和获取响应的一个流程,那么核心的代码呢,在这块。这块呢,就是我们通过一个builder这么一个对象,要创建一个http client对象,那么这个http client对象呢,它会执行一个SQ的方法,SQ的方法执行成功了之后呢,我们就会得到一个响应,好,那整个这个过程实际上呢,就是请求的发送和响应的过程。
03:18
在这个短短的这一行代码里面,其实呢,就隐含了商户端要计算签名,并且呢,返回的时候呢,要对签名进行校验的一个过程,那么之所以这行代码能做这么多事情,完全是因为前期我们做了一些准备工作,对不对?所以呢,我们要看一下前期我们都做了哪些准备工作好,我们呢,先来看一下它这个的说明啊,叫定时更新平台证书功能。这个是什么意思呢?大家想一想,这面我们要对我们的微信平台端返回的结果做验签的话,是不是要拿到平台的公钥啊,那么平台的公钥之前我们学这个安全认证的时候曾经学过这个公钥呢,为了防止被冒用,是不能够直接在网上分发的,那么我们会以证书的形式分发,所以呢,我们要拿到微信平台的公钥呢,其实就意味着我们要拿到微信平台的证书啊,那证书呢,我们也学过,他呢,是有有效期的,那么为了保证这个平台证书呢,永远不过期,所以呢,在这个SDK当中,它给我们提供了一个定时更新平台证书的功能,只要我们使用这个类。
04:35
那么我们的平台证书呢,就可以通过定时器呢,去自动的去定时下载,那具体怎么下载呢?我们不用关心,因为整个这个类里面呢,已经给我们封装好了,我们只需要为这些类提供必要的参数就可以了,好,那最后验证签名的过程就由这个签名验来帮助我们实现,所以呢,在这个build的组当中呢,是需要这个签名验证,那同样在这个htp client的对象的生当中呢,它是依赖于这样的一个build的,那因此呢,我们的htp client所执行的这个程请求呢,它就是能够进行自动签名的了,好,同样呢,他拿到的这个响应方法呢,也是能够进行自动的验签的啊,所以在这个过程当中,我们只需要把整个这段代码它需要的参数给它配置上,然后一系列的签名和验签的过程呢,就在这个里面就自动发生了。
05:33
接下来呢,我们在这个位置复制一下这段代码,把它整合到我们的项目当中。那在我们项目当中,我们打开这个微信配啊,然后呢,在这个里面呢,我们写一个代码。呃,我们写一个叫get微信吧。就是获取。微信支付的一个远程请求对象。
06:02
我们把刚才这段代码呢,先给他复制进来,然后我们最终要得到的呢,实际上是这个close包HTP,那这码我们的主要目的呢,就是把这个HTP就行了,请求我们后调用具体的发,所以这段代码呢啊,我们就把它删掉了,然后整个这个方法的返回值呢,就是close htp client。好,这是这个方法的定义啊,然后接下来呢,我们就来把这个代码呢,给它优化一下啊,因为这个呢叫做签名验证器,也就是说我们商户端获取到的可以进行签名验证的这样的一个对象,那么这个对象呢,在后面其他的位置我们要用,所以呢,我们可以把它呢分离出来,把它抽取出来写到另一个方法里,Get very。
07:03
好,那么这个方法的返回值呢,就是他我们把它通过这种形式定义出来,然后接下来呢,在。这个里面啊,我们呢,就要到刚才这个名,所以我们刚才得到的这个来做个称啊,并且呢,我们想要这个方法呢,可以自动的被执行,所以呢,我们可以在这个地方写一个B啊,因为这个里面其实是啊封装了我们的所有的下载这个平台证书需要的一些参数的,所以这个方法呢,我们不希望它执行多次,那我们就写一个at b,让应用程序一启动的时候呢,它执行一次就好了。接下来呢,在这个里面我们呢,就可以传入这个验证对象了,复制过来啊,因为名字比较长好,所以呢,这个就是我们的。
08:12
获取签名验证器。然后这个。获取HTTP请求对象,好,我们把这个方法呢,再给他做完善啊,那么首先这面我们要把它返回对HTTP。好,然后接下来呢,我们把这些数都替换一下,那首先呢,这个是商户ID,商户ID呢,就是前面我们这个MID。
09:00
好,然后这个呢,是商户序列号。就是商户序列号好,然后这面呢,是我们的商户的密钥,商户的密钥呢,上节课我们是通过这个方法得到的。所以我们在这个前面写一下,叫做get,好,然后传一个参数,传的是密钥路径。好,通过密钥径呢,我们会得到一个商户密钥。接下来呢,我们把商户密钥呢,放在这个位置。那上面这个方法就写好了,我们再给他做一个注释啊,这面呢是获取商户,实际上我们更准确的说呢,是它的私钥对不对啊,密钥如果是非对称加密的话,这个密钥分私钥和公钥,那么我们这边呢,是私钥好,然后接下来呢。
10:07
这个地方。我们得到的呢,是一个私钥签名对象啊,最后啊,整个应用程序SDK的内部啊,对我们的数据。这面做签名的时候呢,它要依赖于这个对象去做哈,然后我们把私钥签名对象呢,放在这个位置。好,接下来呢,这个匿名对象呢。我们也给他独立的创建出来。他是什么呢?他是身份认证对象,好,最后。
11:05
我们拿到这个微信端给我们的响应的时候呢,要做验签,那么验签的主要的目的呢,其实就是做身份认证,我们要确认这个是真正的微信端,而不是一个黑客伪造的或者是冒名顶替的微信端,对不对,所以说呢,这个是身份认证对象啊,然后接下来呢,我们把这个身份认证对象呢也传递过来。好,然后再接下来呢,这块呢,传递的就是我们的对称加密的密钥了啊,那因为在后续的过程当中,大家看啊,往后后续的过程当中呢,我们还是需要做对称加密的啊,因为在数据传输的过程当中,很有可能会有一些非常大的一些数据啊需要传输,所以呢,在传输这个数据量比较大的数据的情况下呢,那我们呢,是需要用对称加密的密钥这边加密,然后这边解密,所以呢,我们最终要封装的啊,最终的这个HTP对象这个里面呢,它肯定是要携带这个对称加密的密钥的,所以那在这个步骤当中呢,我们把这个密钥呢,也封装到这个very fair里面,然后最后呢,把这个very fair呢,再设置到我们最终的这个htp client里面啊,那这样的话,整个我们的请求的发送。
12:28
还有接收啊的完整的流程当中的签名和验签,乃至于后面的对称加密。解密对不对,必要的这些参数呢,我们就都封装到了哪儿啊,就都封装到了这个HTP的对象里。那最后呢,我们再把get微信client这个方法里面的没有完善的内容呢给它完善,那么同样这个是我们的MCHD商户号,这个是我们的商户的证书的序列号,那这个依然是我们的商户的私钥。
13:07
所以呢,我们把这个布置一个。过来粘贴到这个位置,把它替换一下。好,那么最后呢,我们要在这个位置添加一个B啊,让整个的这个对象呢,也可以在应用程序启动的时候自动的被创建出来。
我来说两句