OpenID 和 UnionID 是什么
OpenID 是微信提供給開發(fā)者的用戶唯一標(biāo)識(shí)。然而當(dāng)開發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用、和公眾賬號(hào)(包括小程序)時(shí),同一用戶、不同應(yīng)用下的 OpenID 是不一樣的。
而同一個(gè)微信開放平臺(tái)賬號(hào)下的不同應(yīng)用,用戶的 UnionID 是唯一的。
因此,對(duì)有多個(gè)應(yīng)用的開發(fā)者來講,只有通過 UnionID 來區(qū)分用戶的唯一性,才能實(shí)現(xiàn)多個(gè)應(yīng)用間的賬號(hào)打通。
應(yīng)該使用哪個(gè) ID 登錄
理論上講,當(dāng)產(chǎn)品有App、小程序、公眾號(hào)等多種形式時(shí),用 UnionID 是最好的選擇,否則會(huì)因?yàn)橥挥脩粼诓煌瑧?yīng)用下的 OpenID 不一樣導(dǎo)致產(chǎn)生多個(gè)賬號(hào),那處理起來就很麻煩了。
然而 UnionID 并不是那么容易獲取的。微信小程序最新的限制是:
- 必須使用一個(gè)專用按鈕控件讓用戶主動(dòng)點(diǎn)擊,否則無法彈出授權(quán)彈窗
- 用戶必須點(diǎn)擊「允許」同意小程序獲取公開信息

以上2步,每一步都會(huì)造成一定的用戶流失。所以有的開發(fā)者會(huì)使用 OpenID ,以最大程度的降低用戶獲取的成本,從而推動(dòng)注冊(cè)用戶數(shù)的快速增長(zhǎng)。
拿拼多多來說,用戶打開小程序之后會(huì)靜默獲取 OpenID 并生成賬號(hào),可以正常使用購(gòu)物車、歷史記錄等服務(wù)。用戶在「?jìng)€(gè)人中心」頁(yè)面點(diǎn)擊「更新資料」時(shí)就會(huì)觸發(fā)授權(quán)彈窗獲取公開信息和 UnionID。

對(duì)于不同的業(yè)務(wù)場(chǎng)景,會(huì)有各自最適合的選擇。深入研究下微信的機(jī)制,或許能有一些啟發(fā),在某些場(chǎng)景下可以嘗試優(yōu)化用戶獲取的路徑。
小程序 OpenID 和 UnionID 獲取機(jī)制
在小程序的官方文檔里有一張圖解釋了小程序調(diào)用wx.login接口的登錄流程。不過那張圖除了開發(fā)能看懂,一般人應(yīng)該都看不懂什么意思。翻譯成一般人都能看懂的圖,小程序登錄流程是這樣的:

- 首先,開發(fā)者可以在小程序中靜默調(diào)用登錄接口,拿到一個(gè)憑證
- 小程序把憑證發(fā)送到開發(fā)者的服務(wù)器上
- 服務(wù)器拿著這個(gè)憑證以及小程序密鑰向微信接口請(qǐng)求換取 OpenID
- 微信接口返回 OpenID 給開發(fā)者服務(wù)器,滿足特殊條件時(shí)會(huì)一并返回 UnionID
- 開發(fā)者服務(wù)器創(chuàng)建登錄態(tài)并返回給小程序,從而完成登錄
其中第4點(diǎn),在滿足下面任何一個(gè)條件時(shí)可以同時(shí)獲得 UnionID:
- 如果開發(fā)者賬號(hào)下存在同主體的公眾號(hào),并且該用戶已經(jīng)關(guān)注了該公眾號(hào)
- 如果開發(fā)者賬號(hào)下存在同主體的公眾號(hào)或移動(dòng)應(yīng)用,并且該用戶已經(jīng)授權(quán)登錄過該公眾號(hào)或移動(dòng)應(yīng)用
此時(shí)獲取該用戶 UnionID 是不需要用戶再次授權(quán)的。
除了調(diào)用登錄接口,用戶在小程序中支付完成5分鐘內(nèi),開發(fā)者可以直接通過 getPaidUnionID 接口獲取該用戶的 UnionID,也不需要用戶授權(quán)。
總結(jié)一下:
OpenID可以無感獲取。
而無感獲取 UnionID 必須滿足以下任一條件:
- 用戶已經(jīng)關(guān)注了同主體的公眾號(hào)
- 用戶已經(jīng)授權(quán)過同主體的其他應(yīng)用獲取 UnionID
- 用戶剛剛通過小程序完成了支付
否則就必須讓用戶主動(dòng)點(diǎn)擊按鈕并允許獲取公開信息后,才可以獲得 UnionID。
公開信息有哪些
最后說說微信的用戶公開信息(UserInfo)究竟包含哪些信息:
- 微信昵稱
- 微信頭像圖片的URL,如果用戶沒有頭像,URL會(huì)是空的。如果用戶更換了頭像,原有頭像的URL會(huì)失效
- 用戶性別:未知、男性、女性
- 所在國(guó)家
- 所在省份
- 所在城市
- 國(guó)家、省份、城市所用的語(yǔ)言:英文、簡(jiǎn)體中文、繁體中文
與用戶信息一并返回的還有一串加密信息,轉(zhuǎn)交給開發(fā)者的服務(wù)器解密之后,就可以得到用戶的 OpenID 和 UnionID 了。
一件比較tricky的事情是,如果只是需要在小程序中展示用戶頭像和昵稱,可以使用 <open-data>,微信在渲染小程序的時(shí)候會(huì)顯示用戶的頭像和昵稱。但是此時(shí)只是顯示出來能被用戶看到,開發(fā)者并不能拿到用戶頭像昵稱的數(shù)據(jù),所以這個(gè)時(shí)候就不要想什么分享到聊天的時(shí)候小程序卡片標(biāo)題能帶上用戶昵稱了。
<open-data type="userAvatarUrl"></open-data>
<open-data type="userNickName"></open-data>
通過<open-data>除了可以不經(jīng)過授權(quán)直接展示頭像、昵稱之外,還可以直接展示:
- 用戶性別
- 用戶所在國(guó)家
- 用戶所在城市
- 用戶所在省份
- 用戶的語(yǔ)言
- 群名稱(必須是用戶曾經(jīng)分享過小程序的群)