00:00
到目前为止呢,我们应用程序的核心代码大部分已经完成了,那么接下来呢,我们会开发一个退款功能,当用户点击退款的时候呢,会弹出一个对话框,选择退款的原因,那么我们选择退款原因之后呢,点击确定按钮,用户呢就完成了这个退款的申请。我们来看一下申请退款的API文档,那么你会发现呢,和退款相关的API呢,有申请退款,查询退款和退款结果通知,那么他们和我们的申请支付。查询支付订单以及支付结果通知呢,其实是非常类似的,所以说退款这部分的功能呢,和支付这部分功能的实现的流程呢,都是类似的哈,都是一致的,那这部分的代码呢,我们已经事先参考着支付写好了,所以呢,我们直接来阅读一下这部分的代码。我们打开我们的应用程序。
01:01
找到微信配controller,那么在这个类里面呢,我们创建了一个方法叫做refund方法,它接收两个参数,就是我们的订单编号以及退款原因。接下来我们来看一下业务层的回放方法。那么在业务层的方法当中呢,首先第一个步骤我们创建了一个退款单记录,那么在数据库当中,它对应的就是t found的info这个表,那这个表当中呢,有一些字段哈,那这些字段呢,我们来看一下我们的实体类。分别呢,有商品订单编号,还有一个就是退款单编号,然后呢是支付系统退款单号,那这个支付系统退款单号呢,是我们向微信支付端发起退款申请的时候,微信支付端呢,针对每一笔退款会生成一个退款记录,那这个呢,就是那笔退款记录的唯一的编号,好接下来呢,就是原单金额,那我们的支付订单当中呢,有一个金额呢,是我们用户当时的支付金额,然后退款的时候,实际上微信支付是支持部分退款的,也就是说比如说你这个订单呢,花了100块钱,但是呢,由于种种原因啊,你的商品没有退回,可能有一些瑕疵那。
02:22
可以和商家商量给你退50块钱,所以说这面呢是支持部分退款好,然后接下来呢,这面就是退款原因,还有一个呢,就是退款单的状态,还有呢,就是申请退款的返回参数,以及退款结果通知参数。那么我们申请退款的时候呢,和我们申请支付一样,它都有一个API的返回值,那么我们会把这个API给我们返回的数据呢啊存到这个content里面,那么后期我们有一个退款结果通知,退款结果通知当中呢,有一个通知参数,我们希望呢,也把退款结果通知当中的通知参数呢也存储下来,所以呢,这面呢,我们就有一个content notify哈,好。
03:08
接下来呢,我们再来看一下我们的service层的代码,那么了解到了我们的fund info里面都有哪些字段之后呢,我们来看一下创建退款单记录的这样的一个业务方法,好,我们点进来,那么这个里面呢,就是具体创建退款单记录的一个过程了,那么在创建退款单记录的时候呢,有一些数据我们需要从订单当中获取,例如商品的订单的金额,好那么这个时候呢,我们就需要根据我们的订单编号去获取到我们的订单信息,所以这面呢,我们有一个方法是根据订单编号获取订单信息的这样的一个业务方法,这面呢,我们创建了一个query wrapper,那么我们的查询条件呢,就是订单编号,接下来呢,我们根据查询条件查询到这个订单,把订单返回。
04:04
这面呢,我们获取到订单之后呢,就可以创建退款单了,那么我们创建退款单呢,首先我们把订单编号存到退款单当中,接下来我们根据order number u之前我们的这个订单号工具类里面呢,还有一个获取退款单编号的这么一个方法,那这个方法里面呢,它的退款单的编号的前缀和订单的编号的前缀呢,稍微有一点点区别哈,那后面的算法呢,都是一样的,好通过这种方式呢,我们生成一个订单编号存在这个位置,然后接下来呢,我们把订单当中的订单金额拿出来存到我们的退款单里面,再把我们这次用户选择的退款金额拿出来存到我们的退款单里面,那我们的系统当中呢,目前为止啊,实现的就是用户的退款金额,默认情况下和订单金额呢是一致的。
05:02
接下来呢,我们再把退款原因呢,存到我们的退款数据当中,最后呢,我们做一个退款单的保存工作,然后把这条记录。返回好,那么在我们微信支付退款的这个业务当中呢,我们通过创建这个退款单对象,就得到了一个退款单记录,接下来我们就开始调用我们的退款API,那么调用的过程呢,和我们前面申请支付也是一样的,首先呢,我们先组装这个URL地址,那么由我们的微信的主机的地址,再加上我们退款的地址,那退款的地址这面呢,就是。FUT。再往后就是我们要组装退款的一些请求参数了,那么这些请求参数呢,我们是根据。我们退款申请的API的。
06:04
请求参数列表啊来组装的,那么这些请求参数列表呢也是一样,我们呢,需要将必填的参数呢都给它组装上啊,其中呢,前两个参数有点特殊啊,这两个参数我们二选一即可,那么一个参数呢是微信支付端的订单号,一个参数呢是商户订单号。那我们这边呢,采用的是微信支付端的订单编号组装了这样的一个数据,接下来呢,我们又。设置了退款单编号,退款原因,下面这个呢是退款的通知地址,再接下来呢是退款金额,原单金额,退款币种,那通过这样的方式呢,我们把所有的请求报文当中的参数都给它组装好,组装好之后和之前一样,我们呢也是用Jason工具map转换成Jason字符串,然后接下来我们把Jason字符串设置成我们的HTP请求报文需要的string entity这样的一个数据对象,并且呢,设置我们的请求报文的格式呢为Jason格式,接下来我们把请求报文呢放在我们的http post对象里,然后呢,我们设置我们的请求头,也就是希望接收的数据类型呢,也是Jason类型,最后呢,我们完成一个签名并发送请求的过程,当然这个请求返回来之后呢,我们也可以顺便。
07:35
在在这个地方呢,完成验签的工作好,那么接下来呢,就是解析响应的过程了,我们拿到上面的这个response之后呢,就可以解析出这样的一个响应结果了,那么这个响应结果我们来看一下A档,那它对应着申请退款当中。后面的这些返回参数啊,所以我们拿到响应结果之后,里面都有什么内容呢?就是在API文档当中的返回参数当中,我们可以查看到,接下来呢,退款申请接口调用成功之后呢,我们的这个退款呢,就进入到一个退款中的状态了,所以呢,接下来我们要先更新我们的订单啊,把我们本地商户端的这个订单的状态更新为。
08:26
退款中啊,然后接下来呢,我们还要更新我们的退款单,也就是说前面。我们曾经创建了一个退款单记录,但是呢,这个退款单记录里面呢,只有一些初始化的信息,那当我们的退款申请完成之后呢,我们整个退款申请的API呢,会给我们响应一些数据,那这些数据呢,有一些非常有用,我们呢需要把它们存储在我们的退款单里面去,好,那接下来呢,我们来看一下这里面存了什么。
09:00
那这个里面首先把我们的退款申请API返回的数据先转换成map,然后呢,从我们的哈map当中获取到相应的值来做存储,当然存储的过程呢,我们要根据我们的退款单编号啊来进行数据的更新,所以呢,我们组装了一个查询条件,这个查询条件呢,就是在更新的时候,我们要根据这个条件来做数据的更新,接下来呢,我们创建一个退款单的记录,那么把需要修改的数据字段呢,都设置到这个对象当中。首先我们要。设置我们的微信端通过退款申请的返回值给我们返回的退款单编号,好,我们把微信端的这个业务编号呢存储起来,那未来如果我们对某笔退款有疑问的话,我们可以根据这个编号呢去上微信端去查单,好那么接下来呢,这面呢,就是我们的退款的一个状态了,那么我们的退款的状态呢,我们是放在了这个refund status里面,这个地方有一个判断啊。
10:14
一个呢叫做查询退款和申请退款中的返回参数,我们API接口当中呢,有两个,一个是申请退款,后面还有一个查询退款,他们都有返回值,他们的返回值呢,和退款状态相关的字段呢,是放在了status里面的,所以呢,我们需要从啊这两个接口的status这个返回值当中获取到退款状态,存入到我们的退款记录当中,而我们后面呢,还要调用另外一个方法,就是退款结果通知,退款结果通知在他的通知参数当中也有一个退款状态,而这个退款结果通知的通知参数当中的退款状态呢,放在了refund的status这样的一个参数当中,所以呢,我们需要从这个参数当中获取到我们的退款状态,那这个是这个接口有一点不一致的地方啊,所以呢,在这个位置呢,我们需要判断一下。
11:14
一下,因为现在我们是在申请退款这个功能当中呢。调用的。Updatefund的方法,未来我们还会在查询退款以及退款回调当中,也就是退款通知当中也来调用这个方法,所以呢,为了让这个方法呢更通用一些,我们把不同的这个地方呢,给他用if语句呢啊给他判断一下,这样的话呢,我们不但在退款通知当中能使用这个方法,我们在其他的两个接口当中呢,同样也都能使用这个方法,好,那接下来呢,我们把通知的所有的内容啊,如果是退款通知的话,或者是如果是申请退款或者是查询退款的话,返回结果的所有的内容都存储在我们的。
12:02
Content notify当中。那同样这个content这个结果呢,我们也把它区分一下啊,就是正常的,如果是查询退款和申请退款的话,我们把它放在。Content,这是返回结果,然后接下来呢,如果是回调的话,我们再把它放在content notify。那到这为止呢,我们整个的退款流程呢,就完成了。接下来呢,我们来测试一下这个退款功能。现在呢,我来发起退款,点击退款。好,然后选择一个原因,比如说不喜欢了。那接下来呢,我在这面。清空一下控制台啊。点击确定,这样的话呢,我的这个退款申请呢就发出了,然后呢,状态呢是退款中,我们来看一下控制台。那这面呢,就是已经有和退款相关的啊一些日志了,申请退款,然后呢是创建退款单记录,这样的话呢,我们就创建了一个记录,当然创建记录的过程当中呢,是需要根据我们的订单啊来创建的,所以呢先查询了订单,然后接下来呢,对这个退款记录呢进行保存,所以这是一个insert。
13:24
在接下来呢,就是调用了退款的API,那么我们组装了退款的请求参数。然后将退款申请发送出去之后呢,我们就得到了一个成功的返回结果,那么这个呢,就是我们的返回结果。好,接下来呢,我们更新订单的状态,那么把订单的状态呢,更新为退款中,并且呢,我们还要更新我们的退款单的这个记录哈,那么在下面这个位置又更新了我们的退款单的记录,好那这样的话,整个的一个退款的流程呢就完成了啊,我们来看一下数据库当中的数据。
14:04
找到fund info,那么在fund info当中呢,这面呢,就有一个退款记录了。像这个refund ID都是在后面的更新退款单记录的过程当中创建的。还有这个就是在创建退款单记录的时候创建的。那么这个呢,是啊,根据我们的退款申请的结果的一个退款状态,返回的是processing哈,叫退款中。然后这面呢,我们存储了。我们申请退款的响应的所有的数据。好,那我们再来看一下我们的订单状态,那我们的订单状态前端课程这面呢,是一个退款中的状态。好,同样我们的退款单状态啊,和这个订单状态呢,也是不一样的,也是有所区别的,我们来。
15:03
明确一下。我们找到之前我们这个申请退款的这个业务,最后这块有一个更新订单状态和更新退款单,那么我们的订单状态依然是根据我们本地order status的这几个状态,那么它有退款中啊,有用户已取消呀,超时已关闭啊等等,它是专门针对我们的课程订单的,而退款单的这个状态呢,它的来源是哪呢?我们来看一下,它的来源呢,是这个是远程的结果对不对?我们远程访问API的结果,那退款单的状态呢,来源于远程访问API的结果啊,这个啊,希望大家能够把它们区分开好,这就是一个退款的申请的流程。
我来说两句