00:01
这节课呢,我们来完成我们当前的这个check order status整个业务逻辑当中的第三个分支,如果订单已支付,则更新商户端订单状态并记录支付日志,那么我们先来分析一下这第三个分支什么时候会被执行。正常情况下,我们来看我们的。持续图哈,正常情况下,如果我们的订单已经被成功的支付了,那么呢,我们将会收到支付宝给我们发送的一个异步通知,在这个异步通知当中呢,我们会接收到支付宝的支付成功的这样的一个结果,然后呢,我们去修改我们的订单状态,那我们的订单本地的订单就应该是已支付的状态,但是如果我们在定时查单的过程当中,发现我们明明已支付的订单,却在我们的本地订单状态是没有支付,那这种情况是怎么样发生的呢?就是我们的这个异步通知啊,由于种种原因没有成功的接收到,那么我们呢,就会有一个在支付宝端明明已经支付成功,但是在我们的本地却没有被更新订单状态的这样的一个订单,所以这个时候呢,我们来主动的调用支付宝端的查看接口,进行查询订单的操作。然后。
01:21
如果我们查询的订单是已支付的话,那么我们在这个里面呢,再去修改我们的订单状态啊,所以这是我们这个分支它呢起作用的一个前提,那前提呢,就是我们的异步通知迟迟没有接收到,而我们的订单呢,确实是支付成功了,所以首先呢,我们先对这样的一个场景呢,做一个模拟,那怎么模拟这个场景呢?我们只需要把我们的内网穿透服务器给它停掉就可以了,然后呢,我们去发起一笔支付,并且呢,我们支付成功,那么我们会发现呢,如果内网穿透服务器没有启动,我们本地的订单状态呢,就迟迟的不会被改变,所以我们先做这样的一个测试啊,看一看,我们停止了内网穿透服务器之后,我们本地订单状态不会被改变,这样的一个结果。
02:12
好,所以呢,我们先。将我们的内网穿透,服务器呢,停掉。CTRLC哈,它就停掉了,停掉了之后呢,我们呢,再来进行一个测试,在开发我们的第三个分支之前啊,我们先来进行这样的一个测试。好,那这次呢,我买一个前端课程吧,然后支付宝确认支付。我打开我的支付宝的沙箱板,进行一个扫码测试。好,那现在呢,我。输入支付密码六个一,进行一个成功的支付。
03:02
好,现在呢,我已经支付成功了啊。好,我们回到我们的应用程序当中来看一下呢,我们当前的这笔订单的订单状态。我们找到数据库看一下我们新生成的这笔前端课程的订单,我们找到他的订单号,先查一查远程的支付宝数据库当中的这笔订单的订单状态呢?是否已经支付成功。好,接下来呢,我们来到我们的SPA服务器当中去,来进行一个查单操作,Query,我们把刚才的订单号呢复制到这个位置,我们点击try it out,那我们来看一下,现在呢,已经查询成功了,我们来看看最终的订单状态。那么我们会发现呢,远程服务器的订单状态呢,已经变成了支付成功,但是我们本地服务器的订单状态呢,还是一个未支付的状态,那是因为呢,我们刚才把内网穿透服务器停掉了,我们的支付通知,也就是说我们的异步结果通知呢,没有成功的执行,导致我们的本地服务器的这个订单状态呢,没有成功的修改,那么我们的解决方案呢,就是本地的这个定时任务,在我们本地的定时任务当中,可以对我们的本地的订单状态呢进行一个查询,查询到未支付的订单之后呢,我们将这笔未支付的订单的订单号取出来,然后呢,调用支付宝的查单接口,那么查询一下这笔订单呢,是否已经支付,如果在支付宝的查单接口当中,我们判断出这笔订单已经支付了,那么我们呢,就在本地修改一下订单状态,这样的话呢,就解决了,一旦内网穿透,或者是一旦我们的支付。
04:55
除掉没有被成功的执行的时候,那么我们也可以成功的去处理我们已经支付成功的订单,好,那接下来呢,我们就对这个代码呢进行一编写,我们打开阿里pay service m PL,那我们来创建这个如果订单已支付,则更新商户端订单状态并记录支付日志这样的一个流程。
05:19
我们把上面的这段代码呢,可以给它复制一下,那上面呢是未支付,那这个呢就是已支付,所以呢,我们。把它修改成success已支付,和trade status呢进行一个比较,那么这边呢,我们判断何时订单已支付,好,那么我们把订单号打印出来,那么我们来写一下这个业务逻辑啊,如果订单已支付这个。好,如果订单已支付,那么我们就更新商户端的订单状态,已支付呢,我们就肯定不会做关单了啊,我们把这个关单的操作删掉,那这边呢,就是更新商户端的订单状态,我们把它改成商户端的订单已支付的这样的一个状态,并记录支付日志,好最后呢,我们把支付日志呢,它记录出来,那么记录支付日志呢,我们用payment for service.create。
06:22
Payment in for for阿里pay这个方法就可以了,那这边呢,我们传我们前面的阿里pay的。Query response啊这个值,因为这个trade query response呢,它里面呢,是包含我们需要的这样的一些数据的,我们来看一下。我们找到刚才我们的响应事例,那么这个里面会包含我们在保存支付记录的这个过程当中需要的trade number呀,Out trade number呀,Total amount呀,这样的一些值哈,所以呢,我们来看一下我们的。
07:02
保存支付日志的这样的一个方法里面呢,是需要从参数里面取出这样的一些内容的,Out trade number trade number,还有trade status trade amount啊,所以呢,这个是我们之所以要获取这个结果啊,传递给他的一个原因,那接下来呢,我们就对我们的服务器呢,进行一个启动测试一下,那么它在定时任务当中能不能处理到我们实际已支付,但本地订单却没有支付的啊这样的一个情况,好,我们来重启服务器。好,我们稍等一会儿哈,等着这个定时任务去执行。
08:04
那我们的服务器呢,已经启动成功了。那他下一次执行定时任务呢,应该是19:59:00的时候。好,我们的定时任务呢。准时执行了,我们来看一下啊。在这个位置19:59:00 order confirm被执行,然后呢,我们查到了一笔未支付的订单,就是刚才咱们这个前端课程,接下来呢,我们根据订单号去核实订单,那么查单接口呢,调用了,调用回来之后呢,我们会发现这个订单的订单状态。在支付宝端呢,是trade的success,也就是支付成功的一个状态,所以呢,我们呢就核实订单已支付了,那么我们就更新订单状态,我们把订单状态呢就更新成了支付成功,接下来呢,我们就进入了支付日志,那么这个支付日志的记录呢,实际上就是像我们的t payment info这个表当中呢,插入一条记录好,那么接下来呢,我们来看一下我们的本地的订单状态哈,我们通过页面看吧,我们刷新一下这个页面,我们会发现呢,这面的支付宝的订单状态呢,变成了已支付并且呢,我们会发现呢,证明我们本地的订单状态呢,变成了已支付,并且呢,我们再来看一下数据库中的数据记录,那么order。
09:39
这个订单状态呢,就变成了支付成功,好在接下来呢,我们来看一下支付日志,那么这边呢,我们也已经记录了一个支付日志哈。好,我们需要的信息呢,都已经记录在了数据库当中,好,接下来呢,我们再来查询一下远程的订单状态。那我们把。
10:01
订单号呢,复制一下。我们来查询一下SPA当中的订单状态。好,然后我们来看一下订单状态是这success。
我来说两句