00:01
接下来呢,我们来实现一个用户主动取消订单的功能,那么我们在这个课程列表页呢,选择一门课程,对这个课程呢,点击确认支付按钮。好,那么在弹出二维码之后呢,用户选择了取消支付,那么这个时候呢,在我们的订单列表当中呢,有一个已经生成的订单,那么如果我们的订单迟迟没有支付的话呢,系统呢,会在啊一定的时间内有一个定时任务去主动帮我们关闭这个订单,当然了用户也可以选择取消订单,那我们呢,先来实现一下用户取消订单这样的一个功能那。实现的效果呢,就是这样的,我们点击取消之后,那这样的话呢,就显示订单状态已取消好,现在呢,我们就来对这个效果呢做一个具体的实现。那我们呢,在微信配controller里面呢,开发我们的取消订单的接口,所以呢,我们定义一个PUBLIC2。
01:06
Cancel,那么我们可以根据我们的订单号来取消订单,所以呢,这边我们可以通过路径参数来传递这个订单号。后mapping这面呢,我们写cancel。Order number,好,接下来呢,我们在这个位置呢,写一个日志,Info取消订单。那么我们啊,打算呢,在微信配service这个业务层当中呢,创建一个cancel order的这样的一个方法,并且呢,传递order number参数,最后呢,我们需要为前端返回成功的提示。
02:05
好,那么接口的方法呢,我们已经写好了,接下来呢,我们来创建业务方法。那我们在这个位置呢,来实现我们用户取消订单的功能。接下来呢,我们在这呢,有两件事情要做,第一件事情呢,就是调用微信支付的关单接口,第二件事情呢,就是更新商户。端的订单状态,那么更新商户端的订单状态呢,比较好实现,因为我们之前呢,已经在order service里面呢,写了一个update status by order number的这样的一个业务方法,所以呢,我们只要传进去,也就是订单号和我们希望更新的订单状态就可以了,那我们希望更新的呢,是啊。
03:16
用户已取消好。那接下来呢,我们再来看一下调用微信支付的关单接口这一块,调用微信支付的关单接口呢,我们需要在微信支付的开发文档当中找到native支付关闭订单这个接口。我们现在呢,就要对这个接口进行调用啊,因为后面还有其他的位置,我们也要调用这个接口,所以呢,我们把这个接口的主要的核心的业务代码呢,写在一个方法里,这样的话呢,在其他的位置呢,我们也可以方便的调用。我们传一个order number进去。Out加enter。我们呢,创建这个close这个方法,我们在当前的MPL里面直接创建就行了啊,因为呢,它就在当前的这个类里面调用啊,所以我们作为辅助方法来创建。
04:13
叫关单接口的调用。好,接下来呢,我们就来看一下我们的关单接口。好,我们写一下订单号吧。好,接下来呢,我们打开我们的文档啊,文档里面呢,首先接口说明这一块有一个请求的URL,那么和之前我们调用统一下单接口一样,我们呢,创建请求对象的过程呢,就是。
05:07
创建一个http post,好,那么我们呢,接收一个URL地址,并且呢,创建出这个H。这个URL地址呢,由两部分组成,这两部分呢,一个是我们定义的微信配config里面的get domain,也就是微信端的主机地址,在连接上我们的关单接口的URL地址,那么关单接口的URL地址呢,我们单独的定义一下吧,URL因为有点长了,等于。好啊,最后我们把它们连起来啊好,现在呢,我们来看一下关单接口的URL呢,如何定义。
06:02
我们找到微信。API type这个枚举,这个枚举里面呢,有一个close order by number,也就是说根据订单号关闭订单的这样的一个枚举,我们把它的type取出来,但是这个枚举呢,有一个特点,就是里面有一个占位符,那因为我们是根据订单号关闭订单,所以这个位置呢,就应该传订单号,那因此呢,我们在我们的业务方法当中啊,用string format。这个方法。来将这个里面的。占位符给他替换一下,那么这个方法的第二个参数呢,就是替换里面占位符的。所以这样的话呢,我们就得到了一个占位符,被替换了的一个完整的URL地址,那最后呢,我们把这两部分给它组装起来,那。
07:00
创建http post对象,所以这块呢,是我们创建远程请求对象的过程。接下来呢,我们来看一下。我们就要组装请求参数了,那么这个接口的请求参数呢,很简单,一共就两个,一个呢是直连商户号,一个呢是商户的订单号,而且商户的订单号呢,实际上呢,刚才我们已经通过URL地址传递了,那么这边呢,也给我们标识出来了,是通过pass路径传递的,所以呢,我们的请求体当中只有一个商户号啊好。那我们呢,组装。Jason。请求体好,那么组装Jason的前提呢,是我们先创建一个,这接下来呢,我们在创建一个哈希麦。
08:12
好,我们创建这个名字呢,叫ter。接下来呢,我们在这个ter当中去设置,刚才我们唯一的。这一个请求体参数。那么我们参数的来源呢,就是配置文件。好,这样的话呢,我们的map参数呢,就组装完成了,组装完成了之后呢,我们再将这个参数转换成字符串。那么我们给他起个名字叫jasonters。接下来呢,我们可以在我们的日志当中呢打印一下,便于我们后面的调试哈。
09:10
嗯。好,那接下来呢,我们。将请求参数。设置到请求对象中。那这段代码呢,之前我们写过哈,就我们复制一下吧,啊,我们的native pay当中。我们找到这段,还有后面这段都是需要的。直接呢把它复制过来就可以了,那这样的话呢,这个就是将我们的请求参数设置到请求对象当中,然后呢,为请求对象呢设置啊,我们要接收的数据类型呢是Jason,并且我要发送的数据类型呢也是Jason,然后最后呢我们完成签名并执行请求。
10:07
好,我们把这个异常呢,直接抛出去。好,那接下来呢,我们参考一下之前的native支付这一块。那么。这个位置是不是有一个TRY。Finally啊,好,我们把它复制过来。好,我们看一下哈,那我们先来看文档啊,文档这面呢啊,显示我们这块是没有返回数据的,所以呢,这个关闭订单我们不需要处理返回数据,那这样的话呢,就更简单一些了,我们响应体这边呢,就可以删掉了,然后返回结果它没有。所以说这是没有返回结果的,然后那当然这面也可以删掉。
11:00
好,那响应结果因为没有,所以直接就全都删掉就可以了。啊,所以这块呢,其实我们就处理了一个响应状态码,而且呢,我们如果没有返回结果的话,它的响应状态码呢,应该就是204了,所以呢,针对于关闭订单来说的话,我们最后呢,如果成功的话,它会返回204这个分支啊。好,那这样的话呢,我们关单的这个接口呢,就写好了。接下来呢,我们来看一下调用关单接口的这个位置,我们将异常呢,继续向上抛出。然后呢,我们再来到controller这面,也是一样的异常,直接抛出去就可以了。我们把它处理成exception异常啊。今年也是一样的。好,我们的功能呢已经实现了,然后接下来呢,我们重新启动一下服务器来对我们的功能做一个测试,测试的过程呢,你既可以通过SW来测。
12:05
然后在SPA当中呢,输入一个订单号。如果通过SPA来测的话呢,那么就是在这个位置网站微信支付API,那我们在这面呢,有个cancel,那我们在这边输入一个订单号,点击测试就可以了,当然了,因为我们前端呢,其实也帮助大家实现了,所以呢你也可以在前端来进行测试,那么我们在这个位置点击。一个。课程。比如说我们选择。我看一下。找一个没有的课程啊,前端大数据Java,我们找一个UI。好,我们点击确认支付,然后呢,我们不支付,这面呢,我们决定呢去关单,所以呢,我们点击取消,好这样的话呢,这个订单呢就取消了,那我们顺便看一下前端代码,前端代码呢,就是在订单列表页当中呢,有一个取消按钮,我们来找一下。
13:05
那么在。S点这个页面当中。这面呢,有一个取消按钮啊,取消按钮呢,它调用了一个cancel方法,并且呢传递了一个订单号,那我们来找一下这个cancel方法。在我们methods里面。定义的,那么订单号是刚才传递过来的,那接下来呢,我们调用微信API,也就是说微信API是API微信这个文件。好,里面的cancel方法,那么这个cancel方法呢,就调用了刚才我们后端实现的这个接口,那所以我们再来到我们的页面当中啊,好,那这样的话呢,通过微信API调用了刚才微信里面的方法,并且传递了order number,也就是订单号,那么如果执行成功的话,在我们成功的回调当中呢,就会显示一个取消成功的提示,并且呢,刷新订单列表show out list呢,是再次的执行前面我们的这个方法,这样的话呢,我们订单的最新的状态呢,就会展示出来,好,所以呢,这就是我们取消订单接口的前后端的一个完整的实现。
14:37
最后呢,我们再补充一下,看一看我们刚才执行的取消订单的后台的日志当中,它打印的内容,那这面呢,我们显示了取消订单,然后呢是关单接口的调用,请求参数的组装,还有呢,就是成功返回204的状态,那最后呢,我们更新了订单的状态,订单状态呢被更新为用户。
15:02
已取消。所以我们来看一下database这面。Order in four。啊,数据库当中呢,很显然我们这边的订单呢,已经被取消了。
我来说两句