如今大部分微站都經過用戶的微信openid來實現自動登陸。在我以前的開發中,用戶經過點擊一個菜單,公衆號返回一個圖文,用戶點擊這個圖文才能夠自動登陸微站。可是若是你擁有高級接口,就能夠實現點擊菜單,打開網頁就能獲取這個openid,實現自動登陸。php
這裏已經提到,必需要擁有高級接口的權限(服務號、企業號),開啓了開發者模式。html
在微信公衆平臺後臺「開發者中心」中找到「高級接口」下的「OAuth2.0網頁受權」,後面有一個「修改」,點擊以後就會彈出填寫回調地址的對話框。具體如何受權,請點擊這裏學習。只有得到高級接口權限後,才能出現這個地方的「修改」。json
注意,這裏填寫的是域名,不是帶http://的網址,並且解釋中很清楚,「受權回調域名配置規範爲全域名」,也就是說帶www和不帶是不一樣的兩個域名。所以我這裏要填寫以下圖中的域名。api
建立菜單能夠經過你的微站後臺建立,若是沒有開啓開發者模式,也能夠經過微信公衆平臺後臺建立。微信
菜單使用點擊打開連接的模式,也就是view模式。若是你是使用開發者模式,經過向微信提交以下代碼,便可建立公衆號菜單(開發者文檔):app
{ "button":[ { "type":"view", "name":"登陸微站", "url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid={在微信公衆平臺後臺獲取這個APPID}&redirect_uri={你填寫的回調域名下的地址}&response_type=code&scope=snsapi_base&state=1#wechat_redirect" }] }
代碼1 要提交的菜單代碼,下面要用到微信公衆平臺
APPID的獲取位置就是上面你填寫回調地址的那個「開發者中心」。下面咱們用PHP來實現一下菜單提交:curl
<?php function curl_info($appid,$secret) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { echo 'Errno'.curl_error($ch); } curl_close($ch); $arr= json_decode($tmpInfo,true); return $arr; } function curl_menu($ACCESS_TOKEN,$data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$ACCESS_TOKEN); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { echo 'Errno'.curl_error($ch); } curl_close($ch); $arr= json_decode($tmpInfo,true); return $arr; } function creat_menu() { $ACCESS_LIST= curl_info(APP_ID,APP_SCR);//獲取到的憑證,你須要本身define APP_ID和APP_SCR(應用密鑰),這個也是在微信公衆平臺後臺開發者中心找 if($ACCESS_LIST['access_token']!='') { $access_token = $ACCESS_LIST['access_token'];//獲取到ACCESS_TOKEN $data = '把上面代碼1拷貝黏貼在這裏'; $msg = curl_menu($access_token,preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $data)); if($msg['errmsg']=='ok') { die('建立自定義菜單成功!'); } else { die('建立自定義菜單失敗!'); } } else { die('建立失敗,微信AppId或微信AppSecret填寫錯誤'); } } create_menu(); ?>
代碼2 用PHP來建立微信公衆號菜單post
代碼2其實有點冗餘了,核心部分用紅色標出來了。就這樣,你的微信公衆號中應該很快就能夠看到建立了一個「登陸微站」的菜單。點擊這個菜單就能夠實現登陸微站了。學習
若是你不須要PHP,能夠直接在微信公衆平臺後臺的菜單自定義中寫連接就能夠了。
在上圖中的這個地方,選擇打開連接的方式建立菜單。OK,接下來把上面那個連接放進去:
https://open.weixin.qq.com/connect/oauth2/authorize?appid={在微信公衆平臺後臺獲取這個APPID}&redirect_uri={你填寫的回調域名下的地址}&response_type=code&scope=snsapi_base&state=1#wechat_redirect
建立菜單就能夠了。
固然,你也有可能只須要在你本身的微信管理後臺加入這個連接就能夠了。
細心的你可能已經發現了,上面的連接地址中含有參數scope=snsapi_base,而非scope=snsapi_userinfo, 由於使用前者不須要用戶點擊一個受權按鈕,直接跳轉到回調頁面,然後者須要點擊受權按鈕,不過點擊受權按鈕有好處,一是能夠在沒有關注公衆號的狀況下也可 以受權,二是受權後能夠得到用戶的一些信息,如暱稱、性別、所在地。可是咱們是爲了利用openid進行登陸,因此直接選擇前者就能夠了。
點擊菜單以後,通過微信authorize的處理,會跳轉到你提交的回調地址(這裏須要提醒,回調地址最好不要帶參數,例如xxx/?callback=from_weixin,由於微信跳轉到你的回調地址也要帶參數,而這個參數就你須要的)。微信跳轉到以下URL:
回調地址/?code=CODE&state=1
上面代碼能夠經過$_GET['code']得到一個CODE值,利用這個CODE值和appid,能夠得到openid和access_token。
下面再用PHP來實現如下:
if($_GET['code']) { $code = $_GET['code']; $data = get_by_curl('https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSRC&code='.$code.'&grant_type=authorization_code'); $data = json_decode($data); $openid = $data->openid; $access_token = $data->access_token; } function get_by_curl($url,$post = false){ $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if($post){ curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,$post); } $result = curl_exec($ch); curl_close($ch); return $result; }
這樣能夠就能夠得到openid和access_token,利用這些值,咱們還能夠利用微信公衆平臺的獲取用戶基本信息api接口獲取用戶基本信息。
原文來自 烏徒幫 http://www.utubon.com/post/3065.html