我們在做微信開(kāi)發(fā)的時(shí)候有時(shí)候需要確認用戶(hù)身份來(lái)完成登錄注冊、消息推送、用戶(hù)關(guān)聯(lián)、快捷登錄等功能,但是小程序或H5應該在何時(shí)獲取openid或unionid,如何才能設計出更加順滑的操作,讓產(chǎn)品經(jīng)理們倍感頭疼,今天就來(lái)簡(jiǎn)單講講H5和小程序獲取用戶(hù)信息的機制。
什么是openid、unionid和用戶(hù)基本信息?
WechatIMG506.png
這張圖的意思是說(shuō),同一個(gè)微信用戶(hù)在不同的應用中存在不同的唯一ID,就是openid,但是當兩個(gè)應用綁定在同一個(gè)微信開(kāi)發(fā)者平臺賬號下的時(shí)候,可以判斷出兩個(gè)openid關(guān)聯(lián)的是同一個(gè)unionid,這樣,開(kāi)發(fā)者就知道兩個(gè)應用中的兩個(gè)用戶(hù)其實(shí)是同一個(gè)用戶(hù)。需要注意,假如兩個(gè)應用沒(méi)有綁定在同一個(gè)開(kāi)發(fā)者賬號下,那意味著(zhù)無(wú)法獲取到unionid。
用戶(hù)基本信息包括:openid、unionid、昵稱(chēng)、頭像、所在城市等眾多信息,我們不需要明確太多,完全可以查看接口,這里要注意的是用戶(hù)基本信息是包括unionid的,但是如果沒(méi)有申請開(kāi)發(fā)者平臺賬號并進(jìn)行應用的綁定,那么用戶(hù)基本信息是無(wú)法返回unionid的。
H5如何獲取用戶(hù)的openid和unionid
明確H5:
這里說(shuō)的H5,是指網(wǎng)頁(yè)應用,也就是說(shuō)用戶(hù)在微信客戶(hù)端訪(fǎng)問(wèn)網(wǎng)頁(yè)應用,可以通過(guò)授權機制獲取到用戶(hù)的信息,進(jìn)而實(shí)現業(yè)務(wù)邏輯。
網(wǎng)頁(yè)授權回調域名的說(shuō)明:
(翻譯一下,就是H5網(wǎng)頁(yè)在微信公眾號的配置,這個(gè)不難,也不是重點(diǎn),就直接復制微信開(kāi)發(fā)者文檔里面的內容看看就行了)
(1) 在微信公眾號請求用戶(hù)網(wǎng)頁(yè)授權之前,開(kāi)發(fā)者需要先到公眾平臺官網(wǎng)中的“開(kāi)發(fā) - 接口權限 - 網(wǎng)頁(yè)服務(wù) - 網(wǎng)頁(yè)賬號 - 網(wǎng)頁(yè)授權獲取用戶(hù)基本信息”的配置選項中,修改授權回調域名。請注意,這里填寫(xiě)的是域名(是一個(gè)字符串),而不是URL,因此請勿加 http:// 等協(xié)議頭;
(2) 授權回調域名配置規范為全域名,比如需要網(wǎng)頁(yè)授權的域名為:
www.qq.com,配置以后此域名下面的頁(yè)面
http://www.qq.com/music.html 、
http://www.qq.com/login.html 都可以進(jìn)行OAuth2.0鑒權。但
http://pay.qq.com 、
http://music.qq.com 、
http://qq.com 無(wú)法進(jìn)行OAuth2.0鑒權;
(3) 如果公眾號登錄授權給了第三方開(kāi)發(fā)者來(lái)進(jìn)行管理,則不必做任何設置,由第三方代替公眾號實(shí)現網(wǎng)頁(yè)授權即可。
參考文檔鏈接網(wǎng)頁(yè)授權的兩種形式
官方文檔方式1-靜默授權獲取openid
以snsapi_base為scope發(fā)起的網(wǎng)頁(yè)授權,是用來(lái)獲取進(jìn)入頁(yè)面的用戶(hù)的openid的,并且是靜默授權并自動(dòng)跳轉到回調頁(yè)的。用戶(hù)感知的就是直接進(jìn)入了回調頁(yè)(往往是業(yè)務(wù)頁(yè)面)
方式2-非靜默授權獲取openid
以snsapi_userinfo為scope發(fā)起的網(wǎng)頁(yè)授權,是用來(lái)獲取用戶(hù)的基本信息的。但這種授權需要用戶(hù)手動(dòng)同意,并且由于用戶(hù)同意過(guò),所以無(wú)須關(guān)注,就可在授權后獲取該用戶(hù)的基本信息。
(翻譯:就是說(shuō),用戶(hù)可以通過(guò)授權框確認授權,獲取用戶(hù)的基本信息,這里的基本信息是包含unionid的,但是前提是應用已經(jīng)綁定了微信開(kāi)放平臺的開(kāi)發(fā)者賬號)
到這里兩種方式并沒(méi)有完,微信官方文檔中又增加了一條奇怪的限制:
“用戶(hù)管理類(lèi)接口中的“獲取用戶(hù)基本信息接口”,是在用戶(hù)和公眾號產(chǎn)生消息交互或關(guān)注后事件推送后,才能根據用戶(hù)OpenID來(lái)獲取用戶(hù)基本信息。這個(gè)接口,包括其他微信接口,都是需要該用戶(hù)(即openid)關(guān)注了公眾號后,才能調用成功的?!?div style="height:15px;">
這是因為聰明的開(kāi)發(fā)者想到了規避用戶(hù)授權就能獲取到包括unionid在內的用戶(hù)基本信息的方法,所以在后續的迭代中,微信屏蔽了這個(gè)接口。什么方法呢,就是用靜默的方式獲取到用戶(hù)的openid,然后在“用戶(hù)管理的接口中用openid去查用戶(hù)信息”,如圖:
WechatIMG508.png
那么微信為了規避這種情況的發(fā)生,所以給出了限制,使用用戶(hù)管理類(lèi)接口中的獲取用戶(hù)基本信息的接口時(shí),必須要先關(guān)注公眾號,否則返回的信息只有openid,也就是說(shuō),你只能用openid換回來(lái)openid,等于啥都沒(méi)有~~~
看看用戶(hù)管理類(lèi)接口中的內容:
{ "user_info_list": [ { "subscribe": 1, "openid": "otvxTs4dckWG7imySrJd6jSi0CWE", "nickname": "iWithery", "sex": 1, "language": "zh_CN", "city": "揭陽(yáng)", "province": "廣東", "country": "中國", "headimgurl": "http://thirdwx.qlogo.cn/mmopen/xbIQx1GRqdvyqkMMhEaGOX802l1CyqMJNgUzKP8MeAeHFicRDSnZH7FY4XB7p8XHXIf6uJA2SCunTPicGKezDC4saKISzRj3nz/0", "subscribe_time": 1434093047, "unionid": "oR5GjjgEhCMJFyzaVZdrxZ2zRRF4", "remark": "", "groupid": 0, "tagid_list":[128,2], "subscribe_scene": "ADD_SCENE_QR_CODE", "qr_scene": 98765, "qr_scene_str": "" }, { "subscribe": 0, "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg" } ]}
其中subscribe代表是否關(guān)注了公眾號,1為關(guān)注,0為未關(guān)注,在0的情況下,只返回了openid,1的情況下返回了很多信息。
綜上所述
網(wǎng)頁(yè)應用可以靜默獲取openid,可以授權獲取用戶(hù)基本信息(包括unionid)。
微信小程序如何獲取用戶(hù)的openid和unionid
小程序的登錄時(shí)序圖
api-login.2fcc9f35.jpg
整個(gè)過(guò)程中,其實(shí)是靜默獲取到用戶(hù)的openid的,這一點(diǎn)和早期的小程序不一樣,早期的小程序是通過(guò)用戶(hù)授權才能獲取到openid的。
小程序獲取unionid
方式1-直接調用接口(需要授權):
調用接口 wx.getUserInfo,從解密數據中獲取 UnionID。注意本接口需要用戶(hù)授權,請開(kāi)發(fā)者妥善處理用戶(hù)拒絕授權后的情況。
方式2-存在同主體公眾號且已經(jīng)關(guān)注了該公眾號(無(wú)需授權):
如果開(kāi)發(fā)者賬號下存在同主體的公眾號,并且該用戶(hù)已經(jīng)關(guān)注了該公眾號。開(kāi)發(fā)者可以直接通過(guò) wx.login + code2Session 獲取到該用戶(hù) UnionID,無(wú)須用戶(hù)再次授權。
方式3-存在同主體的公眾號或移動(dòng)應用且已經(jīng)授權登錄過(guò)該公眾號或移動(dòng)應用(無(wú)需授權):
如果開(kāi)發(fā)者賬號下存在同主體的公眾號或移動(dòng)應用,并且該用戶(hù)已經(jīng)授權登錄過(guò)該公眾號或移動(dòng)應用。開(kāi)發(fā)者也可以直接通過(guò) wx.login + code2Session 獲取到該用戶(hù) UnionID ,無(wú)須用戶(hù)再次授權。
方式4-五分鐘內在小程序中完成過(guò)支付(無(wú)需授權):
用戶(hù)在小程序(暫不支持小游戲)中支付完成后,開(kāi)發(fā)者可以直接通過(guò)getPaidUnionId接口獲取該用戶(hù)的 UnionID,無(wú)需用戶(hù)授權。注意:本接口僅在用戶(hù)支付完成后的5分鐘內有效,請開(kāi)發(fā)者妥善處理。
其他方式,與云函數有關(guān):
1、小程序端調用云函數時(shí),如果開(kāi)發(fā)者賬號下存在同主體的公眾號,并且該用戶(hù)已經(jīng)關(guān)注了該公眾號,可在云函數中通過(guò) cloud.getWXContext 獲取 UnionID。
2、小程序端調用云函數時(shí),如果開(kāi)發(fā)者賬號下存在同主體的公眾號或移動(dòng)應用,并且該用戶(hù)已經(jīng)授權登錄過(guò)該公眾號或移動(dòng)應用,也可在云函數中通過(guò) cloud.getWXContext 獲取 UnionID。
綜上所述
小程序可以通過(guò)靜默的方式獲取到openid,但是需要獲取unionid需要使用用戶(hù)授權的方式。
總結
我們可以通過(guò)靜默的方式獲取h5和小程序的openid,通過(guò)授權的方式獲取用戶(hù)信息和unionid,其中小程序的用戶(hù)信息需要考慮加密解密的機制,這里不做陳述,那么產(chǎn)品經(jīng)理們需要注意在什么時(shí)候去獲取用戶(hù)信息,在什么時(shí)候去使用openid,這樣才能打造出更加流暢的用戶(hù)體驗。
作者:王得宇AIPM
微信公眾號:他們已經(jīng)在路上了
他們已經(jīng)在路上了