消息上下文
使用场景
在插件开发过程中经常会遇到需要使用消息上下文的场景,例如做快递查询功能。以下模拟粉丝在公众号对话框查询快递的交互过程:
粉丝:查快递
公众号:你好,请告知你要查询的快递服务商,例如:顺丰
粉丝:顺丰
公众号:你好,请输入你要查询的顺丰快递单号
粉丝: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()
可以很好的完成通过微信对话框实现的业务需求。