Skip to content

消息管理

向军大叔每晚八点在 抖音bilibli 直播

xj-small

消息指用户发来的文本消息、图片消息、视频消息等,本章学习如何使用组件快速操作消息管理。

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

消息类型

下面是消息类型的列表,方便你在开发时查阅。

基本消息

下表是普通消息类型,可以访问公众号文档了解详细参数

消息类型说明
isTextMessage文本消息
isImageMessage图片消息
isVoiceMessage语音消息
isVideoMessage视频消息
isShortVideoMessage小视频消息
isLocationMessage地理位置消息
isLinkMessage链接消息

事件消息

下表是事件消息,可以访问公众号文档了解详细参数

消息类型说明
isSubscribeEvent关注事件
isUnSubscribeEvent取消关注事件
isSubscribeScanEvent扫描带参数二维码事件,用户未关注时,进行关注后的事件推送
isScanEvent扫描带参数二维码事件,用户已关注时的事件推送
isLocationEvent上报地理位置事件

按钮消息

下表是按钮事件消息,可以访问公众号文档了解详细参数

消息类型说明
isButtonClick点击菜单拉取消息时的事件推送
isButtonView点击菜单跳转链接时的事件推送
isButtonScanCodePush扫码推事件的事件推送
isButtonScanCodeWaitmsg扫码推事件且弹出“消息接收中”提示框的事件推送
isButtonPicSysPhoto系统拍照发图的事件推送
isButtonPicPhotoOrAlbum拍照或者相册发图的事件推送
isButtonPicWeixin相册发图的事件推送
isButtonLocationSelect地理位置选择事件推送
isButtonViewMiniProgram点击菜单跳转小程序的事件推送

获取所有方法

通过 getAllTypeCheckMethods 方法可以获取所有用于类型检测的方法

(new \Houdunwang\WeChat\WeChat)->getAllTypeCheckMethods();

获取消息

系统提供多种方式获取消息

获取全部消息

在任何模块中都可以使用 message 方法获取所有消息

app(\Houdunwang\WeChat)->message();

获取数组类型的所有消息

app(\Houdunwang\WeChat)->message(null,true);

也可以使用计算属性获取,但结果是对象结构的消息数据

app(\Houdunwang\WeChat)->message

获取指定消息

如果要获取消息中的某个字段,操作也很简单的。

使用 message 方法获取

app(\Houdunwang\WeChat)->message('Content');

使用计算属性获取

app(\Houdunwang\WeChat)->Content

普通消息

当普通微信用户向公众账号发消息时,微信服务器将 XML 数据消息 POST 到开发服务器。

消息类型

获取用户发送的消息类型,微信提供的消息类型请查看上面的微信官方文档查看。在任何组件中都可以获取消息类型,比如 MessageMaterial 等等组件。

//消息管理模块
$message = new Message;
$message->isText();

获取消息

获取消息内容可以使用几种方法:

  1. 通过 content 方法获取微信消息中的变量
$message->message('Content');
# 不传递参数时获取所有微信返回的消息
$message->message();
  1. 使用计算属性方式获取。
$message->Content;

文本消息

//消息管理模块
$message = new Message;
//判断是否是文本消息
if ($message->isTextMessage())
{
	//向用户回复消息
	return $message->text('后盾人收到你的消息了...:' . $message->Content);
}

图片消息

//判断是否是图片消息
if ($message->isImageMessage())
{
	//向用户回复消息
	return $message->text("图片url:{$message->PicUrl},图片MediaId: {$message->MediaId}");
}

语音消息

//判断是否是语音消息
if ($message->isVoiceMessage())
{
	//向用户回复消息
	return $message->text("你发送的语音消息MediaId: {$message->MediaId} ,语音格式: {$message->Format}");
}

地理位置

第三方在收到地理位置上报信息之后,只需要回复 success 表明收到即可,是不允许回复消息给粉丝的

//判断是否是地理位置消息
if ($message->isLocationMessage())
{
	return $message->text("你发送的地理位置消息,纬度: {$message->Location_X} ,经度: {$message->Location_Y},缩放级别: {$message->Scale},位置: {$message->Label}");
}

链接消息

微信默认将链接做为文本使用,所以链接消息指微信收藏夹中的消息

//判断是否是链接消息
if ($message->isLinkMessage())
{
	//向用户回复消息
	return $message->text("你发送的链接消息,标题: {$message->Title},接要: {$message->Description} ,链接: {$message->Url}");
}

视频消息

视频指用手机拍摄的视频

//判断是否是视频消息
if ($message->isVideoMessage())
{
	//向用户回复消息
	return $message->text("你发送的视频消息 MediaId: {$message->MediaId} ,缩略图的媒体id: {$message->ThumbMediaId}");
}

小视频消息

用手机微信拍摄的小视频

//判断是否是小视频消息
if ($message->isShortVideoMessage())
{
	//获取消息内容
	$contents = $message->getMessage();
	//向用户回复消息
	return $message->text("你发送的小视频消息 MediaId: {$contents->MediaId} ,缩略图的媒体id: {$contents->ThumbMediaId}");
}

事件消息

在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许。

关注

用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的 URL。方便开发者给用户下发欢迎消息或者做帐号的绑定。

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。

假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

//消息管理模块
$message = new Message;
//判断是否是关注事件
if ($message->isSubscribeEvent())
{
	//向用户回复消息
	$message->text("感谢你关注后盾人");
}

取消关注

网站捕获取消关注事件后可以对粉丝等数据进行后续处理。

//消息管理模块
$message = new Message;
//判断是否是取消关注事件
if ($message->isUnSubscribeEvent())
{
	//网站做后续处理...
}

扫描二维码事件

用户未关注时,进行关注后的事件推送

未关注时扫描二维码并点击了关注时触发此事件。如果在些事件处理之前设置了关注事件,那么这个事件不会被执行。如果关注事件与扫码关注事件都有情况下,将扫码关注事件放在关注事件前面处理。

//消息管理模块
$message = new Message;
//未关注用户扫描二维码事件
if ($message->isSubscribeScanEvent())
{
	//向用户回复消息
	$message->text("未关注用户扫描二维码关注了后盾人,EventKey: {$message->EventKey} ,二维码的Ticket: {$message->Ticket}");
}

用户已关注时的事件推送

已经关注的用户扫描了创建的微信二维码时触发这个事件。

//消息管理模块
$message = new Message;
//关注用户扫描二维码事件
if ($message->isScanEvent())
{
	//向用户回复消息
	$message->text("已关注用户扫描二维码,EventKey: {$message->EventKey} ,二维码的Ticket: {$message->Ticket}");
}

上报地理位置消息

用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每 5 秒上报一次地理位置,公众号可以在公众平台网站中修改以上设置。上报地理位置时,微信会将上报地理位置事件推送到开发者填写的 URL。

//消息管理模块
$message = new Message;
//关注用户扫描二维码事件
if ($message->isLocationEvent())
{
	//向用户回复消息
	$message->text("上报地理位置事件,纬度: {$message->Latitude} ,经度: {$message->Longitude}");
}

被动回复消息

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

回复文本消息

//消息管理模块
$message = new Message;
//关注用户扫描二维码事件
if ($message->isTextMsg())
{
	//向用户回复消息
  return $message->text("你发送的内容是".$message->Content);
}

回复图文消息

从 2018 年 10 月 12 日起,微信公众平台图文消息被限制为 1 条。

if ($message->isTextMsg())
{
	//向用户回复消息
	$news=array(
		array(
			'title'=>'后盾人',
			'discription'=>'后盾人 人人做后盾',
			'picurl'=>'http://www.houdunwang.com/1.jpg',
			'url'=>'点击图文消息跳转链接'
		),
		array(
			'title'=>'后盾云',
			'discription'=>'后盾云 快人一步',
			'picurl'=>'http://www.houdunyun.cn/2.jpg',
			'url'=>'点击图文消息跳转链接'
		),
	)
   return $message->news($news);
}

回复语音消息

if ($message->isTextMsg())
{
	//向用户回复消息
	//$media_id 通过素材管理接口上传多媒体文件得到的media_id
   return $message->voice($media_id);
}

回复视频消息

//关注用户扫描二维码事件
if ($message->isTextMsg())
{
	//向用户回复消息
	//$video=array('media_id'=>'素材id','title'=>'视频标题','description'=>'描述');
  return $message->video($video);
}

回复音乐消息

//关注用户扫描二维码事件
if ($message->isTextMsg())
{
	//向用户回复消息
	//$video=array('title'=>'音乐标题','description'=>'描述','musicurl'=>'音乐链接','hqmusicurl'=>'高质量音乐链接,WIFI环境优先使用该链接播放音乐','thumbmediaid'=>'缩略图的媒体id,通过素材管理接口上传多媒体文件');
  return $message->music($video);
}