00:00
上节课呢,我们分析了一下,针对我们的响应进行验签的一个超时的流程,那这节课呢,我们来分析一下正常的流程,首先呢,我们先把之前我们在这设的断点呢先暂时去掉,然后呢,我们重新的执行一下确认支付这个功能。这个时候呢,我们在控制台上呢,会看到。Debug这面的响应,那么我们来分析一下这面的响应啊,这边的响应呢是这样的。在响应当中,我们可以明确的看到一个sign,那这个呢,就是微信的支付平台给我们响应当中的这个签名了,所以呢,我们要对这个签名呢进行验签,那具体如何去做呢?我们来看一下文档。文档当中呢,在接口规则开发指南签名验证这一部分呢,有一个验证签名的一个具体的流程,那么验证签名的具体的流程呢,就是。
01:02
从这块儿开始看。首先呢,要构造燕签名串。那么构造验签名串的过程呢?就是从我们的应答当中获取以下信息。从应答当中应该获取一个时间叫we pay,我们来从应答当中找一下有没有这个时间好,那这个呢,就是应答给我们返回来的时间戳。接下来呢,还要获取一个随机串,那么在应答当中呢,他也会给我们一个随机串啊,在接下来呢,从应答当中,我们要得到应答的主体。那针对于刚才我们支付的这个请求来说呢,我们的应答的主体呢,就是我们要得到的这个扣的URL啊,这是我们的应答消息的具体的内容,好,我们把这三部分的内容呢,要组装成这样的一个字符串,那么签名串一共有三行一。
02:04
杠N结束每一行的行位,那包括最后一行,所以呢,组装出来之后呢,我们的应答的验签名串呢,就是这个形式的,那么他举了一个例子啊,比如说某个HTTP报文的啊,一个应答的响应是这个样子的,那么最终组装完的这个验签名串呢,就是这样的,那这个呢就是时间戳,这个呢就是随机数,这个呢就是应答的消息的主体,那对于我们的例子来说,这块呢,应该就是那个二维码的超链接了哈,好,所以呢,我们验签的第一个步骤就是构造验签名串。好,我们呢,会以这样的形式组装出一个。燕签明串了,那么他给我们的例子呢?是长这个样子的。好,这个是我们验签的第一个步骤,那么验签的第二个步骤呢,就是获取应答签名,从微信支付的啊应答的T。
03:15
那。我们日当中,我以我们个把出来,我们后面的验签的流程。所以呢,这个是获取应答签名。那么是从这个位置。是通过这个位置传递的啊,然后他具体的形式呢,是长这个样子的。那么这是第二个步骤,获取应答签名,获取应答签名的同时呢,我们还要使用贝斯64对这个值呢进行解码。
04:04
好,这也是获取到应答签名之后,要对这个值进行解码,解完码之后才能真正的得到。我们要。解密的这个签名,因为我们还要用公钥对这个签名进行解密,那先要解码,解完码之后呢再解密啊。大家还记得我们之前在分析签名流程的时候,我们先摘要,摘要完了加密,加密完了用BASE64编码对不对?所以验签的流程呢,那首先要用BASE64解码。然后接下来最后一个步骤呢,就是验证签名的步骤了。验证签名这个步骤呢,首先呢。从微信支付平台的平台证书当中,要先获取到它的公钥。所以呢,这面就是假设已经获取了平台证书,并保存为微信啊,这个文件就是它,然后呢,首先从微信支付平台证书导出微信支付平台公钥,当然下面这块呢,它是有命令行做的,那我们相应的呢,在我们的程序当中呢,我们应该用SDK啊相关的方法来写。
05:20
所以呢,这面是验证签名这个里面。需要做的第一件事情,从平台证书当中导出支付平台的公钥。接下来呢,我们啊,要拿着我们刚才解码后的这个signature啊,当然这面啊通过命令行做的时候呢,就把这个我们解码后得到的这个应答签名呢,就保存为文件了,那我们在程序当中写的时候呢,就没有必要了,直接在内存当中去存这样的一个得到的这个解码后的应答签名就可以了,然后接下来呢,对签名进行验证,那么他验证的流程呢,是用公钥对我们解码后的签名呢进行解密,然后呢,用SHA256这个算法对前面我们构造的这个签名串,也就是他。
06:16
对构造的这个签名串呢,进行一个摘要运算啊,然后和刚才通过公钥进行解码的这个应答签名,因为他也得到了一个摘要,那么将这两个摘要字符串呢进行比对,这样的话呢,如果比对成功了,我们的签名呢就校验成功了,如果比对失败了,我们的签名呢就校验失败了。好,那么接下来呢,按照这个步骤呢,我们来看一下我们具体的应用程序的执行的流程,那所以这回呢,我们在应用程序的这个位置添加一个断点。我们再来点一下确认支付,让他去进入到刚才的断点当中。
07:00
那我们先跳过前面参数检查的这个步骤,那么你会发现在这块呢,通过build这个方法获取到了一个,那build这个方法做的是什么呢?它构建的正好就是一个。眼前明。所以通过build message,我们完成了第一个步骤啊,叫做构造验签名串。好,我们回到刚才这个位置,然后接下来呢,我们再从响应头当中拿到微信支付平台的平台证书的序列号。在接下来呢,我们从响应头当中拿到我们微信。支付平台的这个we pay sign,也就是说获取到我们的这个应答签名啊好,这个是sign。然后在接下来呢,就进行我们的签名校验的一个流程,那么我们需要做的呢,就是把平台证书的序列号,把我们刚才得到的这个验签名串,然后呢,再把刚才我们获取到的这个应答签名。
08:15
传进来。传递给这个这个方法。好,我们现在进入的是另外它中间执行的一个方法叫get bus,然后我们再进来,好,那这次呢,我们进入到了这个veryify,那么在very里面呢,首先啊,进行一个数的,再进行一个最新的平台证的。获取最新的平台证书,然后接下来呢,进行一个签名的校验的一个方法的执行,那么这个方法呢,又传递了平台证书序列号,传递了我们的验签名串,传递了我们的应答签名。好穿进去之后呢。
09:00
我们又来到了这个里面,在这个里面呢,它是通过这个过程获取到了我们的平台证书,因为这个参数呢,是平台证书序列号,这面呢,对这个平台证书序列号呢,做一个数据类型的转换。当然了,他仍然是序列号,然后通过这个序列号呢,就拿到了我们正确的平台证书,然后接下来呢,再次执行里面的另外一个verify方法。在这个方法里面,我们构建了一个。这个三对象呢,设置了我们验签需要用到的算法。然后呢,在这个地方呢,又对平台证书呢,进行了处理,我们看一下。那你会发现处理的过程呢,就是从平台证书当中呢,解析出我们的平台来啊,叫做get key。最后呢,对这个签名串呢进行处理。
10:03
好,那它update这个message的作用呢,就是将这个签名串呢,也放到这个对象里面来,那这样的话,我们这个对象里面呢,就有具体的验签的算法,还有呢,从平台证书当中获取的公钥,以及呢签名需要使用的这个验签名串。那现在呢,我们。进行就我们这个本信息呢,我们sign进行签名的验证,那么在对signat进行名验证之前呢,这面呢,会用BASE14对这个sign呢进行解码,也就是说对获取的这个应答签名。进行的贝斯64解码。好,那最终呢,得到了我们解码后的应答签名。那么我们再进入到这个ify方法,那这个ify方法里面的参数呢,就是我们解码后的应答签名了。
11:09
我们直接点进来啊。然后在这设个断点。好,然后执行下一个断点,好进来进来之后呢,我们来看一下这个and very这个方法。进去,然后呢,我们再看后面这个and verify这个方法。好,接下来呢,在这个WiFi方法当中呢,他做了两件事情,就是呢,判一下公钥是不是在,又判断一下这个签名字符串的长度是不是对啊,如果这个参数的校验都成功了的话呢,就开始真正的一个摘要比对的过程。摘要比对的时候,最后比对的呢是二和五这两个值,那么Y5呢,它是来源于Y4 Y3 Y1,也就是说Y5呢是来源于Y1,那Y1呢,其实就是这个参数,所以这个参数呢,实际上。
12:08
就是我们刚才得到的这个应答签名啊。那么接下来呢啊,通过Y1得到Y3,然后到Y4到Y5,所以整个的这个流程你会发现其实他就是在做什么呀,他在用公钥在用rsa算法对我们整个的应答签名呢进行解密运算,进行解密运算之后得到的这个Y5呢,就是一个摘要字符串,那么Y2呢,是对我们当前的啊这个对象里面的构造的签名串进行摘要计算,那么也会得到一个摘要字符串,所以最后呢,对Y2和Y5这两个摘要字符串呢进行比对,那么如果比对成功了,我们的签名呢就校验成功了,如果比对失败了,我们的签名呢就校验失败了。
13:05
那这块呢,就是我们整个签名的两个摘要比对的一个过程。那我们把这个方法执行完,执行完毕之后呢,整个我们的应答啊的验签的流程就执行完成了。
我来说两句