中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信授權登錄并獲取用戶信息接口的示例分析

發布時間:2021-09-10 10:32:42 來源:億速云 閱讀:173 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“微信授權登錄并獲取用戶信息接口的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“微信授權登錄并獲取用戶信息接口的示例分析”這篇文章吧。

近排在做微信接口開發,所以總結一下微信授權登錄并獲取用戶信息 這個接口的開發流程。

一、首先你的微信公眾號要獲得相應的AppID和AppSecret,申請微信登錄且通過審核后,才可開始接入流程。

二、授權流程

1、流程說明

(1). 第三方發起微信授權登錄請求,微信用戶允許授權第三方應用后,微信會拉起應用或重定向到第三方網站,并且帶上授權臨時票據code參數;

(2). 通過code參數加上AppID和AppSecret等,通過API換取access_token;

(3). 通過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操作。

2、獲取access_token時序圖:

微信授權登錄并獲取用戶信息接口的示例分析

三、開發(我的用是CI框架,其實用什么框架都一樣,MVC模式就行了)

1、請求CODE

  weixin.php

<?php
    class weixinController extends CI_Controller {
        public $userInfo;
        public $wxId;


        public function __construct(){
            parent::__construct();

            //只要用戶一訪問此模塊,就登錄授權,獲取用戶信息
            $this->userInfo = $this->getWxUserInfo();
        }
    

        /**
         * 確保當前用戶是在微信中打開,并且獲取用戶信息
         *
         * @param string $url 獲取到微信授權臨時票據(code)回調頁面的URL
         */
        private function getWxUserInfo($url = '') {
            //微信標記(自己創建的)
            $wxSign = $this->input->cookie('wxSign');
            //先看看本地cookie里是否存在微信唯一標記,
            //假如存在,可以通過$wxSign到redis里取出微信個人信息(因為在第一次取到微信個人信息,我會將其保存一份到redis服務器里緩存著)
            if (!empty($wxSign)) {
                //如果存在,則從Redis里取出緩存了的數據
                $userInfo = $this->model->redisCache->getData("weixin:sign_{$wxSign}");
                if (!empty($userInfo)) {
                    //獲取用戶的openid
                    $this->wxId = $userInfo['openid'];
                    //將其存在cookie里
                    $this->input->set_cookie('wxId', $this->wxId, 60*60*24*7);
                    return $userInfo;
                }
            }

            //獲取授權臨時票據(code)
            $code = $_GET['code'];
            if (empty($code)) {
                if (empty($url)) {
                    $url = rtirm($_SERVER['QUERY_STRING'], '/');
                    //到WxModel.php里獲取到微信授權請求URL,然后redirect請求url
                    redirect($this->model->wx->getOAuthUrl(baseUrl($url)));
                }
            }


        }

    }
?>

獲取code的Controller代碼

  Wxmodel.php

<?php
    class WxModel extends ModelBase{
        public $appId;
        public $appSecret;
        public $token;

        public function __construct() {
            parent::__construct();

            //審核通過的移動應用所給的AppID和AppSecret
            $this->appId = 'wx0000000000000000';
            $this->appSecret = '00000000000000000000000000000';
            $this->token = '00000000';
        }

        /**
         * 獲取微信授權url
         * @param string 授權后跳轉的URL
         * @param bool 是否只獲取openid,true時,不會彈出授權頁面,但只能獲取用戶的openid,而false時,彈出授權頁面,可以通過openid獲取用戶信息
         *   
        */
       public function getOAuthUrl($redirectUrl, $openIdOnly, $state = '') {
        $redirectUrl = urlencode($redirectUrl);
        $scope = $openIdOnly ? 'snsapi_base' : 'snsapi_userinfo';
        $oAuthUrl = "https://open.weixin.qq.com/connect/oauth3/authorize?appid={$this->appId}&redirect_uri={$redirectUrl}&response_type=code&scope=$scope&state=$state";
        return $oAuthUrl;
       }

獲取code的Model代碼

獲取code的Model代碼

這里附上請求參數說明和返回值說明

  請求參數說明:

微信授權登錄并獲取用戶信息接口的示例分析

  響應返回值說明:

微信授權登錄并獲取用戶信息接口的示例分析

  當請求成功,會redirect到請求參數中的redirect_uri的值中去,其實又回到weixin.php的$this->userInfo = $this->getWxUserInfo();這行去,然后再一次進入到getWxUserInfo()方法,此時

            //獲取授權臨時票據(code)
            $code = $_GET['code'];

這行也已經能獲取得到code的值了。接著進行第二步。

2、通過code獲取access_token

  weixin.php

<?php
    class weixinController extends CI_Controller {
        public $userInfo;
        public $wxId;


        public function __construct(){
            parent::__construct();

            //只要用戶一訪問此模塊,就登錄授權,獲取用戶信息
            $this->userInfo = $this->getWxUserInfo();
        }
    

        /**
         * 確保當前用戶是在微信中打開,并且獲取用戶信息
         *
         * @param string $url 獲取到微信授權臨時票據(code)回調頁面的URL
         */
        private function getWxUserInfo($url = '') {
            //微信標記(自己創建的)
            $wxSign = $this->input->cookie('wxSign');
            //先看看本地cookie里是否存在微信唯一標記,
            //假如存在,可以通過$wxSign到redis里取出微信個人信息(因為在第一次取到微信個人信息,我會將其保存一份到redis服務器里緩存著)
            if (!empty($wxSign)) {
                //如果存在,則從Redis里取出緩存了的數據
                $userInfo = $this->model->redisCache->getData("weixin:sign_{$wxSign}");
                if (!empty($userInfo)) {
                    //獲取用戶的openid
                    $this->wxId = $userInfo['openid'];
                    //將其存在cookie里
                    $this->input->set_cookie('wxId', $this->wxId, 60*60*24*7);
                    return $userInfo;
                }
            }

            //獲取授權臨時票據(code)
            $code = $_GET['code'];
            if (empty($code)) {
                if (empty($url)) {
                    $url = rtirm($_SERVER['QUERY_STRING'], '/');
                    //到WxModel.php里獲取到微信授權請求URL,然后redirect請求url
                    redirect($this->model->wx->getOAuthUrl(baseUrl($url)));
                }
            }
            /***************這里開始第二步:通過code獲取access_token****************/
            $result = $this->model->wx->getOauthAccessToken($code);

            //如果發生錯誤
            if (isset($result['errcode'])) {
                return array('msg'=>'授權失敗,請聯系客服','result'=>$result);
            }

            //到這一步就說明已經取到了access_token
            $this->wxId = $result['openid'];
            $accessToken = $result['access_token'];
            $openId = $result['openid'];

            //將openid和accesstoken存入cookie中
            $this->input->set_cookie('wx_id', $this->wxId, 60*60*24*7);
            $this->input->set_cookie('access_token', $accessToken);

獲取access_token的控制器代碼

獲取access_token的控制器代碼

  WxModel.php

<?php
    class WxModel extends ModelBase{
        public $appId;
        public $appSecret;
        public $token;

        public function __construct() {
            parent::__construct();

            //審核通過的移動應用所給的AppID和AppSecret
            $this->appId = 'wx0000000000000000';
            $this->appSecret = '00000000000000000000000000000';
            $this->token = '00000000';
        }


        /**
         * 獲取微信授權url
         * @param string 授權后跳轉的URL
         * @param bool 是否只獲取openid,true時,不會彈出授權頁面,但只能獲取用戶的openid,而false時,彈出授權頁面,可以通過openid獲取用戶信息
         *   
        */
        public function getOAuthUrl($redirectUrl, $openIdOnly, $state = '') {
            $redirectUrl = urlencode($redirectUrl);
            $scope = $openIdOnly ? 'snsapi_base' : 'snsapi_userinfo';
            $oAuthUrl = "https://open.weixin.qq.com/connect/oauth3/authorize?appid={$this->appId}&redirect_uri={$redirectUrl}&response_type=code&scope=$scope&state=$state#wechat_redirect";
            return $oAuthUrl;
        }


        /**
        * 獲取access_token
        */
        public function getoAuthAccessToken($code) {
            return json_decode(file_get_contents("https://api.weixin.qq.com/sns/oauth3/access_token?appid={$this->AppId}&secret={$this->AppSecret}&code={$authCode}&grant_type=authorization_code",true);
        }

獲取access_token的Model代碼

獲取access_token的Model代碼

這里附上參數說明

  請求參數說明:

微信授權登錄并獲取用戶信息接口的示例分析

  響應返回值說明:

微信授權登錄并獲取用戶信息接口的示例分析

  當返回錯誤時是這樣子的:

微信授權登錄并獲取用戶信息接口的示例分析

3、通過access_token調用接口(獲取用戶信息)
  獲取access_token后,進行接口調用,有以下前提:

  (1)access_tokec有效且未超時;

  (2)微信用戶已授權給第三方應用賬號相應的接口作用域(scope)。

  以下是獲取用戶信息的代碼

  weixin.php

<?php
    class weixinController extends CI_Controller {
        public $userInfo;
        public $wxId;


        public function __construct(){
            parent::__construct();

            //只要用戶一訪問此模塊,就登錄授權,獲取用戶信息
            $this->userInfo = $this->getWxUserInfo();
        }
    

        /**
         * 確保當前用戶是在微信中打開,并且獲取用戶信息
         *
         * @param string $url 獲取到微信授權臨時票據(code)回調頁面的URL
         */
        private function getWxUserInfo($url = '') {
            //微信標記(自己創建的)
            $wxSign = $this->input->cookie('wxSign');
            //先看看本地cookie里是否存在微信唯一標記,
            //假如存在,可以通過$wxSign到redis里取出微信個人信息(因為在第一次取到微信個人信息,我會將其保存一份到redis服務器里緩存著)
            if (!empty($wxSign)) {
                //如果存在,則從Redis里取出緩存了的數據
                $userInfo = $this->model->redisCache->getData("weixin:sign_{$wxSign}");
                if (!empty($userInfo)) {
                    //獲取用戶的openid
                    $this->wxId = $userInfo['openid'];
                    //將其存在cookie里
                    $this->input->set_cookie('wxId', $this->wxId, 60*60*24*7);
                    return $userInfo;
                }
            }

            //獲取授權臨時票據(code)
            $code = $_GET['code'];
            if (empty($code)) {
                if (empty($url)) {
                    $url = rtirm($_SERVER['QUERY_STRING'], '/');
                    //到WxModel.php里獲取到微信授權請求URL,然后redirect請求url
                    redirect($this->model->wx->getOAuthUrl(baseUrl($url)));
                }
            }
            /***************這里開始第二步:通過code獲取access_token****************/
            $result = $this->model->wx->getOauthAccessToken($code);

            //如果發生錯誤
            if (isset($result['errcode'])) {
                return array('msg'=>'授權失敗,請聯系客服','result'=>$result);
            }

            //到這一步就說明已經取到了access_token
            $this->wxId = $result['openid'];
            $accessToken = $result['access_token'];
            $openId = $result['openid'];

            //將openid和accesstoken存入cookie中
            $this->input->set_cookie('wx_id', $this->wxId, 60*60*24*7);
            $this->input->set_cookie('access_token', $accessToken);

            /*******************這里開始第三步:通過access_token調用接口,取出用戶信息***********************/
            $this->userInfo = $this->model->wx->getUserInfo($openId, $accessToken);

            //自定義微信唯一標識符
            $wxSign =substr(md5($this->wxId.'k2a5dd'), 8, 16);
            //將其存到cookie里
            $this->input->set_cookie('wxSign', $wxSign, 60*60*24*7);
            //將個人信息緩存到redis里
            $this->library->redisCache->set("weixin:sign_{$wxSign}", $userInfo, 60*60*24*7);
            return $userInfo;
        }

    }
?>

獲取用戶信息的Controller

獲取用戶信息的Controller

  WxModel.php

<?php
    class WxModel extends ModelBase{
        public $appId;
        public $appSecret;
        public $token;

        public function __construct() {
            parent::__construct();

            //審核通過的移動應用所給的AppID和AppSecret
            $this->appId = 'wx0000000000000000';
            $this->appSecret = '00000000000000000000000000000';
            $this->token = '00000000';
        }


        /**
         * 獲取微信授權url
         * @param string 授權后跳轉的URL
         * @param bool 是否只獲取openid,true時,不會彈出授權頁面,但只能獲取用戶的openid,而false時,彈出授權頁面,可以通過openid獲取用戶信息
         *   
        */
        public function getOAuthUrl($redirectUrl, $openIdOnly, $state = '') {
            $redirectUrl = urlencode($redirectUrl);
            $scope = $openIdOnly ? 'snsapi_base' : 'snsapi_userinfo';
            $oAuthUrl = "https://open.weixin.qq.com/connect/oauth3/authorize?appid={$this->appId}&redirect_uri={$redirectUrl}&response_type=code&scope=$scope&state=$state#wechat_redirect";
            return $oAuthUrl;
        }


        /**
        * 獲取access_token
        */
        public function getoAuthAccessToken($code) {
            return json_decode(file_get_contents("https://api.weixin.qq.com/sns/oauth3/access_token?appid={$this->AppId}&secret={$this->AppSecret}&code={$authCode}&grant_type=authorization_code",true);
        }

        /**
        * 獲取用戶信息  
        */
        public function getUserInfo($openId, $accessToken) {
            $url = 'https://api.weixin.qq.com/sns/userinfo';
            //獲取用戶微信賬號信息
            $userInfo = $this->callApi("$url?access_token=$accessToken&openid=$openId&lang=zh-CN");

            if ($userInfo['errcode']) {
                return array('msg'=>'獲取用戶信息失敗,請聯系客服', $userInfo);
            }

            $userInfo['wx_id'] = $openId;

            return $userInfo;
        }

        /**
         * 發起Api請求,并獲取返回結果
         * @param string 請求URL
         * @param mixed 請求參數 (array|string)
         * @param string 請求類型 (GET|POST)
         * @return array        
         */
        public function callApi($apiUrl, $param = array(), $method = 'GET') {
            $result = curl_request_json($error, $apiUrl, $params, $method);
            //假如返回的數組有錯誤碼,或者變量$error也有值
            if (!empty($result['errcode'])) {
                $errorCode = $result['errcode'];
                $errorMsg = $result['errmsg'];
            } else if ($error != false) {
                $errorCode = $error['errorCode'];
                $errorMsg = $error['errorMessage'];
            }

            if (isset($errorCode)) {
                //將其插入日志文件
                file_put_contents("/data/error.log", "callApi:url=$apiUrl,error=[$errorCode]$errorMsg");

                if ($errorCode === 40001) {
                    //嘗試更正access_token后重試
                    try {
                        $pos = strpos(strtolower($url), 'access_token=');
                        if ($pos !==false ) {
                            $pos += strlen('access_token=');
                            $pos2 = strpos($apiUrl, '&' ,$pos);
                            $accessTokened = substr($apiUrl, $pos, $pos2 === false ? null : ($pos2 - $pos));
                            return $this->callApi(str_replace($accessTokened, $this->_getApiToken(true), $apiUrl), $param, $method);
                        }
                    }catch (WeixinException $e) { 

                    }
                }
                //這里拋出異常,具有的就不詳說了
                throw new WeixinException($errorMessage, $errorCode);
            }
            return $result;
        }

        /**
        * 獲取微信 api 的 access_token 。 不同于 OAuth 中的 access_token ,參見  http://mp.weixin.qq.com/wiki/index.php?title=%E8%8E%B7%E5%8F%96access_token
        *
        * @param bool 是否強制刷新 accessToken
        */
        private function _getApiToken($forceRefresh = false) {
            //先查看一下redis里是否已經緩存過access_token
            $accessToken = $this->library->redisCache->get('Weixin:AccessToken');
            if($forceRefresh || empty($accessToken)) {
                $result = $this->callApi("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}");
                $accessToken = $result['access_token'];
                $expire = max(1, intval($result['expires_in']) - 60);
                //將access_token緩存到redis里去
                $this->library->redisCache->set('Weixin:AccessToken', $accessToken, $expire);
            }
            return $accessToken;
        }

?>

獲取用戶信息的Model

  Common.php

<?php
    /**
     *   發起一個HTTP(S)請求,并返回json格式的響應數據
     *   @param array 錯誤信息  array($errorCode, $errorMessage)
     *   @param string 請求Url
     *   @param array 請求參數
     *   @param string 請求類型(GET|POST)
     *   @param int 超時時間
     *   @param array 額外配置
     *   
     *   @return array
     */ 
    public function curl_request_json(&$error, $url, $param = array(), $method = 'GET', $timeout = 10, $exOptions = null) {
        $error = false;
        $responseText = curl_request_text($error, $url, $param, $method, $timeout, $exOptions);
        $response = null;
        if ($error == false && $responseText > 0) {
            $response = json_decode($responseText, true);

            if ($response == null) {
                $error = array('errorCode'=>-1, 'errorMessage'=>'json decode fail', 'responseText'=>$responseText);
                //將錯誤信息記錄日志文件里
                $logText = "json decode fail : $url";
                if (!empty($param)) {
                    $logText .= ", param=".json_encode($param);
                }
                $logText .= ", responseText=$responseText";
                file_put_contents("/data/error.log", $logText);
            }
        }
        return $response;
    }

    /**
    *  發起一個HTTP(S)請求,并返回響應文本
    *   @param array 錯誤信息  array($errorCode, $errorMessage)
    *   @param string 請求Url
    *   @param array 請求參數
    *   @param string 請求類型(GET|POST)
    *   @param int 超時時間
    *   @param array 額外配置
    *   
    *   @return string
    */
    public function curl_request_text(&$error, $url, $param = array(), $method = 'GET', $timeout = 15, $exOptions = NULL) {
        //判斷是否開啟了curl擴展
        if (!function_exists('curl_init')) exit('please open this curl extension');

        //將請求方法變大寫
        $method = strtoupper($method);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        if (isset($_SERVER['HTTP_USER_AGENT'])) curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        if (isset($_SERVER['HTTP_REFERER'])) curl_setopt($ch, CURLOPT_REFERER, $_SERVER['HTTP_REFERER']);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        switch ($method) {
            case 'POST':
                curl_setopt($ch, CURLOPT_POST, true);
                if (!empty($param)) {
                    curl_setopt($ch, CURLOPT_POSTFIELDS, (is_array($param)) ? http_build_query($param) : $param);
                }
                break;
            
            case 'GET':
            case 'DELETE':
                if ($method == 'DELETE') {
                    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
                }
                if (!empty($param)) {
                    $url = $url.(strpos($url, '?') ? '&' : '?').(is_array($param) ? http_build_query($param) : $param);
                }
                break;
        }
        curl_setopt($ch, CURLINFO_HEADER_OUT, true);
        curl_setopt($ch, CURLOPT_URL, $url);
        //設置額外配置
        if (!empty($exOptions)) {
            foreach ($exOptions as $k => $v) {
                curl_setopt($ch, $k, $v);
            }
        }
        $response = curl_exec($ch);

        $error = false;
        //看是否有報錯
        $errorCode = curl_errno($ch);
        if ($errorCode) {
            $errorMessage = curl_error($ch);
            $error = array('errorCode'=>$errorCode, 'errorMessage'=>$errorMessage);
            //將報錯寫入日志文件里
            $logText = "$method $url: [$errorCode]$errorMessage";
            if (!empty($param)) $logText .= ",$param".json_encode($param);
            file_put_contents('/data/error.log', $logText);
        }

        curl_close($ch);

        return $response;



    }


?>

獲取用戶信息的自定義函數

通過以上三步調用接口,就可以獲取到用戶的微信賬號信息了。

以上是“微信授權登錄并獲取用戶信息接口的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳西县| 绥化市| 八宿县| 手机| 昆明市| 九龙县| 宜兴市| 页游| 丽水市| 西吉县| 胶南市| 旬邑县| 密云县| 江门市| 中宁县| 永善县| 长葛市| 睢宁县| 沁源县| 百色市| 洪雅县| 凤台县| 贺州市| 建宁县| 望奎县| 淳安县| 扬州市| 买车| 佛坪县| 黄梅县| 宁化县| 新闻| 桐柏县| 濉溪县| 丘北县| 讷河市| 若羌县| 东乌珠穆沁旗| 社会| 永新县| 博白县|