## 消息上下文 ### 使用场景 在插件开发过程中经常会遇到需要使用消息上下文的场景,例如做快递查询功能。以下模拟粉丝在公众号对话框查询快递的交互过程: ~~~ 粉丝:查快递 公众号:你好,请告知你要查询的快递服务商,例如:顺丰 粉丝:顺丰 公众号:你好,请输入你要查询的顺丰快递单号 粉丝:201607079999 公众号:以下是你要查询的内容:xxxxxx ~~~ 根据以上的业务场景我们知道,假设某个快递查询插件以**查快递**作为触发关键词,当粉丝发送**查快递**时,粉丝消息会分发到快递查询插件进行处理,而当粉丝发送**顺丰**时,因为快递查询插件没有设置匹配**顺丰**的关键词,所以此条消息不会进入到快递查询插件,因而不能达到实际的业务需要。这就是**消息上下文**的应用场景,当粉丝发送**查快递**时,消息分发到快递查询插件,我们在快递查询插件中判断用户是否处于消息上下文模式中,如果不处于,则开启消息上下文,当用户发送**顺丰**时,公众号会判断得知**顺丰**与**查快递**处于同一消息上下文模式中,则此条消息会再次分发到快递查询插件进行处理。 ### 使用示例 ~~~ $content = $message['Content']; // 获取用户消息内容 if (!$this->in_context) { // 不在消息上下文模式中(例如用户第一次发送:查快递) $this->begin_context(300); // 开启消息上下文,设置5分钟后自动退出上下文模式 reply_text('你好,请告知你要查询的快递服务商,例如:顺丰'); // 回复用户 } else { // 处于消息上下文模式中(例如用户发送:顺丰) $context = $this->get_context(); // 获取消息上下文附加信息 if (!$context['provider]) { // 如果没有附加信息(比如发送:顺丰) $this->keep_context(300, array('provider'=>$content)); // 保持上下文模式,并把输入的快递服务商作为附加数据 reply_text('你好,请输入你要查询的'.$content.'快递单号'); // 回复用户 } else { // 有附加数据(比如已经输入过快递服务商) $provider = $context['provider']; // 获取快递服务商 // TODO:调用快递查询接口查询物流信息 $this->end_context(); // 退出消息上下文模式,业务完成 reply_text('以下是你要查询的内容:xxxxxx'); } } ~~~ ### 备注 灵活使用`$this->in_contenxt、$this->begin_context()、$this->keep_context()、$this->end_context()`可以很好的完成通过微信对话框实现的业务需求。