🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> **什么叫做消息消息上下文?** ##### 当用户在微信中发送一条消息的时候,默认情况下豆信会检索已安装的插件,如果已安装的插件中文名或者英文标识与用户输入的关键词一致,用户发送的这条消息就会被分发到对应的插件的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 消息上下文自动失效时间 > **总结** 消息上下文机制在微信开发中至关重要,本篇结合“成语接龙”插件大致介绍了在豆信框架中如何设置消息上下文来处理用户的连贯输入,各位开发者可以根据实际情况参考本篇的例子进行更多功能的开发。