00:02
这节课呢,我们来实现异步通知的接收。以及应答好,那既然我们要实现异步通知的接收呢,肯定第一个步骤我们要启动这个NG rock,那我的NG rock呢,已经启动成功了,接下来呢,我们把这个HTTPS的这个地址呢复制一下,然后拷贝到我们的应用程序的配置文件中。拷贝到这个位置啊,那这样的话呢,我们应用程序启动的时候呢,它就可以在这个外网地址上呢,接收远程请求了,那么第二个步骤呢,我们要在我们的应用程序的controller这个里面呢。创建一个通知接口,所以呢我们打开微信配controller,在这里面呢,我们创建一个通知接口,那么首先我们来写一个public,那返回值呢是string啊,因为我们的通知接口呢,它要求响应呢是Jason字符串的形式,所以呢我们直接呢就定义成字符串的这样的一个返回值,那方法名呢,我们可以自己起一个native。
01:06
Notify,好,那我们这个是回调通知,所以呢要接收微信服务器给我们发过来的请求,那么这个请求呢是在http request里面的,所以呢我们要把这个request对象呢给它初始化出来,紧接着呢,我们还要给微信的服务器呢返回响应,所以呢这个响应呢是在http response中的,那因此呢,我们要把这个response对象呢也创建出来。好在接下来呢,就是我们的这个请求方式了,请求方式呢在微信的开发文档当中。我们来看一下文档。那么在API字典。基础支付支付支付通知这一块呢,支付通知API这个文档当中明确的。给我们标识出了请求方式呢,应该是post,所以微信给我们发请求呢,是以post形式发送的,那我们这边接收请求呢,也要以post的形式来接收,接下来呢,我们来写通知地址,那么通知地址呢,是来源于之前我们在我们的。
02:19
下单接口当中设置的一个请求参数就是这个notify URL,我们呢把这个请求参数设置到了下单接口,这样的话,微信接收到我们的请求之后,他就知道当支付成功之后,他应该向哪个地址呢发送结果通知,所以呢,我们要来看一下这个具体的地址是什么。那么这个具体的地址呢,是API微信配native notify,那因为我们这个接口它的前缀呢,就是API微信配,所以呢,我们只需要复制后面这一部分就行了,那么这个地址再加上前面我们设置的整个的这个外网啊的一个地址,那么他们两个合起来呢,对于微信来说就是通知地址了,所以之前我们的。
03:08
Notify URL呢,它实际上就是这么组装的啊,这个是我们刚才设置的这个外网地址,然后这个呢,是我们的支付结果通知的地址,好那么在我们的controller里面呢,我们就把刚才的这个地址呢复制到这来,好把前面这一段呢给它删掉就可以了。这是我们设置通知地址的一个过程。那接下来呢,我们就需要处理我们的通知参数了。好,我们来看一下文档哈。文档,这说到呢,它这个通知参数呢,是以通过请求就是T的请求体中传过来的,所以第一个步骤呢,我们应该先从请求体当中拿到我们的这个Jason数据,那么这个过程呢,我们之前引入了一个工具类叫HTTP,这个HTTP里面的read方法呢,可以从request对象里面获取具体的请求体的内容,并且呢把它们转化成字符串的形式,所以呢,现在呢,我们就用这个read这个方法将请求体转化成字符串。
04:31
那么这面呢,我们来处理一下我们的通知参数,使用HTTP。第二。Read的data,我们将request这个对象传进去,进去之后呢,我们。就会得到一个字符串形式的通知参数了,那么我们需要呢,把这个字符串形式的通知参数呢,转换成哈希map,因为他是Jason格式的,所以呢,我们使用Jason工具转换就可以了,我们在最开始的这个位置呢,定义这个Jason工具。
05:11
好,然后接下来呢,在下面这个地方,我们用Jason的from Jason这个方法将body转换成哈希map。我们就会得到一个body map这样的一个数据哈,那么转换过来之后呢,我们希望。这里面的数据呢,是string的形式,因为这个里面有很多种不同的数据类型啊,所以呢,我们给它定义成这个样子的,然后接下来呢,我们再来看一下我们的文档。文档当中呢,通知参数这块包含这样的几个内容,第一个是通知的ID,每一个通知发送过来之后,都有一个唯一的ID标识,帮助我们呢去辨别这个通知到底是哪一个,所以呢,我们可以把这个ID获取出来,然后把这个通知的ID呢打印一下。
06:13
Body map.get ID。好,我们呢,直接啊将它打印出来就可以了,所以呢,这面呢,我们写一个log.info吧,然后这面呢,叫支付通知的ID。好,那么log in for里面的大括号呢,代表的是一个占位符啊,那未来呢,会被后面的这个参数依次替换,那后面如果只有一个参数的话,它替换的就是这个前面的这个大括号这个占位符了。body.get ID。那接下来呢,我们再把整个已经转换成字符串的这样的一个。
07:02
请求体呢给他打印出来,这个是通知的完整数据。我们把。直接打印出来。好,那到这为止呢,我们就初步的处理了我们的通知数据,接下来呢,我们方法的主体要对这个。订单。进行处理,那除了处理订单之外呢,我们还要进行验签。那这个签名的验证呢,也是我们在这个地方需要做的事情。好。接下来呢,如果进行签名验证和处理订单之后,我们就可以给微信发送一个应答了,那么首先默认情况下呢,我们先返回一个成功的应答。
08:00
也就是说告诉微信这面呢,你的支付成功的通知我已经收到了,并且呢,我已经处理完了我的核心的业务,那么现在呢,我可以给你一个成功的应了response status200。那么具体这个应答应该如何去写呢?我们来看一下这个文档,往下。这边呢有通知应答,那我们的通知应答呢,啊,如果是正确的一个应答的话呢,那么我们呢,应该有200这样的一个应答的响应码,那如果我们的响应体当中呢,不放任何内容的话,那么我们应该呢返回204。那如果我们的应答呢,为错误的应答的话,比如说系统当中出现异常了,那么我们的应答的响应码呢,应该为500,或者是以四为开头的这样的一个响应码,那么返回的数据呢,包括code和message,所以呢,在我们的这个代码当中,我们来创建一个应答对象。
09:23
好,这个呢,是。应答对象。Map点。那我们写扣,这是成功的应答。裤子。那这面呢,我们写success或者是啊成功。好,接下来呢,我们把这个map呢转换成Jason返回就可以了。
10:12
这是我们的成功的应答。接下来我们就对我们当前写的这个接收请求,并且处理通知参数以及成功应答这个流程呢做一个测试,那么我们重新启动我们的服务器。这个时候呢,大家注意啊,我们呢,打开我们的数据库的这个表,你呢,需要将之前我们做测试的这些订单记录呢全删掉啊,因为我们之前做测试的订单记录呢,有可能会有冗余数据,比如说啊,我们的二维码的有效期呢是两个小时,那么如果啊,你的数据当中存了二维码。但是这个二维码呢,已经超时了,那么你也要把它删掉,因为那个二维码就没法扫描了啊,那后面我们会做啊超时自动关单的功能,所以呢,目前为止我们只能去手工删除它,另外还有一些同学呢啊,看到二维码之后,它已经发起了支付了,那么这个二维码呢,就是已经支付的二维码了,并且呢,我们现在呢,还没有做这个。
11:17
订单状态的处理,所以如果你只是通过微信端对这个二维码进行了支付呢,那我们的服务器端存储的这个数据当中,其实呢,这个order呢,依然是未支付的状态,因为我们没有处理,对不对,那所以呢到这个流程当中。他依然呢,会把它当做一个什么呀,一个没有支付的订单查询出来,那么所以呢,那我们在呃,这个做这一节课的支付测试的时候呢,就会出现问题,总之呢,就是你在做测试的时候,先把这里面的所有的订单都删掉,删掉之后呢,我们确认一下哈,刷新一下没有数据了,然后接下来呢,我们来运行一下我们的。
12:02
前端的代码。啊,然后呢,我们点击确认支付。好,二维码展示出来了,接下来呢,我们先清空一下我们的。浏览器的控制台日志。然后接下来呢,我们来扫描这个二维码。好,我对他发起一个支付。好,我这边呢,已经支付成功了,我们来看一下日志。我们的支付通知是不是已经被执行了,也就是说我们来看我们的C了啊。支付通知这个方法呢,我们并没有去主动的去调用它,我们只是呢,在微信配controller这个地方呢,定义了一下,并且呢,在最开始的。
13:01
下单的接口当中呢,告诉了一下微信,诶我们的通知地址呢是这个,所以现在呢,我的支付已经成功了,那么微信呢,就自动的向我的这个支付通知的接口呢,发起了一个回调,那么这个地方呢,你就可以看到支付通知的ID以及支付通知的完整数据了,那么你还可以发现呢,在支付通知的这个数据当中呢,有一段呢是加密数据,所以。后续我们还要做的事情呢,就是对微信给我们发送的这个支付结果通知呢,进行验签,验签完成之后呢,这个s text里面啊,叫加密数据里面呢,我们还要用我们的对称加密的密钥对这个数据进行解密,那么我们真正需要的信息呢,存在了这个。加密的数据里面好,所以这个呢,就是我们支付通知的一个接收。
我来说两句