> **什么叫做消息消息上下文?**
##### 当用户在微信中发送一条消息的时候,默认情况下豆信会检索已安装的插件,如果已安装的插件中文名或者英文标识与用户输入的关键词一致,用户发送的这条消息就会被分发到对应的插件的WeixinModel.class.php中的reply方法进行处理。当用户接着再发送一条消息的时候,也会按照一样的模式进行关键词匹配,匹配不到插件的情况下,就会根据自定义回复插件中设置的回复规则进行回复。
##### 我们有时候会遇到这样的场景,比如有一个插件的名字叫“附近酒店”,在“附近酒店”插件的WeixinModel.class.php的reply方法写了一条回复规则:replyText("请发送你所在的位置查找附近酒店");,这种情况下,当用户在微信公众号发送“附近酒店”这个关键词时肯定可以得到“请发送你所在的位置查找附近酒店”这条回复,这个时候用户再把地理位置发送过去就得不到响应了。按照这种需求,我们应该知道用户第二次发送的地理位置与第一次发送的“附近酒店”关键词应该是一种消息上下文关系,也就是说第二条消息是在第一条消息的基础上发送的,那么在用户发送第二条消息的时候,应该把用户消息分发到“附近酒店”这个插件进行处理。这也就是我们要讲到的:如何设计消息上下文。
> **如何设置消息上下文**
#### 我们已随豆信框架一起开源发布的“成语接龙”插件为例来讲解消息上下文的设置。
##### 先看一下成语接龙插件的使用过程:
![](https://box.kancloud.cn/2016-01-04_568a395830cc6.png)
##### 可以看到,当用户发送“成语接龙”的时候第一次把消息分发到成语接龙插件进行处理。用户接下来的几次输入照样也分发到成语接龙插件进行处理。
#### 看一下代码的实现过程:
`function reply($dataArr, $keywordArr = array()) {
$config = getAddonConfig ( 'Idioms' ); // 获取后台插件的配置参数
$api='http://i.itpk.cn/api.php?question=@cy'; // 成语接龙接口地址
// 当用户触发成语接龙插件时
if($dataArr['Content']=='成语接龙' || $dataArr['Content']=='Idioms'){
$keywordArr['step']='input'; // 定义消息上下文的判断标识
beginContext('Idioms',$keywordArr); // 设置消息上下文
replyText('请输入一个成语,比如:一马当先'); // 进行第一次响应
}
// 用户的下一次输入处于消息上下文中
if($keywordArr['step']=='input'){
if($dataArr['Content']=='退出'){
// 不设置消息上下文,则用户的下一次输入不再处于消息上下文中
replyText('你已退出成语接龙模式,再次回复【成语接龙】即可进入~');
return false;
}
// 将用户输入关键词提交到成语接龙接口,获得接口返回内容
$reply=file_get_contents($api.$dataArr['Content']);
// 如果用户输入的成语不符合规则
if($reply=='别来骗人家,不是随便打4个字就是成语哒!' || $reply=='成语必须为4个汉字'){
$keywordArr['step']='input'; // 定义消息上下文的判断标识
beginContext('Idioms',$keywordArr); // 继续设置消息上下文
replyText($reply."\n".'重新输入一个成语开始接龙,输入【退出】退出成语接龙');
}else{ // 用户输入的成语是标准成语
$keywordArr['step']='input'; // 定义消息上下文的判断标识
beginContext('Idioms',$keywordArr); // 继续设置消息上下文
replyText($reply);
}
}
} `
> **代码解析:**
从上面代码我们可以看出,当用户首次输入“成语接龙”时开始设置消息上下文,用户之后的每一次输入都处于消息上下文中,当用户输入“退出”时,不设置消息上下文而直接回复,这样的话用户的下一次输入将不再“成语接龙”插件的消息上下文中。
> **消息上下文实现函数**
`
function beginContext($addon, $keywordArr = array(), $expire = 300) {
// 设置用户状态
$user_status ['addon'] = $addon;
$user_status ['keywordArr'] = $keywordArr;
$openid = get_openid ();
return S ( 'user_status_' . $openid, $user_status, $expire );
}`
> **代码解析:**
##### 可以看出,消息上下文是通过thinkphp的缓存函数来实现的。参数说明:
* @param $addon string 处理上下文消息的插件
* @param $keywordArr array 关键词数组,用户设置消息上下文判断标识
* @param $expire int 消息上下文自动失效时间
> **总结**
消息上下文机制在微信开发中至关重要,本篇结合“成语接龙”插件大致介绍了在豆信框架中如何设置消息上下文来处理用户的连贯输入,各位开发者可以根据实际情况参考本篇的例子进行更多功能的开发。
- 基本介绍
- 关于豆信
- 开源协议
- 版权声明
- 捐赠我们
- 基础准备
- 获取源代码
- 安装框架
- 在阿里云服务器上安装
- 在SAE服务器上安装
- 使用说明
- 前台使用说明
- 后台使用说明
- 目录结构
- 数据字典
- 交互说明
- HelloWorld
- 微信交互
- 处理消息
- 处理文本消息
- 处理图片消息
- 处理语音消息
- 处理短视频消息
- 处理位置消息
- 处理链接消息
- 处理事件消息
- 处理用户关注事件消息
- 处理用户取消关注事件消息
- 处理用户上报地理位置事件消息
- 发送消息
- 发送文本消息
- 发送图片消息
- 发送图文消息
- 发送客服消息
- 发送模板消息
- 常用功能
- 如何安装插件
- 如何设计插件后台
- 如何设计数据模型
- 如何设计配置文件
- 如何上传图片
- 如何自定义分享内容
- 如何获取用户信息
- 如何设置消息上下文
- 如何使用带参数二维码
- 如何集成微信支付
- 如何开发微网站模板
- 插件开发实战
- 留言板插件开发
- 成语接龙插件开发
- 附近酒店查询插件开发
- 捐赠插件开发
- 微助力插件开发
- 场景二维码插件开发
- 微订餐插件开发
- 客服助手插件开发
- 幼儿园微网站开发
- 常用函数参考
- 系统函数
- is_login
- is_administrator
- 微信交互SDK相关函数
- getWechatApiObj
- 消息事件处理相关
- getRevData
- getRevFrom
- getRevTo
- getRevType
- getRevId
- getRevCtime
- getRevContent
- getRevPic
- getRevLink
- getRevGeo
- getRevEventGeo
- getRevEvent
- getRevVoice
- getRevVideo
- getRevScanInfo
- getRevSendPicsInfo
- getRevSendGeoInfo
- 发送消息
- sendCustomMessage
- sendTemplateMessage
- getRevTplMsgID
- replyText
- replyImage
- replyNews
- replyVoice
- replyVideo
- replyMusic
- 二维码推广相关
- getQRCode
- getRevTicket
- getRevSceneId
- getQRUrl
- getShortUrl
- 自定义菜单相关
- createMenu
- getMenu
- deleteMenu
- 个性菜单相关
- 多客服相关
- transferCustomerService
- getCustomServiceKFlist
- getCustomServiceOnlineKFlist
- getKFSession
- closeKFSession
- 插件开发相关函数
- getUserInfo
- add_credit
- get_cover_url
- addons_url
- JSSDK函数
- pay
- 数据库操作函数
- 常见问题解答
- 获取access_token时AppSecret错误
- 微信接口全局返回码说明
- 文件可写权限问题
- 页面错误,请稍后再试
- 该公众号暂时无法提供服务
- URL请求超时
- 新浪sae/SQLSTATE[07000][1045]
- 资料查询
- 实用代码集
- 微信公众平台
- thinkphp学习资料
- jquery核心函数库
- 移动/PC前端学习资料
- 实用小工具收集
- 加入我们
- 广告招商
- 加入开发者