寒心烟雨情 发表于 2019-12-15 15:09

PHP对接微信公众号实现简单自动回复

今天早上花了点时间去网上抄了点代码,功能比较简单,当用户在公众号下留言,将留言的关键词带到数据库查询并返回查询结果。


反正是以比较简单的代码做的,代码运行环境随便可以运行PHP就行。


<!DOCTYPE html>
<html>
<body>
        <head>
    <meta charset="utf-8">
    </head>

<?php
require_once "defs.php";
function index()
      {


                $timestamp = $_GET['timestamp'];
                $nonce = $_GET['nonce'];
                $token = 'hongming';                        //公众号里面配置的token
                $signature = $_GET['signature'];
                $echostr = $_GET['echostr'];                //每一次都要验证, 只有第一次验证才会有 echostr
                $array = array( $timestamp, $nonce, $token);
                sort( $array );
               
                //2.将排序后的三个参数拼接之后用sha1加密
                $tempstr = implode('', $array);
                $tempstr = sha1( $tempstr );
               
                //3.将加密后的字符串与signature进行对比,判断该请求是否来自微信
                if( $tempstr == $signature && $echostr){       //启动服务器配置 会进入到这里
                        echo $_GET['echostr'];
                        exit();
                }else{
                        reponseMsg();                               //这里是   启用成功后, 接受事件用的
                }


}

function reponseMsg(){
         
                $postStr = file_get_contents("php://input");
               //根据事件,进行自己的逻辑代码吧    请开始你的表演
                if (!empty($postStr)){

            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

            $fromUsername = $postObj->FromUserName;

            $toUsername = $postObj->ToUserName;
         
            $msgtype = $postObj->MsgType;

            $keyword = trim($postObj->Content);

            $time = time();

            $textTpl = "<xml>

            <ToUserName><!]></ToUserName>

            <FromUserName><!]></FromUserName>

            <CreateTime>%s</CreateTime>

            <MsgType><!]></MsgType>

            <Content><!]></Content>

            <FuncFlag>0<FuncFlag>

            </xml>";
            

            if(!empty( $keyword ) & $msgtype == "text")      //文本判断

            {

                $msgType = "text";

                $contentStr = sousuo($keyword);

                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

                echo $resultStr;

            }
            if($msgtype=='event'){                         // 关注判断
                    $msgType = "text";

                $contentStr = "感谢您的关注!";

                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

                echo $resultStr;
            }
            else                     // 其他类型消息判断
            {
                   
                    $msgType = "text";

                $contentStr = "回复关键词可以查询影视资源哦!";

                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

                echo $resultStr;
            }

      }
               
               
       }

   

index();


         
?>

</body
</html>



其他的可以去看看官方的开发文档。


loveni 发表于 2020-3-18 10:45

<?php

//-----可配置区域开始-------------

//微信令牌,请与微信公众号后台同步
define("TOKEN", "weixin");
//解析地址
define("API", "你的解析地址");
//显示数量
define("NUM", "5");
//公众号名称         
define("TITLE", "橙子影视");
//默认图片   
define("PIC", "默认图片地址");
//留言本地址
define("BOOK", "留言本地址");

//-----可配置区域结束-------------

$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{   
    public function CheckUrl($url)
    {      
    return preg_match('/(http|https|ftp):\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is',$url);   
    }
    public function valid()
    {
      $echoStr = $_GET["echostr"];
      if($echoStr==""){      
            $this->responseMsg();
         }elseif($this->checkSignature()){
            echo $echoStr;
            exit;
         }
    }
   
    public function responseMsg(){
         $postStr = addslashes(file_get_contents('php://input'));   if (empty($postStr)){exit("你好!请关注【".TITLE."】微信公众号获取服务");}      
         $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
         $fromUsername = $postObj->FromUserName;
         $toUsername = $postObj->ToUserName;
         $time=$postObj->CreateTime;
         $keyword = trim($postObj->Content);
         $event = $postObj->Event;            
                     
          $textTpl = "<xml><ToUserName><!]></ToUserName><FromUserName><!]></FromUserName><CreateTime>%s</CreateTime><MsgType><!]></MsgType><Content><!]></Content></xml>";
          $newsTpl = "<xml><ToUserName><!]></ToUserName><FromUserName><!]></FromUserName><CreateTime>%s</CreateTime> <MsgType><!]></MsgType> <ArticleCount>1</ArticleCount><Articles><item><Title><!]></Title> <Description><!]></Description><PicUrl><!]></PicUrl><Url><!]></Url></item></Articles></xml>";   
   
         switch($postObj->MsgType){
               case 'event':
               if($event == 'subscribe'){
                  
                        //关注后的回复
                            $contentStr = "欢迎关注".TITLE."\r\n本公众号提供在线影视观看,免广告看VIP视频,持续关注,精彩多多。\r\n输入格式:\r\n    1.输入电影名,如: 西游记 即可在线观看!\r\n2.输入视频网址,支持爱奇艺,优酷,腾讯等主流视频网站免VIP播放。\r\n3.回复数字:\r\n 【0】 显示帮助\r\n 【1】打开留言板";
                            $msgType = 'text';
                            $textTpl = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                            echo $textTpl;
                            break;

               }
            
             case 'text':
                      //输入文字
                     if(preg_match('/[\x{4e00}-\x{9fa5}]+/u',$keyword))
                      {   

                           $result = file_get_contents(API."/api.php?tp=json&wd=".$keyword);
                           $result= json_decode($result,true);                                                                           
                           if($result &&$result["success"]){
                           
                           $txt .="恭喜,成功找到视频,请点击播放:\r\n\n";               
                           $i=1;                           
                           foreach( $result["info"] as $row){
                                    
                                    $title = $row['title'];
                                    
                                    $url=API."/?wd=".urlencode($title)."&id=".$row['id']."&flag=".$row['flag']."&type=".$row['type'];                           
                                    $url=self::getContentLink($url);                              
                                    $pic= $row['pic'];
                                    $txt .= "<a href='".$url."'>·".urldecode($title)."</a>\r\n\n";
                                    $i++;
                                    if($i>NUM){break;}
                                    }
                           
                                     $contentStr = $txt.'<a href="'.API."/?wd=".$keyword.'">【更多】...</a>';
                                     $msgType = 'text';
                                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                                     echo $resultStr;   
                           
                           } else{

                              //没有查找到的时候的回复
                                        $title = "资源未找到,点击图片留言反馈! ";
                                        $des1 ="";
                                        //图片地址
                                        $picUrl1 =PIC;
                                        //跳转链接                              
                                        $url=self::getContentLink(BOOK);
                                        $resultStr= sprintf($newsTpl, $fromUsername, $toUsername, $time, $title, $des1, $picUrl1, $url) ;                                    
                                       echo $resultStr;                                    
                            }
                     
                     //其他
                     
                     }else if($this->CheckUrl($keyword)){
                                        $title = '点击开始播放';
                                        $des1 ="";
                                        //图片地址
                                        $picUrl1 =PIC;
                                        //跳转链接
                                        $url=API."/?url=".$keyword."";
                                        $url=self::getContentLink($url);
                                        $resultStr= sprintf($newsTpl, $fromUsername, $toUsername, $time, $title, $des1, $picUrl1, $url) ;                                    
                                       echo $resultStr;

                        }else if($keyword=="0"){   
                                     $contentStr = "欢迎关注".TITLE."\r\n本公众号提供在线影视观看,免广告看VIP视频,持续关注,精彩多多。\r\n输入格式:\r\n    1.输入电影名,如: 西游记 即可在线观看!\r\n2.输入视频网址,支持爱奇艺,优酷,腾讯等主流视频网站免VIP播放。\r\n3.回复数字:\r\n 【0】 显示帮助\r\n 【1】打开留言板";
                                     $msgType = 'text';
                                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                                     echo $resultStr;   
                        
                         }else if($keyword=="1" ){   
                                    $title = '点击打开留言板';
                                        $des1 ="";
                                        //图片地址
                                        $picUrl1 =PIC;
                                        //跳转链接
                                        $url=self::getContentLink(BOOK);
                                        $resultStr= sprintf($newsTpl, $fromUsername, $toUsername, $time, $title, $des1, $picUrl1, $url) ;                                    
                                       echo $resultStr;
                     
                     
                     }else{
                        
                                    $contentStr = "输入格式:\r\n    1.输入电影名,如: 西游记 即可在线观看!\r\n2.输入视频网址,支持爱奇艺,优酷,腾讯等主流视频网站免VIP播放。\r\n 3.回复数字:\r\n 【0】 显示帮助\r\n 【1】打开留言板";
                                     $msgType = 'text';
                                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                                     echo $resultStr;

                     };
   
                     break;
               
             default:
                      break;
               
         }// switch end
}

    private function checkSignature(){
      // you must define TOKEN by yourself
      if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
      }
      
      $signature = $_GET["signature"];
      $timestamp = $_GET["timestamp"];
      $nonce = $_GET["nonce"];
               
      $token = TOKEN;
      $tmpArr = array($token, $timestamp, $nonce);
      // use SORT_STRING rule
      sort($tmpArr, SORT_STRING);
      $tmpStr = implode( $tmpArr );
      $tmpStr = sha1( $tmpStr );
      
      if( $tmpStr == $signature ){
            return true;
      }else{
            return false;
      }
    }

private function getContentLink($url){
   
   $api="http://api.t.sina.com.cn/short_url/shorten.json?source=2815391962&url_long=";
   $result = file_get_contents($api.$url);
   $result= json_decode($result,true);      
   return $result["url_short"];
   
}
   
}

寒心烟雨情 发表于 2020-3-3 01:45

hlwdsg 发表于 2020-3-2 23:58
请教楼主,我把他复制到新浪云index.php了,为什么一直都说token验证失败呢?token也改的一样,require_onc ...

这个验证好像我当时写出问题了,你可以去看看微信官方那里是这么验证的

ldzzdl 发表于 2019-12-15 15:18

谢谢分享哈

qingjie2010 发表于 2019-12-15 15:21

谢谢分享哈{:1_887:}

ajal 发表于 2019-12-15 15:43

没有defs.php 可以跑起来?

hsx778899 发表于 2019-12-15 15:51

公众号本身不是有设置自动回复的吗

蜜柚吃吧 发表于 2019-12-15 15:52

感谢分享!

寒心烟雨情 发表于 2019-12-15 15:55

hsx778899 发表于 2019-12-15 15:51
公众号本身不是有设置自动回复的吗

我数据库里有一万条数据,我们总不能一个个设置回复吧

寒心烟雨情 发表于 2019-12-15 15:55

ajal 发表于 2019-12-15 15:43
没有defs.php 可以跑起来?

那是文件是我放数据库查询函数的,可以删了

A1one7 发表于 2019-12-15 16:10

楼主,请问有简易的教程吗?:loveliness: 像使用下

众益科技 发表于 2019-12-15 17:01

小白表示不懂怎么用
页: [1] 2 3
查看完整版本: PHP对接微信公众号实现简单自动回复