00:00
好,前面呢,我们已经开发了一个定时任务,那么这个定时任务呢,是每隔30秒执行一次,并且呢,查询超过五分钟未支付的订单,那查询出来这样的一个订单列表之后呢,我们对这个订单列表进行便利,那获取出这个订单的订单号,那么从这些订单的订单号当中呢,我们可以调用微信支付的查单接口来进一步的核实这个订单状态,看一看这些超时未支付的订单到底是真的超时未支付还是用户已支付,但是呢,我们的商户端没有接收到支付回调通知,那如果是用户已支付,我们没有收到支付回调通知的话呢,我们就要修改订单状态,如果用户真的未支付,那么呢,我们就需要关单了。那接下来呢,我们就开发核实订单状态的功能。首先呢,我们在。
01:01
定时任务类当中呢,注入微信配service对象。好。接下来呢,在这面我们用微信配service调用它的核实订单状态的一个方法,那么我们给这个方法起个名字叫check order status。我们传进一个订单号。然后我们创建这个方法。好,那么这个方法的主要功能呢?就是根据订单号。查询微信支付查单接口,核实订单状态。如果订单已支付,则。
02:05
更新商户端订单状态,如果订单未支付,则调用关单接口关闭订单,并更新商户端订单状态,好,那么所以首先呢,我们在这个地方先打印一个日志出来啊,落个点忘我也用警告日志打印,这样的话看起来呢会比较明显,根据订单号。核实订单状态。Order number。
03:00
接下来呢,我们调用查单接口,调用微信支付查单接口好,那么微信支付的查单接口呢,之前我们在当前的这个微信配里面呢,曾经写过一个query order方法,我们传一个order进去,那这面呢,我们会得到一个支付通知的结果,我们抛出异常。那相应的界面也要抛出异常。接下来呢,我们来转换这个Jason,结果我们创建一个Jason对象,用这个Jason对象将我们的result呢进行转换。转换成hasma。好,最后呢,我们会得到一个map这样的一个结果,那我们利用这个map呢,来查询订单状态,获取微信支付端的订单状态map.get。
04:20
Trade state,那我们得到一个订单状态的结果,接下来呢,我们来判断订单状态。好,那么我们和枚举当中的指微信trade state.success成功点get type,那么和我们获取到的这个订单状态呢进行比较,Trade state。如果订单已支付的话,那么呢,我们就记录一个日志,望核实订单已支付。
05:07
哪笔呢,把这个订单号记录一下。接下来呢,如果确认已支付,那么呢,我们就更新本地的订单状态。好,那么更新本地订单状态呢?我们用service里面曾经我们写过一个update status by order number的方法,那么我们传order number进去第一个参数,第二个参数呢,我们传order status success啊。好,那么这个里面呢,有一个本地订单的状态,还有一个远程的微信端的订单状态,这两个是不一样的啊,例如如果远程微信端的订单状态是关闭,就是订单已关闭的话,那么在我们的本地的这个订单状态呢,有可能是。
06:16
订单超时关闭,也有可能呢,是用户主动取消了订单进行的关闭,所以呢。这个里面订单状态呢有已关闭,而这个已关闭呢,对应的是这个里面订单状态的超时关闭,或者是用户取消啊,所以这面是本地的订单状态,而这面呢是微信服务器端的微信支付的订单状态。那如果支付成功的话,除了要修改订单状态,我们还要记录支付日志。Payment for service。
07:00
Create payment,那记录支付日志呢?之前我们调用这个方法的位置呢,在。在我们的。处理订单这个方法当中,而处理订单这个方法呢,是在我们的支付通知当中调用的,也就是说我们之前通过支付通知获取到了一个支付通知参数,那么我们从支付通知参数当中的密文当中解析出来的明文报文。被传递给了这个方法。那现在呢,我们的check status这个方法所调用的查单接口,它返回的响应信息呢,和之前我们的回调通知当中解密出来的那个铭文是一致的啊,也就是说我们来看一下查单接口,这个查单接口里面。返回的参数。
08:03
这些内容呢,恰好和我们的支付通知这个里面的通知参数当中的。秘闻通知参数当中。然后这边有一个密文。Text解密出来的这个数据格式,也就是这面的这个数据格式啊,对应的呢,是这面的这些参数,就这部分的参数和这部分的参数呢,它是一致的啊,所以呢,我们就可以。将result直接复制给create payment info。好,那么还有一种情况呢,就是查询出如果我们的微信里面的这个订单状态呢,是未支付的话。落个点忘哈。
09:02
核实订单未支付。那么呢,我们就要调用关单接口。如果订单未支付,则调用关单接口,然后呢更新本地订单状态,那未支付就不用记录支付日志了哈,好,那么this点。Close order,这个也是之前咱们写过的一个方法,在用户主动取消订单的时候,咱们写了这样的一个方法。接下来呢,我们更新订单状态,Update status by order order status,那如果是超时关单的话,那么我们使用超时已关闭。
10:09
好,接下来呢,我们检查一下我们的程序啊,这个位置打印订单号。界面也是。啊,为了测试方便呢,我把这个时间。改成一分钟,也就是检查超过一分钟没有支付的订单啊,因为这样的话呢,一会儿我们就不用等待太长的时间了,那么我们重新启动一下我们的应用程序。好,我提前呢,已经把我系统当中的订单记录呀,支付记录呀,全都删掉了,这样的话方便咱们判断最新的这个数据。好,现在呢,咱们再来购买一个课程。
11:02
比如说我买Java课程点确认支付,但是这个时候呢,用户迟迟没有支付啊。那我订单这面呢,就会有一个未支付的订单。再接下来呢,我再买一门课程,但是这个课程呢,我打算支付,支付完成之后呢,我却没有收到支付结果通知,那这个怎么模拟呢?我们直接把NG绕关掉就行了,这样的话呢,它就没有办法正常的接收支付结果通知了,按CTRLC把它停掉。那我来,去发起对这笔订单的支付。好,我已经支付成功了。但是呢,你会发现我们这面呢,正常情况下支付成功之后应该有一个回调通知修改订单状态,那我们前端的轮巡查单接口呢,应该去监测到这个订单状态已经修改了,并且呢给我们跳转到支付成功的页面,那到现在为止呢,这件事情也没有做说明呢,可能是我们的支付通知呢没有收到,那确实是因为我们把NG rock关掉了,那我们来看一下我们的后台。
12:11
你会发现呢,这面是未支付的一个状态,然后接下来呢,因为我们这面设置了每隔。30秒查询一下。查询未被。支付的订单,那么我们来看一下。我们通过我们的微信配task吧,看一下是否被执行了。我们从头开始搜啊。那这个地方呢,在13:05的时候呢,被执行了,然后呢,他查询出。未支付的订单的数量呢是零,也就是说那个时候我还没有创建订单,那我们继续向下查找。啊,这也是零。
13:03
好,这个时候呢,我已经创建订单了,我创建了两个订单,那么这两个订单呢,分别就是刚才咱们购买的Java课程以及大数据课程,那么他在我们本地商户端的数据库当中的订单状态呢,都是未支付,接下来呢,那么就判定为它们为超时订单了,那根据订单号核实订单状态,首先核实订单号为34225的这个订单,也就是。34225是这门Java课程哈。好,根据订单号核实订单状态。查单接口调用。成功返回,结果呢,是订单未支付。接下来呢,这面就是最后的核实结果呢,就是订单未支付,然后呢,我们调用了关单接口,对34225这个订单呢,执行了关单。
14:00
那这面呢,是关单的请求好,最后的结果呢,是超时已关闭。然后呢,我们来对另外一个订单做处理,另外一个订单呢,是那笔大数据课程的订单,叫54776,那么我们根据订单号核实订单状态。调用我们微信支付的查单接口。查询出来的结果呢,是支付成功好,那么核实订单状态呢,是已支付的状态,这个时候呢,我们就更新本地的订单状态为支付成功。最后呢,我们记录支付日志。那这个呢,就是支付日志的一个记录的过程。好,那这样的话呢,我们整个应用程序呢,就执行完成了。我们来看一下这面的最终的订单状态,我们刷新一下订单列表。那么我们会发现呢,其中一个是支付成功,另外一个呢,就是超时已关闭。
我来说两句