zoukankan      html  css  js  c++  java
  • 微信公众号开发之网页授权(获取用户信息)

    这次暑假留在学校参与工作室的项目,对微信公众号比较感兴趣,所以参与这方面的学习研究。

    昨天完成了关于网页授权,获取用户信息方面的功能,所以乘热打铁,写上一篇。实现本篇涉及的

    功能,还需要完成一些基础。在写完这篇博客后,我会尽快补上。

    -------------------------废话不多说直入正题

    需要的工具:

    微信公众号(可以申请,但做开发的,可以申请测试号,申请详细不多说了)

    服务器(可以自行购买,我使用的是新浪的sae。)

    编辑器(随意,不做推荐)

    微信公众号开发文档(地址

    -------------------------官方文档解读(只说我读到的信息)

    !!!!!完成基本配置后才能进行一下工作,配置信息在这。(稍后补上)

    你要完成网页授权,并获取用户信息要完成一下3步骤。

    -1-用户授权并获取code

    -2-使用code换取access_token

    -3-使用access_token获取用户信息

    --------------------用户授权并获取code

    参数说明
    appid=APPID(公众号唯一标识)
    redirect_uri=REDIRECT_URI(授权后重定向的回调链接地址)
    response_type=code(返回类型,无需更改)
    scope=SCOPE(snsapi_base ,不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo 弹出授权页面,可通过openid拿到昵称、性别、所在地。)
    state=STATE(重定向后会带上state参数,开发者可以填写任意参数值)
    #wechat_redirect(无需更改)

    地址实例(虽是测试号,但我还是隐藏部分信息)红色字体需要根据实际更改。
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe5809c42e6c00d22&redirect_uri=http://dingcanphp.applinzi.com/getUserInfo.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

    返回结果(code的值,不一定是显示在浏览器界面上的,具体看你的redirect_uri中的文件)
    061h4k8Z1G7AhY0025bZ1nbh8Z1h4k8Q

    -----------------使用code换取access_token

    参数说明
    appid=APPID(公众号唯一标识)
    secret=SECRET(公众号的appsecret)
    code=CODE(第一步获取的code参数)
    grant_type=authorization_code(无需更改)


    地址实例(虽是测试号,但我还是隐藏部分信息)红色字体需要根据实际更改。
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxe5809c42e6c00d22&secret=5444ba1b31666f6052e9c703f906368b&code=061h4k8Z1G7AhY0025bZ1nbh8Z1h4k8Q&grant_type=authorization_code

    返回结果(json格式数据)
    {
    "access_token": "e1nYJFpZuehfQH1buzHFZLb7onqs_wT1cudSdy9HRlnaMXFtFpRMNFOA0euK6UxPcItrSNbAQVcXDdthbLJYX0MdH1p7-tkZSKuGqBCxVc0",
    "expires_in": 7200,
    "refresh_token": "0iVsXn4O1rBCASbO7hx8VNVUVFM1RP2Q4xS0giegd4jlIsJYOjTJNZ0b4Dsh_xcoB02ZZ3bt0WH0a47LvjIEPjWUnESJCZyl6EtY_xYZdVs",
    "openid": "o47Fa0mp9SRTf3eiKmqWm69BjG_8",
    "scope": "snsapi_userinfo"
    }

    结果解释
    access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
    scope 用户授权的作用域,使用逗号(,)分隔

    -----------------使用access_token获取用户信息

    参数说明
    access_token=ACCESS_TOKEN(第2步获取的access_token参数,此access_token与基础支持的access_token不同)
    openid=OPENID(第2步获取的openid参数)
    langlang=zh_CN 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

    地址实例(虽是测试号,但我还是隐藏部分信息)红色字体需要根据实际更改。
    https://api.weixin.qq.com/sns/userinfo?access_token=e1nYJFpZuehfQH1buzHFZLb7onqs_wT1cudSdy9HRlnaMXFtFpRMNFOA0euK6UxPcItrSNbAQVcXDdthbLJYX0MdH1p7-tkZSKuGqBCxVc0&openid=o47Fa0mp9SRTf3eiKmqWm69BjG_8&lang=zh_CN

    返回结果(json格式数据)
    {
    "openid": "o47Fa0mp9SRTf3eiKmqWm69BjG_8",
    "nickname": "齐齐",
    "sex": 0,
    "language": "zh_CN",
    "city": "Shaoxing",
    "province": "Zhejiang",
    "country": "CN",
    "headimgurl": "http://wx.qlogo.cn/mmhead/Q3auHgzwzM6kqfcibzzVc8MDGBch53mIgJjWrbKSwkBnzcsWBOMOGlg/0",
    "privilege": []
    }

    结果解释
    openid 用户的唯一标识
    nickname 用户昵称
    sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    province 用户个人资料填写的省份
    city 普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
    privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

    ---------------------------------代码实现

    解读完文档,理解实现的步骤、过程,那就开始具体的代码实现。

    接触过php,但是没系统性的学习一下,所以代码实现的时候有些困难,如果不懂phpd的可以看这

    直接上代码,在需要的地方我以注释的形式说明。

    命名为login.php放在服务器根目录。

    复制代码
    <?php
        $appid='wxe5809c42e6c00d2d';
        $redirect_uri = urlencode ( 'http://dingcanphp.applinzi.com/getUserInfo.php' );//将字符串以 URL 编码。
        $url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
        header("Location:".$url);//header() 函数向客户端发送原始的 HTTP 报头。
    ?>
    复制代码

    命名为getUserInfo.php放在服务器根目录。

    复制代码
    <?php
        header("content-type:text/html;charset=utf-8");
        $code = $_GET["code"];//预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
        if (isset($_GET['code'])){//判断code是否存在
            $userinfo = getUserInfo($code);
            $xinxi = $userinfo['nickname'];//获取nickname对应的值,即用户名
            print '<h2 style="text-align:center">用户名:'.$xinxi.'</h2>';//打印输出
        }else{
            echo "NO CODE";
        }
        
        function getUserInfo($code)
        {
            $appid = "wxe5809c42e6c00d2d";
            $appsecret = "506eba1b31666f6052e9c703f906368b";
    
            //Get access_token
            $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code";
            $access_token_json = https_request($access_token_url);//自定义函数
            $access_token_array = json_decode($access_token_json,true);//对 JSON 格式的字符串进行解码,转换为 PHP 变量,自带函数
            //获取access_token
            $access_token = $access_token_array['access_token'];//获取access_token对应的值
            //获取openid
            $openid = $access_token_array['openid'];//获取openid对应的值
    
            //Get user info
            $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid";
            $userinfo_json = https_request($userinfo_url);
            $userinfo_array = json_decode($userinfo_json,ture);
            return $userinfo_array;
        }
    
        function https_request($url)//自定义函数,访问url返回结果
        {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl,  CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $data = curl_exec($curl);
            if (curl_errno($curl)){
                return 'ERROR'.curl_error($curl);
            }
            curl_close($curl);
            return $data;
        }
    ?>
    复制代码

    自定义函数中的curl

    --------------------------网页授权,用户信息的获取体验

    两种体验方式。需要完成配置后实现。

    微信公众号自动回复中:

    复制代码
    //自动回复模式
            if (strstr($keyword, "文本")){
                $content = "这是个文本";
            }else if (strstr($keyword, "登录")){
                $content = "OAuth2.0网页授权演示
    ";
                $content .= '<a href="http://dingcanphp.applinzi.com/login.php">点击这里体验</a>';
                $content .="
    ".'<a href="https://jq.qq.com/?_wv=1027&k=4BeSCye">技术支持 现代软件工程工作室</a>';
            }else{
                $content = date("Y-m-d H:i:s",time())."
    
    ".'技术支持 现代软件工程工作室';
            }
    复制代码

    菜单点击访问:

    复制代码
    {
        "button": [
                 {
                        "type":"view",
                        "name":"餐厅信息",
                        "url":"http://dingcanphp.applinzi.com/index/canting.html"
                    },
             {
                "name": "帮助",
                "sub_button": [
                    {
                             "type":"view",
                             "name":"天气查询",
                             "url":"http://dingcanphp.applinzi.com/index/tianqi.html"
                    },
            {
                             "type":"view",
                             "name":"网页授权",
                             "url":"http://dingcanphp.applinzi.com/login.php"
                    }
                ]
            }    
        ]
    }
    复制代码

    效果图展示:

    谢谢阅读,如有不足,请赐教。

     
  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/wangsongbai/p/13444688.html
Copyright © 2011-2022 走看看