问题描述:当用户向微信公众号发送消息时,由于需要去调三方平台的接口,所以不能在5s内进行回复,于是通过客服接口主动向用户发送消息,但是由于微信重发机制,会向用户重复回复三次一样的消息。
解决思路
1.先是查看微信官网文档,尝试先通过发送echo ‘’、echo ‘success’对微信服务器进行回复,让微信服务器不再触发重发机制,但是发现并没有效果。
2.通过网上查找,发现很多都是ob函数,于是跟着学了一次,但是也没有效果。
3.成功思路:通过存储用户发送的msgId来进行判断。当用户发送消息时,判断msgId与上一次存储的msgId是否相等,不相等则进行存储,并进行后续处理;若相等则回复 echo‘success’,并直接exit。下面附上代码(我是通过文件储存msgid,也可以通过redis等缓存进行存储)
<?php
// 获取微信POST过来的数据
$postStr = file_get_contents('php://input');
// 解析用户发送的消息
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName; // 发送方帐号(一个OpenID)
$toUsername = $postObj->ToUserName; // 开发者微信号
$msgType = $postObj->MsgType; // 消息类型
$msgId = $postObj->MsgId; // 消息id
$keyword = trim($postObj->Content); // 获取用户发送的消息内容
//获取上次的msgId,并进行比较
$old_msgid = json_decode(get_php_file("msgid.php"));
if($old_msgid->msgid == $msgId){
echo "success";
exit;
}else{
set_php_file("msgid.php", '{"msgid":"'.$msgId.'"}');
}
switch ($msgType) {
case 'text':
//后续处理
break;
case 'voice':
//后续处理
break;
default:
echo "";
}
//获取文件内容
function get_php_file($filename) {
return trim(substr(file_get_contents($filename), 15));
}
//修改文件内容
function set_php_file($filename, $content) {
$fp = fopen($filename, "w");
fwrite($fp, "<?php exit();?>" . $content);
fclose($fp);
}
msgid.php文件内容:
<?php exit();?>{"msgid":"24537835188423528"}
客服接口和模版回复的坑
1.模版回复只能回复一条信息,第二条会失效;
2.模版回复和客服接口同时使用,模版回复会失效,只有客服接口能成功;