這次暑假留在學校參與工作室的項目,對微信公眾號比較感興趣,所以參與這方面的學習研究。
昨天完成了關於網頁授權,獲取用戶信息方面的功能,所以乘熱打鐵,寫上一篇。實現本篇涉及的
功能,還需要完成一些基礎。在寫完這篇博客后,我會盡快補上。
-------------------------廢話不多說直入正題
需要的工具:
微信公眾號(可以申請,但做開發的,可以申請測試號,申請詳細不多說了)
服務器(可以自行購買,我使用的是新浪的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; } ?>
--------------------------網頁授權,用戶信息的獲取體驗
兩種體驗方式。需要完成配置后實現。
微信公眾號自動回復中:
//自動回復模式 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" } ] } ] }
效果圖展示:
謝謝閱讀,如有不足,請賜教。