场景
要求用户给公众平台发一个消息 (特殊定义好的关键词语)时,公众号同时给用户返回多条消息。
然而,如果用公众号自己的回复能力,却只能回复一条,是不能实现的。那么,想要一次发几条消息怎么实现的呢。其实用客服消息功能就行
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']);
}
很傻很直接但有效。