1、OAuth2.0
OAuth(開(kāi)放授權(quán))是一個(gè)開(kāi)放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問(wèn)該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)繫人列表),而無(wú)需將使用者名稱和密碼提供給第三方應(yīng)用程式。
允許使用者提供一個(gè)令牌,而不是使用者名稱和密碼來(lái)存取他們存放在特定服務(wù)提供者的資料。每一個(gè)令牌授權(quán)一個(gè)特定的網(wǎng)站(例如,影片編輯網(wǎng)站)在特定的時(shí)段(例如,接下來(lái)的2小時(shí)內(nèi))內(nèi)存取特定的資源(例如僅僅是某一相簿中的影片)。這樣,OAuth允許使用者授權(quán)第三方網(wǎng)站存取他們儲(chǔ)存在另外的服務(wù)提供者上的信息,而不需要分享他們的存取許可或他們資料的所有內(nèi)容。
2、目標(biāo)
我們這裡主要模擬使用OAuth2.0,使用者透過(guò)掃描我們網(wǎng)頁(yè)應(yīng)用的二維碼並進(jìn)行授權(quán)登入來(lái)獲取使用者的基本資訊的過(guò)程。詳細(xì)的介面相關(guān)資訊可在微信開(kāi)放平臺(tái)上查看:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
3、前期準(zhǔn)備(取得微信開(kāi)發(fā)者權(quán)限)
我們這裡主要講的是網(wǎng)站(Web)應(yīng)用,網(wǎng)站應(yīng)用微信登入是基於OAuth2.0協(xié)定標(biāo)準(zhǔn)建構(gòu)的微信OAuth2.0授權(quán)登入系統(tǒng)(即上面的協(xié)定)。在微信用戶端授權(quán)登入(取得使用者資訊)的可以查看:http://www.cnblogs.com/0201zcr/p/5131602.html
在進(jìn)行微信OAuth2.在進(jìn)行微信OAuth2.0授權(quán)登入之前存取,在微信開(kāi)放平臺(tái)註冊(cè)開(kāi)發(fā)者帳號(hào),並擁有一個(gè)已審核通過(guò)的網(wǎng)站應(yīng)用,並獲得相應(yīng)的AppID和AppSecret,申請(qǐng)微信登入且通過(guò)審核後,可開(kāi)始存取流程。
3.1、註冊(cè)開(kāi)發(fā)者帳號(hào)
可以在https://open.weixin.qq.com/?這裡申請(qǐng)開(kāi)發(fā)的帳號(hào)。由於是騰訊的網(wǎng)頁(yè),這裡可以直接透過(guò)?QQ號(hào)進(jìn)行登入。
3.2、提交網(wǎng)站應(yīng)用審核
在已經(jīng)登入的介面中選擇「管理中心」—》網(wǎng)站應(yīng)用程式—》建立網(wǎng)站應(yīng)用程式
???都會(huì)彈出後將彈出後填入下面的介面所彈出後的介面。 ,還有一個(gè)頁(yè)面需要填寫(xiě),提交一份紙本申請(qǐng)書(shū)掃描件(會(huì)提供模板,我們下載再來(lái)填寫(xiě)後,需蓋章,簽名),配置回調(diào)域名(掃碼登錄後會(huì)跳轉(zhuǎn)的頁(yè)面)等。
之後提交審核即可,等微信審核通過(guò),我們即可獲得我們需要的網(wǎng)頁(yè)應(yīng)用的appid和AppSecret,並配置後回調(diào)的域名了(這三樣是我們開(kāi)發(fā)所必須的)。
? 認(rèn)證之後是這樣子的:
? ?我現(xiàn)在暫時(shí)沒(méi)有找到可以向公眾帳號(hào)那樣子的測(cè)試帳號(hào)的申請(qǐng)。如果有知道怎麼可以申請(qǐng)到測(cè)試帳號(hào)的高手,希望能賜教一下。
接下來(lái),我們就可以開(kāi)始我們的網(wǎng)頁(yè)微信掃碼登入開(kāi)發(fā)了。
1.?第三方發(fā)起微信授權(quán)登錄請(qǐng)求,微信用戶允許授權(quán)第三方應(yīng)用后,微信會(huì)拉起應(yīng)用或重定向到第三方網(wǎng)站,并且?guī)鲜跈?quán)臨時(shí)票據(jù)code參數(shù);2.?通過(guò)code參數(shù)加上AppID和AppSecret等,通過(guò)API換取access_token;3.?通過(guò)access_token進(jìn)行接口調(diào)用,獲取用戶基本數(shù)據(jù)資源或幫助用戶實(shí)現(xiàn)基本操作。
?
5、獲取網(wǎng)頁(yè)的二維碼
當(dāng)我們通過(guò)微信的認(rèn)證,獲取到了appid和AppSecret,并配置了回調(diào)的域名。我們就已經(jīng)可以獲取屬于我們網(wǎng)頁(yè)的二維碼了,獲取的方式很簡(jiǎn)單,只需打開(kāi)一個(gè)微信的鏈接,加上我們的appid和回調(diào)域名即可在網(wǎng)頁(yè)上面打開(kāi)二維碼,用戶用微信客戶端掃碼并授權(quán)登錄之后即會(huì)跳轉(zhuǎn)到我們配置的回調(diào)域名下。
注意:
1、這里填寫(xiě)的是域名(是一個(gè)字符串),而不是URL,因此請(qǐng)勿加http://等協(xié)議頭;2、授權(quán)回調(diào)域名配置規(guī)范為全域名,比如需要網(wǎng)頁(yè)授權(quán)的域名為:www.qq.com,配置以后此域名下面的頁(yè)面http://www.qq.com/music.html?、?http://m.miracleart.cn/?都可以進(jìn)行OAuth2.0鑒權(quán)。但http://pay.qq.com?、?http://m.miracleart.cn/?、?http://m.miracleart.cn/無(wú)法進(jìn)行OAuth2.0鑒權(quán)
5.1、請(qǐng)求url說(shuō)明
第三方使用網(wǎng)站應(yīng)用授權(quán)登錄前請(qǐng)注意已獲取相應(yīng)網(wǎng)頁(yè)授權(quán)作用域(scope=snsapi_login),則可以通過(guò)在PC端打開(kāi)以下鏈接:
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
?
?參數(shù)說(shuō)明
參數(shù) | 是否必須 | 說(shuō)明 |
---|---|---|
appid | 是 | 應(yīng)用唯一標(biāo)識(shí)(前面認(rèn)證網(wǎng)頁(yè)應(yīng)用中獲得) |
redirect_uri | 是 | 重定向地址,需要進(jìn)行UrlEncode(前面認(rèn)證網(wǎng)頁(yè)應(yīng)用中獲得) |
response_type | 是 | 填code |
scope | 是 | 應(yīng)用授權(quán)作用域,擁有多個(gè)作用域用逗號(hào)(,)分隔,網(wǎng)頁(yè)應(yīng)用目前僅填寫(xiě)snsapi_login即可 |
state | 否 | 用于保持請(qǐng)求和回調(diào)的狀態(tài),授權(quán)請(qǐng)求后原樣帶回給第三方。該參數(shù)可用于防止csrf攻擊(跨站請(qǐng)求偽造攻擊),建議第三方帶上該參數(shù),可設(shè)置為簡(jiǎn)單的隨機(jī)數(shù)加session進(jìn)行校驗(yàn) |
?返回說(shuō)明
? 用戶允許授權(quán)后,將會(huì)重定向到redirect_uri的網(wǎng)址上,并且?guī)蟘ode和state參數(shù)
redirect_uri?code=CODE&state=STATE
? 若用戶禁止授權(quán),則重定向后不會(huì)帶上code參數(shù),僅會(huì)帶上state參數(shù)
redirect_uri?state=STATE
5.2、事例:
一號(hào)店的微信二維碼鏈接如下:
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
? 將其復(fù)制到瀏覽器中打開(kāi)即可獲得一號(hào)店的二維碼,二維碼頁(yè)面如下:
通過(guò)使用微信客戶端的掃一掃功能,掃描該二維碼,即會(huì)跳轉(zhuǎn)到上面填寫(xiě)redirect_uri所在的地址上。假如用戶同意授權(quán),這里就獲得了微信返回的code參數(shù)了。
6、獲取用戶信息
假如前面已經(jīng)獲得code。我們可以通過(guò)code參數(shù)去獲取用戶openid和access_token,進(jìn)而獲得用戶的信息。
6.1、通過(guò)code參數(shù)獲取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
?參數(shù)說(shuō)明
參數(shù) | 是否必須 | 說(shuō)明 |
---|---|---|
appid | 是 | 應(yīng)用唯一標(biāo)識(shí),在微信開(kāi)放平臺(tái)提交應(yīng)用審核通過(guò)后獲得 |
secret | 是 | 應(yīng)用密鑰AppSecret,在微信開(kāi)放平臺(tái)提交應(yīng)用審核通過(guò)后獲得 |
code | 是 | 填寫(xiě)第一步獲取的code參數(shù) |
grant_type | 是 | 填authorization_code |
返回說(shuō)明
正確的返回:
{? "access_token":"ACCESS_TOKEN",? "expires_in":7200,? "refresh_token":"REFRESH_TOKEN","openid":"OPENID",? "scope":"SCOPE","unionid":?"o6_bmasdasdsad6_2sgVt7hMZOPfL"}
參數(shù) | 說(shuō)明 |
---|---|
access_token | 接口調(diào)用憑證 |
expires_in | access_token接口調(diào)用憑證超時(shí)時(shí)間,單位(秒) |
refresh_token | 用戶刷新access_token |
openid | 授權(quán)用戶唯一標(biāo)識(shí) |
scope | 用戶授權(quán)的作用域,使用逗號(hào)(,)分隔 |
?unionid | 當(dāng)且僅當(dāng)該網(wǎng)站應(yīng)用已獲得該用戶的userinfo授權(quán)時(shí),才會(huì)出現(xiàn)該字段。 |
錯(cuò)誤返回樣例:
{"errcode":40029,"errmsg":"invalid?code"}
注意:
code參數(shù)的超時(shí)時(shí)間是5分鐘,且每次請(qǐng)求的code參數(shù)的值都不一樣。
access_token的超時(shí)時(shí)間是32分鐘。
6.2、通過(guò)access_token獲取用戶的基本信息
獲取的前提條件
access_token有效且為超時(shí);
微信用戶已授權(quán)給第三方應(yīng)用賬號(hào)相應(yīng)接口作用域(scope)【在二維碼生成連接那里填寫(xiě)】
對(duì)于接口作用域(scope),能調(diào)用的接口有以下:
授權(quán)作用域(scope) | 接口 | 接口說(shuō)明 |
---|---|---|
snsapi_base | /sns/oauth2/access_token | 通過(guò)code換取access_token、refresh_token和已授權(quán)scope |
/sns/oauth2/refresh_token | 刷新或續(xù)期access_token使用 | |
/sns/auth | 檢查access_token有效性 | |
snsapi_userinfo | /sns/userinfo | 獲取用戶個(gè)人信息 |
?
使用snsapi_base作用域的授權(quán)是掃碼之后無(wú)需用戶點(diǎn)擊授權(quán),掃碼后直接跳轉(zhuǎn),用戶感覺(jué)不到授權(quán)了,但這種授權(quán)方式能獲取的數(shù)據(jù)量有限,這里我們要獲取用戶的基本信息,我們需要使用snsapi_userinfo授權(quán)。使用snsapi_userinfo授權(quán),掃碼后出現(xiàn)類(lèi)似于下面的授權(quán)界面
此接口用于獲取用戶個(gè)人信息。開(kāi)發(fā)者可通過(guò)OpenID來(lái)獲取用戶基本信息。特別需要注意的是,如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),可通過(guò)獲取用戶基本信息中的unionid來(lái)區(qū)分用戶的唯一性,因?yàn)橹灰峭粋€(gè)微信開(kāi)放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),用戶的unionid是唯一的。換句話說(shuō),同一用戶,對(duì)同一個(gè)微信開(kāi)放平臺(tái)下的不同應(yīng)用,unionid是相同的。請(qǐng)注意,在用戶修改微信頭像后,舊的微信頭像URL將會(huì)失效,因此開(kāi)發(fā)者應(yīng)該自己在獲取用戶信息后,將頭像圖片保存下來(lái),避免微信頭像URL失效后的異常情況。
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
?參數(shù)說(shuō)明
參數(shù) | 是否必須 | 說(shuō)明 |
---|---|---|
access_token | 是 | 調(diào)用憑證(上一個(gè)請(qǐng)求中獲得) |
openid | 是 | 普通用戶的標(biāo)識(shí),對(duì)當(dāng)前開(kāi)發(fā)者帳號(hào)唯一(上一個(gè)請(qǐng)求中獲得) |
? ? ? ?lang | ? 否 | 國(guó)家地區(qū)語(yǔ)言版本,zh_CN 簡(jiǎn)體,zh_TW 繁體,en 英語(yǔ),默認(rèn)為zh-CN |
返回說(shuō)明
正確的Json返回結(jié)果:
{? "openid":"OPENID","nickname":"NICKNAME","sex":1,"province":"PROVINCE","city":"CITY","country":"COUNTRY","headimgurl":?"http://m.miracleart.cn/","privilege":["PRIVILEGE1",? "PRIVILEGE2"],"unionid":?"?o6_bmasdasdsad6_2sgVt7hMZOPfL"}
參數(shù) | 說(shuō)明 |
---|---|
openid | 普通用戶的標(biāo)識(shí),對(duì)當(dāng)前開(kāi)發(fā)者帳號(hào)唯一 |
nickname | 普通用戶昵稱 |
sex | 普通用戶性別,1為男性,2為女性 |
province | 普通用戶個(gè)人資料填寫(xiě)的省份 |
city | 普通用戶個(gè)人資料填寫(xiě)的城市 |
country | 國(guó)家,如中國(guó)為CN |
headimgurl | 用戶頭像,最后一個(gè)數(shù)值代表正方形頭像大?。ㄓ?、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒(méi)有頭像時(shí)該項(xiàng)為空 |
privilege | 用戶特權(quán)信息,json數(shù)組,如微信沃卡用戶為(chinaunicom) |
unionid | 用戶統(tǒng)一標(biāo)識(shí)。針對(duì)一個(gè)微信開(kāi)放平臺(tái)帳號(hào)下的應(yīng)用,同一用戶的unionid是唯一的。 |
錯(cuò)誤的Json返回示例:
{? "errcode":40003,"errmsg":"invalid?openid"}
7、總結(jié)?
最近著手開(kāi)發(fā)了微信網(wǎng)頁(yè)掃碼登錄和公眾號(hào)授權(quán)登錄收獲頗豐,兩者的開(kāi)發(fā)很類(lèi)似。以下是我個(gè)人摸索過(guò)程中發(fā)現(xiàn)的兩者的異同:
兩者都可以通過(guò)微信客戶端掃碼授權(quán)的方式,讓第三方頁(yè)面獲得微信用戶的一些基本信息(昵稱、性別、所在地、在微信唯一標(biāo)示等……)。他們都是通過(guò)提供一個(gè)鏈接讓用戶授權(quán)的方式。但網(wǎng)頁(yè)版需要在頁(yè)面打開(kāi)二維碼之后授權(quán),而公眾號(hào)則需要用戶先關(guān)注了我們的公眾號(hào),然后點(diǎn)開(kāi)公眾號(hào)里面的鏈接,確認(rèn)授權(quán)即可。
網(wǎng)頁(yè)掃碼登錄需要將授權(quán)的鏈接(二維碼鏈接)在網(wǎng)頁(yè)中打開(kāi)、而公眾號(hào)授權(quán)登錄的鏈接必須要微信客戶端中打開(kāi)。
無(wú)論網(wǎng)頁(yè)掃碼登錄還是在公眾號(hào)中授權(quán)登錄,都是通過(guò)授權(quán)的方式獲得一個(gè)code參數(shù),之后通過(guò)code參數(shù)獲取access_token和openid和通過(guò)access_token和openid去獲取用戶的基本信息的請(qǐng)求鏈接是一樣的。
在開(kāi)發(fā)公眾號(hào)授權(quán)登錄的過(guò)程中,我發(fā)現(xiàn)了有測(cè)試賬號(hào)的提供,足以滿足我們的測(cè)試和開(kāi)發(fā),但在開(kāi)發(fā)網(wǎng)頁(yè)掃碼時(shí),暫時(shí)未發(fā)現(xiàn)哪里能獲取測(cè)試賬號(hào),我是通過(guò)申請(qǐng)獲取的。(希望知道哪里有測(cè)試賬號(hào)的請(qǐng)求高手賜教)。
?公眾賬號(hào)授權(quán)登錄:http://www.cnblogs.com/0201zcr/p/5131602.html
微信公眾號(hào)群發(fā)消息:http://www.cnblogs.com/0201zcr/p/5866296.html
更多微信開(kāi)放平臺(tái)開(kāi)發(fā)——網(wǎng)頁(yè)微信掃碼登錄(OAuth2.0)?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)
