00:00
咱们来开始自定义菜单,那我们呢,首先去看一下咱们的微信的开发者文档啊,这个文档呢,其实也是大家今后你们去公司的时候,你们要看到一些开发文档,那这些文档呢,说实话啊,咱们在微信这一块呢,是写的比较不错的,写的比较详细,然后很多很多东西呢,都介绍的很好,那到大家去公司之后啊,你们会发现啊,你们的开发文档呢啊,一塌糊涂啊,说白了就是写的比较烂一点,写比较烂一点,然后写的比较简要一点,可能有的时候呢,你需要去琢磨一下才知道到底是怎么回事啊,所以说呢,大家呢,先看一下我们这种写的好的文档啊,好的文档你至少要看懂,那么难一点的文档呢,你到时候你再花点时间自己把它搞出了啊,实在不会呢,你再跟后台的人员进行。交流是不是交流一下这个文档到底是有什么内容啊,好,咱们呢,待会呢是不是自定义菜单,所以说呢,是不是在这里自定义菜单这里面提供呢?你看首先看上面这些啊,一共有四个这样东东,是不是有创建,有查询,有删除,有什么事件推送等等是不是,那其实事件推送的我们已经做的差差不多了啊,已经做了一下啊,咱们来看这里,这里面呢,对应的有三个创建、查询、删除是不是,那其实最重要的呢是创建和删除,那在这里呢,我们讲一下啊,这个菜单它呢,你想要比方说你第一次是不是创建啊,那么你可能过一段时间你是不是要修改这个菜单的一些东西啊,那么你就要得先删除才能再重新创建,它才会生效啊,这是这个菜单呢,需要注意的问题,它必须先删除再创建才会生效,否则的话呢,比方说你创建第二次是。
01:51
是不是你想要第二次的,是不是覆盖第一次的内容啊啊,那么不好意思,它并没有作用的,所以说呢,你必须要先删除再创建,所以说咱们呢,要做的话呢,至少要把这两个接口是不是都写了,都写了好,那下面呢,还有一些接口,它是个性化菜单的接口,那这些呢,到时候我们再来看啊,它这个菜单呢,有些些不一样,有一些些不一样啊好,我们来看一下自定义菜单有哪些啊,自定菜单呢,其实就是我们微信公众号下面显示的这些东西,是不是它呢,有一些事啊,有一些要注意的事项啊,在这里列出出来了,他呢允许你最多有三个一级菜单。
02:29
也就是说这里这些菜单呢,最多有三个是不是好,它的每一个一级菜单里面啊,最多包含五个二级菜单,那这个呢,就是二级菜单最多有五个,是不是他说的一级菜单最多有四个汉字,二级三的字都有七个汉字啊,那注意这里呢。并不是啊,你可以看他这个例子。是七个字吗?明显不是七个字是不是不就换汉字的话呢,123456788个字是不是,而且我们实际测试你会发现呢,也不止七个字啊,所以说呢,但是呢,一定会有限制的,一定会记住,但是不是七个字啊,它这样的文档的比较旧了,然后多出来的字它显示不了的话呢,就会有三个点省略号代替,是不是好是这一块的。
03:24
然后呢,他也要注意,就是他超级赛单呢,并不能够立马的就能够看到结果,可能要等个一一分钟啊,五分钟之后啊,他才会你这块才能看到结果,那为了我们有时候要更快的看到结果的时候呢,我们可能要做些这样的操作啊,让你取消关注之后呢,再重新关注,可能这时候看到效果呢,更加快一些,可能快一些啊,这是这一块注意事项啊,然后另外呢,这菜单里面呢,它对应的呢,有这么种类型啊,一共有十十种类型的菜单,那通常呢,我们虽然有十种啊,它最常使用的是上面两种。
04:04
最最常使用的是上面这两种啊,下面这些呢,的确是它提供的功能,但是呢,用的较少,用的比较少而已啊,我们呢都来看一下啊,首先看一下这菜单到底是怎么回事啊,它这里呢,详细介绍一下这每一个菜单的类型,做什么用的,是不是介绍一下这个呢,我们就不一个人看了,这两个呢,是我们最常用的一个是点击菜单,当我用户点击这菜单的时候呢,会触发对应的事件,然后我呢,我就能通通过判断这个事件来去争来去响应用户对应的操作,这是click,那这个view呢,是当大家当用户点击那个view的那个菜单的时候呢,它会立即跳转到我这个view设置的那个网址上。立即跳转到的网址,所以说呢,通常的情况下呢,这个也用的比较多,当我点击用户某个菜单,它就会跳转到我某一个连接上,就会访问到我想要想要用户的网址啊,就通过这个啊,那下面这些呢,就是一些扩展的一些功能,我们都来看一下啊,然后呢,这里也说了一下啊,有些事件呢,它呢只支持某些版本以上的是不是啊,在iPhone iOS这一块呢,应该是没啥问题的,因为现在iOS都是90的系统了是不是。
05:20
九成十以上的系统呢,但是安卓这块呢,他呢要求你这个版本呢,也是比较高的,是不是版本比较高的啊,也是这一块好,然后另外呢,这里他要求如果你想创建菜单,你得发送一个。POS请求是不是好,然后再POS请求,这是不是请求地址啊,需要你携带一个参数,什么参数。Access token是不是全局唯一的接口调用凭据啊,必须要写在这个参数,好,这里呢,是我发送POS要写在查询字符上的参数,是不是除了这个参数之外呢,还得携带上你请求体的参数,那这个请求体参数呢,它列举到了这个下面啊这呢就是你请求体需要写带参数了,他这参数呢是一个。
06:08
对象或者说字符串是不是是个这样东东,然后呢,这里面呢,首先有个button,是不是有个button,然后它的值为一个数组,数组里面呢,有一个个对象是不是好,第一个对象呢,代表着和一级参呢,第二对象你看这么长,它代表的是你的。二级菜单是不是它这呢就有列了两个对象说明呢,你通过这个方式创建的呢,它有两个一级菜单,然后这个其中第二个一级菜单中呢,它有一个两个三个三个二级菜单,是不是三个二级菜单啊,就是这样去创建一级菜单和二级菜单的,好那我们呢,接下来呢,我们也尝试一下去创建一下咱们的这个菜单,好我们在写这个之前呢,我们首先要去定一个方法,这个方法呢,就是当我调用的时候呢,就会成功创建菜单了,是不是那对应的呢,我要去实现这个功能,那我们看一下怎么去做啊,首先呢,我首先要去做这个事,是不是我们来一个个写啊。
07:11
咱们要发送这个请求,是不是需要二次通啊,需要次通,那咱们呢,将所有的微信这一块呢,提供的接口的这些功能的话呢,我们全都定义在这个二三里面。因为在这个里面呢,我能够很快速的拿到我想要的access token,所以说呢,我们都印在这里面啊。这里面的本身呢,它有五个方法是不是,那我接着去扩展这些方法,第一个方法呢,叫做create。CT create menu是不是创建菜单啊,创建菜单好,到时候呢,我看看创建菜单要做什么事啊,创建菜单我们接下来是不是要发送请求啊好,发送请求呢,请求它是一个。
08:00
异步的方法,首先我们讨论同步异步啊,它是异步的方法是不是,所以说通常异步的方法呢,我们会做一个试啊,为了保证它能够顺利的执行下去,执行完这个之后再执行其他的我们会把它包装一层破对象是不是啊,这时候呢,就是一个我们开发的一个套路了,凡是遇到一些异务的东西呢,我们为了保证它能够顺利执行下去啊,我最好是把它包装一层下好包层像呢,在这里我们去想办法发送请求。首先呢,我要定义什么呢?定义请求的地址是不是,那我就一个ul等于。一个这样的地址啊,这个地址呢,我们去复制过来,是不是这个东东CTRLC啊,先把这地址拿过来,这里是不是托啊,那咱们就不能写死啊,咱们这个to要怎么拿到。是不是通过调用这个talk拿到啊,那好,那咱们在这个menu里面怎么拿到呢。
09:04
怎么去拿到我的。第一步要做的是获取,怎么去拿到呢?This上有没有一个方法叫做N啊,咱们是不是通过thisn就能拿到想要东西了,然后呢,它返回值是一个promise对象是不是,那咱们呢,都用AS函数去写啊,不想切到太多函数,我们把这个函数不是改为AS函数啊,所以说在这里面呢,我就能通过。等于怎样拿到这个值?是不是always就能拿到我这个promise项的返回啊,那么德塔是不是最终我的想要的返回值好,最终呢,德塔里面就有个值叫做。叫做CETK是不是S了,好,咱们到现在为止是不是这个请求地址就搞定了,请求地址搞定了,那我呢,是不是接下来去想办法发送。
10:11
请求是不是要想办法发送请求,好发送请求的话呢,我对应呢,这里就要去做些处理,我呢是不是使用这个RP这个库啊好来写一下我是不是要method为。然后呢,这里面还有一个叫做ul请求地址,还有一个转为处是不是好,除了这些呢,我还有一个参数。这仓是什么呢?待会我是不是要创建菜单啊,你是不是要告诉他,你要创建一个怎样的一个菜单,到底有多少个一级菜单,到底有多少个二级菜单啊,一级菜单是什么,二级菜单又是什么,是不是都要告诉他,那就告诉他的参数呢?他在这里告诉你呢,需要通过这样的方式传递,是不是,那他这个说的请求示例的意思呢?
11:02
他会告诉你,其实这个意思就是首先你这个请求是POS系啊,如果是查询字符串参数的话呢,它都会在这里给你列举出来啊,如果没在这里列举的地方呢,它如果是以这种方式列举的话呢,说明这个参数呢,是以请求体的方式发送过去的。那么我们现在就要做一个这样的事,首先是不是先得建立这个东西啊,建立这个东西,建立第一步,建立这个东西第二步呢,是不是也要以起求体的方式,在那个请求的时候发送过去啊,发送过去好,那我们来建立这个东西,好,咱们这是不是menu啊,那咱们这串单文件呢,通常呢,我们也会定一个文件,因为它里面的内容呢比较复杂,我们专门定一个模块呢,就是做咱们自定个菜单文件,所以在这里呢,我们在这里定一个菜单啊,这东西呢,比较麻烦,定义成一个模块之后啊,方便我今后去很好的去修改这个菜单,我只要修改当前模块,我就知道到底是怎么回事了啊。
12:01
那这个菜单模块呢,就是自定义菜单,那这个菜单模块呢,它需要向外暴露出去什么东西呢。Model报露出这个对象,这对象呢,是不是我这个要定义的这个对象啊,就报的出去这个东西就可以了,CTRCCTRV,好是不是这个样子,好这个样子我们就要稍微改一改它,改一改它啊这个呢,是不是代表你的类型是cli c,然后name呢,是不是去改,改啥都行啊,比如说这里是。就说这里你可以随意写,写啥都行,但是呢,最多是有四个字,是不是哦,错误啊,是不是啊,就是错误啊,然后你可以点它对不对,然后这里是不是有个K值啊,这个K值是什么K值呢。诶,咱们还记得咱们去接收用户的发送过来的数据的时候,我是不是有个件类型就是这个。
13:07
K是不是,诶这个一文字K,就是当前你设置的这个K,你设置什么K,它就能得到什么一文K,所以在这里呢,你可以随意写啊,可以写中文英文什么东西都行,反正总之总而言之呢,就是写完之后呢,他能够知道到底点击的这个按钮是做什么用的,是不是你写任何东西比后咱们就写立。写的很厉害,随以你写啥都行啊好,然后呢,下面呢这呢定义的是个一级菜单,它没有二级菜单是不是,那下面呢,是不是定义第二个一级菜单啊,它呢是个这么长的东西,说明呢,这个东西呢,是一个包含二级菜单的一个一级菜单,是不是它里面可以写很多东西啊来看它呢,第一个写的什么呢?比如这是菜。菜单二菜单二啊,然后这里面的sub button呢,就是它的二级菜单time等于real real呢,就是当你点击这个东西的时候呢,它会跳转连接啊。
14:08
跳转到你指定的连接,你可以设置到比如说咱们的sscript,咱们的官网是不是可以跳转到你设定的这个主机的连接,那这里大家注意,就是这里咱们写的是ul,是不是这type为view的时候呢,特殊的这个名称啊,如果你type是click的话呢,你这里是不是只有K值啊,你就没有UL,所以说你这东西呢,不能乱写啊,写错了它就会到时候会报错的,然后这里呢,它用了一个东西叫做mini program什么呢?啊,小程序,比如小程序呢,是不是也能通过这个菜单去引入呢,也能引入,但是咱们这没有啊,没有的话呢,我们就不写小程序了啊,我们就把它去掉好除了这些呢,我们再来测试其他的啊这可咱们也不测试了,我们呢还有很多其他类型,是不是我们都可以看一看,完了从上面呢,介绍了这两种我们最常用的类型,那下面呢,介绍一下其他类型看一下啊,比方说这里有两个。
15:07
我们把它放过来。好,这两个是干嘛的呢啊,第一个呢是扫码的是不是,第二个是不是也是扫码的相关东西啊,比如当你点击这个按钮的时候呢,它会帮你触发那个相机,你自己的系统相机,然后呢,从而呢,自动来到这个扫码的这个界面,让你呢,能够去扫描相应的二维码,是不是能够扫描相应的二维码啊这个3BUTTON就没了啊,因为他们没有这个扫button好然对的这个地址是不是也可以去自己定义啊,比如这是扫码大提示。这里是扫码世界,是不是也可以自己去定义的,然后呢,再往下走,我们再写一写啊,然后这里面呢,还有一些相应的内容。那比方说我把下面这个两个先把它放出来吧。下面这两个给大家介绍一下啊,这里呢,还有两个老师大家注意,我这里是不是最多五个一级菜单啊,123,这里是不是两个四五了,已经到头了,是不是好这两个是干嘛的呢?来看他们的一个叫D,一个叫view limit体的好这里呢,就是当你点击这个按钮的时候呢,会。
16:17
点击按钮发会发送一张设置的图片给你,那你是要怎样图片呢?就是你要传这个媒体ID是不是,你传什么媒体ID,它就会发送什么图片给你,同样的下面也是一样的啊,你传什么ID,它就会发送什么样的图文消息给你,是不是啊,对应的是这样的,那这种东西呢,我们现在没办法获取到,因为它要求是永久素材的媒体ID啊,咱们现在还没有,还没有实现这个功能,所以说咱们这两个人还做不了啊。走掉好,所以说把它注释掉,那他们设置呢,就是这样设置的不会很难,那下面再往下走,这里呢,还有一些其他的类型,我们都把它复制过来啊。把整个这个东西对象都复制过来,那咱们呢,给他计算第三个这样的那个。
17:06
一级菜单是不是这个呢,就是发图的一个菜单,菜单三可以说啊,然后这里面呢,来看我这三八很不需要啊,没有下拉下拉的菜单了,它呢,当你去点击的时候呢。它会弹出一个。是不是你的那个系统的那个相册啊,他会把你自己系统的相册给你弹出来,让你选择你要发送的照片是哪一张,他会立马弹出这个系统相册,那下面这个呢。啊,这个呢,是不是弹出相机啊,这个是弹相机,它是拍照嘛,是不是这个弹出相机,然后这个呢,是让你选择它弹,点击之后呢,它会有两个选项,第一个选项是你要拍照,第二选项你是相册,是不是看你去拍照相册里面选,然后第三个呢,才是你点击它的时候呢,它就会告诉你。
18:00
直接打开你的相册是不是,然后选择让你选择要发送的图片啊,是这样的啊这些呢,你看那这个文字是不是2468这种文字,那它可以正常显示的啊,大家都可以看好这呢是不是这些东西,那这里还有最后一个叫做发送地理位置,是不是这个东西呢?我们可以看一下啊,发送地理位置点击这个东西呢,就会弹出你那个地理位置的选项,你可以选择到底你现在所处的位置在哪里,然后呢,可以发送出去。可以这样的啊,那这些呢,就是全部的所有菜单能够去设置的东西,是不是,那通常呢,我们也说了啊,最常用的就是前面这两个,一个是可一个是木,这两个最常用的好咱们的这个海是不是定义完成了,定义完成了,定义完成之后呢,我们来到我们的好在这里面呢,我们要发送的时候,是不是到时候要去传递过来啊,要传递过来,那么我们呢,比方说就在这里。
19:01
到时候有你的啊,调用者的时候呢,把这个你需要传递的这个menu这个东西菜单是不是传递过来,你调用的时候把这个菜单传递过来,那么我对应的我只要把这个菜单这个内容是不是放到请求体中就可以了,那我怎么放到请求体中呢?那在这里它还有个参数叫做。Body body是不是代表体的意思啊啊,这里面就是说明,如果你把参数放在body中呢,它就会以起求体的方式把这参数发送过去。那我们要发送的参数是。Menu是不是那就可以了,发出这个me就可以了,好,那我们呢这里呢,用那个C函数的话呢,我们都可以用这个always关键字去接收到它的返回值,是不是接收它的返回值。嗯,那最终呢,创建成功呢,会有返回值给你,我们来拿到它的返回值啊,比如说拿到它最终的结果啊,等于一下它是不是好,最终呢,我们就。
20:04
将这个最终的返回值啊,是不是造它通过送方法呢给它。返回出去。就是这种调送,将这个result给返回出去啊,返回出去啊,这样呢,就是我们的一个奥函数啊,那如果我想做这个抛异常怎么办呢?我当前这个外层呢,他接受不到异常,我该怎么办呢。啊,如果我真的想要去做的话呢,我就得去try cash去解决这个问题,是不是啊,如果你用C函数,C函数很不好的一点就是它不能解决异常,如果你想解决异常的话呢,你就必须要抛一层try catch,一旦这里面所有的数据一旦有一行出了问题,他立马会走这个cash逻辑,是不是?那你就cash的时候就可以把这个错误呢给抛出去,比如说这个create menu方法。出了问题是不是,然后呢,再把这个异常是不是告诉他就可以了啊,那如果你想这样做的话,就这里面包一层包装一层try cash就可以了。
21:09
好,那在这里呢,成功会调用算我失败是不是调用这样子,好这是这个创建菜单,好咱们把这创建菜单方法定义好了,我们先不测试啊,我们呢,把那个删除菜单方法也一起写了,因为呢,咱们要创建之前呢,我们要记得先要删除掉菜单才行,删除掉它才行啊好咱们来看一下删除菜单的方法呢,就比较简单了,是不是这个删除接口啊,你看。你看这个文档够不够解决,就这么点内容,他要求你干嘛?Get请求方式是不是请求这个接口啊,请求参数有。是不是,然后呢,请求成功之后呢,它会返回一个这数据给你,是不是ER code为零啊,ER message为OK是不是,所以这里大家注意就是并不是说出现这个什么ER东西,就是说明你请求失败的,有时候是说明它是请求是成功的是不是,所以对应的你要看啊,如果为OK是不是多说明成功的啊,前面是零也说明是成功的啊,所以说这个删除接口就非常简单了,它能怎么做呢?
22:19
首先我来写个套路,怎么写呢?一个有一个对象是不是好,咱们呢,写在这里面呢,我们把它改成啊,首先我要获取一个什么东西呢。我首先我要定义请求地址,我们一个写吗。请求地址是不是好,那个写一个ul等于一个地址,是不是这个地址呢?我把它给复制一份地址的最后一个是不是想办法要拿到啊,怎么拿到。通过。来Co德塔等于A,是不是C点就能拿到这个东西了,这东西呢,就是塔点。
23:08
是不是好拿它之后呢,接下来就是。发送请求了,是不是发送请求通过RP证库,这里面传是参数啊,首先第一个是method为GA,然后第二个是以will,第三个是Jason为true,是不是好?需要传播体吗?不需要,它压根没有请求体,数据是不是好?接下来呢,我们就接绍一下它的。返回值通过是不是接收一下,接收一下它的返回值,然后最后呢,在这里面调用。方法是不是第用方法就那如果你想接受这个异常的话呢,你就得用那个TRY去接一下啊。
24:01
那到后面呢,我们就可以把这个套路给它给完成了啊,其实大部分都是这样写的,是不是reject这里呢,就写menu呢。方法出了问题,是不是方法出了问题,然后呢,告诉他这个问题的具体原因呢,就是这个一,是不是就是这个一好,咱们这个方法第一好了,是不是好,咱们把注释把它给写完了。这里就是用来创建自定义菜单,是不是用来创建自定义菜单,那下面这个呢,是用来。啊,用来删除自定义。自定义菜单的。好,下面这个magic参数呢,就是菜单的这个对象啊。才能的配置对象啊,好就是这么一回事,那咱们来看啊,咱们呢,在这个son的话呢,现在叫他S就不太合适了啊,因为呢,咱们这里面有其他的一些逻辑是不是,那通常呢,我们这个函数呢,我们就命名为一个叫做wech啊,因为它呢是实现我微信所有接口的一个功能函数,一个功能模块,我所有的微信接口呢,其实都是在当前这个模块实现的,而且这个模块咱们要注意就是它能够完完全全脱离我的服务器单独去运行。
25:27
它完全不需要借助我服务器逻辑,我创建菜单跟删除菜单,我只要想办法在当前模块右键run一下就能够运行了,为什么呢?你想想他是不是只要发送请求就可以了,他发送请求我需要去跟我微信服务器,我需要去做什么,去放在我的其他模块中吗?什么A模块吗?要不需要我发送请求,是不是在哪里都可以发,我在哪里都可以发送请求,我在前端也可以发,我在后台也可以发,在这里的位置都可以发,只要发送请求你传的这个SN。
26:04
是他承认的合法的,他就会知道到底修改谁的就够了,所以说呢,我们就可以在这个定义这个模块出来之后呢,它呢就会单独在任意地方去运行啊,那这些前面这些东西呢,我就把它删掉啊,大家会去前面去回顾,我们创建实际对象之后呢,我就可以W点。Menu方法调用是不是我接下来是不是传个menu啊,所以说我对应的我要去。引入我的menu是不是引入。Menu模块。这个等于require斜杠,Require斜杠的是不是?好。Menu,然后呢,在下面是不是用啊,创建的时候呢,你要用,当然呢,我们说了在创建之前呢,你得先删除是不是好来看一下我们我们一般会怎么做啊,因为呢,它都是些异步函数,所以说我们会这样写。
27:06
我这里是不是立即执行函数啊,我在这里面写的好处啊,就是因为我可以通过office关键字是不是等一等啊,等它执行完毕之后呢,我来打一下它的造的值啊,然后我首先在前面呢,我们先首先得删除。之前定义的菜单是不是才能,接下来是创建。新的菜单是不是啊,要删除之前第一菜单才能创建新的菜单,好,咱们来删除一下之前的菜单。就是通过w.a层么钮删除我们呢,通过位置关键字是不是也等于等啊,那我们去接触它返回值,最终打开看一下返回值是不是我们想要的,打一下这个result,然后呢,在后面呢,也接触一下我这个串级的返回值,然后呢也打一下我串级的返回值啊result。
28:02
好,最终呢,这个东西只要我运行当前模块是不是会被调用啊,就会被调用啊好是这样的,那我们来现在来做一下啊,看一下最终的法规值是不是我们想要的,来右击转一下。啊,是不是都是OK的,都是OK的两次是不是打印了两个字,说明咱们删除和创建是不是成功了,好成功之后呢,我们看一下有没有反应过来啊。呃,我们重新看一下,他呢,可能一下子反应不过来。啊,现在看不到是不是看不到的话呢,可能你要去取消关注,再重新关注,是不是就会有我想要的东西啊,啊所以说呢,接下来呢,我们先停一下啊。
我来说两句