微信網頁第三方登錄 獲取用戶信息 代碼

1.登錄的html頁面代碼php

<a href="weixin.redirect_uri">微信登錄</a>

2.跳轉到的控制器方法代碼html

CJUL是常量,就是你在開放平臺上註冊的重定向網址sql

跳換到後重定向到的地址是微信的一個重定向地址數據庫

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirectjson

帶了你在開放平臺上註冊的網址redirect_uri和appid 而且scope爲snsapi_loginapi

參數 是否必須 說明
appid 應用惟一標識
redirect_uri 重定向地址,須要進行UrlEncode
response_type 填code
scope 應用受權做用域,擁有多個做用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login便可
state 用於保持請求和回調的狀態,受權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求僞造攻擊),建議第三方帶上該參數,可設置爲簡單的隨機數加session進行校驗
class  PhoneController extends CommonController{    

        //加載首頁
        public function Index(){

            //經過受權跳轉網頁進入
            if(isset($_GET['code'])){

                $code = $_GET['code'];

                //經過code換取網頁受權access_token
                $access_token = $this->get_code_access_token($code);

                //檢驗受權憑證(access_token)是否有效
                $data = $this->checkAvail($access_token['access_token'],$access_token['openid']);

                if($data['errcode'] != '0' || $data['error_msg'] != 'ok'){
                    
                    //刷新access_token
                    $access_token = $this->refresh_access_token($access_token['refresh_token']);
                
                }

                //獲得拉取用戶信息(需scope爲 snsapi_userinfo)
                $userinfo = $this->get_user_info($access_token['access_token'],$access_token['openid']);

                require 'view/index.html';

            }elseif(isset($_GET['page'])){

                //網頁端入口
                require 'view/index.html';
                

            }else{

                echo "NO CODE";
            }



        }

               //跳轉到微信的認證頁
        public function redirect_uri(){
            $url =  $this->get_authorize_url(CJURL,'1');
             
            header('location:'.$url);
        }
}

3.調用的底層代碼數組

<?php 
    
    class CommonController{

        //http get
        public function httpRequest($url){

            $ch = curl_init();

            curl_setopt($ch, CURLOPT_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);

            if($output == false){
                return 'curl error:'.curl_error($ch);
            }

            curl_close($ch);

            return $output;
        }


        //curl獲取參數
        //https 中的 get  和  post
        public function https_request($url,$data=null){
            
            $curl = curl_init();
        
            curl_setopt($curl,CURLOPT_URL,$url);

            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);

            //不爲空,使用post傳參數,不然使用get
            if($data){

                curl_setopt($curl,CURLOPT_POST,1);
                curl_setopt($curl,CURLOPT_POSTFIELDS,$data);

            }

            curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
            
            $output = curl_exec($curl);
            curl_close($curl);

            return $output;
        }

        //獲取接口票據access_token
        public function get_token(){

            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;

            $json = $this->https_request($url);

            $arr = json_decode($json,true);
            
            return $arr['access_token'];
        }



        /*獲取受權後重定向的回調連接地址,請使用urlencode對連接進行處理
         * @param string $redirect_uri
         * @param string $state
         **/
        public function get_authorize_url($redirect_uri = '', $state = ''){

            $redirect_uri = urlencode($redirect_uri);
            return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".APPID."&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_base&state={$state}#wechat_redirect";
        }


        /**
         *加載網頁受權經過code獲取access_token
         *
         * @param string $code
         **/
        public function get_code_access_token($code){

            //第一步:用戶贊成受權,獲取code
            // 第二步:經過code換取網頁受權access_token,與接口票據不同
            $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".APPID."&secret=".APPSECRET."&code={$code}&grant_type=authorization_code";

            $access_token = $this->https_request($access_token_url);

            $arr = json_decode($access_token,true);

            return $arr;
        }


        /**
         * 刷新access_token(若是須要)
         *
         **/
        public function refresh_access_token($refresh_token){

            //三步:刷新access_token(若是須要)
            $refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=".APPID."&grant_type=refresh_token&refresh_token={$refresh_token}";

            $access_token = $this->https_request($refresh_url);

            return json_decode($access_token,true);

        }


       /**
        * 獲取受權後的微信用戶信息
        *
        * @param string $access_token
        * @param string $open_id
           **/
           public function get_user_info($access_token = '', $open_id = ''){

               // 第四步:拉取用戶信息(需scope爲 snsapi_userinfo)

            if($access_token && $open_id){

                $info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
                
                $info_data = $this->https_request($info_url);

                return json_decode($info_data, TRUE);

            }
            
            return FALSE;
        }

        /**
         *檢驗受權憑證(access_token)是否有效
         * @param string $access_token
         * @param string $open_id
         **/
        public function checkAvail($access_token='',$openid=''){

             if($access_token && $open_id){

                 $avail_url = "https://api.weixin.qq.com/sns/auth?access_token={$access_token}&openid={$openid}";

                 $avail_data = $this->https_request($avail_url);

                return json_decode($avail_data, TRUE);
             }

              return FALSE;
        }



        //獲取自定義菜單建立接口
        public function setcustomMenu(){

            $access_token = $this->get_token();

            $menuurl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";

            $jsonmenu = '{
                 "button":[
                 {    
                      "type":"view",
                      "name":"抽獎",
                      "url":"http://akira.weixin-sandbox.ciicgat.com/index.php?c=Phone&a=Index&page=Page"
                  },
                  {
                         "type":"click",
                       "name":"贊一下",
                       "key":"點贊"
                  },
                  {
                       "name":"上網",
                       "sub_button":[
                       {    
                           "type":"view",
                           "name":"搜搜",
                           "url":"http://www.soso.com/"
                        },
                        {
                           "type":"view",
                           "name":"騰訊",
                           "url":"http://v.qq.com/"
                        },
                        {
                           "type":"view",
                           "name":"百度",
                           "url":"http://www.baidu.com/"
                        }]
                   }]
             }';

            //在直接訪問接口的時候已經改變了微站上面的信息
            $result = $this->https_request($menuurl,$jsonmenu);

            var_dump($result);
        }


        /**
         *openid
         *用戶說的內容
         *獲取和你聊天的用戶的基本信息造成列表
         **/
        public  function  getUserInfo($openid,$text){

            $access_token = $this->get_token();
            //http請求方式:GET
            $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$openid}&lang=zh_CN";
            //請求獲取用戶信息的接口,返回這個openid對應的用戶信息,json格式
            $jsoninfo = $this->httpRequest($url);
            //將json轉爲php數組
            $user = json_decode($jsoninfo,true);

            $this->insertuser($user);

            $this->insertmessage($openid,$text,0,'text');
        }

        /*
         *將用戶的數據寫入數據庫
         */
        public function insertuser($arr){

            $user = new Model('user');

            $user->ctime = $arr['subscribe_time'];

            $user->add($arr);
        }

        /**
         *第一個參數: $openid 用戶的編號
         *第二個參數: $text 用戶消息和公衆號數據標記  1 表示公衆號 0 表示用戶消息
         **/
        public function insertmessage($openid,$text,$who,$mtype="text"){

            $message = new Model('message');

            $message->openid = $openid;
            $message->mess = $text;
            $message->who = $who;
            $message->utime = time();
            $message->mtype = $mtype;

            $message->add();

            $sql = "upadte user set utime=".time()." where openid = '{$openid}'";

            $user = new Model('user');
            $user->query($sql);
        }


        //獲取帶參數的二維碼的過程包括兩步,首先建立二維碼ticket,而後憑藉ticket到指定URL換取二維碼
        
         /**
          *微信獲取二維碼ticket
          *@param string $type
          *@param string $time
          **/
        public function getTicket($type="temporary",$time="604800"){

            /*
            http請求方式: POST
            URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
            POST數據格式:json

            臨時二維碼請求說明
            POST數據例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
        
            永久二維碼請求說明
            POST數據例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
            或者也可使用如下POST數據建立字符串形式的二維碼參數:
            {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "123"}}}
            */

            if((int)($time) > 604800){
                $time = 604800;
            }

            //獲取token
            $token = $this->get_token();

            //臨時
            $temporary_qrcode = '{"expire_seconds": '.$time.', "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}';

            //永久
            $permanent_qrcode = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}';

            //永久字符串
            $permanent_str_qrcode = '{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": 123}}}';

            //獲取類型斷定
            $code = $type.'_qrcode';
            $qrcode = $$code;

            //請求ticket
            $ticket_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$token}";

            $ticket = $this->https_request($ticket_url,$qrcode);

            return $ticket;
        }

        /**
         *憑藉ticket到指定URL換取二維碼  
         **/
        public function getQrcode(){
        
            //本接口無須登陸態便可調用    TICKET進行UrlEncode
            // HTTP GET請求(請使用https協議)
            // https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
            $ticket = json_decode($this->getTicket(),true);

            $qrcode_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket['ticket']);

            echo  $qrcode_url;

            $qrcode = $this->https_request($qrcode_url);

            // header("");
        }


        /*
         * 微信不接收\u***格式的json內容須要對json字符串處理
         * 僅支持發送text消息,其餘類型消息本身添加代碼
         * @param string msgtype
         * @param array
         * @return string
         */
        function my_json_encode($type, $p){

            if (PHP_VERSION >= '5.4'){

                $str = json_encode($p, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
            }
            else{

                switch ($type){

                    case 'text':
                        isset($p['text']['content']) && ($p['text']['content'] = urlencode($p['text']['content']));
                        break;
                }
                $str = urldecode(json_encode($p));
            }
            return $str;
        }

        
        //中文分詞函數,只要傳一句話,就能夠分詞出來
        public function fci($text){
            $text = iconv('UTF-8','GBK//IGNORE',$text);
            $text = urlencode($text);
            $result = file_get_contents("http://akira.weixin-sandbox.ciicgat.com/index.php?w=".$text);
            $result = iconv("GBK","UTF-8//IGNORE",$result);
            return explode(" ",$result);
        }

    }

 ?>
相關文章
相關標籤/搜索