微擎实现一个关键词公众号回复多条消息的代码修改

昨天研究最近爆火的那个小霸王游戏的营销思路,说人话就是抄一下,其实思路就是网页引流到公众号,通过外卖佣金变现。

这次的坑,是我要实现下图的功能:

看起来很简单是不是,其实这个功能公众号自带的自动回复可以实现。

选择回复全部就可以回复多条消息,但微信公众号自身无法回复H5链接消息,也就是图中第一条消息样式。

于是考虑到了用微擎实现,接口对接,设置全都ok了,然后发现一个恶心的地方,【微擎竟然不能多条回复!!!!!】

我靠,这就尴尬了,微擎到现在这点简单的功能都不开放吗?别说他们不会开发,网上教程都出来了!

哎,这样我陷入了两难,双面都有bug,无法满足我的要求,装微擎模块能解决,可惜,免费模块都测试了不能用,收费的~呵呵,这点功能不值得花钱啊!

我也懒得换程序了,于是开始魔改一下,让微擎自己能实现多条回复功能。

图片[1]-微擎实现一个关键词公众号回复多条消息的代码修改-www.88531.cn资享网

消息回复功能写在这个文件里,打开文件,是一个名为CoreModuleProcessor的类,首先把类中第一个函数修改如下:

public function respond() {
       $result = $this->msg_respond();
       return $this->respText($result);
  }

然后插入我们的循环发送函数:

private function msg_respond() {
        $rids = !is_array($this->rule) ? explode(',', $this->rule) : $this->rule;
        //数据库中获取发送文字的信息
        $reply = table('basic_reply')->where(array('rid IN' => $rids))->orderby('id')->getAll();
        //图片
        $img_reply = table('images_reply')->where(array('rid IN' => $rids))->orderby('id')->getAll();
        //图文
        $news_reply = table('news_reply')->where(array('rid IN' => $rids))->orderby('id')->getAll();
        //音乐
        $music_reply = table('music_reply')->where(array('rid IN' => $rids))->orderby('id')->getAll();
        //语音
        $voice_reply = table('voice_reply')->where(array('rid IN' => $rids))->orderby('id')->getAll();
        //视频
        $video_reply = table('video_reply')->where(array('rid IN' => $rids))->orderby('id')->getAll();
        //判断是否为空,如果都为空返回false
        if (empty($reply)&&empty($img_reply)&&empty($news_reply)&&empty($music_reply)&&empty($voice_reply)&&empty($video_reply)) {
            return false;
        }
        $access_token=$this->getToken();
        $postStr=file_get_contents('php://input');
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        if (count($reply)+count($img_reply)+count($news_reply)+count($music_reply)+count($voice_reply)+count($video_reply)==1){
            if($reply!=null){
                $reply[0]['content'] = htmlspecialchars_decode($reply[0]['content']);
                $reply[0]['content'] = str_replace(array('<br>', '&nbsp;'), array("\n", ' '), $reply[0]['content']);
                $reply[0]['content'] = strip_tags($reply[0]['content'], '<a>');
                return $reply[0]['content'];
            }elseif ($img_reply!=null){
                for ($y=0;$y<count($img_reply);$y++){
                    $this->imageReply($postObj->FromUserName,$access_token,$img_reply[$y]['mediaid']);
                }
            }elseif ($news_reply!=null){
                //$this->judgeType('news');
                for ($j=0;$j<count($news_reply);$j++){

                    $this->newsRespond($postObj->FromUserName,$access_token,$news_reply[$j]['url'],$news_reply[$j]['thumb'],$news_reply[$j]['title'],$news_reply[$j]['description'],$news_reply[$j]['media_id']);
                    // $this->newsRespond();
                }
            }elseif ($music_reply!=null){
                $result = $this->music_respond();
                return $this->respMusic(array(
                    'Title' => $result['title'],
                    'Description' => $result['description'],
                    'MusicUrl' => $result['url'],
                    'HQMusicUrl' => $result['hqurl'],
                ));
            }elseif ($voice_reply!=null){
                for ($s=0;$s<count($voice_reply);$s++){
                    $this->voiceReply($postObj->FromUserName,$access_token,$voice_reply[$s]['mediaid']);
                }
            }elseif ($video_reply!=null){
                for ($d=0;$d<count($video_reply);$d++){
                    $this->videoReply($postObj->FromUserName,$access_token,$video_reply[$d]['mediaid'],$video_reply[$d]['title'],$video_reply[$d]['description']);
                }
            }else{
                return "数据错误!!!";
            }
        }else{
            //循环发送图片
            for ($y=0;$y<count($img_reply);$y++){
                $this->imageReply($postObj->FromUserName,$access_token,$img_reply[$y]['mediaid']);
            }
            //循环发送图文
            for ($j=0;$j<count($news_reply);$j++){
                 $this->newsRespond($postObj->FromUserName,$access_token,$news_reply[$j]['url'],$news_reply[$j]['thumb'],$news_reply[$j]['title'],$news_reply[$j]['description'],$news_reply[$j]['media_id']);
            }
            //视频
            for ($d=0;$d<count($video_reply);$d++){
                $this->videoReply($postObj->FromUserName,$access_token,$video_reply[$d]['mediaid'],$video_reply[$d]['title'],$video_reply[$d]['description']);
            }
            //语音
            for ($s=0;$s<count($voice_reply);$s++){
                $this->voiceReply($postObj->FromUserName,$access_token,$voice_reply[$s]['mediaid']);
            }
            //循环发送文字
            for($i=0;$i<count($reply);$i++){
                if($i==count($reply)-1){
                    return $reply[$i]['content'];
                }else{
                    $this->replymsg($postObj->FromUserName,$access_token,trim($reply[$i]['content']));
                }
            }
        }
   return 0;
 }

插入一个获取access_token的函数:

private function getToken(){
    $appid = "你自己的appid";
    $secret = "你自己的secret";
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;
    $ch = curl_init();//初始化
    curl_setopt($ch, CURLOPT_URL, $url);//与url建立对话
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //进行配置
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //进行配置
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//进行配置
    $output = curl_exec($ch);//获取Access Token
    curl_close($ch);//关闭会话
    $jsoninfo = json_decode($output, true);
    $access_token =$jsoninfo["access_token"];
    echo $access_token;
    return $access_token;
}

插入请求函数:

private function https_post($url,$data)
{
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec($curl);
        if (curl_errno($curl)) {
            return 'Errno'.curl_error($curl);
        }
        curl_close($curl);
        return $result;
    }

重写所有发送方法:

//发送文字的方法
 private function replymsg($fromUsername,$access_token,$content){
      $data = '{
            "touser":"'.$fromUsername.'",
            "msgtype":"text",
            "text":
            {
                 "content":"'.$content.'"
            }
        }';
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
        //$this->https_post($url,$data);
        $result = $this->https_post($url,$data);
        $final = json_decode($result);
        return $final;
    }
    //发送图片的方法
    private function imageReply($fromUsername,$access_token,$mediaId){
        $data='{
            "touser":"'.$fromUsername.'",
            "msgtype":"image",
            "image":
                {
                    "media_id":"'.$mediaId.'"
                }
        }';
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
        //$this->https_post($url,$data);
        $result = $this->https_post($url,$data);
        $final = json_decode($result);
        return $final;
    }
    //发送图文的方法
  private function newsRespond($fromUsername,$access_token,$url,$picUrl,$title,$description,$mediaid) {
      $myfile = fopen("newfile.txt", "w") ;
      fwrite($myfile, $mediaid);
      fclose($myfile);
      if(preg_match("/^\d*$/",$mediaid)) 
       {
         $data = '{
             "touser":"'.$fromUsername.'",
           "msgtype":"news",
             "news":{
             "articles": [
              {
                  "title":"'.$title.'",
                  "description":"'.$description.'",
                  "url":"'.$url.'",
                  "picurl":"'.$picUrl.'"
              }
              ]
             }
         }';
         
         $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
         //$this->https_post($url,$data);
         $result = $this->https_post($url,$data);
         $final = json_decode($result);
         return $final;
       }
      else{
        $data = '{
            "touser":"'.$fromUsername.'",
            "msgtype":"mpnews",
            "mpnews":{
                "media_id":"'.$mediaid.'"
            }
        }';
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
        //$this->https_post($url,$data);
        $result = $this->https_post($url,$data);
        $final = json_decode($result);
        return $final;
      }
  }
    //发送音乐的方法
    private function musicReply($fromUsername,$access_token,$title,$description,$url,$hqurl){
        $data = '{
            "touser":"'.$fromUsername.'",
            "msgtype":"music",
            "music":
             {
                "title":"'.$title.'",
                "description":"'.$description.'",
                "musicurl":"'.$url.'",
                "hqmusicurl":"'.$hqurl.'"
             }
        }';
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
        //$this->https_post($url,$data);
        $result = $this->https_post($url,$data);
        $final = json_decode($result);
        return $final;
    }
    //语音
    private function voiceReply($fromUsername,$access_token,$mediaid){
        $data='
            {
    "touser":"'.$fromUsername.'",
    "msgtype":"voice",
    "voice":
    {
      "media_id":"'.$mediaid.'"
    }
}
        ';
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
        //$this->https_post($url,$data);
        $result = $this->https_post($url,$data);
        $final = json_decode($result);
        return $final;
    }
    //视频
    private function videoReply($fromUsername,$access_token,$mediaid,$title,$description){
        $data = '
            {
    "touser":"'.$fromUsername.'",
    "msgtype":"video",
    "video":
    {
      "media_id":"'.$mediaid.'",
      "title":"'.$title.'",
      "description":"'.$description.'"
    }
}';
        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$access_token;
        //$this->https_post($url,$data);
        $result = $this->https_post($url,$data);
        $final = json_decode($result);
        return $final;
    }

OK,这一套下来基本就是重写了整个微擎的回复代码,原则上用上面的这些方法替换掉CoreModuleProcessor类中的所有代码,就可以了。

虽然我这些代码也是按照网上复制粘贴的,但网上的原版魔改教程是有个bug的,那就是他没有写图文链接消息的回复代码,也就是最后实现了多条回复,但又无法回复图文链接消息,这点我已经修复了,也就是我这个代码目前是比较完善的魔改方法。

最后终于实现了想要的功能:

这个小霸王游戏机的流程,也终于被我搞定,其实在小霸王网页的代码中还有一个坑,那就是你缺少后台php文件接口,所以你搭建完的无法定义分享标题和封面图,这点我也已经搞定了,自己写了个后台接口,涉及知识就是微信公众号的网页开发,有能力的朋友去看看文档吧!累了,最后看看成果!

来源地址:微擎实现一个关键词公众号回复多条消息的代码修改

转载声明:本站文章若无特别说明,皆为原创,转载请注明来源:www.88531.cn资享网,谢谢!^^

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享