消息上下文

使用场景

在插件开发过程中经常会遇到需要使用消息上下文的场景,例如做快递查询功能。以下模拟粉丝在公众号对话框查询快递的交互过程:

  1. 粉丝:查快递
  2. 公众号:你好,请告知你要查询的快递服务商,例如:顺丰
  3. 粉丝:顺丰
  4. 公众号:你好,请输入你要查询的顺丰快递单号
  5. 粉丝:201607079999
  6. 公众号:以下是你要查询的内容:xxxxxx

根据以上的业务场景我们知道,假设某个快递查询插件以查快递作为触发关键词,当粉丝发送查快递时,粉丝消息会分发到快递查询插件进行处理,而当粉丝发送顺丰时,因为快递查询插件没有设置匹配顺丰的关键词,所以此条消息不会进入到快递查询插件,因而不能达到实际的业务需要。这就是消息上下文的应用场景,当粉丝发送查快递时,消息分发到快递查询插件,我们在快递查询插件中判断用户是否处于消息上下文模式中,如果不处于,则开启消息上下文,当用户发送顺丰时,公众号会判断得知顺丰查快递处于同一消息上下文模式中,则此条消息会再次分发到快递查询插件进行处理。

使用示例

  1. $content = $message['Content']; // 获取用户消息内容
  2. if (!$this->in_context) { // 不在消息上下文模式中(例如用户第一次发送:查快递)
  3. $this->begin_context(300); // 开启消息上下文,设置5分钟后自动退出上下文模式
  4. reply_text('你好,请告知你要查询的快递服务商,例如:顺丰'); // 回复用户
  5. } else { // 处于消息上下文模式中(例如用户发送:顺丰)
  6. $context = $this->get_context(); // 获取消息上下文附加信息
  7. if (!$context['provider]) { // 如果没有附加信息(比如发送:顺丰)
  8. $this->keep_context(300, array('provider'=>$content)); // 保持上下文模式,并把输入的快递服务商作为附加数据
  9. reply_text('你好,请输入你要查询的'.$content.'快递单号'); // 回复用户
  10. } else { // 有附加数据(比如已经输入过快递服务商)
  11. $provider = $context['provider']; // 获取快递服务商
  12. // TODO:调用快递查询接口查询物流信息
  13. $this->end_context(); // 退出消息上下文模式,业务完成
  14. reply_text('以下是你要查询的内容:xxxxxx');
  15. }
  16. }

备注

灵活使用$this->in_contenxt、$this->begin_context()、$this->keep_context()、$this->end_context()可以很好的完成通过微信对话框实现的业务需求。