00:01
各位同学大家好,咱们继续来开发挂号订单功能,刚才呢,咱们已经通过了微信支付完成了挂号的支付功能,那下面呢,我们再来开发另外一个功能,这个功能就叫做取消预约功能,那这功能我们要怎么做呢?首先给大家做一个分析,首先大家注意,比如说我现在啊,我创建的订单,而我这个订单是不能取消啊,取消的话咱们分成两种情况,哪两种情况呢?首先第一种情况,我已经预约成功了,但是我没有支付,所以我们点击取消预约可以做到,然后第二种情况,当咱们已经支付过了,是不是也能进行取消预约,所以这是他的两种情况。而两种情况中呢,第一种情况咱们在未支付情况下取消订单,这个过程应该比较简单,直接去更新你的这个订单的状态是不是就可以了,然后第二种方式复杂点,当咱们支付之后,我要取消订单,那怎么做,咱要首先是不是要先退款呀,给用户退款,然后再去更新我们的订单的状态,而这里边就是关于取消订单的这么一个需求,而我们在这里边的给大家重点用第二种方式做到第一种方式各位按照我们的过程给他自己快速实现就可以了。咱重点说第二种方式就是已经支付之后,我们先做个退款,然后再去更新医院订单的状态。
01:29
所以咱们下面就来做这个取消预约功能,咱们做这个退款,包括更新状态操作,那咱们看这个功能我们该怎么做呢?给大家做个分析,因为咱们现在呢用的是微信支付,而微信支付之后我们要退款,所以咱们也是要去调用微信的接口实现退款操作。那这操作怎么实现呢?下面给各位来做一下啊,首先第一个我们要进行微信退款的话,你需要到官网下载一下它相关的证书,这个证书呢,我这里边已经给大家下载过了,然后咱在项目中需要配置上我们的证书,通过证书来实现退款操作,那我们看一下啊,在我的资料中给大家提供了一个工具类,然后里边有一个相关的证书,这就是微信操作退款的证书,比如说咱们在项目中需要用到它,所以这是关于一个基本介绍,所以咱们下面呢,给各位就来具体实现一下这个预约取消的功能,咱们先做到微信退款,然后再来更新相关订单状态,那下面我们来做一下啊。
02:39
首先第一步操作呢,咱们先把这个证书文件给它复制到我们的项目中来,比如说我现在在我这个O这里边,我们在result里边,我先给它创建这么一个就是。文件夹,比如说这个文件夹我就叫CT,然后把我们这个证书文件给它直接复制过来,证书咱就放到这个位置,然后这个发完之后,这是我们的第一步完成了,然后第二步呢,咱们在配置文件中配置一下我们这个证书的这个路径,那这路径我来配置一下。
03:17
咱们找到啊,我在配置文件,我们点,然后咱们加上一个就是这个相关这个证书。我写到这里啊,退款的一个。证书,比如说我们叫这个微信点c ert,然后加上这个证书那个完全路径,也就是带盘符那个路径,那这个路径我们来找一下啊,我这个证书应该是在这个位置,然后里边在这个就是预约挂号里边这个service service order里边,这个result里边的CRT,我们是在这个位置,所以我把我这个路径给它复制过来,然后写到咱的配置文件中来。
04:01
咱给他写一下,然后最后加上咱们这个证书的名称。就是这个名字,然后在写的时候呢,因为现在它这个斜杠这里边我们需要做个转移,所以大家给它写一下啊,转移一下里边的一个路径,我的这个是在这个路径下,各位写的时候写上你那个项目中对应的这个路径,让他能找到你这个证书文件就可以了,我现在是在这个地方。所以现在给它都配置过来了,这是我们做的第一步操作配置证式路径,然后这个配置之后呢,咱们下面就来创建它相关的接口部分,那这里边给各位做创建,而在创建过程中呢,我们这里边啊,需要做到这么几个操作,首先第一个操作,因为咱们就是在退款之后,我们是不是要更新相关的这些信息啊,第一个就是咱的订单,第二个有一个支付记录,包括这里边还有一个表,这个表,这个表做咱那个退款的提货信息,所以咱们这些表标定操作,所以首先我先创建一个方法,这个方法咱们做这个事情。
05:11
是为了后面更新做准备,咱们根据我这个订单ID,还有这个类型,先得到咱这个支付记录,然后得到之后呢,我们再创建这个相关的退款的部分,包括写controller,包括写service部分,那咱们首先先来建这么一个接口,就是根据订单ID得到咱这个支付记录接口。那这里边我来写一下啊,我把这个接口给各位复制过来,然后咱们找到咱们里边相关的service,或者一块使用service,就是这个payment service里边加上接口,获取我们的支付记录,然后这个加上之后咱们来到它的实现类中,Payment service在实现类中来实现它的。记的方法。
06:01
我在里边写一下,这个方法做的就是根据我们的这两个条件值,然后得到我们最终的这个数据,那我在里边给各位快速来写一下啊,我们加上一个query rapper,然后里面加一个payment。In。咱们叫rapper,等于new上一个query rapper,然后rapper里边设置它的条件,第一个条件就是里边这个订单ID,咱看一下表里边订单ID应该是这个的ID。把这个给他拿过来,然后他传的值就是这个OID,另外还有第二个是它这个支付的类型,我们加上一个EQ,然后支付类型是连这个payment type。把这个加上。这里边加上这个叫payment type,然后加上之后,最后我们调用这个base map中的方法,咱们调这个select y,因为它这里边不能重复添加,所以咱们最终返回个payment info这么一个对象,然后把它做个return就可以了。这是我们写的一个方法,为了一会儿进行使用,比如说咱要做这个操作。
07:17
然后这个写完之后呢,咱们下面就来创建里边这个其他部分,大家注意啊,我们现在表里边除了这两表之外,还有一个表,这个表叫这个refund info,这个表因为记录咱们那个退款的信息,所以这个表里边咱把它相关类也创建出来,包含它的controller,包含它的service,还有它的mal部分,然后在里边,比如说咱也写个方法,就是保存那个退款记录,比如说我退款是哪个订单,包括等等信息在里边再给它加上,所以现在咱把这个做个创建,我们先串这个refund info,它这个map就是汇款记录的map。那那个写到我们这里边,我们来创建。
08:01
Refund for。然后我们让这个map呢,继承一个叫base map里边加上它的实体内就是这个refund info。这是我们退款这个十几类。啊,应该是一个interface interface。这个我们给他做这么一个创建啊,让他继承我们这个内容,呃,然后把它呃重新创建一下啊。重新给他。创建一下,我在里边建一个interface。这个。Refund info。让他继承这个。Space map,然后里边加这个refund for。这样的话把这个map我们就创建出来了,然后这个实体类我们看一下啊,里边就是一些相关的退款信息,包含你的对外的编号,订单编号,支付类型,交易编码,推广金额等等信息,这个map我们就创建了,然后创建map之后,下面再来创建里边这个servicece,我在里边写一下,Service中先写个interface。
09:19
然后service的interface,我们叫refund for service。然后这个service呢,继承一个叫这个I service里边传入你的十几类。我把这个拿过来啊,都是咱们之前写过的内容,我们就快速创建出来可以了,然后创建之后呢,再来写上它的一个就是相关的实现类。那咱把它的实现类我在里边。创建出来。就是这个I'mpl然后让它就是实现咱们这个接口。这个我们就写出来了,另外让这个实验类啊,它也是继承这么一个内容。
10:04
把这个啊给它直接就复制过来。转给他。补充完整。包括它的。相关的。依赖给它都点进去,所以这样的话,这个实现类我们就完成了,上面我们加上一个service。然后依赖给它引入,这是关于相关的创建,然后这些创建之后呢,咱们在这个SS里边呢,创建一个方法,这个方法用于保存咱的退款记录,也就是最终向咱那个round info里边加上咱的数据。那我现在来写上这个方法,这个方法比如说我把这个给各位复制过来,咱们写他这个。就是里边。这个方法。保存你的这个退款记录,然后写完之后咱们来到它的实现类中,在实现类中来实现它,最终这个方法我写个注释。
11:06
保存。退款的记录,那这里边咱们把这个方法给它快速实现一下。咱们来写一下啊,然后这个方法中大家看啊,咱们传的对象是这个payment info,就是咱那个信息,那在里边写一下,因为咱们跟之前一样,我向表里面加数据,首先是做判断呀,如果表里边有相同数据,那咱就不需要添加,没有相同数据我们再添加,那怎么判断呢?大家看啊,这里边有两个字段,一个是OID,一个是这个支付类型,根据它是不能判断,因为这两值肯定是唯一的啊,那这里边我们来快速写一下啊,就是第一步。判断是否有重复的数据的添加,那咱写一下,我来一个这个query。Rapper里边加上一个这个round info。
12:04
Info,然后咱们叫rapper,等于new上一个quality rapper在per里边设置它的条件,第一个条件就是里边这个order ID,然后order ID,咱通过这个payment info里边能得到这个order ID,这是第一个值。然后第二个值就是里边这个支付类型,那我到里边给它复制出来,支付类型应该是这个payment type。然后支付类型,咱们通过这里边也给他能够取到,就是这个payment type,然后这个条件设置之后,咱们下面调用方法来做查询,我们用一个叫select。Y。啊,Select one,然后里边传入这个rapper,最终返回咱们这个对象,这个我们做一个查询,然后返回对象之后,下面咱做个判断,如果说这个对象呢,它不等于空,那表示表里边有相同数据,咱就不需要添加,把它直接返回就可以了,如果没有相同的,那这里边我们再进行其他的这个操作,那这里边我来加一个退。
13:19
Round info,就是它里边有相同的数据。加一个注释,如果说没有相同数据,那下面我们再做个添加,就是没有相同的话,那这值肯定等于空,所以我们下面再进行这么一个添加。就是添加记录,那添加记录我们用这个run info等于new上一个round info,就是先new这个对象,然后扭完对象之后向里边来设置它的这些值,里边有很多值,比如说我们写几个,后面一些我就复制过来了,比如里面有一个click time。那就是咱们的当前时间啊,当然里边还有其他纸,那其他纸呢,我找到我的课件中,把其他纸给他就直接复制过来,就是里边的这些值。
14:09
那我们看一下啊,里面这些值应该都是我们最基本的,比如你看里边有订单ID,支付类型,订单编号,包括你这个相关的状态,而这个状态大家注意啊。我们看这个状态目前是不是一个退款的状态,退款中包括已退款,然后这是我们的签相关的信息,还有里面一个订单的金额,这些都是之后最后我们调一下这个方法,然后做到这个添加操作,咱们调base map里边这个in色的方法,传入这个round info。然后出完之后,最终把它咱们做一个给退,所以这样的话,这个方法就完成了,保存我们的退款记录的方法,这是咱们编写的这个内容。然后这个写完之后呢,咱们下面来写这个就是。
15:02
关于我们这个退款的controller报告内容,当然各位注意啊。因为咱们进行退款的话,咱们是不是也是要调用微信那边的接口。由微信提供接口,我们进行调用,然后来实现咱们最终的退款,所以咱们下面我们在微信里边写下这个退款这个方法,因为刚才写的都是操作数据库,下面写的才是真正的退款方法,那咱们来实现一下啊。首先我们找的这个微信的service。在里边加上这个退款的方法,就是咱们叫这个给放的,然后传入这个订单ID,这个写完之后来到微信的实现类中,在实现类中具体实现下这个退款操作啊,这里边我写个注释就是。微信退款操作。那这个操作呢,跟我们之前写那个就是生成二维码,包括咱们之前写那个就是查询状态基本类似,它也是去调用微信里边的接口,把这个最终得到,那我们来写一下啊,首先我们的第一部分咱们可以先做个查询,先把这里边的相关信息给他查出来,那查的话大家注意啊,这里边有一个订单的,这个就是ID。
16:25
那咱们可以用一个方法查询,我们来写一下啊,这里边应该有一个payment service,咱们之前写过这个方法。就是刚才我们刚写过这个方法,得到你这个就是相关的支付记录信息啊,所以这个方法中大家看刚才咱们刚写过,里边传入订单号,包括你这个支付类型,然后把信息得到,所以这个方法我们现在给他就用一下。我写一下啊,就是获取到你那个支付的这个相关的记录的信息,里边传入两个参数,一个是订单ID,还有一个是支付类型,支付类型咱通过这个payment type枚举里边这个值得到咱类型,我们就查这个微信。
17:13
这么一个类型。然后最终呢,它会返回咱这个payment for这么一个对象。这样的话啊,咱们第一个我们就得到了,查出来呢,你的支付信息,然后信息查出来之后,我们再进入到里边的第二部分,第二份做什么呢?咱就可以把这信息呢,先加到咱那个退款记录表中,因为咱像表里边最终肯定要加数据嘛,就是像这个run的info表里边加数据,然我们写第二部分添加你的这个信息到这个退款的。记录表里边,那怎么加呢?咱调一下,刚才我们写那个就是相关这个service,就是那个round service,那我给它先注进来啊,我们加一个凹,然后加这个。
18:03
Round。嗯,就是刚才写的这个啊。撞的info。这次我把它直接复制过来。然后咱们调用里边刚才写这个方法,我们做一个就是添加操作,咱给它添加一下啊,我们调里边刚才就是这个方法,Save round info里边传入我们这个payment info,最终会返回,就是你这个相换对象,这样的话我们的第二步添加就完成了,然后添加完成之后,我们继续往下进行实现,那下面做什么呢?大家看一下我的课件中啊,这里边呢,我这个位置做了一个判断。那这判断什么意思呢?各位看到我把这个拿过来啊,这应该不难理解,大家看啊,首先我通过round info得到里面这个状态值,然后状态值呢,如果说是这个值,那我们就直接存处,大家看啊,这个值是什么,是不是已退款,比如说你查这个数据中,如果它本身已经完成了退款,那咱就不需要往下做,直接存处是不是就可以了,所以这里边做了一个判断,就是判断当前这个。
19:17
订单的数据是否已经退款,如果说已经退款,咱就直接return出,如果说他没有退款,那我们再去调用微信的接口就能做到,里边就是这个过程,然后下面咱就来调用。微信的接口实现退款,那怎么调用?首先咱们先封装我们这个调用接口中需要的一些参数,怎么封装,咱们写过至少两遍了,是不是用过ma集合呀,然后ma集合中这是值,把这值转成叉格式,最终我们进行切换操作啊,跟之前基本上一样的,那现在我们给他。快速写下啊,咱们就写一个map集合。
20:02
我写个缀,然后它的value也叫缀,这个名字我们叫P。Map等于妞上一个。哈希map向map中设置它的相关的参数值,也就是里边的。这几个值我把它都复制过来,就是里边的。这么几个值。我把它复制过来,然后大家看一下啊,首先第一个值就是我们这个ID,第二个商户号,然后第三个这个字符串,下一个是我们那个微信的那个订单号,因为咱们要进行退款嘛,而微信订单在我们的payment info中应该能取到里面这个订单号,也就是里边的,咱看到啊,就是里边的。这个值微信的这个订单号啊,里边有这个相关值,然后除了这个之外,在里边还有下一个是你那个商户的编号,比如咱们订单那个唯一的编号这个值。
21:03
除了他之外,下面有咱那个商户那个对单号,其实对单号就是这个微信订单号啊,是一个值,然后除了他之外,下面有咱的金额,我们的金额呢,其实真正实际项目中,你要选取你实际那个订单金额,因为咱们现在约定我们支付就是这个。一分钱,所以咱就退款,包括这个总金额都是一分钱,这是我们设置的金额,然后设置之后咱们在操作中需要把咱参数是不是给它转成叉,并且是不是要进行加密啊,跟之前一样,用微信工具类中的方法把这个M集合转成买,并且用咱的这个商户key对它进行加密,所以现在这些参数部分我们应该都写出来了,这里边有异常,咱给它加上一个try catch处理一下。我把这部分都放到咱那个拆开里面去。所以大家看啊,现在这个参数就完成封装,然后参数封装之后呢,下面咱就要调用微信那边的接口部分,然后写一下设置调用的那个接口的这个内容,大概设置我们加个htp client,然后client等于new上一个htp client里边加上这个接口的路径。
22:23
这路径我从里边复制一下,就是这个路径。各位看到啊,这个路径名字它叫做配refund的,就是一个退款的接口,然后这个写完之后,我们向里边设置它的参数,就是叉LP,把咱刚才这个叉参数放进去,然后设置之后,我们下一步再来设置它这个HTPS。等于负,除了这个之外呢,大家注意啊,下面有一段内容跟咱之前不太一样了,因为现在我们做这个退款的时候呢,需要用到咱们刚才下载那个证书,所以下面部分呢,你就需要设置一下你这个。
23:06
证书的一些信息,通过证书才能完成下载,如果说你不设置证书,它是不能进行下载操作的,就是进行这个退款操作的,那咱现在把这个证书我们来设置一下。大家看一下啊,首先set CRT等于true,然后设置你那个相关的内容啊,通过这个商户P设置它这个相关内容。所以现在咱们把这些都设置完成了,设置完成之后,最后我们来调用,用client里面这个方法叫POS方法完成最终调用,所以这是关于我们写这个退款的这个接口部分调用微信的内容。然后在写的过程中呢,有一个地方各位注意啊,咱就来到我们当时写的一个工具类里面,各位注意,在工具类中呢,当时我们在里面有一个地方,我特别加了一个土著说需要完善。
24:01
不是,各位是否记得啊,这里边要写什么呢?你需要在这个位置写上,就是你那个证书的那个路径,把路径需要写上,当时我们这里边是写了一个空,我这里写到说需要完善,所以咱们现在把这个就给它完善一下,那些路径怎么做,就是你可以第一个写法,你可以把这路径直接复制过来。但是我们是写到配置文件中嘛,所以我给他呢,写到咱这个工具类中,我在这里边再给他写一下啊,通过工具类来调一下,这个我们叫CT。然后咱们通过这个Y6注解取到里边这个值。然后这个值咱看到就叫微信点CT。下面我们定一个常量public static string c,然后最后我们做一个赋值,C等于。
25:00
CRT这个啊,咱们在这个就是工具类中,把这个配置文件中这个证书的路径取出来了,然后取出来之后在咱们这个HT的工具类中的这个地方,通过咱的这个工具类取到这个路径,这个咱们需要做完善,所大家写的时候这个地方要特别注意啊,如果你这路径写的不对,最终退款是不能成功的。这咱就完成了,完成之后现在完成了请求,然后完成请求之后呢,最后它是会返回数据啊,所以咱们就接收到他返回的这个数据,那我们接收一下啊,可赖里边这个叫get content接收到数据,它的数据返回的是一段叉L格式,那咱们把这叉格式转成我们的麦克集合。我们给他转一下啊叉买to map。然后它返回到就是一个map集合,比如我们起名就叫result map,这样的话结果就得到了,然后得到结果之后咱们往下看啊,就是下面咱怎么做呢?咱们可以通过它的结果中的内容做个判断,如果说现在退款成功,那里边我们就来做一些相关的操作,比如更新我们那个就是退款记录表中,因为大家注意啊,刚才咱们加那个退款记录表中的数据的时候,我们是正在退款,现在如果说成功的话,那就表示他已经退款成功了,所以现在我把这个判断咱们在里边给它快速弄出来。
26:35
啊,就是这么一个结构。然后大家看到啊,这里边的写法啊。就是我们现在在这个位置,我们通过里边这个结果做个判断,Result map中它会有一个返回值,叫做result code,这是表示我们的状态嘛,然后咱根据它给判断。如果状态码的值是这个success,就表示当前我们这个退款成功了,如果退款成功的话,那我们做件事情,什么事情呢?就来更新咱那个退款记录表,把里面的状态改成这个状态就是已经退款,所以咱们现在就来完成这个事情,然后调方法R的方法做一个更新,最终return处,然后否则for。
27:24
啊,这个啊,我们现在就把这个退款的接口,咱们就最终就完了,还是调用微信那边的接口,做到跟咱之前的生成二维码查询状态基本上是一致的。这个我们就写完了啊,然后写完之后呢,咱们下面就可以做到把这个CTRL部分给它完成啊,当然这过程中呢,这里边应该还有一个订单的接口,包括订单里边咱们把它的信息也要做个修改,然后咱还要去调用医院那边的接口,让医院那边也最终完成更新,那咱们一会儿来实现,目前呢,咱这完成里边基本的方法主要是这个退款,这个借款方法。
我来说两句