微信開(kāi)放平臺(tái)(https://open.weixin.qq.com/)移動(dòng)應(yīng)用網(wǎng)站微信公眾平臺(tái)(https://mp.weixin.qq.com/) 服務(wù)號(hào)(Service Account)訂閱號(hào)(Subscription A" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 微信登錄UnionID終極方案——小程序、網(wǎng)站、微信內(nèi)嵌

微信登錄UnionID終極方案——小程序、網(wǎng)站、微信內(nèi)嵌

時(shí)間:2023-05-23 09:12:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-05-23 09:12:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)

微信登錄UnionID終極方案——小程序、網(wǎng)站、微信內(nèi)嵌:微信登錄有多種方式:




從開(kāi)發(fā)者的用戶體驗(yàn)角度來(lái)說(shuō),一個(gè)公司只有一個(gè)開(kāi)發(fā)者平臺(tái),一個(gè)管理員帳號(hào)即可,比如GitHub、Google、FB的開(kāi)發(fā)者平臺(tái)都是如此,里面可以開(kāi)通各個(gè)產(chǎn)品線的API權(quán)限,多人協(xié)作靠組織權(quán)限管理。

而騰訊竟然有多個(gè)開(kāi)放平臺(tái)面向開(kāi)發(fā)者提供服務(wù),每個(gè)都要單獨(dú)注冊(cè),尤其是微信公眾平臺(tái)之內(nèi)的3個(gè)服務(wù):服務(wù)號(hào)、訂閱號(hào)、小程序 竟然要注冊(cè)3個(gè)管理員賬號(hào)……騰訊不是最擅長(zhǎng)用戶體驗(yàn)嗎,開(kāi)放平臺(tái)為什么做的這么差?

那是因?yàn)轵v訊只擅長(zhǎng)“2C”的用戶體驗(yàn),而面向開(kāi)發(fā)者的用戶體驗(yàn)屬于“ToB”,需要技術(shù)架構(gòu)、權(quán)限管理,騰訊很不擅長(zhǎng),畢竟騰訊的技術(shù)已經(jīng)全面落后了。參考騰訊老員工的深度分析:騰訊的技術(shù)建設(shè)是否處于落后同體量公司的狀態(tài)? - 本站

微信網(wǎng)站和服務(wù)號(hào)使用 UnionID 打通

場(chǎng)景:網(wǎng)站使用了“微信掃碼登錄”,而分享到微信后內(nèi)嵌打開(kāi),如果繼續(xù)展示“微信掃碼登錄”,那只能長(zhǎng)按識(shí)別二維碼,是不允許的,會(huì)登錄失敗。

解決辦法:開(kāi)通“服務(wù)號(hào)”授權(quán)登錄。

然后遇到了新問(wèn)題:“網(wǎng)站掃碼登錄”和“服務(wù)號(hào)授權(quán)登錄”拿到的用戶ID竟然不一樣,那就創(chuàng)建了兩個(gè)用戶。

從上面的后臺(tái)可以看出,“網(wǎng)站”是在“微信開(kāi)放平臺(tái)”申請(qǐng)的,而“服務(wù)號(hào)”是在“微信公眾平臺(tái)”申請(qǐng)的,所以兩邊的用戶登錄數(shù)據(jù)是不通的,很坑!按照正常的技術(shù)水平,應(yīng)該在一個(gè)地方申請(qǐng),就像“App”和“網(wǎng)站”就是通的。

解決辦法:把“服務(wù)號(hào)”綁定到“微信開(kāi)放平臺(tái)”,都使用UnionID來(lái)創(chuàng)建用戶,而不要再用OpenID。請(qǐng)看騰訊公告:

微信公眾平臺(tái)更新,為開(kāi)發(fā)者提供UnionID機(jī)制
經(jīng)開(kāi)發(fā)者反饋,由于同一公司下多個(gè)公眾號(hào)之間需要用戶帳號(hào)互通,微信開(kāi)放平臺(tái)提供了UnionID機(jī)制,來(lái)解決此問(wèn)題。
通過(guò)獲取用戶基本信息接口,開(kāi)發(fā)者可通過(guò)OpenID來(lái)獲取用戶基本信息,而如果開(kāi)發(fā)者擁有多個(gè)公眾號(hào),可使用以下辦法通過(guò)UnionID機(jī)制來(lái)在多公眾號(hào)之間進(jìn)行用戶帳號(hào)互通。
1. 將多個(gè)公眾號(hào)綁定到同一個(gè)微信開(kāi)放平臺(tái)(http://open.weixin.qq.com)帳號(hào)下,即同一個(gè)Union下
2. 通過(guò)獲取用戶基本信息接口中的UnionID來(lái)區(qū)分用戶的唯一性,不過(guò)需要注意的是:公眾號(hào)只有在被綁定到微信開(kāi)放平臺(tái)帳號(hào)下后,才會(huì)獲取UnionID。只要是同一個(gè)微信開(kāi)放平臺(tái)帳號(hào)下的公眾號(hào),用戶的UnionID是唯一的。換句話說(shuō), 同一用戶,對(duì)同一個(gè)微信開(kāi)放平臺(tái)帳號(hào)下的不同應(yīng)用,UnionID是相同的。
微信團(tuán)隊(duì)
2014年06月27日






綁定之后,服務(wù)號(hào)登錄獲得的用戶數(shù)據(jù)如下:

{ "city" : "嘉定", "nickname" : "sink", "country" : "中國(guó)", "sex" : 1, "privilege" : [], "headimgurl" : "http://thirdwx.qlogo.cn/mmopen/vi_32/xxx", "unionid" : "o8kXM0YPa8C_Qnih9cCwGpe1sABQ", "openid" : "oZg120nIyCJzEAyXKD5LJR8HhKCk", "language" : "zh_CN", "province" : "杭州"}對(duì)比網(wǎng)站登錄的數(shù)據(jù):

{ "language" : "zh_CN", "privilege" : [], "sex" : 1, "unionid" : "o8kXM0YPa8C_Qnih9cCwGpe1sABQ", "country" : "中國(guó)", "city" : "嘉定", "headimgurl" : "http://thirdwx.qlogo.cn/mmopen/vi_32/xxx", "province" : "杭州", "openid" : "o0Xnp5liQw-fxkm8OLrbbPvljr48", "nickname" : "sink"}可以看到 unionid 相同,而 openid 不同。

還可以看出騰訊招了一些英語(yǔ)四級(jí)忘光的馬大哈程序員,代碼非常不規(guī)范,unionid 既不是駝峰也是下劃線風(fēng)格,導(dǎo)致 IDE 警告。

還可以看出騰訊的程序員在頭像鏈接里使用了下劃線,違反了 domain slug 規(guī)范,會(huì)導(dǎo)致一些問(wèn)題(微博截圖)。

還可以看出騰訊的頭像鏈接竟然沒(méi)有使用 HTTPS……手動(dòng)改成 HTTPS 是能打開(kāi)的,看來(lái)騰訊經(jīng)過(guò)當(dāng)初公眾號(hào)文章被劫持插廣告好幾年之后,服務(wù)器普遍部署了 HTTPS,但由于技術(shù)管理不善,老接口沒(méi)人敢動(dòng),一直還在用 HTTP。

代碼

PHP Laravel

微信小程序登錄使用 UnionID

微信小程序的登錄更詭異,竟然不采用 OAuth 標(biāo)準(zhǔn)(隱式授權(quán)(Implicit) 或 Browser-Based),自己發(fā)明輪子造了一堆亂糟糟的接口??梢哉f(shuō)小程序是騰訊技術(shù)最差時(shí)的產(chǎn)品,連京東都看不下去了……Look:《小程序開(kāi)發(fā)效率提升神獸:京東Taro誕生記》

閱讀官方文檔《小程序登錄》和《小程序 UnionID 機(jī)制說(shuō)明》,可以看出小程序免授權(quán)登錄時(shí)無(wú)法獲得 UnionID,也就是說(shuō):訪客打開(kāi)小程序,就能獲取 OpenID,如果這時(shí)后端就創(chuàng)建一個(gè) user,那就壞了,之后用戶授權(quán)拿到 UnionID,發(fā)現(xiàn) 網(wǎng)站/App 已經(jīng)用它創(chuàng)建了 user,就會(huì)面臨兩個(gè) user 無(wú)法合并的問(wèn)題。

所以,正確的做法是:訪客打開(kāi)小程序,算作 session,而不是 user。就像電商網(wǎng)站不登錄也可以加購(gòu)物車一樣。

小程序是JS應(yīng)用,調(diào)遠(yuǎn)程接口,主流是用 HTTP Header token,無(wú)法像網(wǎng)站那樣把 session ID 放在 Cookie 或 Query String 里,怎么辦呢?

有兩種辦法:

  1. 造輪子,在 API 里模仿 session 生成 ID,當(dāng)做 token 返回。
  2. 使用標(biāo)準(zhǔn) session,這樣 API 里可以使用各種成熟的 session 中間件。
顯然是第2種好。開(kāi)啟 session use query string,調(diào)用接口時(shí)加上參數(shù)即可:

curl -i 'http://demo.localhost/php.php?PHPSESSID=npvh65dsqshgk24qj4a1nitmoc'但這樣和 token 機(jī)制不一致,而且不安全,不推薦:

; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
經(jīng)過(guò)試驗(yàn)發(fā)現(xiàn),最優(yōu)雅的方案是:使用 token,在 HTTP server 層面轉(zhuǎn)成 Cookie: session ID,詳細(xì)步驟請(qǐng)看:Apache change Cookie

apache config /etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80> SetEnvIf Authorization "^Session/ (.*)$" session=$1 RequestHeader set Cookie "PHPSESSID=%{session}e" env=session</VirtualHost>php /var/www/html/php.php

<?phpsession_start();var_dump(session_id());var_dump($_COOKIE);shell result

curl -i 'http://demo.localhost/php.php' -H 'Authorization: Session npvh65dsqshgk24qj4a1nitmoc'HTTP/1.1 200 OKDate: Sun, 21 Apr 2019 08:54:59 GMTServer: Apache/2.4.34 (Ubuntu)Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidatePragma: no-cacheVary: Accept-EncodingContent-Length: 113Content-Type: text/html; charset=UTF-8string(26) "npvh65dsqshgk24qj4a1nitmoc"array(1) { ["PHPSESSID"]=> string(26) "npvh65dsqshgk24qj4a1nitmoc"}后續(xù)工作:

  1. 把從微信接口取的 session_key 存在 session 里,生成 session id 給前端。
  2. 當(dāng)微信授權(quán)時(shí),獲得 UnionID,后端創(chuàng)建 user,把之前的 session_key 存起來(lái),生成 token 給前端。
當(dāng)然也是要把“微信公眾平臺(tái)”的“小程序”綁定到“微信開(kāi)放平臺(tái)”,才能獲得 UnionID。




代碼

TODO

后續(xù)更新請(qǐng)看原文:https://sinkcup.github.io/wechat-login-union-id

參考資料

  1. 騰訊的技術(shù)建設(shè)是否處于落后同體量公司的狀態(tài)? - 本站
  2. 微信開(kāi)放平臺(tái) - OAuth - 獲取用戶個(gè)人信息(UnionID機(jī)制)
  3. 微信公眾平臺(tái) - 不是OAuth - 小程序UnionID 機(jī)制說(shuō)明
  4. 如何看待騰訊 2018 年的架構(gòu)調(diào)整?為什么要將 OMG 等部門做整合? - 本站
  5. Laravel 微信登錄——一鍵安裝,5分鐘搞定 - sink

關(guān)鍵詞:程序,方案,終極

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉