微信小程序的登錄,需要獲取到用戶的唯一標識OpenId,這里只涉及到后端代碼,所以前提是前端申請了一個小程序并且有了appid和secret。
文章目錄
一、微信小程序登錄流程
二、代碼實現(xiàn)
1.引入相關(guān)依賴
2.代碼實現(xiàn)
實際項目經(jīng)驗分享
一、微信小程序登錄流程
先上官方開發(fā)文檔連接
小程序登錄 | 微信開發(fā)文檔
????????上面就是微信的官方開發(fā)文檔,在獲取openid之前,需要小程序端調(diào)用官方提供的接口wx.login()去獲取code(臨時登入憑證),通過自己的后端請求,把code傳給到服務(wù)端(自己的后端),服務(wù)端根據(jù) 小程序的appid+secret+js_code+grant_type去調(diào)用微信提供好的接口,獲取到session_key和openid,openId就是用戶在這個小程序中的唯一標識,拿到OpenId后,我們就能進行相關(guān)操作,處理好后返回數(shù)據(jù)給小程序端。
二、代碼實現(xiàn)
1.引入相關(guān)依賴
????????由于項目中需要使用到微信的第三方接口的調(diào)用,以及對返回json數(shù)據(jù)的解析,在這我強烈推薦由國人生產(chǎn)的HuTool工具包,里面有許多方便的接口,比如第三方接口的調(diào)用,Json數(shù)據(jù)的解析與轉(zhuǎn)換,隨機數(shù)字的生成;可以提高效率。
<!--hutool具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.0</version>
</dependency>
2.代碼實現(xiàn)
代碼如下:
代碼中需要用到的參數(shù)要根據(jù)自己申請的小程序中的參數(shù)對應(yīng)文章來源:http://www.zghlxwxcb.cn/news/detail-531961.html
package com.lyj.ylwechat.util;
import cn.hutool.core.codec.Base64;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.Security;
import java.util.Arrays;
import java.util.HashMap;
public class WeChatUtil {
public static JSONObject getSessionKeyOrOpenId(String code) {
//微信小程序官方接口
String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
//接口所需參數(shù)
HashMap<String, Object> requestUrlParam = new HashMap<>();
//小程序appId
requestUrlParam.put("appid", "wx08613a542bab");
//小程序secret
requestUrlParam.put("secret", "5f929f8894a2f7d58ef5d0ef1d6");
//小程序端返回的code
requestUrlParam.put("js_code", code);
//默認參數(shù),固定寫死即可
requestUrlParam.put("grant_type", "authorization_code");
//發(fā)送post請求讀取調(diào)用微信接口獲取openid用戶唯一標識
String result = HttpUtil.get(requestUrl, requestUrlParam);
JSONObject jsonObject = JSONUtil.parseObj(result);
String openid = jsonObject.get("openid", String.class);
return jsonObject;
}
public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) throws Exception {
// 被加密的數(shù)據(jù)
byte[] dataByte = Base64.decode(encryptedData);
// 加密秘鑰
byte[] keyByte = Base64.decode(sessionKey);
// 偏移量
byte[] ivByte = Base64.decode(iv);
try {
// 如果密鑰不足16位,那么就補足. 這個if 中的內(nèi)容很重要
int base = 16;
if (keyByte.length % base != 0) {
int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
keyByte = temp;
}
// 初始化
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
parameters.init(new IvParameterSpec(ivByte));
// 初始化
cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
byte[] resultByte = cipher.doFinal(dataByte);
if (null != resultByte && resultByte.length > 0) {
String result = new String(resultByte, "UTF-8");
return JSONUtil.parseObj(result);
}
} catch (Exception e) {
}
return null;
}
}
實際項目經(jīng)驗分享
????????上面僅僅是獲取到了用戶在申請小程序端中的唯一標識Openid,拿到OpenId等信息之后,可以把用戶信息保存到數(shù)據(jù)庫。將openid保存下來,與token(自定義登入狀態(tài))來進行關(guān)聯(lián),最后把小程序需要的數(shù)據(jù)返回給小程序端,以后就通過token來維護用戶登入狀態(tài)。文章來源地址http://www.zghlxwxcb.cn/news/detail-531961.html
到了這里,關(guān)于微信小程序登錄獲取用戶唯一標識OpenId,(SpringBoot項目)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!