微信授權(quán)注冊(cè)與登陸

????????前段時(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)微信登錄

也可以在自己的網(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ì)的地方煮纵,或者疑問歡迎留言。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偏螺,一起剝皮案震驚了整個(gè)濱河市行疏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌套像,老刑警劉巖酿联,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異夺巩,居然都是意外死亡贞让,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門柳譬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喳张,“玉大人,你說我怎么就攤上這事美澳∠浚” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵制跟,是天一觀的道長(zhǎng)舅桩。 經(jīng)常有香客問我,道長(zhǎng)雨膨,這世上最難降的妖魔是什么擂涛? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮聊记,結(jié)果婚禮上撒妈,老公的妹妹穿的比我還像新娘。我一直安慰自己甥雕,他們只是感情好踩身,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布胀茵。 她就那樣靜靜地躺著社露,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琼娘。 梳的紋絲不亂的頭發(fā)上峭弟,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天附鸽,我揣著相機(jī)與錄音,去河邊找鬼瞒瘸。 笑死坷备,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的情臭。 我是一名探鬼主播省撑,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俯在!你這毒婦竟也來了竟秫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤跷乐,失蹤者是張志新(化名)和其女友劉穎肥败,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愕提,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馒稍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浅侨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纽谒。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖如输,靈堂內(nèi)的尸體忽然破棺而出佛舱,到底是詐尸還是另有隱情,我是刑警寧澤挨决,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布请祖,位于F島的核電站,受9級(jí)特大地震影響脖祈,放射性物質(zhì)發(fā)生泄漏肆捕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一盖高、第九天 我趴在偏房一處隱蔽的房頂上張望慎陵。 院中可真熱鬧,春花似錦喻奥、人聲如沸席纽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽润梯。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纺铭,已是汗流浹背寇钉。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舶赔,地道東北人扫倡。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像竟纳,于是被迫代替她去往敵國(guó)和親撵溃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354