公众账号自定义回复功能
微信官方其实并不推荐经常群发消息,更多的是希望用户通过对话来自己获取服务或者进行搜索。今天我们就讲下如何使用开发模式做自定义回复。
目前公众账号可以接收的用户提交消息请求有四种类型,分别是文字、图片、地理位置和链接,而公众账号回复只有三种格式,文字、图文和音乐,也就是说用户互动的模式最多也就是12种,我们今天先讲三种即文字回复文字、文字回复图文、文字回复音乐。
这强调一下,微信的消息接口通讯有效时间是5秒,也就是说网络不稳定等原因很容易造成用户在5秒内接收不到回复消息,然后就通讯中断了,这几天有人反映关注ZTalk后没有消息提示就是这个问题。
一、文字回复文字之鹦鹉学舌
鹦鹉学舌大家都知道,就是你说什么它跟着你说什么,咱们也可以在微信公众平台里玩一下,首先进入SAE平台,打开代码编辑,在之前的接口文件上进行修改。代码如图:
代码添加位置是在“事件消息”的注释前面,用户消息赋值之后,实际添加的代码是从图上20行开始到41行。
第21行是判断用户发送的消息类型是否文字消息,可以参考事件消息的判断,变动的只是消息类型标示。
第24行是判断如果用户发送了文字消息,那么获取用户发送的文字消息内容赋值给变量$form_Content 。
PS:这里有个函数“trim”,大家可以查下php的函数手册,这个函数作用是去除字符串首尾的空格,有时候用户误在头尾多敲了空格,如果不去除的话就会出现关键字无法匹配,比如“你好 ”如果不去掉尾部空格就无法匹配关键字“你好”。
第26行是判断用户发送的消息内容是否为空,可以参照第9行的逻辑,empty($form_Content)在$form_Content不为空的时候返回0,为空的时候返回1,非(!)0即1表示条件成立,用户发送的消息是有内容的。
第28行到第31行就是完成回复文字消息的功能,其中回复的内容直接用了$form_Content,也就是把用户发送的内容又给回复回去。
第34行是如果用户发送的内容为空白,则返回输入提示。因此第37行的回复消息就是"请输入些什么吧……"。
好了现在去测试下,当你向公众账号输入文字时,公众账号就会回复同样的内容给你,当然你也可以把$form_Content改成直接的字符串,这样就是自动回复了。
二、文字回复图文之餐馆菜单
有多少人能马上说出编辑模式里最多能设多少个关键字?估计不多,当然用心看我教程的应该知道,是200个,到了开发模式这个关键字其实是无限的,前面举了文字回复文字的简单例子,现在加点难度,可以识别关键字并且回复的是图文消息,咱们就拿菜单来做例子吧,先做菜谱的类别,这个我们用文字回复,代码如图下:
添加的代码位置在判断用户发送消息不为空的条件判断之后,默认回复之前,这里大家注意下默认回复其实就是将前面文字回复文字的变量用字符串代替了。增加的代码从第29行开始到41行。
第30行判断用户发送过来的消息是否为“菜谱”,这里注意判断是否等于是用两个“=”号。如果是则运行该判断条件下的代码。
第33行先赋值给$return_str一个初始字符串点菜提示“请输入字母编码浏览相应菜品:”,我这里加了两个\n表示空两行。
第34行是一个数组,数组的元素为菜谱的类别。
数组在程序中使用非常普遍,它是一种把具有相同类型的若干变量、数字或者字符串,有序组织起来的一种形式,有点像咱们以前数学课教的集合概念。
数组的每个元素都是由键和值关联组成,我在例子里的定义方式键值会默认生成,第一个元素的键值为0,元素值是“lc.冷菜\n”,数组的每个元素值可以使用“数组名[键值]”的方式获取或者输出,比如$return_arr[0]的值就是“lc.冷菜\n”。
数组可以用来做数据的存储、排序、检索等,它的概念比较复杂但是很重要,希望大家能够去看些资料认真学习下。
第35行是用implode函数将$return_arr转化成字符串,然后加到之前赋值过的$return_str后面,其运行结果为:
"请输入字母编码浏览相应菜品:\n\nlc.冷菜\nhb.杭帮菜\nsk.烧烤\nwp.外婆烧\nml.麻辣\nrc.热菜\ntp.甜品"。
implode函数的使用方法为implode(分隔符,数组),将数组内元素转化成字符串,并将分隔符插入元素之间,我在例子里分隔符为空值,所以最后转化的字符串是首尾相连中间没有分隔符的。
后面的就不解释了,输出文字消息同时退出运行。
接着我们来示例某个类别的详细菜单,咱们用多图文消息来做,灵光的朋友已经想到了,呵呵,先写一个判断,然后把那段用户关注回复多图文消息的代码拷贝过来修改下就好了。当然我今天加了点料,示例如下:
添加的代码位置在菜谱的大括号后面。第42行到51行和之前的是一样的,唯一不同的是ArticleCount我设置成了10,也就是图文消息条数为10条(编辑模式里多图文消息最多只有8条,开发模式里是10条),不清楚的可以看第十期教程,我直接讲下改进的部分。
第53行到105行我定义了一个数组$return_arr,这个数组里共有10个元素,每个元素又是一个结构相同的数组,这些数组都有三个元素分别对应标题、图片和链接,为了偷懒,我9个列表消息只是换了标题,没有图片和连接,不知道大家看明白没有。
这个数组其实就相当于我把菜单的10道菜里不同的数据按照相同的结构做了集合,然后使用一个循环读取语句将这些数据拼接成将要输出的图文消息。
第107行的foreach是一个将数组中每个元素按照键值顺序遍历一遍的函数,通俗的说就是将$return_arr这个数组里的元素按照先后顺序读取出来,每次读取一个元素,读取出来的元素赋值给$value,所以这个$value的值会随着每次循环改变。即第一次循环时$value=$return_arr[0],第二次循环时$value=$return_arr[1]……
每次读取的$value其实就是$return_arr一个元素,根据上面的数据结构这个元素又是一个数组,里面有三个元素,分别对应了标题、图片和链接,值是$value[0]、$value[1]、$value[2],将这三个数据拼接到图文消息模板,同时与前一次的$resultStr拼接。这样做的好处在于减少了代码的长度,把图文消息模板复用了,另外这个数组的结构其实跟数据库里读取出来的结构是一样的,所以也是想让大家一点点熟悉起来。
等循环结束就执行第116行,完成最后的闭合拼接,然后输出结果。公众账号就将这个包含10条菜品的图文消息发送给了用户。
三、文字回复音乐之表情传意
很多人,真的很多人,几乎每天都有人在公众平台上问我同一个问题,就是你怎么可以放超过60秒的歌曲,我的答案只有一个,就是用开发模式的音乐消息回复接口实现的。今天就给大家介绍下如何使用音乐接口来回复用户消息,让用户有好的欣赏体验。
回复音乐消息里的音乐是以链接形式加载到回复数据模板里的,类似咱们回复图文消息里的图片链接,SO,我们音乐文件的链接获取也参照图片连接方式,一种呢是找网上在线收听的链接,不过真不是很保险,很多是防盗链的,比图片还严格,另外一种呢就是放到云存储平台上,这里建议大家如果要把音乐做成常态功能,必须选择专业的云存储平台,比如又拍云、七牛。
今天我图个方便就还是上传到了SAE的Storage里了,如下图,我选了我的大爱曲婉婷成名曲《我的歌声里》(偷偷显摆下,曲婉婷跟我在微博上可是互相关注的噢,我是她第3729个粉丝!!)。
这个消息回复里支持的音乐格式目前我只测试过MP3、AAC两个,肯定是没有问题的,这里需要注意的是上传的文件名必须用英文或数字,文件名里不要有中文、空格、单双引号等,大小写无所谓。如果资源允许可以上传一个低码率的音乐文件,再上传一个高码率的音乐文件,因为微信里听音乐会自动识别网络环境选择不同音质的版本。
音乐文件准备好后咱们就上代码了吧!我这里给的例子是用户发送表情,公众账号回复歌曲,如图所示:
增加的代码加到前面菜单的代码后面就行了,只要在那个默认回复之前都可以。
第124行代码是判断用户发送的表情是不是微笑。就是微信表情第一排第一个,这里大家肯定会很奇怪微笑表情符号不是“[微笑]”吗,老贼我最早也犯过这个错,折腾半天才发现其实微信接口发送过来的表情代码是这样的。
第127行这里是消息类型,音乐消息的类型是music。
第128行到137行就是调用wx_tpl.php里的音乐消息模板,用sprintf将格式化的数据写入到变量中去。其中“我的歌声里是”是title,“曲婉婷”是DESCRIPTION,第一首歌的链接是低码率的,第二首是高码率的,微信会根据环境自动选择。
后面就是输出到用户手机上,用户接收到的就是音乐播放器,点击播放键就可以欣赏音乐了,是不是很简单?
ZTalk秘籍
如何收集所有表情的代码呢?在第10期教程里有个秘籍是让大家调试接口时可以把输出结果文件保存到Storage上,然后查看文件检查程序是否正常。咱们就用这个法子抓取所有表情的代码。
把抓取表情的代码放到这个位置:
然后到手机上往公众平台上发表情,按照顺序从第一个一直输入到最后一个,然后一起发送,然后你到Storage就会看到有bq.txt,打开后就能看到如下图:
这些就是真正的表情符号,我这里就发了第一屏幕的,大家抓取完就把代码都删除了吧,否则这里有个结束语句在那里,不去掉就不会执行后面的程序。