微信公衆號開發之網頁受權(獲取用戶信息)

  此次暑假留在學校參與工做室的項目,對微信公衆號比較感興趣,因此參與這方面的學習研究。php

昨天完成了關於網頁受權,獲取用戶信息方面的功能,因此乘熱打鐵,寫上一篇。實現本篇涉及的html

功能,還須要完成一些基礎。在寫完這篇博客後,我會盡快補上。json

 

-------------------------廢話很少說直入正題api

須要的工具:數組

微信公衆號(能夠申請,但作開發的,能夠申請測試號,申請詳細很少說了)瀏覽器

服務器(能夠自行購買,我使用的是新浪的sae。)服務器

編輯器(隨意,不作推薦)微信

微信公衆號開發文檔(地址app

 

-------------------------官方文檔解讀(只說我讀到的信息)curl

!!!!!完成基本配置後才能進行一下工做,配置信息在這。(稍後補上)

你要完成網頁受權,並獲取用戶信息要完成一下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、4六、6四、9六、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網頁受權演示\n";
            $content .= '<a href="http://dingcanphp.applinzi.com/login.php">點擊這裏體驗</a>';
            $content .="\n".'<a href="https://jq.qq.com/?_wv=1027&k=4BeSCye">技術支持 現代軟件工程工做室</a>';
        }else{
            $content = date("Y-m-d H:i:s",time())."\n\n".'技術支持 現代軟件工程工做室';
        }

 

菜單點擊訪問:

{
    "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"
                }
            ]
        }    
    ]
}

 

效果圖展現:

 

謝謝閱讀,若有不足,請賜教。

相關文章
相關標籤/搜索