00:01
上一节课呢,我们对微信给我们发送的支付通知进行了验签,那么接下来呢,我们要对支付通知的通知参数进行解密,那我们再来详细看一下微信端,微信端呢,给我们发送通知之前呢,先用APIV3密钥,也就是我们在商户后台申请的那个对称加密的密钥进行了参数的加密,加密之后呢,他又对他的请求呢进行了签名,签完名之后呢,给我们发送了通知,那我们紧接着要做的就是用密钥呢将我们的通知参数进行解密,从我们的通知参数当中呢,拿到我们的支付结果详情好,那接下来呢,我们来看一下我们如何做这个解密的工作。我们来打开支付通知的API文档,这个里面呢有一节叫做参数解密,那么详细描述了呢,如何进行解密操作,在我们的支付通知的参数里面呢,有一个字段,这个字段呢叫做。
01:06
Resource支付通知参数,这里面的这些字段呢,是明文发送过来的,比如说之前我们呢,获取了通知的唯一的ID啊,那么这里面除了ID之外呢,还包含通知的创建时间,通知的类型等等,那么除了这些明文数据之外呢,还包含一个密文数据,就是通知数据叫resource,那么在resource里面呢,具体的密文呢,是存在了这个text里面的,那么其他的字段呢,那这个就是我们的加密算法类型。那这个就是我们的附加数据,那这个就是随机串,这些数据呢,和微信端进行对称加密的过程呢,是有关的,所以呢,我们呢,也要用这些参数呢,帮助我们进行相应的对称解密。那么它具体的解密的过程是什么呢?在这块。
02:02
他详细的进行了描述。也就是说我们首先要获取到我们后台的APIV3密钥,然后呢,使用刚才这个参数当中所描述的解密算法,取得对应的随机数,还有这个附加数据,然后接下来呢,这个K也有了,算法也有了,随机数也有了,附加数据也有了,我们呢就使用我们的K,也就是对称加密的密钥,还有刚才啊从通知参数当中拿到的随机数以及这个附加数据,对数据密文,也就是刚才我们看到的resource里面的s text进行解密,解密之后呢,我们会得到Jason形式的字符串资源,那么这个Jason形式的字符串资源呢?他就长这个样子。所以。这一部分是我们得到的原始的那个map的数据,那么这个map数据里面的resource里面的方法经过解密之后就会得到这种形式啊,所以说我们这节课的目标呢,是将我们请求对象当中解析出来的这个字符串中的s text给它解密成这种形式啊,好,那么接下来呢,我们再来补充一个内容啊,就是这个附加数据,可能有些同学感到比较疑惑啊,它是什么它呢,实际上是我们在进行支付下单的时候的一个可选参数。
03:36
那这个可选参数呢,就是如果我们想传递一些自定义的信息的话,我们可以借助于这个attach字段来传递我们想要传递的数据,那传回去之后呢,这个数据我们呢,就会在支付通知当中原样的拿回啊,所以这个地方他给我们描述了一下,说在支付通知当中会原样返回,所以其实这个是我们的下单和我们的支付通知啊,他们之间传递自定义参数的一个过程,可以借助于它啊,那因为我们当时下单的时候没有传递这个自定义参数,所以呢,现在我们支付通知当中获取到的这个附加数据呢,它也是没有值的,但是即使没有值,我们在解密运算的过程当中。
04:23
也需要用到它,就是即使是一个空值,我们也需要把它传到解密算法当中去,好,那这个是具体的一个描述了,但是这个描述呢,依然很抽象,那具体我们应该怎么样利用这些参数进行解密呢?那在我们微信支付的SDK,也就是我们Java版本的这个SDK当中,给我们提供了一个工具,那我们把它点开啊,点开之后就是这个文件,在这个页面当中呢,有一个描述叫证书和回调解密需要的AESGCM,很显然这个AES描述的就是什么呀,我们的对称加密解密的啊一个工具对吧?好,解密在这个类当中,所以我们利用SDK当中给我们提供的AEU9就可以进行解密了,那么接下来呢,我们具体的来看一下代码如何实现。
05:17
好,我们在这个位置呢进行。订单处理啊,在在订单处理的过程当中呢的第一个步骤,我们来进行解密。所以呢,我们在微信里面。创建一个order这样的一个方法,我们把前面我们得到的这个具有文数据的map呢给他去。好,接下来呢,我们来生成这个抽象方法,我们在生成业务层的实现。好,那在这边呢,我们打印一个日志。
06:02
那接下来呢,我们。从我们的body map当中呢,获取对应的数据进行解密,那因为这个解密的流程呢,我们后面的功能当中也要用到,所以呢,我们把它抽取出来,抽取成一个辅助方法,我们给它起个名字叫。From south。然后呢,我们希望得到的是一个。文数据哈,叫文的意思好out加啊,我们直接在当前的。业务当中创建这个解密的辅助函数。
07:01
好,那接下来呢,根据前面的描述,我们呢,需要。用到这个AESU求这个工具,所以呢,我们先拗一个a esu求。那我们创建这么一个as u to对象,那as u to这个对象呢,它啊有一个构造函数是需要一个key的,这个key呢,就是我们对称加密的密钥,并且呢,它要的是这个BA数据类型,那我们呢,从我们的微信配里面把它获取到get API v3k.get bus啊就可以了,这样的话呢,我们就获取到了我们的解密工具,然后呢,我们用a e u to点里面呢,有一个方法叫correct to string,这个方法呢需要三个参数,第一个参数呢,就是前面我们提到的associated data,第二参数呢就是那个随机串。第三个参数呢,就是密文,好,那么这个文档里面其实还提到了一个叫做解密算法,那实际上这个解密算法呢,不用我们去啊,从我们的通知参数当中去特意的获取了,因为呢,这个工具里面,它使用这个方式进行解密,用的就是指定的解密算法,好那么所以呢,我们把刚才提到的。
08:23
这个方法当中需要的三个参数呢,给它取出来,那这些参数呢,来源于body map,从body map当中呢,我们先获取到。这个resource。这个对象,那么resource本身呢,它也是一个map,所以呢,我们给它起名叫map啊,然后它这个里面存的是啊。Resource map,好,这面呢,我们给它强转一下,转成map。好,接下来呢,我们从map里面。
09:03
下面我们写一下注释吧。这个呢是通知数据好,然后接下来呢,我们去获取数据密文。Resource map.get。那数据密文呢,就是通知数据里面的。好,接下来呢,我们来获取随机串。那随机串呢,是我们。Resource里面的。North。我们来获取这个附加数据。附加数据,那么它是我们resource map里面的associate,好,我们把创建出来,那接下来呢,这个个需要的UN和s text呢,我们就都准备好了,我们把它依次传进去,但是呢,它需要的是一个。
10:24
字节数组类型的啊,所以呢,我们需要得到它的字节数组。这是第一个参数,第二个参数呢是那。好,第三个参数呢,就是我们的了。好,我们检查一下。前两个参数都是字节数组类型的,第三个参数呢是字符串类型的。那这样的话呢,我们就得到了一个铭文。
11:04
好,我们在这个地方呢。可以将我们的铭文打印出来。嗯。那同样呢,我们也可以将密文打印出来。译文就是sta。最后呢,我们把这个铭文呢给他返回好,那我们把这个异常呢给他抛出去。那么在这个位置呢,我们继续向上抛出。好,这样的话呢,我们解密的过程呢,就做完了,那接下来呢,我们针对我们目前为止做的这个解密的过程呢,做一个简单的测试哈,好看一看呢,能不能由。
12:03
密文解密成我们的英文。重新启动一下服务器。好,服务器启动成功了,然后我们呢,刷新一下我们的页面。找一个没有下过单的课程。我们进行扫码支付。好,我已经支付成功了啊,我们来看控制台。那么控制台上呢,打印了我们的支付结果通知,并且验签成功,然后处理订单密文解密,那密文呢,就是我们从resource里面获取出来的s text,那铭文呢,就是我们解析出来的这样的一个Jason字符串,那这个Jason字符串里面呢,大家会发现它包含MCD,也就是我们的商户号APPID。
13:07
ID个我们微支付信生支付订唯一的订单。好,到这为止呢,我们就完成了我们密文的解密工作。
我来说两句