• 微信 oauth授权 获取用户的信息


    应用场景

    (1)点击菜单直接链接跳转,这样直接跳是获取不到用户的openid的,需要用到这个

    (2)获取用户的一些基本信息,头像,呢称,需要用到这个

    准备

    需要在公众号里面配置一个应用域名,不配置这个的话,跳转后就是空白页面

    步骤

    (一)

    //$callback="一个回调的网址比如http://www.baidu.com/auth.php";
            $param ['redirect_uri'] = $callback . '&getOpenId=1';
    //&getOpenId=1 这个参数是自己加着用的,跟微信无关
    $param ['response_type'] = 'code'; $param ['scope'] = 'snsapi_userinfo'; $param ['state'] = 123; $param ['appid'] = $info ['appid']; //拼凑出一个url 请求此url $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query ( $param ) . '#wechat_redirect'; /*url大致的样子如下 https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxxxxxxx8xx9b9&redirect_uri=http%3A%2F%2Fxxxn.xingames.com%2Fweiphp%2Fixxxex.php%3Fs%3D%2Faddon%2FMxxber%2FMexxxber%2Findex%26getOpenId%3D1&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect */ redirect ( $url );

    ***$param ['scope'] = 'snsapi_userinfo'诸如这样的参数什么意思,可以查询微信的手册

    地址:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

    (二) 跳转到上面的url后,微信会返回给你这个url 大致如下

    http://weixin.xxxxs.com/weiphp/index.php?s=/addon/Memxxx/Mxxxber/ixxdex&getOpenId=1&code=021f5ed2e0e52421c27450565a5176aS&state=123

    因为 这里可以通过 $_GET 获取一个叫code的东西 $code=$_GET['code'];

    (三)根据这个code 获取openid

    $param ['secret'] = $info ['secret'];
    $param ['code'] = I ( 'code' );
    $param ['grant_type'] = 'authorization_code';
            
            $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . http_build_query ( $param );
            $content = file_get_contents ( $url );
            $content = json_decode ( $content, true );

    /***这个$content 大概内容下
    {
        "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
        "expires_in": 7200,
        "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
        "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
        "scope": "snsapi_userinfo,"
    }
    **********/
    redirect (
    $callback . '&openid=' . $content ['openid'] );
    /**
    最后跳转的url大概如下
    http://weixin.xixxxxxxs.com/weiphp/index.php?s=/addon/Mexx/Mexxr/indxex&getOpenId=1&code=021f5edxxxxxxx0565a5176aS&state=123 &openid=oV6rHt3zxxxxhIi24  
    这样openid就能获取到了
    还有个access_token 是获取用户信息要用到的, 
    */

    (四)能得到openid,基本就能标示用户的身份了,这样很多功能就ok了

    这里就获取到openid了,

    然后这里有个access_token称呼为授权token

    还有一个access_token称呼为全局token =》是使用AppID和AppSecret获取

    这俩都能获取到一些用户信息

    区别就是授权的那个,如果是认证服务号使用的话,就不需要弹出微信的授权登陆确认,给用户的体验更好一些

    =====》

    先看授权token,这个能接上面第三步

    第三步获取到授权的access_token和openid后

    继续请求这个地址

        $param2 ['access_token'] = $access_token;
        $param2 ['openid'] = $openid;
        $param2 ['lang'] = 'zh_CN';
        
        $url = 'https://api.weixin.qq.com/sns/userinfo?' . http_build_query ( $param2 );
    
    /**url大体这个样子
    https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc
    
    */
        $content = file_get_contents ( $url );
        $content = json_decode ( $content, true );
    
    /**
    content大体这个样子
    {
        "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
        "nickname": "sb",
        "sex": 1,
        "language": "zh_CN",
        "city": "深圳",
        "province": "广东",
        "country": "中国",
        "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
        "privilege": []
    }
    
    */
        return $content;

    这样就获取到了

    这里基本就完了

    =====》使用全局access_token获取用户信息

    (一)获取access_token

    直接上一个函数 weiphp的函数

    // 获取access_token,自动带缓存功能
    function get_access_token($token = '') {
        empty ( $token ) && $token = get_token ();
        $key = 'access_token_' . $token;
        $res = S ( $key );
        if ($res !== false)
            return $res;
        
        $info = get_token_appinfo ( $token );
        if (empty ( $info ['appid'] ) || empty ( $info ['secret'] )) {
            S ( $key, 0, 7200 );
            return 0;
        }
        
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $info ['appid'] . '&secret=' . $info ['secret'];
        $tempArr = json_decode ( file_get_contents ( $url ), true );
        if (@array_key_exists ( 'access_token', $tempArr )) {
            S ( $key, $tempArr ['access_token'], 7200 );
    //S是thinkphp的缓存函数,这个要缓存,有请求次数限制
            return $tempArr ['access_token'];
        } else {
            return 0;
        }
    }
    简单来说 就是使用appid和appsecret请求下面这个地址
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    (二)结合access_token和openid来获取用户信息

    这里比较郁闷的就是需要openid,如果是推送消息方式,比如用户发送抽奖,微信推送一个抽奖页面过去的方式,这种在用户发送消息的xml内容中就包含openid了,好说

    如果是直接点击链接菜单跳转,那么还是需要先走最上面的方法,来获取openid

    $param ['scope'] = 'snsapi_userinfo'这个改为snsapi_base 就能获取openid,是未认证的公众号也能使用的
    有了openid之后

    再来一个函数

    function getWeixinUserInfo($openid, $token) {
        $access_token = get_access_token ( $token );
        if (empty ( $access_token )) {
            return false;
        }
        
        $param2 ['access_token'] = $access_token;
        $param2 ['openid'] = $openid;
        $param2 ['lang'] = 'zh_CN';
        
        $url = 'https://api.weixin.qq.com/cgi-bin/user/info?' . http_build_query ( $param2 );
        $content = file_get_contents ( $url );
        $content = json_decode ( $content, true );
        return $content;
    }

    也就是用access_token和openid来请求

    https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID

    最后也能获取到用户的信息

  • 相关阅读:
    Codechef之2014FebChallenge
    Codechef之CodeCraft: IIIT Hyderabad
    原创水题
    用图论模型解决dp问题
    [某模拟赛]一道好题
    萌新java入门笔记
    CodeForces 761C 【DP】
    POJ3268【最短路】
    POJ3191【(-2)进制本质】
    POJ3264 【RMQ基础题—ST-线段树】
  • 原文地址:https://www.cnblogs.com/dk1988/p/4604113.html
Copyright © 2020-2023  润新知