00:00
接下来呢,我们来实现一个用户取消订单的功能,那么首先呢,我们选择Java课程,选择支付宝支付,我们选择确认支付。好,那么在这个过程当中呢,用户呢,并没有发起支付,那么我们接下来呢,来到我们的订单页面。那么这个地方呢,就会有一个未支付的支付宝支付的订单,我们选择取消订单,那么我们希望呢,开发一个取消订单的接口,对支付宝的这个订单呢,进行一个取消操作,那么我们来看一下如何实现打开idea,打开阿里pay controller,我们在这个地方呢,添加一个取消订单的接口public,二取消订单呢,我们就给它起名叫cancel,然后呢,这边呢,我们是passver,我们还是传递一个order number订单编号。
01:01
然后在上面呢,我们写API,用户取消订单,好,那么请求方式呢,我们用post mapping,那这个呢,对应的是我们前端的一个调用哈,所以呢,我们必须和前端对接上,那么。应该严格的按照这个请求方式以及ul地址去编写number,好,然后接下来呢,我们实现这个具体的方法的内容。我们在这里呢,再加一个注释吧,叫用户取消订单。然后在这个位置呢,我们打印一个日志,要不叫音色。取消订单,好,那么这边呢,我们就要用阿里pay service里面的,我们就要写的这个cancel order这个方法,然后在这里呢,那我们把order number,也就是订单号传进去,最后呢,我们返回r.ok.that message。
02:18
订单已取消,好,那接下来呢,我们对这个业务方法进行一个实现,Out加enter,我们生成这个方法,然后我们生成这个方法的实现类,好接下来呢,我们来看一下用户取消订单的这个方法具体的编写。那么在取消订单这个方法当中呢,我们要调用一个取消订单的业务,因为这个取消订单的业务呢,未来在其他的位置我们也要调用哈,所以呢,我们就把它封装成一个辅助方法,这个辅助方法呢,我们需要做的呢,就是调用支付宝。
03:08
提供的统一收单交易关闭接口,那我们来看一下文档们要调用的就是这个接口,统一收单交易关闭接口啊好,调用完这个关单接口之后呢,我们要做的就是更新用户的订单状态,更新用户订单状态啊,那么我们直接调用我们之前写过的order for service第2UPDATE status by order number,那么我们把order number传进去之后呢,我们再传进去一个我们想要更新的订单状态,那么是order status cancel。好,这样的话呢,我们就在调用了支付宝的统一收单交易管理接口之后呢,我们就可以更新用户的订单状态了,接下来呢,我们来实现这个close order的这个方法。
04:08
那么这个方法呢,我们作为一个辅助方法调用就可以了,所以我们选第一个啊,好,直接在这个下面创建了一个辅助方法,那么这个呢,就是关单接口的调用,好,那么这个order number呢,其实就是我们的订单号了。那么在这个关单接口的调用的过程当中呢,我们来看一下具体的调用的流程。我们打开。支付宝的文档。找到后面的这个代码示例,我们把它复制一下。然后粘贴到我们的这个代码当中,当然了,阿里client呢,是我们在前面。
05:00
已经注入进来的对象哈,所以呢,我们这边呢,就把它删掉就可以了,不需要它,然后接下来呢,在上面这个地方,我们先打印一个日志的log点缝。关单接口的调用,那么我们可以打印一个订单号,好,以便于后期的调试啊,好,Order number。那么接下来呢,我们就创建这个request对象,那么这个request对象的名字呢,就叫做阿里pay trade close request,好,然后接下来呢,我们来组装它的业务参数,那么业务参数呢,我们来看一下。文档当中。关于。业务参数里面呢,有。两个特殊可选,什么叫特殊可选呢?就是一个是trade number,一个是out trade number,那么这两个值呢,它是二选一的,那这边呢,写到该交易在支付宝系统中交易的流水号。
06:14
Out number不能同时为空,如果同时传了out trade number和trade number,则以trade number为准,那么这个第二个就是out trade number了,订单支付时传入的商户订单号和支付宝交易号不能同时领空,也就是说他们两个二选一啊,Trade number out trade number如果同时存在,优先取trade number,那么现在呢,其实我们并没有这个trade number啊,我们现在拥有的或者是说我们现在能够拿到的是这个out trade number,所以呢,我们就把这个out trade number呢,传入到我们的这个业务参数当中,那么这面呢,我们改成order的number,然后这个位置我们改成order number,这个就是我们的订单号,那接下来呢,我们将business content转换成主串,设置在我们的request对象里面,然后最后呢,我们用阿里pay client的方法啊,去将。
07:15
Best呢,发送出去得到这个响应,最后呢,我们判断这个响应的success状态,判断呢,它是否调零成功还是失败好,那么后面的这个过程呢,我们参考一下之前我们曾经写过的这样的一个判断哈,我把这个拿过来,包括后面的这个穿都是我把它拿过来。因为刚才这个位置呢,有一个异常嘛,所以我们在我们的代码当中就直接呢,进行一个异常的补货,Try catch好,然后接下来呢,我们直接把后面这部分呢,给它替换一下。妈。这个称呢,我们就不需要了啊,然后这块呢是返回结果,这块呢是调用失败返回描述啊,这块呢是返回码,那这个地方呢,我们是关单接口调用失败,然后这个位置呢,我们也是关单接口调用失败,好那这样的话呢,我们就对我们的关单接口进行了一个编写,那接下来呢,我们重启一下服务器,对这个。
08:24
关单功能呢进行一个测试。好,我们服务器呢,已经重启成功了,那接下来呢,我们来到刚才的我们的这个页面当中,我们点击这个取消订单按钮,对这个关单的功能呢进行一个测试,好,我们点击取消订单。那么我们会发现呢,他报告了一个错误,是500,那一定是我们的后台管理系统报错了哈,我们打开我们的后台管理系统的日志,我们会发现呢,这个地方呢,有一个调用失败,返回码呢是40004,返回描述呢是business field,然后再往上看一看呢,它的一个响应结果在这个地方呢,打印出来了,那么就是关单接口的调用啊,订单号啊,那这个是整个关单接口的调用的一个流程,然后这个地方会打印我们整个的一个响应信息,那这边呢,你会发现它呢,响应码是40004,然后响应消息呢是交易不存在,那为什么交易不存在呢?那么我们的支付宝是这样的啊,就是。
09:41
我们来打开我们的测试页面,刚才我们打开了我们的支付宝的扫码支付,还有登录的页面,如果你没有进行扫码,也没有进行账户名和支付密码的这个登录的话,那么这笔订单呢,是没有创建的,那如果这笔订单没有创建,那我们的这个交易其实是不存在的,那交易既然不存在,你关单其实就没有必要,为什么你没有必要去调用支付宝的关单接口,去支付宝的交易数据中关单,因为支付宝并没有创建这笔交易记录,那什么时候支付宝会创建这笔交易记录呢?两种情况,第一种情况呢,就是在这个位置,如果我们用。
10:26
账户名和支付密码的方式登录的话啊,在登录之后,他的这个交易记录呢,才会创建,所以呢,我们来试验一下啊,那么我们找到我们的沙箱账号。我们用买家账号进行登录。六个一啊。好,这个时候呢,我们会进行一个啊,支付宝的一个账号登录。那么登录成功之后,我们在输入支付密码之前,诶,这个过程其实也是用户未支付的一个状态,对不对,我们看一下我们这边的订单记录啊,依然是未支付的状态,那么这个时候交易记录呢,其实就已经创建了,所以呢,我们把这个后台的这个错误日志啊,先给它清空一下,然后我们在这个位置呢,再次的去点击取消。
11:22
按钮你会发现呢,这一次我们的订单呢,就取消成功了,那么说明呢,这个时候支付宝呢,其实已经创建了交易记录,同样我们再做一个实验,还是支付宝啊,然后Java课程我们点击确认支付。好,我们还是来到我们的订单后台,那么我们会发现呢,这个时候我们的订单呢,也是不存在的,我们还是来看我们的后台日志系统,那么依然是关单接口调用失败,依然是刚才的这个问题交易不存在,那么我们来测试另外一种情况,就是我使用支付宝的客户端进行扫码。
12:05
好,我还是打开我的支付宝的沙箱板进行一个扫码,那现在呢,我已经扫码成功了,但是扫码成功之后,我并没有去点击我手机上的支付宝APP当中的立即付款,以及也没有输入这个支付密码,只是扫码成功而已,那只要扫码成功,支付宝端就会创建这笔交易记录,那么此时此刻我们在这个地方取消订单。诶就可以成功了啊,所以呢,我们取消订单成功的前提呢,是支付宝已经创建了交易记录,但是如果支付宝没有创建交易记录的时候,我们将会如何取消这个订单呢?我们来看一下我们的这个代码。那么如果支付宝没有创建交易记录呢,我们这个代码呢,将会走到else的这个分支当中,然后刚才其实就是在这个位置打印了这样的一个错误信息,并且我们在这个位置呢,抛出了异常,那么应用程序呢就立即停止了,实际上呢,如果支付宝没有创建这笔交易记录,我们的应用程序呢,走else分支之后呢,我们可以不抛出这个异常,让应用程序呢不会异常退出,那么这个时候呢,应用程序就会从这个close order方法当中呢正常退出,正常退出了之后呢,它就会正常的去执行我们closed order之后的一个关单流程,那么我们单纯的就关闭本地订单其实就可以了,因为远程的支付宝呢,它是没有订单的,所以呢,我们直接关闭本地订单啊,那这样的话呢,我们就解决了这样的一个远程支付宝没有创建订单的情况下,我们关闭。
13:54
本地订单直接关闭本地订单的这样的一个问题哈,接下来呢,我们重新启动这个应用程序,我们再不进行扫码,不进行支付宝账号登录的情况下呢,再次的进行一个关单操作的测试。
14:14
好,我们应用程序呢,已经启动了,那么我们还是重新的进行一个测试哈。好,我们在这个地方呢,点击支付宝,然后点击确认支付,那么此时此刻呢,我既没有进行扫码,也没有进行支付宝账户的登录工作,那此时呢,我们来到我的订单进行一个关单操作,你会发现呢,我们的订单呢也成功的关闭了。好,这个就是我们的用户取消订单的功能。
我来说两句