OpenID 和 UnionID 是什么
OpenID 是微信提供給開發(fā)者的用戶唯一標(biāo)識越妈。然而當(dāng)開發(fā)者擁有多個移動應(yīng)用季俩、網(wǎng)站應(yīng)用、和公眾賬號(包括小程序)時梅掠,同一用戶酌住、不同應(yīng)用下的 OpenID 是不一樣的店归。
而同一個微信開放平臺賬號下的不同應(yīng)用,用戶的 UnionID 是唯一的赂韵。
因此娱节,對有多個應(yīng)用的開發(fā)者來講,只有通過 UnionID 來區(qū)分用戶的唯一性祭示,才能實現(xiàn)多個應(yīng)用間的賬號打通肄满。
應(yīng)該使用哪個 ID 登錄
理論上講,當(dāng)產(chǎn)品有App质涛、小程序稠歉、公眾號等多種形式時,用 UnionID 是最好的選擇汇陆,否則會因為同一用戶在不同應(yīng)用下的 OpenID 不一樣導(dǎo)致產(chǎn)生多個賬號怒炸,那處理起來就很麻煩了。
然而 UnionID 并不是那么容易獲取的毡代。微信小程序最新的限制是:
- 必須使用一個專用按鈕控件讓用戶主動點擊阅羹,否則無法彈出授權(quán)彈窗
- 用戶必須點擊「允許」同意小程序獲取公開信息
以上2步,每一步都會造成一定的用戶流失教寂。所以有的開發(fā)者會使用 OpenID 捏鱼,以最大程度的降低用戶獲取的成本,從而推動注冊用戶數(shù)的快速增長酪耕。
拿拼多多來說导梆,用戶打開小程序之后會靜默獲取 OpenID 并生成賬號,可以正常使用購物車迂烁、歷史記錄等服務(wù)看尼。用戶在「個人中心」頁面點擊「更新資料」時就會觸發(fā)授權(quán)彈窗獲取公開信息和 UnionID。
對于不同的業(yè)務(wù)場景盟步,會有各自最適合的選擇藏斩。深入研究下微信的機制,或許能有一些啟發(fā)却盘,在某些場景下可以嘗試優(yōu)化用戶獲取的路徑灾茁。
小程序 OpenID 和 UnionID 獲取機制
在小程序的官方文檔里有一張圖解釋了小程序調(diào)用wx.login接口的登錄流程。不過那張圖除了開發(fā)能看懂谷炸,一般人應(yīng)該都看不懂什么意思。翻譯成一般人都能看懂的圖禀挫,小程序登錄流程是這樣的:
- 首先旬陡,開發(fā)者可以在小程序中靜默調(diào)用登錄接口,拿到一個憑證
- 小程序把憑證發(fā)送到開發(fā)者的服務(wù)器上
- 服務(wù)器拿著這個憑證以及小程序密鑰向微信接口請求換取 OpenID
- 微信接口返回 OpenID 給開發(fā)者服務(wù)器语婴,滿足特殊條件時會一并返回 UnionID
- 開發(fā)者服務(wù)器創(chuàng)建登錄態(tài)并返回給小程序描孟,從而完成登錄
其中第4點驶睦,在滿足下面任何一個條件時可以同時獲得 UnionID:
- 如果開發(fā)者賬號下存在同主體的公眾號,并且該用戶已經(jīng)關(guān)注了該公眾號
- 如果開發(fā)者賬號下存在同主體的公眾號或移動應(yīng)用匿醒,并且該用戶已經(jīng)授權(quán)登錄過該公眾號或移動應(yīng)用
此時獲取該用戶 UnionID 是不需要用戶再次授權(quán)的场航。
除了調(diào)用登錄接口,用戶在小程序中支付完成5分鐘內(nèi)廉羔,開發(fā)者可以直接通過 getPaidUnionID 接口獲取該用戶的 UnionID溉痢,也不需要用戶授權(quán)。
總結(jié)一下:
OpenID可以無感獲取憋他。
而無感獲取 UnionID 必須滿足以下任一條件:
- 用戶已經(jīng)關(guān)注了同主體的公眾號
- 用戶已經(jīng)授權(quán)過同主體的其他應(yīng)用獲取 UnionID
- 用戶剛剛通過小程序完成了支付
否則就必須讓用戶主動點擊按鈕并允許獲取公開信息后孩饼,才可以獲得 UnionID。
公開信息有哪些
最后說說微信的用戶公開信息(UserInfo)究竟包含哪些信息:
- 微信昵稱
- 微信頭像圖片的URL竹挡,如果用戶沒有頭像镀娶,URL會是空的。如果用戶更換了頭像揪罕,原有頭像的URL會失效
- 用戶性別:未知梯码、男性、女性
- 所在國家
- 所在省份
- 所在城市
- 國家好啰、省份轩娶、城市所用的語言:英文、簡體中文坎怪、繁體中文
與用戶信息一并返回的還有一串加密信息罢坝,轉(zhuǎn)交給開發(fā)者的服務(wù)器解密之后,就可以得到用戶的 OpenID 和 UnionID 了搅窿。
一件比較tricky的事情是嘁酿,如果只是需要在小程序中展示用戶頭像和昵稱,可以使用 <open-data>
男应,微信在渲染小程序的時候會顯示用戶的頭像和昵稱闹司。但是此時只是顯示出來能被用戶看到,開發(fā)者并不能拿到用戶頭像昵稱的數(shù)據(jù)沐飘,所以這個時候就不要想什么分享到聊天的時候小程序卡片標(biāo)題能帶上用戶昵稱了游桩。
<open-data type="userAvatarUrl"></open-data>
<open-data type="userNickName"></open-data>
通過<open-data>
除了可以不經(jīng)過授權(quán)直接展示頭像、昵稱之外耐朴,還可以直接展示:
- 用戶性別
- 用戶所在國家
- 用戶所在城市
- 用戶所在省份
- 用戶的語言
- 群名稱(必須是用戶曾經(jīng)分享過小程序的群)