這篇文章主要介紹了關於PHP實現微信網頁登陸授權開發,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下 更多PHP相關知識請關註我的專欄PHPzhuanlan.zhihu.com 微信開放平臺和公眾平臺的區別 1.公眾平臺面向的時普通的用戶,比如自媒體和媒體,企業官方微信公眾賬號運營人 ...
這篇文章主要介紹了關於PHP實現微信網頁登陸授權開發,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
更多PHP相關知識請關註我的專欄PHP
微信開放平臺和公眾平臺的區別
1.公眾平臺面向的時普通的用戶,比如自媒體和媒體,企業官方微信公眾賬號運營人員使用,當然你所在的團隊或者公司有實力去開發一些內容,也可以調用公眾平臺裡面的介面,比如自定義菜單,自動回覆,查詢功能。目前大多數微信通過認證之後,都在做這個事情。
2.開放平臺面向的開發者和第三方獨立軟體開發商。我覺得開發平臺最大的開放就是微信登錄。當年騰訊沒有花大力氣去做統一登錄這個事情,導致目前各個網站都要弄一套登錄機制。好在他們現在認清了局勢。開發者或軟體開發商,通過微信開放提供的平臺和介面,可以開發適合企業的電子商務網站,掃描二維碼進去一個游戲界面,然後去購買商品等。當然後續開放平臺要開放支付介面,那麼類似口袋通這種軟體開發廠商,就可以為大型,中小企業提供微信小店這種服務和軟體了。
公眾平臺就是服務號訂閱號的管理開發後臺。
開發平臺說得通俗一點就是實現手機裡邊安裝軟體的內容一鍵分享朋友圈;
下麵的第三方登陸就是依托於開放平臺(http://open.weixin.qq.com)的功能
準備工作
網站應用微信登錄是基於OAuth2.0協議標準構建的微信OAuth2.0授權登錄系統。
在進行微信OAuth2.在進行微信OAuth2.0授權登錄接入之前,在微信開放平臺註冊開發者帳號,並擁有一個已審核通過的網站應用,並獲得相應的AppID和AppSecret,申請微信登錄且通過審核後,可開始接入流程。
授權流程說明
微信OAuth2.0授權登錄讓微信用戶使用微信身份安全登錄第三方應用或網站,在微信用戶授權登錄已接入微信OAuth2.0的第三方應用後,第三方可以獲取到用戶的介面調用憑證(access_token),通過access_token可以進行微信開放平臺授權關係介面調用,從而可實現獲取微信用戶基本開放信息和幫助用戶實現基礎開放功能等。
微信OAuth2.0授權登錄目前支持authorization_code模式,適用於擁有server端的應用授權。該模式整體流程為:
1. 第三方發起微信授權登錄請求,微信用戶允許授權第三方應用後,微信會拉起應用或重定向到第三方網站,並且帶上授權臨時票據code參數;
2. 通過code參數加上AppID和AppSecret等,通過API換取access_token;
3. 通過access_token進行介面調用,獲取用戶基本數據資源或幫助用戶實現基本操作。
獲取access_token時序圖:
第一步:請求CODE
第三方使用網站應用授權登錄前請註意已獲取相應網頁授權作用域(scope=snsapi_login),則可以通過在PC端打開以下鏈接:
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示“該鏈接無法訪問”,請檢查參數是否填寫錯誤,如redirect_uri的功能變數名稱與審核時填寫的授權功能變數名稱不一致或scope不為snsapi_login。
參數說明
返回說明
用戶允許授權後,將會重定向到redirect_uri的網址上,並且帶上code和state參數
redirect_uri?code=CODE&state=STATE
若用戶禁止授權,則重定向後不會帶上code參數,僅會帶上state參數
redirect_uri?state=STATE
請求示例
登錄一號店網站應用
https://passport.yhd.com/wechat/login.do
打開後,一號店會生成state參數,跳轉到
https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect
微信用戶使用微信掃描二維碼並且確認登錄後,PC端會跳轉到
https://passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e
第二種獲取code的方式,支持網站將微信登錄二維碼內嵌到自己頁面中,用戶使用微信掃碼授權後通過JS將code返回給網站。
JS微信登錄主要用途:網站希望用戶在網站內就能完成登錄,無需跳轉到微信域下登錄後再返回,提升微信登錄的流暢性與成功率。 網站內嵌二維碼微信登錄JS實現辦法:
步驟1:在頁面中先引入如下JS文件(支持https):
<scriptsrc="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
步驟2:在需要使用微信登錄的地方實例以下JS對象:
varobj = new WxLogin({
id:"login_container",
appid: "",
scope: "",
redirect_uri: "",
state: "",
style: "",
href: ""
});
參數說明
第二步:通過code獲取access_token
通過code獲取access_token
參數說明
返回說明
正確的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE","unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"}
錯誤返回樣例:
{"errcode":40029,"errmsg":"invalidcode"}
刷新access_token有效期
access_token是調用授權關係介面的調用憑證,由於access_token有效期(目前為2個小時)較短,當access_token超時後,可以使用refresh_token進行刷新,access_token刷新結果有兩種:
1. 若access_token已超時,那麼進行refresh_token會獲取一個新的access_token,新的超時時間;
2. 若access_token未超時,那麼進行refresh_token不會改變access_token,但超時時間會刷新,相當於續期access_token。
refresh_token擁有較長的有效期(30天),當refresh_token失效的後,需要用戶重新授權。
請求方法
獲取第一步的code後,請求以下鏈接進行refresh_token:
參數說明
返回說明
正確的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
返回說明
正確的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
錯誤返回樣例:
{"errcode":40030,"errmsg":"invalidrefresh_token"}
註意:
1、Appsecret是應用介面使用密鑰,泄漏後將可能導致應用數據泄漏、應用的用戶數據泄漏等高風險後果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);
2、access_token為用戶授權第三方應用發起介面調用的憑證(相當於用戶登錄態),存儲在客戶端,可能出現惡意獲取access_token 後導致的用戶數據泄漏、用戶微信相關介面功能被惡意發起等行為;
3、refresh_token為用戶授權第三方應用的長效憑證,僅用於刷新access_token,但泄漏後相當於access_token 泄漏,風險同上。
建議將secret、用戶數據(如access_token)放在App雲端伺服器,由雲端中轉介面調用請求。
第三步:通過access_token調用介面
獲取access_token後,進行介面調用,有以下前提:
1. access_token有效且未超時;
2. 微信用戶已授權給第三方應用帳號相應介面作用域(scope)。
對於介面作用域(scope),能調用的介面有以下:
其中snsapi_base屬於基礎介面,若應用已擁有其它scope許可權,則預設擁有snsapi_base的許可權。使用snsapi_base可以讓移動端網頁授權繞過跳轉授權登錄頁請求用戶授權的動作,直接跳轉第三方網頁帶上授權臨時票據(code),但會使得用戶已授權作用域(scope)僅為snsapi_base,從而導致無法獲取到需要用戶授權才允許獲得的數據和基礎功能。
F.A.Q
1.什麼是授權臨時票據(code)?
答:第三方通過code進行獲取access_token的時候需要用到,code的超時時間為10分鐘,一個code只能成功換取一次access_token即失效。code的臨時性和一次保障了微信授權登錄的安全性。第三方可通過使用https和state參數,進一步加強自身授權登錄的安全性。
2.什麼是授權作用域(scope)?
答:授權作用域(scope)代表用戶授權給第三方的介面許可權,第三方應用需要向微信開放平臺申請使用相應scope的許可權後,使用文檔所述方式讓用戶進行授權,經過用戶授權,獲取到相應access_token後方可對介面進行調用。
3.網站內嵌二維碼微信登錄JS代碼中style欄位作用?
答:第三方頁面顏色風格可能為淺色調或者深色調,若第三方頁面為淺色背景,style欄位應提供"black"值(或者不提供,black為預設值),則對應的微信登錄文字樣式為黑色。相關效果如下:
若提供"white"值,則對應的文字描述將顯示為白色,適合深色背景。相關效果如下:
4.網站內嵌二維碼微信登錄JS代碼中href欄位作用?
答:如果第三方覺得微信團隊提供的預設樣式與自己的頁面樣式不匹配,可以自己提供樣式文件來覆蓋預設樣式。舉個例子,如第三方覺得預設二維碼過大,可以提供相關css樣式文件,並把鏈接地址填入href欄位
.impowerBox .qrcode {width:200px;}
.impowerBox .title {display: none;}
.impowerBox .info {width: 200px;}
.status_icon {display:none}
.impowerBox .status {text-align: center;}
相關效果如下:
獲取用戶個人信息(UnionID機制)
介面說明
此介面用於獲取用戶個人信息。開發者可通過OpenID來獲取用戶基本信息。特別需要註意的是,如果開發者擁有多個移動應用、網站應用和公眾帳號,可通過獲取用戶基本信息中的unionid來區分用戶的唯一性,因為只要是同一個微信開放平臺帳號下的移動應用、網站應用和公眾帳號,用戶的unionid是唯一的。換句話說,同一用戶,對同一個微信開放平臺下的不同應用,unionid是相同的。
請求說明
http請求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
參數說明
返回說明
正確的Json返回結果:
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl":"http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
錯誤的Json返回示例:
{
"errcode":40003,"errmsg":"invalid openid"
}
調用頻率限制
代碼示例:
第三方發起微信授權登錄請求,微信用戶允許授權第三方應用後,微信會拉起應用或重定向到第三方網站,並且帶上授權臨時票據code參數;
通過code參數加上AppID和AppSecret等,通過API換取access_token;
通過access_token進行介面調用,獲取用戶基本數據資源或幫助用戶實現基本操作。
Login.php如下:
返回 code state*/
$appid = 'wxea1xxxxxxxx20cb62';
$url = "https://open.weixin.qq.com/connect/qrconnect?appid=$appid&redirect_uri=http://zhiliaoke.com.cn/weixin.php&response_type=code&scope=snsapi_login&state=1&connect_redirect=1#wechat_redirect";
header(
'location:'.
$url);
驗證處理如下:
<?php
$code = $_GET['code'];
$state = $_GET['state'];//換成自己的介面信息
$appid = 'XXXXX';
$appsecret = 'XXXXX';
if (empty($code)) $this->error('授權失敗');
<br>
$token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';
$token = json_decode(file_get_contents($token_url));
if (isset($token->errcode)) {
echo '<h1>錯誤:</h1>'.$token->errcode;
echo '<br/><h2>錯誤信息:</h2>'.$token->errmsg;
exit;
}
<br>
$access_token_url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid='.$appid.'&grant_type=refresh_token&refresh_token='.$token->refresh_token;//轉成對象
$access_token = json_decode(file_get_contents($access_token_url));
if (isset($access_token->errcode)) {
echo '<h1>錯誤:</h1>'.$access_token->errcode;
echo '<br/><h2>錯誤信息:</h2>'.$access_token->errmsg;
exit;
}
<br>
<br>
$user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token->access_token.'&openid='.$access_token->openid.'&lang=zh_CN';//轉成對象
$user_info = json_decode(file_get_contents($user_info_url));
if (isset($user_info->errcode)) {
echo '<h1>錯誤:</h1>'.$user_info->errcode;
echo '<br/><h2>錯誤信息:</h2>'.$user_info->errmsg;
exit;
}
$rs = json_decode(json_encode($user_info),true);//返回的json數組轉換成array數組
//列印用戶信息echo '<pre>';
<br>
print_r($rs);echo '</pre>';
<br>
?>
微信第三方登錄(靜默授權和非靜默授權)
用戶在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取用戶基本信息,進而實現業務邏輯。
微信的授權登錄在日常應用中應用的非常廣泛,越來越多的平臺支持用戶使用微信進行授權第三方登錄
使用微信授權登錄有哪些優勢/好處;
1、用戶量足夠大,基本所有用戶都會有微信,登錄起來比較方便快捷;
2、微信作為一個開放平臺,為眾多公眾號/服務開放了許多服務介面,讓公眾號能夠為自己的用戶提供更加個性、更加優質的產品服務;
open id 和 union id ,這兩個id有什麼區別;
1、openid:在關註者與公眾號產生消息交互後,公眾號可獲得關註者的openid,同一個用戶,在不同公眾號或移動應用下對應有不同open id標識;
2、union id:同一個用戶,在不同公眾號或移動應用下unionID相同;前提是,如若需要做多個公眾號以及移動應用賬戶互通,得到唯一身份標識union id,則需要將多個公眾號或移動應用在微信開放平臺進行綁定,然後我們才能給拿到unionid;
所以,如果某個應用或者服務,有聯合登錄甚至多個公眾應用多賬戶互通,可以採用union id來進行賬戶體系的用戶識別與合併;即微信平臺可以通過union id 來進行基於多個公眾號之間的賬戶體系互通與識別合併;
微信聯合登錄是怎麼登錄的,有幾種登錄方式;微信聯合登錄和微信授權登錄【授權登錄(非靜默授權)與靜默授權】
微信聯合登錄;也就是我們常用的微信移動端/PC端之間的掃碼登錄,PC端用微信掃碼登錄,微信移動端確認授權登錄後,應用可以從微信拿到用戶的open id或union id,將微信獲取的用戶信息與自己賬戶體系中的用戶身份進行關聯;
授權登錄:需要用戶確認登錄,這樣可以通過用戶的個人確認,獲取用戶全面的信息,無論是否關註相關微信公眾號等都可以獲取。
靜默授權不需要用戶確認,只需要用戶訪問某個網頁,屬於嵌套在普通網頁里的授權形式,但是只能獲取到用戶的唯一標示openid和union id,無法拿到用戶的微信頭像、微信名稱等個人信息,對於用戶的簡單認證還是很有用的。
如何通過微信賬戶體系來做多應用、多平臺之間的賬戶互通體系;如果某個服務同時分佈在多個公眾號中,賬戶體系如何建立;如何做到用戶身份唯一識別;
1)、同一用戶不同公眾號/應用下open id不同,同一用戶不同公眾號/應用下unionid相同;
2)、建立應用賬戶體系時,通過union來進行多應用/平臺之間的用戶賬戶體系識別與合併;
3)、多應用/平臺建立賬戶體系時,需要做到唯一user id對應唯一union id;
某個服務,包括移動app端、PC網頁端、公眾號端服務,那麼用戶使用微信授權登錄的數據流轉流程是怎麼樣的;
1、用戶通過微信授權移動app服務;該應用服務即可通過介面獲取用戶的union id,這個時候,如果在資料庫中沒有查到該id,則識別為新用戶,直接創建一個user id,該唯一user id與union id 對應;
2、用戶通過微信掃碼PC端授權聯合登陸獲取PC端服務;該應用服務即可通過介面獲取用戶的union id,這個時候,在資料庫中查到有這個id,就會把pc登錄這個賬戶合併到之前創建的唯一user id賬戶下;
3、用戶通過關註該服務公眾號,用微信授權登錄公眾號服務;該應用服即可通過介面獲取用戶的union id,這個時候,在資料庫中查到有這個id,就會把公眾號中登錄的這個賬戶合併到之前創建的唯一user id賬戶下;
網頁授權的兩種scope的區別說明:
1、授權登錄以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的用戶的openid的,並且是靜默授權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(往往是業務頁面)特點:用戶無感知;
2、靜默授權以snsapi_userinfo為scope發起的網頁授權,是用來獲取用戶的基本信息的。但這種授權需要用戶手動同意,並且由於用戶同意過,所以無須關註,就可在授權後獲取該用戶的基本信息。
特殊場景下靜默授權:
對於已關註公眾號的用戶,如果用戶從公眾號的會話或者自定義菜單進入本公眾號的網頁授權頁,即使是scope為snsapi_userinfo,也是靜默授權,用戶無感知。
網頁授權流程:
1、引導用戶進入授權頁面同意授權,獲取code
確保微信公眾賬號擁有授權作用域(scope參數)的許可權的前提下引導用戶去授權頁面
參考鏈接:
scope為snsapi_base
註意:appid,redirect_uri,state這些要和後臺協商好
https://open.weixin.qq.com/connect/oauth2/authorize?appid="+wx_appid+"&redirect_uri="+api.wx_reg+"&response_type=code&scope=snsapi_login,snsapi_userinfo&state=1,0#wechat_redirect
scope為snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid="+wx_appid+"&redirect_uri="+api.wx_reg+"&response_type=code&scope=snsapi_base,snsapi_userinfo&state=1,0#wechat_redirect
用戶同意授權後
如果用戶同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。
2、通過code換取網頁授權access_token(後臺操作)
頁面跳回跳的url上redirect_uri/?code=CODE&state=STATE。code
通過code換取的是網頁授權access_token,如果網頁授權的作用域為snsapi_base,則本步驟中獲取到網頁授權access_token的同時,也獲取到了openid,snsapi_base式的網頁授權流程即到此為止。
3:需要個人信息。後臺通過code得到值之後返回給前端去操作
以上就是PHP實現微信網頁登陸授權開發的詳細內容
更多PHP相關知識請關註我的專欄PHP