此次暑假留在學校參與工做室的項目,對微信公衆號比較感興趣,因此參與這方面的學習研究。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; } ?>
--------------------------網頁受權,用戶信息的獲取體驗
兩種體驗方式。須要完成配置後實現。
微信公衆號自動回覆中:
//自動回覆模式 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" } ] } ] }
效果圖展現:
謝謝閱讀,若有不足,請賜教。