00:00
好。嗯,那我们创建一个类。啊,在哪创建呢?在APP下面啊,我先随便创建一个类啊,因为我们最终不会去用它,最终我们会把它去往更高级的一个层次,就是说往这个factor的一个层次去封装,所以我先随便放到这里啊,先随便放到APP这个目录下啊。然后创建一个一个plus的一个class。好。接着啊。我们来看看怎么去提取这些东西,首先要提取这个内容,这些配置文件你肯定要提取出去,是不是这样的。啊啊,所以像。这些配置文件啊,我们应该定义一些。受保护的一些属性。哎,把注释也写上商户的这个ID。
01:00
好,然后是API。K。接着把这个变量也拿过来啊。也是受保护的就可以。好,那我们再来定义一个。就是构造函数,在构造函数里面去初始化这些配置,配置呢我们从一维里面去取。方。Constructor。嗯,Con。等于哎,我们去新建一个config啊。就是把这些配置文件都放到con里面,然后在这个类里面,我们从con里面去取出来这些配置啊,为我们的这个类的一些属性去设置,最后我们再把这个比如说这个参数的封装啊,还以及结果的返回,以及这个加密都封装成这个类的一个方法就完成了。清楚吧,啊,来看一看啊。Config,那我们新建一个配置文件吧。
02:02
就是普通的PP文件啊,创建一个ex。那这个配置文件呢,直接去一个数组就可以,然后是它的数组的一些数组项啊,比如说。我们的这个配置项。然后让它从EV里面去取啊。好,这个取哪个值我先不说啊,接着先把这个再写上。把这个也写上。也从一言为里去取。好,呃,接着呃,把注释写一写啊,商户ID。这个dota鼠标,这是我们的APP。接着写我们EV的一个名字啊,EV的一个名字啊,一般我们都用大写啊。
03:02
一般我们都用大写啊这样的啊,比如这个是APP下划线。那接着去,因为。去加入这些配置啊。快递查询的配置。哎,一个它等于。然后。还有一个是。这个它等于。可以吧?啊,那不是他啊。写错了,应该是他。等于哎,我们这时候可以把控制器里面的这两个值就拿过来了啊,放到这里了。域名我不用处理啊,域名他们API不会换域名,所以域名没必要去放到这个配置里面,我们写支付的时候,你建议人家把你支付的这个相关的接口都给你放到配置里面,没有吧,是不是也是只是配置了一些必备的一些配置嘛。当然这个回调域名因为是你自己去定义的,你可变的,所以给你放到这里面啊,所以我们这里也不用啊,也不用就只要把呃,商户的ID还有API的K给放到这里面就可以了。
04:09
因为。把APIK粘贴到这里,哎,这两个配置就挪过来了啊。接着呢?啊,我们这里你看因为里配置了这两个键,然后创建了一个配置文件,配置文件里面去使用这两个对吧?啊,接着在这个类里面,我们就可以用config辅助函数啊去。加上这个文件名,可以拿到这个配置文件返回的这个结果啊。Conf price啊,就可以得到它return的这个配置的结果。好,接着this。他是不是。就等于。Config里面的。
05:01
好,这样我们就拿到了配置文件对吧。啊,Config里面的。这个东西啊。好,接着同样再来一下,它等于卡里面的它。哎,是不是我们这样就从con里面去拿到了对应的这个配置是不是好,接着写我们的方法。那我们都有什么方法呢?嗯。先把这个整个代码都拿过去啊,先把这个整个代码都拿过去。来,我们定一个方法啊。反写。啊,取个吧足迹啊。来,把我们的代码粘贴到这里。啊,这个也引入啊,好,接下来开始去,呃,抽离我们的这个代码。首先这些配置,也就是说用到这些配置的这个地方,我们可以从这个类里面啊,就是this。
06:03
就是this这里面去获取对不对。包括这个K是不是这样的啊,配置我们首先处理了,那既然这里还需要这个方法啊,我们把这个方法也给拿过来。这个方法作为一个签名的一个方法的话啊,受保护的就可以只在内部去使用。方形好,那既然。这个也是我们这个内内部的一个方法的话,其实这个API的这个K都不用传。你直接在这这里用this去拿这个。APP的这个K是不是也可以。对不对。哎,只要传一个date过来就可以嘛,好。接着我们来处理啊。接着看什么?首先这个URL啊,既有这个正式的,又有这个。又有这个这个沙箱的,我们不可能说,哎,我测试我把这个沙箱的打开,我上线了,我把帧数打开,没有这麻烦的吧。
07:05
我们是不是可以参考,比如说支付这里,我们是不是也可以在配置里面去定义一个这个变量,如果开启了这个配址,然后就是进入沙箱的一个地址,如果没有开启一种正式地址,对吧?所以我们需要一个方法来专门去处理。这个ul先把这个注释写一下,这个是及时查询的一个快递的足迹啊。啊,及时。查询啊。快递足迹。所以我们得需要把这个URL给给处理出去,来单独得写一个方法啊,也是内部使用啊,内部使用的话直接使用protect。方式。URL。返回APIURL。
08:04
那这里我们要接收一个什么,接收一个type,也就是说你要请求哪个类型的一个API,对吧,因为他一个。一个这个网站它有这么多API。所以说我们要根据不同类型返回不同地子,我们封装类一定要有一个这个可扩展性的一个思想,你不要说啊,你就用这个,你就封装成了一个,他别人都用不了了,对吧,我们要。就支持所有的一个API,哎,至少是支持这个他这块的所有API。你通过传不同类型,我给你返回不同的一个。这个U2不就完了嘛,是不是好。那我在这里要定义一个所有的一个URL啊,得到一个数组,这个数组呢,我肯定是要按照这个类型。来返回对吧,那类型,比如说我们这个及时查询,我们就用它啊check这个类型ICK好,它里面呢,它应该有两个地址,一个是我们生产环境用的,一个是我们测试,就是说测试环境用的。
09:05
对吧,好,所以我们product定义一个生产环境,有了正式的啊,然后再定一个D啊,开发时候用的,也就是一般沙箱测试时候用的可以吧。啊,那接下来我是不是就可以这个URL,我先用这个tap去获取到。就是说这样的一个数组,接着它里面还有两个,是不是我是不是还要再来一层数组去获取到啊D啊,啊,或者这个product,当然我不能这么写死吧,所以我要有一个。啊,我们类里面要有一个属性,比如说我们就用这个model哎来控制,我们拿生产环境还是拿它对不对好,所以我们去。创建一个啊这么一个类的一个属性。啊,模式啊。
10:00
就用model吧。然后这里配置呢。我们写一写啊,Model。Model。当然有可能你没有这个参数,有可能你你不用配不配置啊,所以啊,我们这里应该给上这个。啊,默认的是。调大的。玩呢?嗯,那现在。我们要去配置文件里面去加一个这个配置是不是好。是否进入沙箱模式model?等于第一位对,当我们开启了它的时候,这个配置的时候,就会进入插件模式,当我们把它注释掉,注释掉啊,这个类里面它就取不到这个配置了,取不到这个配置呢,它就会用它。对吧,那里就会给我们返回生产环境的一个地址。
11:02
这里处理URL,这里是不是就会返成根据这个model去返回对应的一个。地址好,那这个U22处理完了啊,跟我们在支付的时候,人家写的这个模式也是比较像的啊。嗯,现在我们进入的这个沙箱模式啊,这个字错了,好啊,那接着。这里面的这个地址是不是可以抽离出去了。是不是,首先这个配置刚才我们已经使用了this啊,不是这个啊,是这里面。类里面。啊,这个地址是也可以处理出去了,这个是。嗯。正式的一个地址啊。这个是沙箱的地址,我们正式的放到这里面。沙香的放到下面。
12:00
把这个就可以删掉了啊,这个就可以删掉了,那这里是不是请求校U。URL我就直接呃使用this URL调这个内部的这个UR函数啊UR方法,然后我给它传一个type,我是不是就可以得到这个URL了,然后传type,传谁呢,就传这个。Check。你看我传菜进来。就可以得到它对吧,得到它呢,这样得到了一个这样一个数组,也是这步是得到了这个数组之后,再用this mode,根据这个嗯,DV或者去拿对应的一个地址啊,这样URL我们也处理完了。接着看看还有什么要处理的啊。还有什么能。嗯。抽离的啊。接着看一看这个。这个啊。就是说。啊,你如果看一下他其他的一个。就是沙箱测试,你看一下其他的一个API的话,它这些系统级的参数它是都需要的。
13:02
清楚了吗?所以这个我们也可以把它抽离出去啊。知道吧。啊。然后。来我们建立一个,再来一个啊。因为这个其他地方都会需要这些系统级的参数,它真正改变的是什么,真正改变的不同的是啊,它的这个request type啊是不同的。清楚吧,所以哎,我们把那个request APP流程变量就可以了啊来。嗯,就是说你们如果去其他的地方去看的话,我这里就就不看了,接着封装一个什么呢。Request。啊,函数啊,Product function。Format。
14:00
I啊。啊,处理这个请求的这个数据。格式化。请求参数。那。接着啊,就把它也给抽离出来了啊,放到这里面,最后我们return这个data就可以了,是不是好,需要一个什么,需要一个request date是不是。啊。需要request data。然后还需要什么。之前我们还说了这个request type也是不一样的啊。清楚了吧,啊,这个也有可能不一样,这个我们碰到的时候再说吧,好吧,现在我们用的这个接口啊,暂时不涉及到它。好,那这里就是。Request,它你商务ID不会变呀,你这个request data就已经传过来了。是这样吗?啊,所以。
15:00
那这里。这个请求的这个参数就是dota this里面的啊,Format date,哎,我们把什么呢。画一下行吧,有点长了啊。把什么呢,把。这个request date传进去。知道吧,把它穿进来。好。他传进来啊。哎,还有一个参数request type是吧,我们这个type是1002,是不是就这个API的这个type吗?是1002。好,那这一步啊,已经优化到这里了,我们发送请求,这里来接着看。接着看什么呢?嗯。看这个请求的这个参数啊,参数请求的参数,你像呃,这个物流公司,还有这个单号肯定是传过来的是不是,所以这里我们要在调用这个方法的时候,要能传这个物流的一个公司。
16:09
对吧,啊,所以。我们把这里也给写上啊。还有单号也是要能传的,对吧,你查快递你肯定要给我物流公司和物流公司的单号。啊,因为这个最外层是双引号,所以我这里可以直接用大括号去写这个变量啊,包括这里也是啊。直接用大括号去写这个变量,哎,这样我们请求的参数也分好了啊。那接着我们来看一下。嗯。接着来看什么呢?就是这个返回的这个数据啊,有也需要格式化。就是我们在使用其他的这个API的时候,也会用到,用到这个返回的一个数据嘛,所以这个格式化也可以去提取数据,对吧,那你们可能为什么不把这个发送请求提取出去呢?因为每个地方它发送请求的这个参数啊,可能额外带的一些参数,或者说这个啊请求的方式不一样,所以这个我们就不去提取了。
17:12
来,我们再格式化一个响应的一个参数。For met。Res对称。格式化。响应参数啊,那他应该接受一个。Result啊,就出一个结果,这个变量就随便写啊,那。应该是直接就返回他。啊,应该直接就返回它就可以了。
18:00
然后传这个result过来嘛,传他的这个执行结果result过来嘛,我们还我们还可以在这里面去加上一些这个result一些判断,比如说请求失败什么之类的是不是。好,这里就先不写啊那。这里就可以不要了,直接return这个this里面的。Format。啊,直接这个格式化后的一个返回的一个数据就可以了。清楚吧啊,直接怼它就可以了啊。那这么一来,呃,我们这个类就封装好了,可以看到也是比较完善的,就是可以去配置。对吧,基于配置的,然后是呃,封装的一些内部使用的一些方法,包括对外提供的一些方法。啊,内部使用的像一些加密的方法,一些格式化数据的一些方法,包括返回不同这个API的一些方法。接下来进行测试。及时查询啊。
19:00
来在这里面进行测试,那这些都不要了,这些都不用要了啊。可以吧?啊,这个签名也不用了,那我就真正的测试啊,真正的测试呢,我们要得到他的一个。物流的一个轨迹要调用那个方法?所以那个方法我是不是得先new class啊,不是它express。啊,APP下面的他然后。嗯。就是说结果啊,我们的物流的一个结果。等于谁这个类里面的拆方法是吧,他接收一个物流,呃,公司类型和物流这个。编码啊,就是说单号。注意这个物流公司的类型啊,不是你随便去写的,而是。在这个它里面提供的有有快递,各个快递的公司的编码,它是一个表格,我们可以从里面去看。啊,我们可以把常用的给做成一个啊,就是说下拉框啊或者什么的一些数据存到我们的系统中去给返回就可以了。
20:09
来这里。接收一个order里面的。Order里面我们有这个物流的类型的字段。是吧?来看一看啊,忘了是啥了。找到订单这一块。有这个快递的类型啊,然后还有快递的单号,所以我们要传这个order里面的,它和order里面的。这个。这个单号啊。好。传他们啊,最后我们返回这个result就可以了,Return response。啊,它是一个数组,把这个返回就可以了。
21:01
哎,这样就完成了这个物流的一个查询。呃,当然,呃,我们先看看结果啊,先看看这个结果。153号。说明有地方报错啊,刚好我们把我们的错误信息给。优化一下。先来看一看啊,这一步应该是有返回的啊,这步应该是有一个查询结果的,也就是说他服务器报错的一个原因。看一看。是不是?看到了吧,啊,所以啊,我们在拿到这个结果之后,我们应该做一个判断,如果他的这个啊,Success是force,我们应该直接就返回这个错误的一个信息是不是。
22:06
我们这里先获取一下啊。Result等于它啊if先把错信息除一下,最后我们再排除,就是说再去解决这个错误的一个问题。它里面的。这个。如果。那等等一会。这时候可以直接返回了,直接返回。到他啊。那这个时候我们来看一看。也就是说,哎。我们这里就拿到了这个。错误的那个结果啊,那我们这里应该做一个判断啊if。Set啊,先用set吧,因为我们还得对比成功的那个去做一下处理。
23:09
如果设置了它啊,并且它的值。等等1FO。那我就说说明说错了吗?我们就直接去一个。啊,错误的一个响应吗。Request。请求错误啊。啊,这个时候至少可以有这么一个400的一个错误。但是这样我们并不知道是出了一个什么问题,所以呃。还是可以从里面去拿到错误的一个消息。
24:01
给他显示指定的一个错误的消息。看到啊,错误消息是在哪个字段里面,在这个。啊。响应的这个date里面啊。也就是这里面是我们的错误的消息。把它给放这儿。好。这样我们正好把错误给处理好。对不对,远程服务器内部错误啊,这个是API的一个问题,也就是说是我们请求。他们这个API的这么一个问题啊。好,这里也可以去把这个给。换一下。找找请求API的地方,也就这里啊,这里我们请求他发给返回给我,结果不是我们需要的一个数据,它内部服务器错误啊,是这个地址的一个问题。
25:01
经过我长时间的这个排查。问题包括。测试了所有的一个参数,就没有发现任何异常。所以我们代码是没有任何问题的。然后那我就在想,是不是他这个对这个测试账号做了一定限制,比如说啊,我每天只能请求十色。好,基于这个尝试,我又新注册了一个账号,重新更换了我的测试的这些配置啊,结果发生一次请求就成功了啊,说明。就是对账号做了一个限制啊。所以说这个问题。就是我们这么封装是没有问题的。其他的都没有任何问题啊,那接着去写我们代码。那这里我们还是从订单里面去获取。啊,这是我测试的时候写写子啊,还从订单里面去获取这两个啊type。然后是我们的这个单号。
26:03
所以你们如果也是在写这一块,然后突然用着用着就出现这种,嗯,内部他们内部复习错误,可能又是你请求的错限了。这也是。啊。没有办法的事情啊。啊。嗯。那其实。这一块我们啊继续要优化一下啊,就是我们的订单。只有什么情况下才能去发送。这个查询物流呢。只有在商家去填了这个快递的单号,也就是说已经发货的情况下,我们才能去。查看那个物流对不对。所以啊,这里你看我们的订单是。现在查的是几?四这个对吧。但是四这个它的状态是二也是刚付完款。而且这个都是空的。啊,所以这个时候我们应该不能查,所以我们这里应该做一个判断啊,就是说if order。
27:04
啊,你的这个space啊,不等于。嗯,我们想想有几个状态是能查的,首先是三发货了,是能查这个物流状态,而且我们在购物的过程中已经完成了这个订单,也是可以的。对不对,也就是说啊。在什么情况下呢?在这个已经发货和已经收货啊,这两个情况下,是都可以去查询这个物流的啊,所以我们应该判断。啊。它不等于三。或者啊,只要你不是三和四之间的一个啊,或者你不等于四。那么我都应该给你返回一个。错误的一个消息啊,就是订单状态异常好,加上这个优化之后啊,会稍微好一点啊。来接着,这个是我们的。
28:01
查询物流相关的一个内容啊。但是。什么呢,大家可能去感觉啊,这么显。还要你用这个对象,还要就是说去调查方法比较麻烦,想用什么方式呢?用类似于比如说拉我提供的这种门面的方式,像我们用的这个ATP,想用这种门面的方式,对吧。啊,那么我们也是可以把我们自己写的这个类去给它改成门面的一个形式。清楚吧,啊,首先再检查一下我们的这个类,应该是没有什么有问题的地方,包括错误,我们也进行了一个处理,是不是包括这个链接啊支持。我们的这个沙箱也支持正直好。那怎么把我们自己写的这些类?去封装成这个门面的一个形式呢,可以看一下这个手册啊。手册在这个核心架构里面啊,这个factor这里面也有说明啊。
29:04
这里面详细介绍了一个fact的一个原理,以及它的这个底层的一个实现,所以你把这个看好之后呢,就可以去注册自己的一个啊,这里我们就直接开始写。啊啊,首先。我们要有合理的去组组织啊,规划我们的文件,还有我们的类啊,我们先建一个目录,当然你也可以。通过命令去转移啊。Factor。FACDS。接着呢,我在这个里面再建一个目录,也就是。呃,我们这个。作用啊,我们功能的这个作用。因为你不可能说只有这一个,对吧,你可能还有很多,所以每个我放到不同的目录里面,那我们这个就放到这个目录里面,对吧,好。不搜索不搜索。直接给他挪到这里面。啊,挪到这里面之后呢。
30:01
它在这个APP下面的factors啊,它的这个命名空间就要换一下啊。命名空间是。ACS下面的X press,这个应该是它的一个命闭空间,它的命空间,那这个是我们的一个原始的一个类,对不对?你看我们的原始的一个类,所以我们应该再建一个它对应的一个factory的一个文件。明白吗?好,来。再新建一个目录啊,用来存放它相关的这个factory。还CAD啊,好在这里面再新建一个类。和他同名就可以啊啊,不同名也行,都都都都可以啊。啊,这个我们就认为它是这个它的一个门面的一个类,好在这个门面类里面呢,我们只需要啊继承一个。啊,门面的一个接口,以及实现它一个方法就可以了。
31:03
其实可以去参考一下啊,比如嗯,这里用到的这个ATP这个门面看它。啊,是继承这个啊,然后实现这个方法就可以了,来我们也读起来。关掉啊,整天一下。啊,这个不是我们的门面类啊。嗯。换一下啊。啊,这个不要啊,这个这个只要一个这个啊,这个不要。那这个是我们把这个换过来啊,这个刚才应该复制的。就只要去继承它就可以了,实现这个方法最后返回的是什么呢?返回的就是我们的这个类名啊,返回到我们这个类名。啊,这样就可以,这就是我们这个门面就定义好了。比较简单是吧,主要就是继承。啊,这个门面啊,门面的这个factor。
32:03
然后去实现它这个这个方法啊,当然你这么着呢,你还用用不了你得干什么,你得把它给注册到我们的拉的这个容器中,哎。就是找到。APP目录下有一个provider啊。在哪里面注册呢?在这个。到里面去注册,哎,把我们的这个门面注册进来啊,当然你在这里面其实注册比较简单,你也可以去单独去创建一个啊,我来写一下。啊,单独去创建一个。呃的一个。它的这么一个门面啊,发这么一个门面。怎么一个服务提供者?知道吧。那我们就简单的注册,我们就不创建了,简单的就在在这个里面去注册一下吧啊。啊,当然也可以创建一个。啊,注册自定义门面啊,啊使用什么注册呢?Do this this里面的这个APP啊,这个是的这个容器。
33:07
啊,使用他的这个新啊提问注册一个单立的一个。然后这个是我们抽象类的一个名字啊,那我们就用。我们要使用的这个啊,名字啊,就是我们在这里定义了之后,就可以用它去作为门面啊,第二个是就是说类的一个真实的一个。所在啊,就是我们使用这个门面,他去啊去映射的是哪个真实类,也就是我们要。用它知道吧,所以这里面有两种写法,一个是你可以写一个啊函数,然后在这个函数里面呢,你这个new啊,我们的一个express,这个真实的我们的实体类所在啊。去这么去写。什么,然后。就可以直接去使用这个门面了啊,来我们看看在控制器里面怎么去使用。把这个先关了啊。这是我们的。
34:02
空想。那这里就。没有了,没有这个类了。那这里就可以直接去使用。看。来重新粘贴一下。等会手打一下,然后去找一下命名空间,一定是用我们的这个factor factor用这个你看啊。然后就可以使用它的这个方法。这什么?来看看结果。是不是一样的。啊,只不过是订单状态异常。呃,把订单改一改。改成三,然后把它给个顺丰,就是我们模拟后台的发货的一个过程啊。好,来提交一下。再来检测一下。还是订单状态异常?三啊,那我们这里判断有问题啊,还是不能用这个,不不能用这个或或的话三次都过不了啊。
35:06
好用数组啊。啊,不能用这个啊。啊,这样就没问题了。在。是不是返回了我们的地址,说明我们这个门面这个配置的这个方法是有效的啊,当然这个命名空间我们可以啊,就是说给它放到上面去啊。复制一下这个命名空间。啊,可以给它放到上面去啊。柚子。好。这个。这个就不要了。那这样的话就可以直接去使用了啊。
36:02
这是一种方式啊,这是一种方式。诶,找到我们刚才用的地方在哪啊在这呢,还有一种什么方式呢,就是注册的方式不一样。这是一种方式,还可以就是你不去返回这个实际的这个真实的一个类,直接使用这个类名也可以,它会自动去找到这个类啊,再来注册一下。Express,然后这里直接用我们这个真实的这个类的这个名字就可以了。Plus。2342。找哪呢?不要用这个方子啊,找这个真实的这个类啊,这个真实的这个类。我们实际的这个类,用它这个名字也一样可以注册。清楚吧,好,那这里面我们不用改。可以啊,直接再去尝试一下。是不是一样可以拿到这个结果,并且这个时间都不一样啊。
37:03
这样我们订单这个物流查询就完成了,并且还学会了自定义这个factor啊,去自定义这个类,然后我们自己定义这个factor啊,去这么去。让我们用起来更加方便,包括错误的处理也都做了处理。
我来说两句