PHP-解决微信客服接口重复发送三次消息的问题

本文讲述了作者在处理微信公众号消息时遇到的重发机制问题,通过存储用户msgId来判断并避免重复回复,同时揭示了客服接口和模版回复的使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:当用户向微信公众号发送消息时,由于需要去调三方平台的接口,所以不能在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.模版回复和客服接口同时使用,模版回复会失效,只有客服接口能成功;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值