第45行,做了三件事,第一个使用iconv()函数将$city的字符编码从UTF-8转换成GBK,第二件是使用urlencode将汉字转换成英文编码方便URL传值,第三件是将URL中的“&city=”的参数名拼接了。

音乐文件准备好后咱们就上代码了吧!我这里给的例子是用户发送表情,公众账号回复歌曲,如图所示:

图片 1

 

图片 2

 

 

等循环结束就执行第116行,完成最后的闭合拼接,然后输出结果。公众账号就将这个包含10条菜品的图文消息发送给了用户。

不知道还有多少人记得我曾写过一篇《那些离开的朋友们》,是因为微信把退订消息接口开了,每天看到不少人退订心里有点小难过写的,到今天我看了下差不多有2000个退订用户了,估计是我现在写的东西不合他们胃口。

第124行代码是判断用户发送的表情是不是微笑。就是微信表情第一排第一个,这里大家肯定会很奇怪微笑表情符号不是“[微笑]”吗,老贼我最早也犯过这个错,折腾半天才发现其实微信接口发送过来的表情代码是这样的。

 

 

 

第127行这里是消息类型,音乐消息的类型是music。

第20行,判断消息类型是否为图片消息,条件为$form_MsgType==image;

 

图片 3

代码添加位置是在“事件消息”的注释前面,用户消息赋值之后,实际添加的代码是从图上20行开始到41行。

 

PS:这里有个函数“trim”,大家可以查下php的函数手册,这个函数作用是去除字符串首尾的空格,有时候用户误在头尾多敲了空格,如果不去除的话就会出现关键字无法匹配,比如“你好
”如果不去掉尾部空格就无法匹配关键字“你好”。

第45行到48行,文件没有抓取到提示用户图片上传失败。

这些就是真正的表情符号,我这里就发了第一屏幕的,大家抓取完就把代码都删除了吧,否则这里有个结束语句在那里,不去掉就不会执行后面的程序。

这里一大堆信息里只需要提取城市,即CITY这个标签内的数据。

图片 4

 

第34行是一个数组,数组的元素为菜谱的类别。

 

implode函数的使用方法为implode(分隔符,数组),将数组内元素转化成字符串,并将分隔符插入元素之间,我在例子里分隔符为空值,所以最后转化的字符串是首尾相连中间没有分隔符的。

 

把抓取表情的代码放到这个位置:

第35行,图片抓取成功后,新建一个Storage的对象,我们要保存图片了。

 

 

 

大家可以看到图片消息除了固定的消息发送用户ID、接收公众号ID、生成时间等固定字段外,多了一个图片链接PicUrl,这个就是用户向公众账号发送图片后,保存到微信的服务器上返回给公众号的链接,该图片链接格式如下:

 

 

这强调一下,微信的消息接口通讯有效时间是5秒,也就是说网络不稳定等原因很容易造成用户在5秒内接收不到回复消息,然后就通讯中断了,这几天有人反映关注ZTalk后没有消息提示就是这个问题。

 

回复音乐消息里的音乐是以链接形式加载到回复数据模板里的,类似咱们回复图文消息里的图片链接,SO,我们音乐文件的链接获取也参照图片连接方式,一种呢是找网上在线收听的链接,不过真不是很保险,很多是防盗链的,比图片还严格,另外一种呢就是放到云存储平台上,这里建议大家如果要把音乐做成常态功能,必须选择专业的云存储平台,比如又拍云、七牛。

 

 

公众账号接收非文字消息

 

第40行,这是一个正则表达式,比较复杂,作用就是根据规则将$geocoder里的<city>北京市</city>数据提取出来赋予$city这个变量,如果成功这个数据是会是一个多维数组,其中city标签内的数据即北京市是存储在$city[1][0]里的,$city[0][0]的值是“<city>北京市</city>”;

图片 5

 

一、文字回复文字之鹦鹉学舌

 

 

 

第24行是判断如果用户发送了文字消息,那么获取用户发送的文字消息内容赋值给变量$form_Content

第28行,SAE上的内置接口类很多,SaeFetchurl是一个用来抓取远程网页的类,使用这个类就可以很方便的实现抓取其他网站的内容,否则使用PHP的curl或者file_get_contents这些估计还得解释半天,这句代码是新建一个抓取类的对象。

后面的就不解释了,输出文字消息同时退出运行。

图片 6

第30行判断用户发送过来的消息是否为“菜谱”,这里注意判断是否等于是用两个“=”号。如果是则运行该判断条件下的代码。

 

 

 

图片 7增加的代码加到前面菜单的代码后面就行了,只要在那个默认回复之前都可以。

其实73到82行完成的就是将所有数据拼接成一个字符串,使用“.”一个个拼也可以,不过效率低下而且代码也不够清晰。

每次读取的$value其实就是$return_arr一个元素,根据上面的数据结构这个元素又是一个数组,里面有三个元素,分别对应了标题、图片和链接,值是$value[0]、$value[1]、$value[2],将这三个数据拼接到图文消息模板,同时与前一次的$resultStr拼接。这样做的好处在于减少了代码的长度,把图文消息模板复用了,另外这个数组的结构其实跟数据库里读取出来的结构是一样的,所以也是想让大家一点点熟悉起来。

第32行,判断抓取结果,errno()返回的是抓取结束后的错误代码,如果为0则成功,其他的就是不成功。

好了现在去测试下,当你向公众账号输入文字时,公众账号就会回复同样的内容给你,当然你也可以把$form_Content改成直接的字符串,这样就是自动回复了。

要实现这些功能首先得学会接收这些消息类型,比文字消息类型肯定要复杂很多了,目前我们能够接收的消息类型只有图片、地理位置以及退订消息,其他的如链接消息、语音消息是需要官方授权的。接收到用户消息以后回复的消息类型可以参考第11章,目前也就那三种。

 

 

 

也就是说我们如果要把图片保存到本地服务器,就要先将图片从微信服务器上抓取下来,当然你也可以直接保存这个链接以后直接访问,这个看具体应用了。今天要讲的是图片保存到本地服务器上,请看下面代码:

然后到手机上往公众平台上发表情,按照顺序从第一个一直输入到最后一个,然后一起发送,然后你到Storage就会看到有bq.txt,打开后就能看到如下图:

 

ZTalk秘籍

 

 

 

鹦鹉学舌大家都知道,就是你说什么它跟着你说什么,咱们也可以在微信公众平台里玩一下,首先进入SAE平台,打开代码编辑,在之前的接口文件上进行修改。代码如图:

 

图片 8

第64行到71行判断天气变化是否相同,比如上面显示的天气1和天气2其实都是阴,如果不做判断就会返回给用户“阴转阴”,非常2,所以这里判断如果两个天气是一致的则将任意一个天气赋值给$w_status变量,否则就按照天气2转天气1赋值给$w_status变量,最后输出时用$w_status这个变量。

 

 

添加的代码位置在判断用户发送消息不为空的条件判断之后,默认回复之前,这里大家注意下默认回复其实就是将前面文字回复文字的变量用字符串代替了。增加的代码从第29行开始到41行。

 

 

 

这个数组其实就相当于我把菜单的10道菜里不同的数据按照相同的结构做了集合,然后使用一个循环读取语句将这些数据拼接成将要输出的图文消息。

 

 

第33行,又要抓页面了,先建个抓取类的对象。

图片 9

一、图片消息接收

第34行是如果用户发送的内容为空白,则返回输入提示。因此第37行的回复消息就是”请输入些什么吧……”。

当然我们如果严谨一点,还要判断图片文件是否保存成功,可以把第37行后面改写一下,如下图:

 

 

第21行是判断用户发送的消息类型是否文字消息,可以参考事件消息的判断,变动的只是消息类型标示。

这里说下URL的规则,URL就是大家常看到的网页链接,一般由HTTP://后面加网址加参数组成,主要说下参数,参数一般是“参数名=赋值”组成,普通的URL参数格式是跟在网址后面第一个参数前用“?”号分隔,第二个参数开始用“&”分隔,参数在程序里是可以获取到的,我们上面获取坐标解析的实际地址形式为:

第107行的foreach是一个将数组中每个元素按照键值顺序遍历一遍的函数,通俗的说就是将$return_arr这个数组里的元素按照先后顺序读取出来,每次读取一个元素,读取出来的元素赋值给$value,所以这个$value的值会随着每次循环改变。即第一次循环时$value=$return_arr[0],第二次循环时$value=$return_arr[1]……

第300行,判断事件类型标示是否为”unsubscribe“,大家可以看下订阅消息是”subscribe“;

 

 

 

 

 

 

 

第39行到41行,保存成功后给用户提示图片上传成功。

很多人,真的很多人,几乎每天都有人在公众平台上问我同一个问题,就是你怎么可以放超过60秒的歌曲,我的答案只有一个,就是用开发模式的音乐消息回复接口实现的。今天就给大家介绍下如何使用音乐接口来回复用户消息,让用户有好的欣赏体验。

 

 

在微信公众平台上用户都是用使用文字在进行交互的,但是有时候使用图片、语音、视频以及地理位置等可以实现一些非常棒的功能,比如“语音提醒”公众号里的发送语音就可以实现定时的事件提醒功能;比如ZTalk曾经搞过微信拍照晒电脑桌面的活动(响应的人太少,桑心……);比如一些预定本地化服务的公众号里发送当前地理位置就可以查询周边商家。

后面就是输出到用户手机上,用户接收到的就是音乐播放器,点击播放键就可以欣赏音乐了,是不是很简单?

图片 10

 

第82行,将数组用implode()函数转化成数组,用”\n”这个换行符来分割。

 

第35行,百度地图API接口的反向地址解析规则是URL+坐标类型+坐标值,其中$map_api_url.$map_coord_type两个变量拼接就是URL+坐标类型,然后再加上经纬度参数,用location=经度,纬度来赋值。

第35行是用implode函数将$return_arr转化成字符串,然后加到之前赋值过的$return_str后面,其运行结果为:

第37行,这句代码其实已经在以前出现多次,这次将抓取的内容($res)写入指定的文件($filename),并保存到Storage里,请注意把“weixincourse”替换成自己创建的Storage空间名

 

 

有多少人能马上说出编辑模式里最多能设多少个关键字?估计不多,当然用心看我教程的应该知道,是200个,到了开发模式这个关键字其实是无限的,前面举了文字回复文字的简单例子,现在加点难度,可以识别关键字并且回复的是图文消息,咱们就拿菜单来做例子吧,先做菜谱的类别,这个我们用文字回复,代码如图下:

手机上基于地理位置的APP很多,是个应用现在都得跟LBS扯上点关系,SoLoMo里重要的一环就是地理位置,微信里也有很多应用是跟地理位置相关的,比如查个本地天气、附近酒店餐馆啥的。今天举的例子是查本地天气。先了解下地理位置消息的结构,如下图:

目前公众账号可以接收的用户提交消息请求有四种类型,分别是文字、图片、地理位置和链接,而公众账号回复只有三种格式,文字、图文和音乐,也就是说用户互动的模式最多也就是12种,我们今天先讲三种即文字回复文字、文字回复图文、文字回复音乐。

第46行,查询天气日期,0表示当天,1表示明天,以此类推……

 

 

数组可以用来做数据的存储、排序、检索等,它的概念比较复杂但是很重要,希望大家能够去看些资料认真学习下。

图片 11

公众账号自定义回复功能

当用户退订后在Storage的存储空间里就会有一个文件生成。

第128行到137行就是调用wx_tpl.php里的音乐消息模板,用sprintf将格式化的数据写入到变量中去。其中“我的歌声里是”是title,“曲婉婷”是DESCRIPTION,第一首歌的链接是低码率的,第二首是高码率的,微信会根据环境自动选择。

 

 

 

 

 

图片 12

大家可以尝试把Storage的空间名字故意写错,看看会有什么样的提示。如果提示上传成功,我们到SAE的Storage列表里就应该可以看到刚上传的文件了。

 

 

如何收集所有表情的代码呢?在第10期教程里有个秘籍是让大家调试接口时可以把输出结果文件保存到Storage上,然后查看文件检查程序是否正常。咱们就用这个法子抓取所有表情的代码。

代码添加的位置请看仔细了,在事件消息判断里的获取事件类型之后。代码很短,解释如下:

数组的每个元素都是由键和值关联组成,我在例子里的定义方式键值会默认生成,第一个元素的键值为0,元素值是“lc.冷菜\n”,数组的每个元素值可以使用“数组名[键值]”的方式获取或者输出,比如$return_arr[0]的值就是“lc.冷菜\n”。

第303行,新建一个Storage的对象;

 

微信公众平台开发的基础教程差不多已经讲完,后面还会讲下数据库和云存储平台的使用,然后就会是完整案例,之所以花那么长时间讲那么细,是希望大家能够先熟悉一些基础的编程,有一个循序渐进的过程,所有复杂的程序其实都是这些基础模块组成,如果你觉得看不懂,那可能是没有跟着动手做,后面的教程估计会跟不上,so,有时间就动动手吧!anyway,我会把教程坚持写完,因为很多人有期待。

第33行先赋值给$return_str一个初始字符串点菜提示“请输入字母编码浏览相应菜品:”,我这里加了两个\n表示空两行。

 

第53行到105行我定义了一个数组$return_arr,这个数组里共有10个元素,每个元素又是一个结构相同的数组,这些数组都有三个元素分别对应标题、图片和链接,为了偷懒,我9个列表消息只是换了标题,没有图片和连接,不知道大家看明白没有。

 原文:http://www.cnblogs.com/imaker/p/6249987.html

 

第31行,由于各家地图不一样因此传输过来的经纬度也会有所偏差,这里我选的是wgs84即手机GPS的坐标。

 

第30行,执行抓取图片链接,其中抓取的函数是fetch(),图片链接是之前赋值的$from_PicUrl,抓取后的结果赋值给$res;

二、文字回复图文之餐馆菜单

关于字符,有时候我们上网的时候会发现网页有乱码,大部分是因为字符编码不对造成的,可以调节浏览器的编码来切换,在程序里也是一样,由于新浪接口接收的字符串是GBK的,而我们程序里使用UTF-8,所以需要转码后才能通讯,否则新浪接口收到的就是乱码。

 

地理位置消息多了四项,分别是经纬度的X和Y坐标、地图缩放比例以及地址信息,而实际上由于网络原因我们经常是收不到地址信息的,只有坐标信息,因此地理位置的开发基本围绕着坐标来。先来看本地天气查询代码吧,如下图:

 

第305行,写入文件,文件名为退订用户的OPENID,文件后缀是.txt,内容我用了退订时间。

“请输入字母编码浏览相应菜品:\n\nlc.冷菜\nhb.杭帮菜\nsk.烧烤\nwp.外婆烧\nml.麻辣\nrc.热菜\ntp.甜品”。

 

 

全部拼接完成就可以输出了,在手机上效果如下:

 

三、退订消息接收

 

第21行,消息类型判断语句,消息类型为location;

 

第37行,判断是否抓取成功,如果抓取成功$geocoder的数据实际是如下格式:

 

这又是一个XML,然后用的是一些拼音首字母做了标签,把这个回复给用户估计会疯的,我们要进行一些整理,方法嘛就是用正则表达式来提取我们需要的内容,我这里提取的标签是city(城市)、status2-status1(天气变化)、temperature2-temperature1(温度变化)、direction2-power2(风向风力)、chy_shuoming(穿着建议)、savedate_weather(信息发布时间)

今天我图个方便就还是上传到了SAE的Storage里了,如下图,我选了我的大爱曲婉婷成名曲《我的歌声里》(偷偷显摆下,曲婉婷跟我在微博上可是互相关注的噢,我是她第3729个粉丝!!)。

第51行,判断是否抓到天气,这里我多加了一个

数组在程序中使用非常普遍,它是一种把具有相同类型的若干变量、数字或者字符串,有序组织起来的一种形式,有点像咱们以前数学课教的集合概念。

图片 13

这个消息回复里支持的音乐格式目前我只测试过MP3、AAC两个,肯定是没有问题的,这里需要注意的是上传的文件名必须用英文或数字,文件名里不要有中文、空格、单双引号等,大小写无所谓。如果资源允许可以上传一个低码率的音乐文件,再上传一个高码率的音乐文件,因为微信里听音乐会自动识别网络环境选择不同音质的版本。

 

第28行到第31行就是完成回复文字消息的功能,其中回复的内容直接用了$form_Content,也就是把用户发送的内容又给回复回去。

第41行,将$city[1][0]的值即“北京市”提取出来,同时使用str_replace函数将“市”替换掉再重新赋值给$city,str_replace按照字面意思就是字符串替换,用法是:str_replace(要替换的内容,替换成的内容,字符串);其中替换的内容和替换成的内容可以使用数组,也可以使用单个字符串,我这里是用了数组,即将市县区都替换成了空,替换的用处是因为后面查天气预报的接口只支持城市名称,不能有市县区啥的……经过这一步$city的值就是“北京”;

接着我们来示例某个类别的详细菜单,咱们用多图文消息来做,灵光的朋友已经想到了,呵呵,先写一个判断,然后把那段用户关注回复多图文消息的代码拷贝过来修改下就好了。当然我今天加了点料,示例如下:

strstr函数是用来检查$weather里是否存在“Weather”这个字符串,&&表示并且,这里的判断就是不仅要抓取成功并且在抓取到的内容里存在“Weather”。这样写的目的是因为新浪天气接口不管有没有查询到天气都会返回数据,而判断数据里是否有天气信息,只有判断返回内容里有木有“Weather”这个字符串。成功抓取到的会是如下内容:

 原文:http://www.cnblogs.com/imaker/p/6249980.html

第29行,定义百度地图API接口的反向地址解析URL,反向地址解析是指通过经纬度获取当前位置的地址信息。

 

第43行,定义天气API接口的URL;

 

接收的实际地址为http://api.map.baidu.com/geocoder,获取到的参数是coord\_type和location,值为相应后面跟着的。

第26行是判断用户发送的消息内容是否为空,可以参照第9行的逻辑,empty($form_Content)在$form_Content不为空的时候返回0,为空的时候返回1,非(!)0即1表示条件成立,用户发送的消息是有内容的。

第26行,生成要保存到本地服务器的图片名称,为了避免重复新图片命名使用了发送用户的OPENID+当前时间戳,文件的后缀名我是直接设定为jpg文件。(由于从图片链接上无法获取到图片后缀名,又懒得通过头文件获取图片格式,就直接固定死了JPG格式,貌似没有什么问题,哈哈哈);

图片 14

 

 

相信拍照是目前智能手机用户用得最多的功能没有之一,在微信里也是一样,看看每天朋友圈里分享的那些照片就知道了,那么如何接收和保存用户照片捏,首先我们得了解用户发送的图片消息结构,如下图:

微信官方其实并不推荐经常群发消息,更多的是希望用户通过对话来自己获取服务或者进行搜索。今天我们就讲下如何使用开发模式做自定义回复。

 

三、文字回复音乐之表情传意

第49行,抓取天气内容并赋值给$weather,这里不需要再建立抓取类的对象了,因为之前已经建立了可以直接用。

添加的代码位置在菜谱的大括号后面。第42行到51行和之前的是一样的,唯一不同的是ArticleCount我设置成了10,也就是图文消息条数为10条(编辑模式里多图文消息最多只有8条,开发模式里是10条),不清楚的可以看第十期教程,我直接讲下改进的部分。

 

 

二、地理位置消息接收

 

第54行到62行就是提取这些数据的正则表达式,可以发现其实改动的只是标签名和赋值的参数,如果大家还想加写数据的可以参照着提取;

 

图片 15

退订消息接口的代码很简单,跟用户订阅一样是一个事件类型的消息,只是事件类型的标示是”unsubscribe“,退订用户最好是配合数据库来记录,我这里给大家的是一个保存成文件的例子,如下图:

 

 

图片 16

图片 17

后面的就不详细说了,都有标注,都是些判断提示语句,大家可以自己学着看,不懂的可以直接在后台问。另外强调一点,一般天气预报是拿中国天气网接口做的会比这个更好,能够显示县区级的天气,但是需要搞个城市代码表,留到以后说吧,新浪的接口可以直接用城市名查就先演示下。

 

图片 18

 

 

 

 

由于图片消息是另一种消息类型,因此代码添加位置可以位于文字消息上面或者下面,只要别在文字消息的判断语句内就行。然后我来解释下每个语句的作用:

 

第73行到81行新建一个数组,将前面获取到的天气数据添加为数组元素,格式就是$weather_res=array();然后在括号里用逗号分割每个天气数据,最后一个后面不要加逗号,这样做的好处是避免代码行过长,而且很清晰。

图片 19

 

 

 

 

第24行,获取图片消息数据中的图片链接并赋值给$from_PicUrl;

PS:GBK或者GB2312是中文简体编码,属于ANSI编码,但是同个ANSI编码值在不同国家的编码对应是不同的文字,会非常混乱,所以有了Unicode以及UTF-8,这是国际通用的文字编码格式,所有文字都被分配了不同的编码,也就不怕乱码了。

图片 20

 

第24行到27行,将用户推送地理消息的经纬度、地图比例、地址信息分别赋值。经纬度分别为Location_X和Location_Y,相当于用经线和纬线的交叉点来标注地理位置。Scale是用户发送地理位置时地图的缩放比例。Label是地址信息(经常是获取不到的,获取了也没啥用,因为都是连在一起的,无法提取地市县信息)。

 

 

 

代码添加位置同图片消息,另起一个消息类型判断语句,可以放在图片消息前面或者后面。前面说了我们主要使用的是经纬度,经纬度是可以通过一些地图api接口来获取实际地址、周边商家等信息的,天气代码这里我用的是百度地图API接口,主要是因为它有URL接口,代码解释开始:

相关文章