千家信息网

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

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

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

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

一、首先你的微信公众号要获得相应的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安全错误 数据库的锁怎样保障安全 石家庄龙腾软件开发公司 数据库管理信息系统考题 web软件开发与应用开 深圳办公系统软件开发公司 软件开发必须报培训机构吗 温州市东信网络技术 香港云服务器租赁哪个好 生活中影响数据库安全的案例 坪山区光纤网络技术开发展示 数据库没有锁定数据库文件 昌平网络安全等级保护认证 互联网科技最新排行榜 网络安全大学生创新创业大赛 新加坡网络技术交流会 海南畅音网络技术有限 服务器运行时间长内存上升 网络安全与防护考试题 密云区智能化网络技术推广系统 网络安全高端人才 为什么网络安全要学HTML 多线程同时操作数据库表 论网络安全议论文60字 会议室效果图软件开发 网络安全检测的设备 昌平网络安全等级保护认证 数据库 amp 字符转换 怎样使用数据库查询网站 服务器与api接口安全吗 如何查看服务器阵营人数 计算机网络安全问题及其对策
0