????????前段時(shí)間公司網(wǎng)站登錄注冊(cè)改版,做了基于微信的第三方授權(quán)登錄和注冊(cè)闪彼,下面說的是網(wǎng)站應(yīng)用微信授權(quán)實(shí)現(xiàn)登錄注冊(cè),协饲。踩了一些坑畏腕,現(xiàn)在寫下來,?剛好梳理一下之前的思路茉稠,?如果能幫到有需要的人描馅,那更好了。
? ? ? ?微信授權(quán)登陸的優(yōu)點(diǎn)是而线,?通過接入微信登錄功能铭污,用戶可使用微信帳號(hào)快速登錄你的網(wǎng)站,降低注冊(cè)門檻膀篮。 這是微信官方文檔微信OAuth2.0授權(quán)登錄的流程圖嘹狞,后來又做了釘釘?shù)卿洠琎Q登錄誓竿,發(fā)現(xiàn)都是一樣的流程和原理磅网,?都是基于OAuth2.0實(shí)現(xiàn)的,這個(gè)會(huì)了烤黍,釘釘?shù)卿浿校琿q登錄也就會(huì)了傻盟,一通百通。
????????進(jìn)入正題嫂丙,?準(zhǔn)備工作簡(jiǎn)單說下娘赴,?在微信開放平臺(tái)注冊(cè)賬號(hào),?配置好AppID和AppSecret跟啤,設(shè)置好授權(quán)回調(diào)域名(注:重要诽表,授權(quán)回調(diào)地址必須在此域名下)。
第一步:獲取code
請(qǐng)確認(rèn)你的網(wǎng)站應(yīng)用已經(jīng)獲取了網(wǎng)頁授權(quán)作用域(scope=snsapi_login)隅肥,?你可以在前端放置或者在后端重定向到?以下鏈接:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect?竿奏,
參數(shù)說明:
注意,?redirect_uri需要進(jìn)行urlEncode編碼腥放,?必須在授權(quán)域名下泛啸。不然會(huì)出現(xiàn)redirect_url錯(cuò)誤的提示,授權(quán)失敗秃症。用戶同意后會(huì)重定向到redirect_uri的路由上候址,并帶上code和state參數(shù)。redirect_uri?code=CODE&state=STATE种柑,?到這一步獲取到了code岗仑。
也可以在自己的網(wǎng)站頁面嵌入微信登錄二維碼聚请,用戶使用微信掃碼授權(quán)后通過JS將code返回給網(wǎng)站荠雕,這樣無需跳轉(zhuǎn)到微信域名下?登錄再返回,流暢性更好些驶赏。
例如:問卷網(wǎng)網(wǎng)頁內(nèi)嵌微信登錄二維碼
自己網(wǎng)頁嵌入微信登錄二維碼需要在頁面引入微信的JS文件(日了吉娃娃炸卑,復(fù)制不過來了,只能截圖了):
在需要使用微信登錄的地方實(shí)例以下JS對(duì)象
var obj = new WxLogin({
id:"login_container",
appid: "",
scope: "",
redirect_uri: "",
state: "",
style: "",
href: ""
});
第二步母市,?通過code獲取access_token
通過上一步獲取到的code參數(shù)矾兜,獲取access_token
請(qǐng)求方法:?GET
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
參數(shù)說明:
正確返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
參數(shù)說明:
這一步獲取到损趋,?access_token,? openid, unionid,?這里對(duì)三個(gè)參數(shù)進(jìn)行患久,?access_token?是調(diào)用授權(quán)接口的調(diào)用憑證,這個(gè)access_token不需要進(jìn)行緩存浑槽。還有一個(gè)access_token?是全局唯一接口調(diào)用憑據(jù)是需要緩存下來蒋失,有效期為兩小時(shí),有調(diào)用頻次限制的桐玻。openid是這個(gè)用戶對(duì)應(yīng)當(dāng)前應(yīng)用的唯一標(biāo)識(shí)篙挽,比如說,你只有一個(gè)網(wǎng)站應(yīng)用镊靴,那個(gè)openid就是用戶對(duì)應(yīng)你的網(wǎng)站應(yīng)用的唯一標(biāo)識(shí)铣卡。?后來链韭,你又新開發(fā)了個(gè)app,和公眾號(hào)煮落,那么你的每個(gè)應(yīng)用對(duì)應(yīng)同一個(gè)用戶是有不同openid的敞峭,?這個(gè)時(shí)候你肯定需要同一個(gè)用戶對(duì)應(yīng)你的不同應(yīng)用具有唯一性標(biāo)示,這樣才能把各個(gè)應(yīng)用打通蝉仇,這個(gè)時(shí)候就需要使用unionid了旋讹。你需要把你的公眾號(hào)和應(yīng)用綁定在同一開放平臺(tái)下。同一用戶轿衔,對(duì)同一個(gè)微信開放平臺(tái)下的不同應(yīng)用沉迹,unionid是相同的。這就是unionid的主要作用害驹。
第三步:使用access_token?獲取用戶信息
請(qǐng)求方法:? ? GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
參數(shù)說明:
正確返回結(jié)果:
{
"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"
}
至此鞭呕,已經(jīng)獲取到用戶信息⊥鸸伲可以建立用戶會(huì)話琅拌。實(shí)現(xiàn)用戶的注冊(cè)和登陸。
使用openid獲取unionid
做網(wǎng)站應(yīng)用微信授權(quán)中間遇到點(diǎn)小插曲摘刑, 因?yàn)楣緲I(yè)務(wù)之前是用微信公眾號(hào)實(shí)現(xiàn)的授權(quán)进宝,保存的是openid,?做了網(wǎng)站應(yīng)用之后就不能使用openid作為用戶數(shù)據(jù)表的微信字段了枷恕,需要使用unionid才能保證公司多個(gè)應(yīng)用對(duì)于同一用戶的唯一性党晋。所以, 需要把之前的幾十萬用戶的openid更換為unionid在用戶數(shù)據(jù)表里保存徐块。后來未玻,查了下文檔,微信提供了openid轉(zhuǎn)unionid的接口胡控。
第一步扳剿,?先獲取全局唯一接口調(diào)用憑據(jù)access_token。
接口調(diào)用說明:
https請(qǐng)求方式: GET昼激,
?https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
參數(shù)說明:
注意庇绽, 這個(gè)access_token?跟上面微信授權(quán)提到的access_token沒有半毛錢關(guān)系,?這個(gè)access_token?需要緩存下來橙困,因?yàn)檫@個(gè)接口有調(diào)用頻次限制瞧掺,?好像每天最多可以調(diào)用5000次,可以保存在redis或者memcache里凡傅,設(shè)置過期時(shí)間為7200秒辟狈,最好小于7200 ,比如你可以設(shè)置7000后過期,過期后重新調(diào)用這個(gè)接口獲取哼转。
第二步明未,獲取Unionid
接口調(diào)用說明
http請(qǐng)求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
參數(shù)說明:
正常情況下,微信會(huì)返回下述JSON數(shù)據(jù)包給公眾號(hào)
{
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "廣州",
"province": "廣東",
"country": "中國(guó)",
"headimgurl":"http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time": 1382694957,
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "",
"groupid": 0,
"tagid_list":[128,2]
}
參數(shù)說明:
這樣就用用戶之前保存的openid?獲取到Unionid了壹蔓。
寫了個(gè)多線程調(diào)用微信的接口亚隅,半個(gè)多小時(shí)就把幾十萬用戶的openid、更換為了Unionid了庶溶。
有不對(duì)的地方煮纵,或者疑問歡迎留言。