最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java后端接入微信小程序登錄功能(登錄流程)

 更新時間:2023年06月20日 09:20:29   作者:玄德_hk  
這篇文章主要介紹了Java后端接入微信小程序登錄功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

此文章是Java后端接入微信登錄功能,由于項目需要,舍棄了解密用戶信息的session_key,只保留openid用于檢索用戶信息

后端框架:spring boot

小程序框架:uniapp

流程概括

  • 官方流程:通過自定義登錄態(tài)與openid,session_key關(guān)聯(lián),之后的前后端交互通過自定義登錄態(tài)來識別
  • 只保留登錄流程:使用 spring boot 的session進(jìn)行交互,openid存入數(shù)據(jù)庫,用來檢索用戶信息(可以理解為 openid 作為賬號,只保留此小程序的登錄功能)

官方小程序登錄流程圖解(圖取自官網(wǎng))

  • 通過wx.login()獲取code
  • 將code發(fā)送給后端服務(wù)器,后端會返回一個token,這個token將作為你身份的唯一標(biāo)識。
  • 將token通過wx.setStorageSync()保存在本地存儲。
  • 用戶下次進(jìn)入?面時,會先通過wx.getStorageSync() 方法判斷token是否有值,如果有值,則可以請求其它數(shù)據(jù),如果沒有值,則進(jìn)行登錄操作。

  • openid:用來唯一標(biāo)識用戶的一個字符串,通過openid可以獲取用戶的基本信息(不同小程序中擁有不同openid)
  • code:code是用戶登錄憑證,由微信服務(wù)器頒發(fā)給小程序;后端通過code向微信服務(wù)器請求用戶的openidsession_key等信息。(code是一次性的,且時效為5分鐘)
  • unionid:用于標(biāo)識同一微信開放平臺賬號下多個應(yīng)用的用戶,多個小程序中的unionid是相同的

接入小程序登錄(只保留 openid 登錄功能)

  • 通過wx.login()獲取code
  • 將code發(fā)送給后端服務(wù)器,后端保存openid到數(shù)據(jù)庫并返回sessionId
  • 將sessionId通過wx.setStorageSync()保存在本地存儲
  • 用戶下次進(jìn)入?面時,會先通過wx.getStorageSync() 方法判斷sessionId是否有值,如果有值,則可以請求其它數(shù)據(jù),如果沒有值,則進(jìn)行登錄操作。

后端代碼

工具類

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import com.redapple.project.common.ErrorCode;
import com.redapple.project.exception.ThrowUtils;
public class RequestUtils {
    // 獲取AccessToken
    public static JSONObject getAccessToken(String appId, String appSecret) {
        String apiUrl = StrUtil.format(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}",
                appId, appSecret
        );
        String body = HttpRequest.get(apiUrl).execute().body();
        ThrowUtils.throwIf(body == null, ErrorCode.OPERATION_ERROR);
        return new JSONObject(body);
    }
    // 獲取session_key和openid
    public static String getOpenIdByCode(String appId, String secret, String code) {
        String apiUrl = StrUtil.format(
                "https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code",
                appId, secret, code
        );
        String body = HttpRequest.get(apiUrl).execute().body();
        ThrowUtils.throwIf(body == null, ErrorCode.OPERATION_ERROR);
        return body;
    }
}

登錄實現(xiàn)

主要接收三個參數(shù),分別是小程序的appi、appSecret、前端傳來的code

這里通過工具類向微信接口服務(wù)發(fā)送jscode,返回openid

  • openid存在:登錄,返回用戶信息
  • openid不存在:注冊,將openid存入數(shù)據(jù)庫并返回用戶信息
public LoginUserVO WeChatLogin(String appid, String secret, String code, HttpServletRequest request) {
        // 獲取session_key和openid
        String result = RequestUtils.getOpenIdByCode(appid, secret, code);
        System.out.println("result:" + result);
        // 提取openid
        String openid = new JSONObject(result).getStr("openid");
        // 這里是自己封裝的方法,流程是如果openid為空則拋異常
        ThrowUtils.throwIf(openid == null, ErrorCode.NOT_FOUND_ERROR, "openid為空");
        // 查詢openid是否存在
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("openid", openid);
        User oldUser = this.baseMapper.selectOne(queryWrapper);
        // openid不存在
        if (oldUser == null) {
            // 添加用戶
            User user = new User();
            user.setOpenid(openid);
            user.setPhone("手機號未填寫");
            user.setUserName("默認(rèn)用戶");
            boolean saveResult = this.save(user);
            if (!saveResult) {
                // 這里也是自己封裝的方法,流程是拋自定義異常
                throw new BusinessException(ErrorCode.SYSTEM_ERROR, "注冊失敗,數(shù)據(jù)庫錯誤");
            }
            // 記錄用戶的登錄態(tài)
            request.getSession().setAttribute(USER_LOGIN_STATE, user);
            return getLoginUserVO(user);
        }
        // 記錄用戶的登錄態(tài)
        request.getSession().setAttribute(USER_LOGIN_STATE, oldUser);
        // 用戶存在,返回用戶數(shù)據(jù)
        return getLoginUserVO(oldUser);	// 自己封裝的方法,返回脫敏的用戶數(shù)據(jù)
    }

前端代碼

uniapp框架

<template>
	<view>
		<button class="loginbutton" @click="login">微信一鍵登錄</button>
	</view>
</template>
<script setup lang="ts">
    	const login = () => {
		uni.login({
			provider: 'weixin', //使用微信登錄
			success: function (loginRes) {
				if (loginRes.code !== null) {
					console.log("獲取code:" + loginRes.code)
					loginUser(loginRes.code);
				} else {
					console.log("code為空");
				}
			}
		})
	}
	const loginUser = (code: any) => {
		uni.request({
			url: "http://localhost:8066/api/wechat/login",
			method: 'POST',
			data: {
				code: code,
			},
			success: (res : any) => {
				//每次登錄時清楚緩存
				uni.removeStorageSync('JSESSIONID');
				// 保存Cookie到Storage
				uni.setStorageSync("JSESSIONID", res.header['Set-Cookie'])
				if (res.data.code === 1) {
					uni.switchTab({
						url: "/pages/index/index"
					})
				} else {
					console.log(res);
				}
			}
		})
	}
</script>
<style>
</style>

到此這篇關(guān)于Java后端接入微信小程序登錄功能的文章就介紹到這了,更多相關(guān)java微信小程序登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • sqlserver和java將resultSet中的記錄轉(zhuǎn)換為學(xué)生對象

    sqlserver和java將resultSet中的記錄轉(zhuǎn)換為學(xué)生對象

    這篇文章主要介紹了如何利用sqlserver和java將resultSet中的記錄轉(zhuǎn)換為學(xué)生對象,附有超詳細(xì)的代碼,需要的朋友可以參考一下,希望對你有所幫助
    2021-12-12
  • Java數(shù)組看這篇就夠了

    Java數(shù)組看這篇就夠了

    這篇文章主要介紹了Java數(shù)組的詳細(xì)解釋,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • mybatis plus時間判斷問題

    mybatis plus時間判斷問題

    在MyBatisPlus中,時間判斷可以通過XML轉(zhuǎn)義的方式實現(xiàn),例如使用>、<、<>、>=、<=進(jìn)行比較,這種方法涉及到SQL符號的轉(zhuǎn)義,確保查詢語句的安全性和準(zhǔn)確性,特別是在處理大于、小于和等于等邏輯時,正確的轉(zhuǎn)義能夠防止SQL注入等安全問題
    2024-09-09
  • Spring Cloud Stream分區(qū)分組原理圖解

    Spring Cloud Stream分區(qū)分組原理圖解

    這篇文章主要介紹了Spring Cloud Stream的分區(qū)和分組,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Spring Boot 控制層之參數(shù)傳遞方法詳解

    Spring Boot 控制層之參數(shù)傳遞方法詳解

    這篇文章主要介紹了Spring Boot 控制層之參數(shù)傳遞方法詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 詳解Thymeleaf的三種循環(huán)遍歷方式

    詳解Thymeleaf的三種循環(huán)遍歷方式

    Thymeleaf?是一款用于渲染?XML/XHTML/HTML5?內(nèi)容的模板引擎。本文為大家總結(jié)了Thymeleaf的三種循環(huán)遍歷方式,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • Java的覆寫操作實例分析

    Java的覆寫操作實例分析

    這篇文章主要介紹了Java的覆寫操作,結(jié)合實例形式分析了java屬性覆寫及super調(diào)用父類方法覆寫相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Java中不可變對象(Immutable Objects)的使用

    Java中不可變對象(Immutable Objects)的使用

    不可變對象創(chuàng)建后不可更改,Java中如String、Integer等基本類型包裝類及LocalDate等日期時間類,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2025-08-08
  • MapStruct處理Java中實體與模型間不匹配屬性轉(zhuǎn)換的方法

    MapStruct處理Java中實體與模型間不匹配屬性轉(zhuǎn)換的方法

    今天小編就為大家分享一篇關(guān)于MapStruct處理Java中實體與模型間不匹配屬性轉(zhuǎn)換的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • spring-boot讀取props和yml配置文件的方法

    spring-boot讀取props和yml配置文件的方法

    本篇文章主要介紹了spring-boot讀取props和yml配置文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論

衡阳市| 洞口县| 恩平市| 丰宁| 宁蒗| 洞头县| 社会| 永春县| 阿拉善左旗| 高淳县| 喀什市| 宣威市| 五峰| 平乐县| 昌图县| 友谊县| 桂平市| 轮台县| 海安县| 商水县| 临夏市| 绥棱县| 东辽县| 莫力| 麦盖提县| 崇左市| 海南省| 沈阳市| 运城市| 石家庄市| 昂仁县| 桂东县| 河池市| 招远市| 阿克陶县| 荔波县| 商都县| 华蓥市| 河西区| 雷州市| 遵义县|