PHP微信公众平台开发高级篇—自定义菜单 (根据慕课网上的视频教程编写)

一、说明

1、根据慕课网上的教程为基础,这是前两个基础教程:
PHP实现微信公众平台开发—基础篇:https://www.imooc.com/video/9316
PHP实现微信公众平台开发—提升篇 :https://www.imooc.com/video/10231
2、慕课上视频讲解用的是thinkphp早期版本,我用的是thinkphp3.2.3版本。可以看慕课视频进行学习,讲的比较详细
PHP微信公众平台开发高级篇—自定义菜单:https://www.imooc.com/video/11332
3、代码亲测有效

二、IndexController控制器代码


namespace Weixin\Controller;
use Think\Controller;

class IndexController extends Controller{
    public function __construct(){

    }//可以不写
    public function index(){
        //获得参数 signature nonce token timestamp echostr
        $nonce     = $_GET['nonce'];
        $token     = 'weixin';
        $timestamp = $_GET['timestamp'];
        $echostr   = $_GET['echostr'];
        $signature = $_GET['signature'];
        //形成数组,然后按字典序排序
        $array = array();
        $array = array($nonce, $timestamp, $token);
        sort($array);
        //拼接成字符串,sha1加密 ,然后与signature进行校验
        $str = sha1( implode( $array ) );
        if( $str  == $signature && $echostr ){
            //第一次接入weixin api接口的时候
            echo  $echostr;
            exit;
        }else{
            $this->definedItem();
            $this->reponseMsg();
        }
    }
    // 接收事件推送并回复
    public function reponseMsg(){
        //1.获取到微信推送过来post数据(xml格式)
        //$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];//php7开始不支持
        $postArr = file_get_contents("php://input"); 
        //2.处理消息类型,并设置回复类型和内容
        $postObj = simplexml_load_string( $postArr );

        //判断该数据包是否是订阅的事件推送
        if( strtolower( $postObj->MsgType) == 'event'){
            //如果是关注 subscribe 事件
            if( strtolower($postObj->Event == 'subscribe') ){
                /* //回复用户消息(纯文本格式)  
                $toUser   = $postObj->FromUserName;
                $fromUser = $postObj->ToUserName;
                $time     = time();
                $msgType  =  'text';
                //$content  = '欢迎关注我们的微信公众账号'.$postObj->FromUserName.'-'.$postObj->ToUserName;
                $content  = '欢迎关注放哥的微信公众账号';
                $template = "
                            
                            
                            %s
                            
                            
                            ";
                $info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
                echo $info; */ 
                //回复一个单图文
                $arr = array(
                    array(
                        'title'=>'程序员的天堂',
                        'description'=>"欢迎来到放哥的公众号",
                        'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
                        'url'=>'http://www.imooc.com',
                    ),
                );
                $model = new \Weixin\Model\IndexModel();
                $model -> responseSubscribe($postObj, $arr);
            }
        }
         //dump($postObj->Event); 
         //dump($postObj->Eventkey);
        //自定义菜单中event->click事件
         if( strtolower($postObj->Event) == 'click'){
             $key = (string)$postObj->EventKey;
            if(strtolower($key == 'item1')){
                $content = "这是item1菜单的事件推送";
            }elseif(strtolower($key == 'songs')){
                $content = "这是歌曲菜单的事件推送";
            } else {
                $content = '未匹配'.print_r($postObj->EventKey, true);
            }
            $model = new \Weixin\Model\IndexModel();
            $model -> responseText($postObj, $content);
        }

        //如果是自定义菜单中的event->view
        if(strtolower($postObj->Event) == 'view'){
            $content="跳转的链接是".$postObj->EventKey;
            $model = new \Weixin\Model\IndexModel();
            $model -> responseText($postObj, $content);
        }   

        //用户发送tuwen1关键字的时候,回复一个单图文
        if( strtolower($postObj->MsgType) == 'text' && trim($postObj->Content)=='tuwen2' ){
            //从数据库中查询得到
            $arr = array(
                array(
                    'title'=>'imooc',
                    'description'=>"imooc is very cool",
                    'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
                    'url'=>'http://www.imooc.com',
                ),
                array(
                    'title'=>'hao123',
                    'description'=>"hao123 is very cool",
                    'picUrl'=>'https://www.baidu.com/img/bdlogo.png',
                    'url'=>'http://www.hao123.com',
                ),
                array(
                    'title'=>'qq',
                    'description'=>"qq is very cool",
                    'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
                    'url'=>'http://www.qq.com',
                ),
            );
            //实例化模型
            $model = new \Weixin\Model\IndexModel();
            $model -> responseNews($postObj, $arr);

            //注意:进行多图文发送时,子图文个数不能超过10个
        }else{
            switch(trim($postObj->Content)){
                case 1:
                    $content = '您输入的数字是1';
                break;
                case 2:
                    $content = '您输入的数字是2';
                break;
                case 3:
                    $content = '您输入的数字是3';
                break;
                case 4:
                    $content = "慕课";
                break;
                case '英文':
                    $content = 'imooc is ok';
                break;
                default:
                    $content = '没有找到相关信息';
            }   
            //实例化模型
            $model = new \Weixin\Model\IndexModel();
            $model -> responseText($postObj, $content);
        }//if end
    }//reponseMsg end

/*  function http_curl(){
        //获取imooc
        //1.初始化curl
        $ch = curl_init();
        $url = 'http://www.baidu.com';
        //2.设置curl的参数
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //3.采集
        $output = curl_exec($ch);
        //4.关闭
        curl_close($ch);
        var_dump($output);
    } */
    /*
    *$url 接口url string
    *$type 请求类型 string
    *$res 返回数据类型 string
    *%$arr post 请求参数 string
    */
    public function http_curl($url,$type='get',$res='json',$arr=''){
        //1.初始化curl
        $ch = curl_init();
        //2.设置curl的参数
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if($type == 'post'){
            curl_setopt($ch, CURLOPT_POST,1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
        }
        //3.采集
        $output = curl_exec($ch);
        //4.关闭
        curl_close($ch);
        if($res=='json'){
            if(curl_error($ch)){
                //请求失败,返回错误信息
                return curl_error($ch);
            }else{
                //请求成功,返回错误信息
                return json_decode($output,true);
            }
        }
    }

    /* function getWxAccessToken(){
        //1.请求url地址
        $appid = 'wxb20bebb764546087';
        $appsecret =  '64e22d215895d52af21c8fcbf6da3241';
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        //2初始化
        $ch = curl_init();
        //3.设置参数
        curl_setopt($ch , CURLOPT_URL, $url);
        curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
        //4.调用接口 
        $res = curl_exec($ch);
        //5.关闭curl
        curl_close( $ch );
        if( curl_errno($ch) ){
            var_dump( curl_error($ch) );
        }
        $arr = json_decode($res, true);
        var_dump( $arr );
    } */

    function getWxServerIp(){
        $accessToken = "10_GeE-KKSKq5PE_K3gLKJE7bmAJKJS2hh0qwM5ZwTSJaGtY6DJ3o5moOvT0TjpScimSG4g4LfjShJc6unkfKThjAcdinCJsWyS0RIIdWJLnJ_yBN3Qa06DTf63ZgkC86N7lmfRNcsVuwdthW35AXIdABAKHS";
        $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$accessToken;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        $res = curl_exec($ch);
        curl_close($ch);
        if(curl_errno($ch)){
            var_dump(curl_error($ch));
        }
        $arr = json_decode($res,true);
        echo "
";
        var_dump( $arr );
        echo "
"
; } /* *返回access_token *session解决办法 存mysql memcache */ public function getWxAccessToken(){ //将access_token 存在session/cookie中 if($_SESSION['access_token'] && $_SESSION['expire_time'] > time()){ //如果access_token在session中没有过期 return $_SESSION['access_token']; }else{ //如果access_token在session中不存在或者已经过期 $appid = 'wxb20bebb764546087'; $appsecret = '64e22d215895d52af21c8fcbf6da3241'; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret; $res = $this->http_curl($url,'get','json'); $access_token = $res['access_token']; //将重新获取到的access_token存到session中 $_SESSION['access_token'] = $access_token; $_SESSION['erpire_time'] = time() + 7000; return $access_token; } } /* 创建微信菜单 目前微信接口的调用方式都是curl post/get */ public function definedItem(){ header('content-type:text/html;charset=utf-8'); echo $access_token = $this->getWxAccessToken(); echo '
'
; $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token; $postArr = array( 'button' => array( array( 'name' => urlencode('菜单一'), 'type' => 'click', 'key' => 'item1', ),//第一个一级菜单 array( 'name' => urlencode('菜单二'), 'sub_button' => array( array( 'name' => urlencode('歌曲'), 'type' => 'click', 'key' => 'songs', ),//第一个二级菜单 array( 'name' => urlencode('电影'), 'type' => 'view', 'url' => 'http://www.baidu.com', ),//第二个二级菜单 ), ),//第二个一级菜单 array( 'name' => urlencode('菜单三'), 'type' => 'view', 'url' => 'http://www.qq.com', ),//第三个一级菜单 ), ); echo '
'
; var_dump($postArr); echo '
'
; echo $postJson = urldecode(json_encode($postArr)); $res = $this->http_curl($url,'post','json',$postJson); echo '
'
; var_dump($res); } }//class end

三、IndexModel模型代码


namespace Weixin\Model;

class IndexModel{
    //回复多图文类型的微信消息
    public function responseNews($postObj ,$arr){
        $toUser = $postObj->FromUserName;
        $fromUser = $postObj->ToUserName;
        $template = "
                    
                    
                    %s
                    
                    ".count($arr)."
                    ";
        foreach($arr as $k=>$v){
            $template .="
                        <![CDATA["</span>.<span class="hljs-variable">$v</span>[<span class="hljs-string">'title'</span>].<span class="hljs-string">"]]> 
                        .$v['description']."]]>
                        .$v['picUrl']."]]>
                        .$v['url']."]]>
                        ";
        }

        $template .="
                     ";
        echo sprintf($template, $toUser, $fromUser, time(), 'news');
    }

    // 回复单文本
    public function responseText($postObj,$content){
        $template = "
        
        
        %s
        
        
        ";
        //注意模板中的中括号 不能少 也不能多
        $fromUser = $postObj->ToUserName;
        $toUser   = $postObj->FromUserName; 
        $time     = time();
        $msgType  = 'text';
        echo sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
    }

    //回复微信用户的关注事件
    public function responseSubscribe($postObj, $arr){
        $this->responseNews($postObj,$arr);
    }
}

你可能感兴趣的:(微信公众号开发)