微信網頁開發之獲取用戶unionID的兩種方法--基於微信的多點登錄用戶識別

来源:http://www.cnblogs.com/yangtoude/archive/2016/12/31/multi-site-login-based-on-wechat.html
-Advertisement-
Play Games

假設網站A有以下功能需求:1,pc端微信掃碼登錄;2,微信瀏覽器中的靜默登錄功能需求,這兩種需求就需要用到用戶的unionID,這樣才能在多個登錄點(終端)識別用戶。那麼這兩種需求下用戶的unionID該如何獲取呢? 1,先看pc端的解決方案 以snsapi_login為scope發起網頁授權,先拿 ...


假設網站A有以下功能需求:1,pc端微信掃碼登錄;2,微信瀏覽器中的靜默登錄功能需求,這兩種需求就需要用到用戶的unionID,這樣才能在多個登錄點(終端)識別用戶。那麼這兩種需求下用戶的unionID該如何獲取呢?

1,先看pc端的解決方案

以snsapi_login為scope發起網頁授權,先拿網站應用的appid和secret用授權介面獲取“網頁授權access_token”,再利用“網頁授權access_token”通過“拉取用戶信息的api介面”拉取用戶信息從而獲得unionId。

此方法適合場景:在不使用微信公眾號(訂閱號、服務號)的情況下,通過微信開放平臺下的網站應用來實現pc端網站的微信掃碼登錄功能。這個場景需求相對來說比較簡單,可參考按照微信開放平臺的技術文檔“網站應用”--“微信登錄功能”一節來實現編碼,下麵只把用戶掃描二維碼授權微信登錄(用戶掃描二維碼併在微信客戶端彈出的授權視窗點擊確認登錄後)後如何獲取unionID的方法和過程描述下。

用戶授權登錄後重定向到網站A的登錄頁,並帶回code和state參數。先拿code獲取網頁授權access_token:

1         $curl = new Curl();
2         $wxresponse = $curl->get('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid
3             . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code');
4         $wxresult = json_decode($wxresponse);

請求參數說明:

1 參數          是否必須    說明
2 appid          是    應用唯一標識,在微信開放平臺提交應用審核通過後獲得
3 secret         是    應用密鑰AppSecret,在微信開放平臺提交應用審核通過後獲得
4 code           是    填寫第一步獲取的code參數
5 grant_type     是    填authorization_code

如果請求正確,返回值:

{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE" 
}
參數             說明
access_token    介面調用憑證
expires_in      access_token介面調用憑證超時時間,單位(秒)
refresh_token   用戶刷新access_token
openid          授權用戶唯一標識
scope           用戶授權的作用域,使用逗號(,)分隔

可以看到除access_token外,還可以獲得openid。

然後用拿到的access_token和openid獲取unionID:

1     //獲取用戶個人信息
2     $response = $curl->get('https://api.weixin.qq.com/sns/userinfo?access_token=' . $wxresult->access_token
3         . '&openid=' . $wxresult->openid);

返回值就不詳細寫了,其中就有用戶的unionID。

 

2,再看手機端微信瀏覽器的解決方案

方法一:以snsapi_userinfo為scope發起網頁授權,獲取unionID過程與pc端的相同,但要用到微信公眾號中的服務號appid和secret獲取網頁授權access_token。

1              // 用戶是從微信訪問此頁面,直接調用微信驗證
2              header('Location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid
3                 . '&redirect_uri=http%3A%2F%2Fwww.host.com%2Fsite%2Fcallback'
4                 . '&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect');
5              exit;

這種方法在微信瀏覽器中的體驗並不好,因為當用戶在微信瀏覽器中瀏覽網頁時點擊了某個網頁觸發登錄功能時會彈出授權視窗,而比較好的體驗應該是,用戶觸發登錄功能時應該是無感知的,下麵的方法二就可以實現這種需求。

 

方法二:以snsapi_base為scope發起網頁授權,先用公眾號的appid和secret獲取微信公眾號的全局唯一憑證access_token,然後用拿到的access_token調用公眾號的“用戶管理介面”中的“獲取用戶信息介面”獲得unionID。

發起授權請求,因為以snsapi_base為scope發起網頁授權請求,所以授權是靜默的,用戶是無感知的微信公眾平臺開發文檔網頁授權一節中有說明。

1             header('Location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid
2                 . '&redirect_uri=http%3A%2F%2Fwww.host.com%2Fsite%2Fcallback'
3                 . '&response_type=code&scope=snsapi_base&state=state#wechat_redirect');
4             exit;

獲取公眾號全局唯一access_token

            $curl = new Curl();
            $curl->setOption(CURLOPT_SSL_VERIFYPEER, false);
            $tokenresult = $curl->get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $secret);

如果請求正確的話,返回值:

1 {"access_token":"ACCESS_TOKEN","expires_in":7200}
2 
3 參數                    說明
4 access_token           獲取到的憑證
5 expires_in            憑證有效時間,單位:秒

調用公眾號“獲取用戶信息介面”:

1                 $response = $curl->get('https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $token . '&openid=' . $wxresult->openid . '&lang=zh_CN');

如果正確的話,返回值示例:

 1 {
 2    "subscribe": 1,
 3    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
 4    "nickname": "Band",
 5    "sex": 1,
 6    "language": "zh_CN",
 7    "city": "廣州",
 8    "province": "廣東",
 9    "country": "中國",
10 
11    "headimgurl":  "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4
12 
13 eMsv84eavHiaiceqxibJxCfHe/0",
14   "subscribe_time": 1382694957,
15   "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
16   "remark": "",
17 
18   "groupid": 0,
19 
20   "tagid_list":[128,2]
21 }
22 
23 參數說明
24 參數    說明
25 subscribe    用戶是否訂閱該公眾號標識,值為0時,代表此用戶沒有關註該公眾號,拉取不到其餘信息。
26 openid    用戶的標識,對當前公眾號唯一
27 nickname    用戶的昵稱
28 sex    用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知
29 city    用戶所在城市
30 country    用戶所在國家
31 province    用戶所在省份
32 language    用戶的語言,簡體中文為zh_CN
33 headimgurl    用戶頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空。若用戶更換頭像,原有頭像URL將失效。
34 subscribe_time    用戶關註時間,為時間戳。如果用戶曾多次關註,則取最後關註時間
35 unionid    只有在用戶將公眾號綁定到微信開放平臺帳號後,才會出現該欄位。
36 remark    公眾號運營者對粉絲的備註,公眾號運營者可在微信公眾平臺用戶管理界面對粉絲添加備註
37 groupid    用戶所在的分組ID(相容舊的用戶分組介面)
38 tagid_list    用戶被打上的標簽ID列表

 

 3,總結

用戶無論從pc端登錄網站還是從微信瀏覽器中訪問網站,我們都能獲取unionID,從而實現了多點登錄的用戶識別。


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 許多人都有各自的興趣,如打球、踢毽子、看書、看電視、玩游戲等等....我近來迷上了猜燈謎,於是業餘做了一個線上猜燈謎的網站:何問起謎語。先出個謎語讓你猜猜:不可缺一點(打一字)。可以線上猜:http://m.hovertree.com/miyu/bjae/j13e2e2e.htm,輸入答案,點擊“猜 ...
  • 劉海峰:國內知名微軟開源技術網站51Aspx 創始人,十年以上的Asp.net從業經驗,微軟MSDN特約講師、Teched講師、ImagineCup大賽評委、人大出版社研修班特約講師,曾多次受邀訪問美國西雅圖的微軟總部,2009年與業內知名MVP組建易縱互聯(北京)科技有限公司並任運營總監。現專註於 ...
  • 1. 適用場景 實現條件的過濾和查詢等功能。 2. 說明 跟SQL語句中的where作用相似,都起到了範圍的限定即過濾的作用,而判斷條件是緊跟後面的條件子句。where主要分為三種形式:簡單形式、條件形式、First()形式,下麵分別舉例測試一下: 2.1 簡單形式 例如:查詢在倫敦購買的訂單。 例 ...
  • 純粹是記錄一下自己在剛開始使用的時候遇到的一些坑,以及自己是怎樣通過配合redis來解決問題的。文章分為三個部分,一是怎樣跑起來,並且怎樣監控相關的隊列和任務;二是遇到的幾個坑;三是給一些自己配合redis使用的代碼示例。 一.celery使用: Ⅰ.把任務中間件伺服器跑起來,rabbitmq-se ...
  • Input 輸入數據首先包括一個整數C,表示測試實例的個數,每個測試實例的第一行是一個整數N(1 <= N <= 100),表示數塔的高度,接下來用N行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。 Output 對於每個測試實例,輸出可能得到的最大和,每個實例的輸出占一 ...
  • 在學習CGlib動態代理時,遇到如下錯誤: Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V 經過百度上尋找答案,是jar包衝突導致,解決方案: 把cgli ...
  • 今天學習主要內容: Python: 1、with語句(補充昨天的文件操作) 用with打開的文件在腳本結束會自動關閉,以防普通打開方式忘記關閉文件連接 語法: with open("demo.txt","r",encoding="utf-8") as file: for line in file: ...
  • JVM的類載入機制就是:JVM把描述類的class文件載入到記憶體,並對數據進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java類型 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...