千家信息网

微信授权登录并获取用户信息接口的示例分析

发表于:2025-01-29 作者:千家信息网编辑
千家信息网最后更新 2025年01月29日,这篇文章主要为大家展示了"微信授权登录并获取用户信息接口的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"微信授权登录并获取用户信息接口的示例分析"
千家信息网最后更新 2025年01月29日微信授权登录并获取用户信息接口的示例分析

这篇文章主要为大家展示了"微信授权登录并获取用户信息接口的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"微信授权登录并获取用户信息接口的示例分析"这篇文章吧。

近排在做微信接口开发,所以总结一下微信授权登录并获取用户信息 这个接口的开发流程。

一、首先你的微信公众号要获得相应的AppID和AppSecret,申请微信登录且通过审核后,才可开始接入流程。

二、授权流程

1、流程说明

(1). 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

(2). 通过code参数加上AppID和AppSecret等,通过API换取access_token;

(3). 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

2、获取access_token时序图:

三、开发(我的用是CI框架,其实用什么框架都一样,MVC模式就行了)

1、请求CODE

  weixin.php

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

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

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

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

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

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

 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;    }?>

获取用户信息的自定义函数

通过以上三步调用接口,就可以获取到用户的微信账号信息了。

以上是"微信授权登录并获取用户信息接口的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

用户 信息 接口 参数 缓存 页面 代码 票据 个人 登录 可以通过 错误 数据 流程 第三方 示例 分析 内容 文件 日志 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全测评项目 你怎样看待网络安全法 网络安全人才培训班心得 中化集团软件开发 软件开发用服务器cpu 软件开发案例详细设计说明书 sql数据库安全措施 房地产企业历史成本数据库 两会临近 网络安全 如何检查服务器的网络是否正常 如何用数据库生成花名册 镇江市网络安全与信息化领导小组 财务管理软件开发合同 网络安全管理本科高校 关于软件开发的搞笑段子 科技微讯-互联网的一些事一些情 《数据库技术与运用》 高斯数据库的前身 猫王北京互联网科技有限公司 db2数据库切换库名 xbox2k21无法连接服务器 铁路网络安全防护宣传 上海有哪几家互联网科技公司 国内网络安全试验场 如何用数据库生成花名册 计算机网络技术出来干什么的 简易 视频会议服务器 森林公安网络安全周 电脑老是弹出检测服务器信息 使用tsql语句修改数据库
0