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

Java后端接入微信小程序?qū)崿F(xiàn)登錄功能

 更新時間:2023年06月20日 09:11:37   作者:玄德_hk  
這篇文章主要介紹了Java如何在后端接入微信小程序從而實現(xiàn)登錄功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

前言

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

后端框架:spring boot

小程序框架:uniapp

流程概括

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

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

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

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

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

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

后端代碼

工具類

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("默認用戶");
            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后端接入微信小程序?qū)崿F(xiàn)登錄功能的文章就介紹到這了,更多相關(guān)Java登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javaweb圖書商城設(shè)計之購物車模塊(3)

    javaweb圖書商城設(shè)計之購物車模塊(3)

    這篇文章主要為大家詳細介紹了javaweb圖書商城設(shè)計之購物車模塊的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Java基數(shù)排序radix sort原理及用法解析

    Java基數(shù)排序radix sort原理及用法解析

    這篇文章主要介紹了Java基數(shù)排序radix sort原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 解決Maven項目pom.xml導入了Junit包還是用不了@Test注解問題

    解決Maven項目pom.xml導入了Junit包還是用不了@Test注解問題

    在Maven項目中,如果在非test目錄下使用@Test注解,可能會因為pom.xml中<scope>test</scope>的設(shè)置而無法使用,正確做法是將測試代碼放在src/test/java目錄下,或去除<scope>test</scope>限制,這樣可以確保Junit依賴正確加載并應(yīng)用于適當?shù)拇a部分
    2024-10-10
  • 聊聊Java和CPU的關(guān)系

    聊聊Java和CPU的關(guān)系

    java和cpu關(guān)系不大,但是也有點關(guān)系,下面我們來聊一聊java和cpu的關(guān)系,感興趣的朋友一起看看吧
    2016-08-08
  • Java實現(xiàn)堆排序和圖解

    Java實現(xiàn)堆排序和圖解

    如果將堆理解為二叉樹,那么樹中任一非葉結(jié)點的關(guān)鍵字均不大于(或不小于)其左右孩子(若存在)結(jié)點的關(guān)鍵字,堆排序的時間復(fù)雜度為O(N*logN),這里我們就來詳解堆排序算法原理及Java版的代碼實現(xiàn)
    2021-07-07
  • spring-data-jpa實現(xiàn)增刪改查以及分頁操作方法

    spring-data-jpa實現(xiàn)增刪改查以及分頁操作方法

    下面小編就為大家分享一篇spring-data-jpa實現(xiàn)增刪改查以及分頁操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • response對象的使用(實例講解)

    response對象的使用(實例講解)

    下面小編就為大家?guī)硪黄猺esponse對象的使用(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 阿里、華為、騰訊Java技術(shù)面試題精選

    阿里、華為、騰訊Java技術(shù)面試題精選

    這篇文章主要為大家分享了阿里、華為、騰訊Java技術(shù)面試題精選,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • springboot讀取nacos配置文件的實現(xiàn)

    springboot讀取nacos配置文件的實現(xiàn)

    SpringBoot注冊服務(wù)到Nacos上,由Nacos來做服務(wù)的管理,本文主要介紹了springboot讀取nacos配置文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java中的這些騷操作你不能不知道!!!

    Java中的這些騷操作你不能不知道!!!

    今天在看python相關(guān)的東西,看到各種騷操作,回頭想了下Java有沒有什么騷操作,整理下面幾種,一起看一下吧,希望能給你帶來幫助
    2021-07-07

最新評論

永安市| 石首市| 新津县| 闵行区| 绵竹市| 南丰县| 巴彦淖尔市| 石城县| 嘉义市| 合江县| 黑河市| 牟定县| 文成县| 江津市| 伊吾县| 商水县| 拜泉县| 宁陵县| 康马县| 永兴县| 镇赉县| 利辛县| 绥德县| 潜山县| 刚察县| 泸定县| 邵阳县| 罗平县| 澳门| 平陆县| 凤凰县| 海口市| 南漳县| 南靖县| 犍为县| 沙雅县| 巴林右旗| 银川市| 翁牛特旗| 宝兴县| 安丘市|