## 消息上下文
### 使用场景
在插件开发过程中经常会遇到需要使用消息上下文的场景,例如做快递查询功能。以下模拟粉丝在公众号对话框查询快递的交互过程:
~~~
粉丝:查快递
公众号:你好,请告知你要查询的快递服务商,例如:顺丰
粉丝:顺丰
公众号:你好,请输入你要查询的顺丰快递单号
粉丝: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()`可以很好的完成通过微信对话框实现的业务需求。
- 更新日志
- 入门
- 关于豆信
- 系统安装
- 功能介绍
- 公众号对接
- 小程序对接
- 系统架构
- 数据字典
- 框架目录结构
- 插件目录结构
- 运行流程
- 插件开发
- 新建插件
- info.php
- 设计数据表
- 插件控制器
- 后台管理控制器
- 移动端控制器
- 交互响应控制器
- 接口管理控制器
- 插件模型
- 插件视图
- 发布插件
- 自定义模型
- 通用增删改查
- common_lists
- common_add
- common_edit
- common_delete
- setMetaTitle
- setSubmitType
- setModel
- setListMap
- setListSearch
- setListOrder
- setListPer
- setEditMap
- setDeleteMap
- setFindMap
- addCrumb
- addNav
- addButton
- setTip
- 函数手册
- get_addon
- get_addon_settings
- tomedia
- get_fans_info
- 小程序开发专题
- 小程序对接插件.js
- 获取插件配置
- 获取用户信息
- 更新用户资料
- 公众号开发专题
- 获取粉丝信息
- 自定义分享
- 消息上下文
- 微信支付
- 企业付款
- 发送现金红包
- 发送模板消息
- 发送客服消息
- 引入前端资源
- 限制页面仅在微信浏览器访问
- 在插件页面中引入样式文件
- 在插件中创建跳转链接
- 数据预处理
- 插件开发实例
- 聊天机器人
- 留言板
- 常见问题解答