Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)
目錄
前言
操作流程
1、注冊微信小程序
2、通過后臺獲取小程序碼
注意事項
時序圖理解
方案實現步驟
前言
很多業務場景之下我們需要實現微信掃碼登錄檢測登錄狀態的需求,或需要同步網站與小程序的用戶信息。
如:小程序上的用戶收藏內容與網站收藏相同。或登錄網站后也查看自己的訂單信息。
我們知道微信創建的每一個有 appId 的程序,注冊之后,每個微信用戶在這個小程序里會有一個唯一用戶標識 openid,對于用戶相關的業務可以基于這點展開。
整體認證流及獲取小程序碼的過程對于第一次接觸的人來說有點小復雜,可以看我的開源項目,已經對這些過程進行了封裝
github地址:
https://github.com/Durancer/wx-login-based-on-miniapp.git
gitee地址:
Wx-login-based-on-miniapp: 基于 springboot 實現微信掃描小程序碼登錄,獲取用戶微信信息
下面展示操作流程
1、注冊微信小程序
此方案是基于小程序獲取用戶信息的方案,因此之前你需要注冊一個小程序。
如何注冊微信小程序
2、通過后臺獲取小程序碼
這里先簡單介紹 小程序碼 和 小程序二維碼 的區別。
小程序二維碼就是我們平時掃描的,進入小程序的二維碼。
而小程序碼是我們通過接口生成的 掃描后 可以進入指定頁面(這里就是我們的認證界面),并能攜帶一個參數(scene值),在認證界面進行接收。我們的業務邏輯也將根據這個值展開
可以查看微信開放文檔的相關api
獲取小程序碼 | 微信開放文檔
主要幾點就是:
首先需要獲取 access_token?獲取access_token
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
在通過 access_token 獲取到小程序碼,這里在 postman直接發送請求可以直接獲取到圖片,發送獲取小程序碼的請求是需要傳入一個scene值的(此套掃碼登錄方案就是在成功創建小程序碼后添加一條數據庫信息來檢測此碼的掃描和認證狀態),如果是在java后臺發送,我們需要以 InputStream流 的形式來接收。然后通過流的形式來保存圖片到本地或者服務器(開源項目里已經都做過封裝處理了,歡迎大家star)
獲取不限制的小程序碼 | 微信開放文檔
POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
注意事項
- 如果調用成功,會直接返回圖片二進制內容,如果請求失敗,會返回 JSON 格式的數據。
- POST 參數需要轉成 JSON 字符串,不支持 form 表單提交。
- 接口只能生成已發布的小程序碼
- 調用分鐘頻率受限(5000次/分鐘),如需大量小程序碼,建議預生成
因此,我們就是通過scene 值來區分和標記用戶掃的碼是哪一張的
3、前端處理
PC端掃碼
到了這里說明我們已經保存了剛才請求接口所生成的小程序碼到服務器的某個文件夾下,那么我們只需要通過某種方式將此圖片映射到前端上顯示即可。可以通過配置 springMVC 靜態資源映射(tomcat映射) 或者 nginx 映射?即可。本開源項目使用tomcat映射。ps:當然圖片都保存了,怎么顯示要做修改也就簡單了
移動端
掃描小程序碼將進入我們編寫的指定頁面,我們只要拿到scene值,就可以開始進行業務邏輯處理了。
獲取 scene 值
- scene 字段的值會作為 query 參數傳遞給小程序/小游戲。用戶掃描該碼進入小程序/小游戲后,開發者可以獲取到二維碼中的 scene 值,再做處理邏輯。
- 調試階段可以使用開發工具的條件編譯自定義參數 scene=xxxx 進行模擬,開發工具模擬時的 scene 的參數值需要進行 encodeURIComponent
也就是說,每一張生成的小程序碼是不一樣的,它除了能夠進行掃碼進到指定的頁面,還會攜帶一個 scene 參數,讓我們進行需要的業務邏輯。同時scene值也保證了小程序碼的唯一性
我們需要在小程序中寫一個,類似這樣的界面,掃描二維碼,將進入這個界面
在頁面的js文件中,我們可以這樣獲取到這個 scene值
Page({onLoad (query) {// scene 需要使用 decodeURIComponent 才能獲取到生成二維碼時傳入的 sceneconst scene = decodeURIComponent(query.scene)}
})
接下來就可以進行我們需要的業務邏輯了,本文主要描述登錄的需求。在文首文末的開源項目里有完整認證邏輯參考的 js 文件
時序圖理解
為了更好的理解登陸邏輯我們可以先來看看登錄的 時序圖
方案實現步驟
?準備工作。我們需要準備兩個表 一個是用戶信息表,一個是?小程序碼狀態表?也就是存放?scene值?的表,當然,這個表在認證成功之后需要關聯用戶id,來告知前端認證用戶的信息。
小程序碼狀態表為 status 掃碼狀態、scene場景值
1、獲取小程序碼時,在后臺數據庫創建一條數據,并返回scene值。
2、之后網站端根據 scene值 輪詢 該條數據的認證狀態。用掃碼狀態作為是否繼續輪詢的依據
3、掃碼進入后更新掃碼狀態為 正在掃碼
4、用戶點擊認證或者取消認證,更改掃碼狀態為對應的內容。當web端獲取到的 狀態為 取消認證或已認證時,即可結束輪詢。已認證將在修改狀態之前先插入用戶信息。
5、如果是已認證,該項數據將會攜帶userid,web端可以根據userid查詢到認證用戶的信息。
6、為了避免造成資源的浪費和數據庫垃圾信息。在已認證或取消認證后應該刪除有關信息
這些操作的接口我都已經在
github:
https://github.com/Durancer/wx-login-based-on-miniapp.git
gitee:
Wx-login-based-on-miniapp: 基于 springboot 實現微信掃描小程序碼登錄,獲取用戶微信信息
做好了封裝,有不理解的地方可以到?github、gitee?上提 issue,
如果覺得本文和項目項目有幫助的話,歡迎大家star項目。
最后可以看看我的開源項目: i集大校園
開源地址:GitHub - Durancer/JMU-Campus: i集大校園軟件服務端,基于SpringCloud Alibaba 微服務組件及部分分布式技術實現服務之間關聯及協作進行前后端分離項目實現。計劃實現微信小程序和app兩端同步。
使用技術棧為:Spring Boot、Spring Cloud Alibaba、rabbitMQ、JWT、minIO、mysql、redis、ES、docker
前端使用 微信小程序編寫。
歡迎一起參加貢獻和star項目哈!
總結
以上是生活随笔為你收集整理的Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音麦,音柚,探遇漂流瓶自动打招呼回复源码
- 下一篇: 盘点那些跨界玩到飞起的程序员们!