zoukankan      html  css  js  c++  java
  • 微信 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

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

  • 相关阅读:
    DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
    UVA10071 Back to High School Physics
    UVA10071 Back to High School Physics
    UVA10055 Hashmat the Brave Warrior
    UVA10055 Hashmat the Brave Warrior
    UVA458 The Decoder
    UVA458 The Decoder
    HDU2054 A == B ?
    HDU2054 A == B ?
    POJ3414 Pots
  • 原文地址:https://www.cnblogs.com/dk1988/p/4604113.html
Copyright © 2011-2022 走看看