• 微信登录oauth2.0


    微信oauth2.0登陆流程:

    1. 客户端(User)访问站点
    2. Web站点跳转至授权服务器,并带上appidredirect_uri、response_typescopestate等参数
    3. 授权服务器请求用户输入账号和密码;
    4. 用户输入账号和密码,并授权;
    5. 授权服务器返回codeWeb站点
    6. Web站点带上appidappsecretcodegrant_type参数返回给授权服务器,请求获取access_tokenopenid  ;
    7. 授权服务器返回access_tokenopenidrefresh_token等参数;
    8. Web站点带上access_tokenopenidlang参数给授权服务器获取用户信息;
    9. 授权服务器返回用户信息给Web站点;
    10. Web站点将用户信息返回给客户端(User.

    流程图:

     

    PHP源码(APPID 和 APPSECRET 换成自己申请的):

    <?php

    /*
     * 绑定微信 bobwen add
     */
    define("APPID", "wwacs354wertf89iykgk");
    define("APPSECRET", "9125435wertsfgsdg7f08edsgas0ae8");
    class weixin{
        var $appid = APPID;
        var $appsecret = APPSECRET;
        var $access_token = '';
        /**
         * 获取openid
         */
        function get_openid() {
            if (!empty($appid))
            {

                $openid=@$_COOKIE['sopenid'];
                if(array_key_exists('HTTP_USER_AGENT', $_SERVER)){
                    if(!$openid && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false){         
                        //使用jsapi接口
                        //$jsApi = new JsApi_pub();
                        if (!isset($_GET['code']))
                        {
                            //=========步骤1:网页授权获取用户openid============
                            //通过code获得openid

                            //触发微信返回code码
                            $backurl = $this->get_url();
                            $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=".urlencode($backurl)."&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
                            //echo $url;
                            Header("Location: $url");
                        }else
                        {
                            //获取code码,以获取openid
                            $code = $_GET['code'];

                            $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=".$code."&grant_type=authorization_code";
                            $re = $this->http_request_json($url);
                            $rearr = json_decode($re,true);//获取返回的appid和access_token
                            if(isset($rearr['openid']))
                            {
                                $openid = $rearr['openid'];

                                setcookie("sopenid",$openid,time()+864000,'/');
                            }
                        }
                    }
                }
            }
            return $rearr;
        }

        /**
         * 获取用戶信息
         */
        function get_user_info($res) {
            $url="https://api.weixin.qq.com/cgi-bin/user/info?access_token=$res['access_token']&openid=$res['sopenid']";
            $re = $this->http_request_json($url);
            $rearr = json_decode($re,true);
            return $rearr;
        }

        /**
         * 获取当前页面完整URL地址
         */
        function get_url() {
            $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
            $php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
            $path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
            $relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
            return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
        }
        function http_request_json($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);  
           $result = curl_exec($ch);  
           curl_close($ch);  
           return $result;    
        }    
    }
    $weixin = new weixin();
    $res=$weixin->get_openid();
    $usrinfo=$weixin->get_user_info($res);
    return $userinfo;
    ?>

  • 相关阅读:
    瀑布流事件
    js 面向对象 模拟日历
    leetcode 戳气球
    leetcode 地下城游戏
    laravel服务容器
    lru缓存策略
    php实现7种常见排序
    curl请求中http头的几种格式
    wireshark过滤规则(两年前记录在qq空间的日志)
    screen和nohub及&用法
  • 原文地址:https://www.cnblogs.com/dengcw/p/5582806.html
Copyright © 2020-2023  润新知