PHP實現微信網頁登錄受權開發

這篇文章主要介紹了關於PHP實現微信網頁登錄受權開發,有着必定的參考價值,如今分享給你們,有須要的朋友能夠參考一下php

更多PHP相關知識請關注個人專欄PHP​zhuanlan.zhihu.comcss

微信開放平臺和公衆平臺的區別html

1.公衆平臺面向的時普通的用戶,好比自媒體和媒體,企業官方微信公衆帳號運營人員使用,固然你所在的團隊或者公司有實力去開發一些內容,也能夠調用公衆平臺裏面的接口,好比自定義菜單,自動回覆,查詢功能。目前大多數微信經過認證以後,都在作這個事情。前端

2.開放平臺面向的開發者和第三方獨立軟件開發商。我以爲開發平臺最大的開放就是微信登陸。當年騰訊沒有花大力氣去作統一登陸這個事情,致使目前各個網站都要弄一套登陸機制。好在他們如今認清了局勢。開發者或軟件開發商,經過微信開放提供的平臺和接口,能夠開發適合企業的電子商務網站,掃描二維碼進去一個遊戲界面,而後去購買商品等。固然後續開放平臺要開放支付接口,那麼相似口袋通這種軟件開發廠商,就能夠爲大型,中小企業提供微信小店這種服務和軟件了。node

公衆平臺就是服務號訂閱號的管理開發後臺。數據庫

開發平臺說得通俗一點就是實現手機裏邊安裝軟件的內容一鍵分享朋友圈;json

下面的第三方登錄就是依託於開放平臺()的功能api

 

準備工做

網站應用微信登陸是基於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端打開如下連接:

若提示「該連接沒法訪問」,請檢查參數是否填寫錯誤,如redirect_uri的域名與審覈時填寫的受權域名不一致或scope不爲snsapi_login。

參數說明

返回說明

用戶容許受權後,將會重定向到redirect_uri的網址上,而且帶上code和state參數

redirect_uri?code=CODE&state=STATE

若用戶禁止受權,則重定向後不會帶上code參數,僅會帶上state參數

redirect_uri?state=STATE

請求示例

登陸一號店網站應用

打開後,一號店會生成state參數,跳轉到
snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect

微信用戶使用微信掃描二維碼而且確認登陸後,PC端會跳轉到

 

第二種獲取code的方式,支持網站將微信登陸二維碼內嵌到本身頁面中,用戶使用微信掃碼受權後經過JS將code返回給網站。

JS微信登陸主要用途:網站但願用戶在網站內就能完成登陸,無需跳轉到微信域下登陸後再返回,提高微信登陸的流暢性與成功率。 網站內嵌二維碼微信登陸JS實現辦法:

步驟1:在頁面中先引入以下JS文件(支持https):

<scriptsrc=""></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"}

注意:

一、Appsecret是應用接口使用密鑰,泄漏後將可能致使應用數據泄漏、應用的用戶數據泄漏等高風險後果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);

二、access_token爲用戶受權第三方應用發起接口調用的憑證(至關於用戶登陸態),存儲在客戶端,可能出現惡意獲取access_token 後致使的用戶數據泄漏、用戶微信相關接口功能被惡意發起等行爲;

三、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

參數說明

返回說明

正確的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>


?>

微信第三方登陸(靜默受權和非靜默受權)

用戶在微信客戶端中訪問第三方網頁,公衆號能夠經過微信網頁受權機制,來獲取用戶基本信息,進而實現業務邏輯。

微信的受權登陸在平常應用中應用的很是普遍,愈來愈多的平臺支持用戶使用微信進行受權第三方登陸

使用微信受權登陸有哪些優點/好處;

一、用戶量足夠大,基本全部用戶都會有微信,登陸起來比較方便快捷;

二、微信做爲一個開放平臺,爲衆多公衆號/服務開放了許多服務接口,讓公衆號可以爲本身的用戶提供更加個性、更加優質的產品服務;

open id 和 union id ,這兩個id有什麼區別;

一、openid:在關注者與公衆號產生消息交互後,公衆號可得到關注者的openid,同一個用戶,在不一樣公衆號或移動應用下對應有不一樣open id標識;

二、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網頁端、公衆號端服務,那麼用戶使用微信受權登陸的數據流轉流程是怎麼樣的;

一、用戶經過微信受權移動app服務;該應用服務便可經過接口獲取用戶的union id,這個時候,若是在數據庫中沒有查到該id,則識別爲新用戶,直接建立一個user id,該惟一user id與union id 對應;

二、用戶經過微信掃碼PC端受權聯合登錄獲取PC端服務;該應用服務便可經過接口獲取用戶的union id,這個時候,在數據庫中查到有這個id,就會把pc登陸這個帳戶合併到以前建立的惟一user id帳戶下;

三、用戶經過關注該服務公衆號,用微信受權登陸公衆號服務;該應用服便可經過接口獲取用戶的union id,這個時候,在數據庫中查到有這個id,就會把公衆號中登陸的這個帳戶合併到以前建立的惟一user id帳戶下;

網頁受權的兩種scope的區別說明:

一、受權登陸以snsapi_base爲scope發起的網頁受權,是用來獲取進入頁面的用戶的openid的,而且是靜默受權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(每每是業務頁面)特色:用戶無感知;

二、靜默受權以snsapi_userinfo爲scope發起的網頁受權,是用來獲取用戶的基本信息的。但這種受權須要用戶手動贊成,而且因爲用戶贊成過,因此無須關注,就可在受權後獲取該用戶的基本信息。

特殊場景下靜默受權:

對於已關注公衆號的用戶,若是用戶從公衆號的會話或者自定義菜單進入本公衆號的網頁受權頁,即便是scope爲snsapi_userinfo,也是靜默受權,用戶無感知。

網頁受權流程:

一、引導用戶進入受權頁面贊成受權,獲取code

確保微信公衆帳號擁有受權做用域(scope參數)的權限的前提下引導用戶去受權頁面

參考連接:

scope爲snsapi_base

注意:appid,redirect_uri,state這些要和後臺協商好

"+wx_appid+"&redirect_uri="+api.wx_reg+"&response_type=code&scope=snsapi_login,snsapi_userinfo&state=1,0#wechat_redirect

scope爲snsapi_userinfo

"+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。

二、經過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​zhuanlan.zhihu.com

相關文章
相關標籤/搜索