Write the Code. Change the World.

9月 27

场景

要求用户给公众平台发一个消息 (特殊定义好的关键词语)时,公众号同时给用户返回多条消息。

然而,如果用公众号自己的回复能力,却只能回复一条,是不能实现的。那么,想要一次发几条消息怎么实现的呢。其实用客服消息功能就行

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547

先说说客服消息

公众平台官方文档已经有说明。

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

利用客服接口,可以发送多条消息。一样可以发送文本,图片,语音,视频等消息。

接用户信息

接用户消息。

$postStr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");
if (!empty($postStr)) {
    libxml_disable_entity_loader(true);
    $msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    if ($msg['Content'] === 'xxx') {
       // 如果关键字刚好是需要的 这个时候就可以用客服消息了。
       // 1. 获取accessToken
       // 2. 组织消息内容
       // 3. 发客服消息 1
       // 4. 发客服消息 2
       // 5. 发客服消息 3
       // ……
    }   
}



如果向上边这样操作,腾讯那边迟迟接不到回音,就会重复请求,这样就会重复发三次客服消息。下边就是解决方法。

在 获取 accessToken 之前,加入下边的代码。

    ignore_user_abort(true);
    ob_start();
    echo '';
    header('Connection: close');
    header('Content-Length: ' . ob_get_length());
    ob_end_flush();
    ob_flush();
    flush();

这样还不能解决问题的。

很傻很直接的办法

1, 消息进来,对消息数据进行观察。发现超时请求的数据格式一样。这样,我们可以知道该条消息的特征(FromUserName 和 CreateTime 组合成唯一识别key)。
2,对特殊关键字的消息做消息过滤。以 FromUserName 和 CreateTime 组合的值为key 作为 redis 的 key,先判断该 key 对应值是否存在,如果存在,表示是 超时过来的请求,请 echo ''; exit; 相应。如果不存在,建立一个 15 秒的 redis缓存即可。

    if($this->msg['Content'] == '领红包')
    {
    $key = $this->msg['FromUserName'] . $this->msg['CreateTime'];

    if(\Illuminate\Support\Facades\Redis::exists($key))
    {
    echo '';
    exit;
    }

    \Illuminate\Support\Facades\Redis::setex($key, 15, $this->msg['Content']);
    }

很傻很直接但有效。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注