微信上的消息接受与回复

1.接收消息

URL接口验证以后,公众平台账号收到的消息将由微信服务器使用HTTP POST推送至该URL。消息内容为XML格式,消息类型有文本、图片、语音、视频等。各消息类型的推送XML数据包结构如下。

文本消息模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>

其中,ToUserName和FromUserName分别为公众账号和用户账号的表识串;MsgType标识消息类型;“text”表明消息是文本消息;文本内容放置在Content字段;消息接口中定义的消息创建时间CreateTime,它表示1970年1月1日0时0分0秒至消息创建时所间隔的秒数,注意是间隔的秒数,不是毫秒数。


 

图片信息模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[this is a url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
<MsgId>1234567890123456</MsgId>
</xml>

其中与文本信息编码中相同的字符所表示的意义也相同,可参考上面的解释。其他参数的意思是:PicUrl为图片链接;MediaId是图片消息媒体id,可以调用多媒体文件下载接口拉取数据。

其他类型的推送XML数据包不多做阐释,可在微信公众平台的开发文档中查看。


 

2.回复消息

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发来的消息的一次回复。各种回复类型的编码模板如以下所示。

文本回复信息编码模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

其中,ToUserName为接收方账号,FromUserName为开发者微信号,CreateTime为消息创建时间(整型),MsgType为回复类型,如文本回复就是text,以上4项参数出现在后面的编码中,也为同样的意思。


图片回复消息编码模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>

图片回复消息的MsgType为Image,MediaId为通过素材管理中的接口上传多媒体文件得到的ID。


语音回复消息编码模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]]></MediaId>
</Voice>
</xml>

视频信息编码模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<Video>
<MediaId><![CDATA[media_id]]></MediaId>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
</Video>
</xml>

编码中的Title为视频消息的标题,Description为视频消息的描述,这两项都不是必须填写的项目。


音乐消息回复模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[TITLE]]></Title>
<Description><![CDATA[DESCRIPTION]]></Description>
<MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
<HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
<ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
</Music>
</xml>

编码中的MusicUrl为音乐链接,HQMusicUrl为高质量音乐链接,WiFi环境优先使用该链接播放音乐,这两项并不是必须填写的;ThumbMediaId为缩略图的媒体ID,通过素材管理中的接口上传多媒体文件得到的ID,必须填写。


图文消息回复编码模板

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>

ArticleCount为图文消息个数,限制为10条以内;Articles为多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应;PicUrl为图片链接,支持JPG、PNG格式,较好的效果为大图360像素×200像素,小图200像素×200像素;Url为单击图文消息跳转链接。

消息回复的编码做好后,可上传至新建应用中使用。如果出现“该公众号暂时无法提供服务,请稍后再试”的情况,可能是开发者在5秒内未回复任何内容或开发者回复了异常数据,如JSON数据等,需要对编码进行检测,登录新浪SAE,找到新建应用然后单击“编辑代码”即可。

另外,回复图片等多媒体消息时需要预先通过素材管理接口上传临时素材到微信服务器,可以使用素材管理中的临时素材,也可以使用永久素材。


 

1.地理位置

在微信公众服务号开发需求中经常有获取用户位置信息的功能,通过用户的位置信息,可以做一些地图导航,以及基于LBS的营销活动。地理位置获取流程如图

开通了上报地理位置接口的公众号,用户在关注后进入公众号会话时,会弹框让用户确认是否允许公众号使用其地理位置。弹框只在关注后出现一次,用户以后可以在公众号详情页面进行操作。第三方在收到地理位置上报信息之后,只需要回复success表明收到即可,不允许回复粉丝消息。

用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,上报地理位置以推送XML数据包到开发者填写的URL来实现。

推送XML数据包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[LOCATION]]></Event>
<Latitude>23.137466</Latitude>
<Longitude>113.352425</Longitude>
<Precision>119.385040</Precision>
</xml>

Event为事件类型,即LOCATION;Latitude为地理位置纬度;Longitude为地理位置经度;Precision为地理位置精度。

2.天气

推送天气情况需要先行获得用户的地理位置信息,才能为用户提供相应地区的天气预报。同时需要通过中国天气网提供的开放API进行相关地区天气查询。

用户发送过来查询天气的消息的格式是固定好的,即 “地区+天气”,所以,首先截取后两个字,判断是否为“天气”关键词。

从消息的结尾数第二个字符开始截取,截取两个字符,然后加以判断是否为“天气”关键词。下面进行地区提取,还是使用 mb_substr()函数。从消息的开头开始,截掉末尾的两个字符(天气),即得地区关键词。然后进行判断,继而调用函数查询天气数据。

if($str=='天气' && !empty($str_key))
{
//调用函数查询天气数据
}
View Code

weather()函数查询返回信息比较全面,也是以json格式提供,格式如下。

{"weatherinfo":{
//基本信息;
"city":"北京","city_en":"suzhou",
"date_y":"2013年7月9日","date":"","week":"星期二","fchh":"18","cityid":"101190401",
//摄氏温度
"temp1":"30℃~37℃",
"temp2":"30℃~37℃",
"temp3":"29℃~35℃",
"temp4":"27℃~33℃",
"temp5":"27℃~31℃",
"temp6":"27℃~35℃",
//华氏温度;
"tempF1":"86℉~98.6℉",
"tempF2":"86℉~98.6℉",
"tempF3":"84.2℉~95℉",
"tempF4":"80.6℉~91.4℉",
"tempF5":"80.6℉~87.8℉",
"tempF6":"80.6℉~95℉",
//天气描述;
"weather1":"晴转多云",
"weather2":"晴转多云",
"weather3":"晴转多云",
"weather4":"多云",
"weather5":"雷阵雨转中雨",
"weather6":"雷阵雨转多云",
//天气描述图片序号
"img1":"0",
"img2":"1",
"img3":"0",
"img4":"1",
"img5":"0",
"img6":"1",
"img7":"1",
"img8":"99",
"img9":"4",
"img10":"8",
"img11":"4",
"img12":"1",
//图片名称;
"img_single":"1",
"img_title1":"晴",
"img_title2":"多云",
"img_title3":"晴",
"img_title4":"多云",
"img_title5":"晴",
"img_title6":"多云",
"img_title7":"多云",
"img_title8":"多云",
"img_title9":"雷阵雨",
"img_title10":"中雨",
"img_title11":"雷阵雨",
"img_title12":"多云",
"img_title_single":"多云",
//风速描述
"wind1":"西南风3-4级",
"wind2":"西南风3-4级",
"wind3":"东南风3-4级",
"wind4":"东南风3-4级转4-5级",
"wind5":"东南风4-5级转西南风3-4级",
"wind6":"西南风3-4级转4-5级",
//风速级别描述
"fx1":"西南风",
"fx2":"西南风",
"fl1":"3-4级",
"fl2":"3-4级",
"fl3":"3-4级",
"fl4":"3-4级转4-5级",
"fl5":"4-5级转3-4级",
"fl6":"3-4级转4-5级",
//今日穿衣指数;
"index":"炎热",
"index_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",
//48小时穿衣指数
"index48":"炎热",
"index48_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。",
//紫外线及48小时紫外线
"index_uv":"中等",
"index48_uv":"中等",
//洗车指数
"index_xc":"适宜",
//旅游指数
"index_tr":"较不宜",
//舒适指数
"index_co":"很不舒适",
"st1":"36",
"st2":"28",
"st3":"36",
"st4":"28",
"st5":"34",
"st6":"27",
//晨练指数
"index_cl":"较适宜",
//晾晒指数
"index_ls":"适宜",
//过敏指数
"index_ag":"不易发"}}

我们可以通过解析JSON,获取相应城市的天气数据。

weather()函数如下。

private function weather($n){
include("weather_cityId.php");
$c_name=$weather_cityId[$n];
if(!empty($c_name)){
$json=file_get_contents("http://m.weather.com.cn/data/".$c_name.".html");
return json_decode($json);
} else {
return null;
}
}

这里include 了一个城市对应关系文件 weather_cityId.php,格式如下。

<?php

$weather_cityId=array("北京"=>"101010100","上海"=>"101020100","苏州"=>"101190401");

?>

根据传入的城市名,得到城市代码,如果不为空,则调用中国天气网的API进行查询,返回json格式的数据,然后进行解析并返回数据,如果为空,则返回null值。

判断返回数据是否为空,若为空,则 $contentStr=“抱歉,没有查到\”“.$str_key."\"的天气信息!”;若返回数据不为空,会返回相关的信息,如下所示。

$contentStr="【".$data->weatherinfo->city."天气预报】\n".$data->weatherinfo->date_y." ".$data->weatherinfo->fchh."时发布"."\n\n实时天气\n".$data->weatherinfo->weather1." ".$data->weatherinfo->temp1." ".$data->weatherinfo->wind1."\n\n温馨提示:".$data->weatherinfo->index_d."\n\n明天\n".$data->weatherinfo->weather2." ".$data->weatherinfo->temp2." ".$data->weatherinfo->wind2."\n\n后天\n".$data->weatherinfo->weather3." ".$data->weatherinfo->temp3." ".$data->weatherinfo->wind3;

 

posted @ 2024-05-16 20:18  璞子的家  阅读(8)  评论(0编辑  收藏  举报