thinkphp 實現微信公衆號開發(二)--實現自定義菜單

IndexController.class.phpjavascript

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
   /* public function index(){
        $this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微軟雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>歡迎使用 <b>ThinkPHP</b>!</p><br/>版本 V{$Think.version}</div><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_55e75dfae343f5a1"></thinkad><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>','utf-8');
    }*/
    public function __construct(){

    }
    public function index(){
        //得到參數 signature nonce token timestamp echostr
        $nonce     = $_GET['nonce'];
        $token     = 'imooc';
        $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  show(){
        echo 'imooc';
    }

    //消息處理函數
    public function reponseMsg(){
        //1.獲取到微信推送過來post數據(xml格式)
        $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
        //2.處理消息類型,並設置回覆類型和內容
        /*<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>*/
        $postObj = simplexml_load_string( $postArr );
        //$postObj->ToUserName = '';
        //$postObj->FromUserName = '';
        //$postObj->CreateTime = '';
        //$postObj->MsgType = '';
        //$postObj->Event = '';
        // gh_e79a177814ed
        //判斷該數據包是不是訂閱的事件推送
        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;
                $template = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            </xml>";
                $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
                echo $info;
                /*<xml>
                <ToUserName><![CDATA[toUser]]></ToUserName>
                <FromUserName><![CDATA[fromUser]]></FromUserName>
                <CreateTime>12345678</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[你好]]></Content>
                </xml>*/


            }
        }
        //根據用戶輸入消息進行回覆
        else if(strtolower( $postObj->MsgType) == 'text'){
            $toUser   = $postObj->FromUserName;
            $fromUser = $postObj->ToUserName;
            $time     = time();
            $msgType  =  'text';
            //$content  = 'imooc is very good'.$postObj->FromUserName.'-'.$postObj->ToUserName;
            $template = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            </xml>";
            switch( trim($postObj->Content)){
                case 1:
                    $content = '您輸入的數字是1';
                break;
                case 2:
                    $content = '您輸入的數字是2';
                break;
                case 3:
                    $content = '<a href="http://www.baidu.com">百度</a>';
                break;
                case tuwen:
                        $arr=array(
                            array('title'=>'imooc',
                                'description'=>'imooc描述',
                                'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
                                'url'=>'http://www.baidu.com'),
                            array('title'=>'hao123',
                                'description'=>'hao123描述',
                                'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
                                'url'=>'http://www.hao123.com'),
                            array('title'=>'baidu',
                                'description'=>'baidu描述',
                                'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
                                'url'=>'http://www.baidu.com'),
                         );
                    $content = '<a href="http://www.baidu.com">百度</a>';
                    $template_tuWen = "<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <ArticleCount>".count($arr)."</ArticleCount>
                                <Articles>";
                    foreach($arr as $k=>$v){
                        $template_tuWen .= "<item>
                                <Title><![CDATA[".$v['title']."]]></Title>
                                <Description><![CDATA[".$v['description']."]]></Description>
                                <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>
                                <Url><![CDATA[".$v['url']."]]></Url>
                                </item>";
                    }

                    $template_tuWen .="</Articles>
                                </xml>";
                    $info     = sprintf($template_tuWen, $toUser,$fromUser,$time,'news');
                    echo $info;
                    break;
            }

            $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
            echo $info;
        }

}

    //$url  接口url string
    //$type 請求類型string
    //$res  返回類型string
    //$arr= 請求參數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);
            }
        }
        echo var_dump( $output );
    }

    //獲取測試號微信AccessToken
    /*function  getWxAccessToken(){

        //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_error($ch)){
            var_dump(curl_error($ch));
        }
        $arr=json_decode($res,true);
        var_dump($arr);
    }*/

    //獲取微信服務器IP地址
    function  getWxServerIp(){
        $accessToken ="Y7cYto0UvJz1U-9NpN04lhQuBkO5BO7Sim6hCZ0GkZlLLfisnvXLjg6VTX_v7veESGX24zAIlu31GD5YXjQFWd5AYXkQTv5a1iGIwk9oxL4gPeWC3fCciWTp2e5ftVZvUXFcAHAHKS";
        $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);
        //5.關閉curl
        curl_close($ch);
        if(curl_error($ch)){
            var_dump(curl_error($ch));
        }
        $arr=json_decode($res,true);
        echo "<pre>";
        var_dump($arr);
        echo "</pre>";
    }
//返回access_token *session解決辦法 存mysql memcache
    public function  getWxAccessToken(){
        if( $_SESSION['access_token'] && $_SESSION['expire_time']>time()){
          //若是access_token在session沒有過時
            echo "111";
            echo $_SESSION['access_token'];;
            return $_SESSION['access_token'];
        }
        else{
            //若是access_token比存在或者已通過期,從新取access_token
            //1 請求url地址
            $AppId='wx6636f00cafe25cc0';
            $AppSecret='4e67418c1a2f5a1780235e3115eb2b77';
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$AppId."&secret=".$AppSecret;
            $res=$this->http_curl($url,'get','json');
            echo "res";
            echo $res;
            $access_token =$res['access_token'];
            //將從新獲取到的aceess_token存到session
            $_SESSION['access_token']=$access_token;
            $_SESSION['expire_time']=time()+7000;
            echo "2222";
            echo $access_token;
            return $access_token;
        }
    }


    public function  definedItem(){
        //建立微信菜單
        //目前微信接口的調用方式都是經過 curl post/get
        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  $postJson = urldecode(json_encode($postArr));
        $res = $this->http_curl($url,'post','json',$postJson);
        var_dump($res);
    }
}
相關文章
相關標籤/搜索