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

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

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

前言

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

后端框架:spring boot

小程序框架:uniapp

流程概括

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

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

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

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

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

  • 通過(guò)wx.login()獲取code
  • 將code發(fā)送給后端服務(wù)器,后端保存openid到數(shù)據(jù)庫(kù)并返回sessionId
  • 將sessionId通過(guò)wx.setStorageSync()保存在本地存儲(chǔ)
  • 用戶下次進(jìn)入?面時(shí),會(huì)先通過(guò)wx.getStorageSync() 方法判斷sessionId是否有值,如果有值,則可以請(qǐng)求其它數(shù)據(jù),如果沒(méi)有值,則進(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;
    }

}

登錄實(shí)現(xiàn)

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

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

  • openid存在:登錄,返回用戶信息
  • openid不存在:注冊(cè),將openid存入數(shù)據(jù)庫(kù)并返回用戶信息
    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("手機(jī)號(hào)未填寫");
            user.setUserName("默認(rèn)用戶");
            boolean saveResult = this.save(user);
            if (!saveResult) {
                // 這里也是自己封裝的方法,流程是拋?zhàn)远x異常
                throw new BusinessException(ErrorCode.SYSTEM_ERROR, "注冊(cè)失敗,數(shù)據(jù)庫(kù)錯(cuò)誤");
            }
            // 記錄用戶的登錄態(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) => {
				//每次登錄時(shí)清楚緩存
				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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javaweb圖書商城設(shè)計(jì)之購(gòu)物車模塊(3)

    javaweb圖書商城設(shè)計(jì)之購(gòu)物車模塊(3)

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

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

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

    解決Maven項(xiàng)目pom.xml導(dǎo)入了Junit包還是用不了@Test注解問(wèn)題

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

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

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

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

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

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

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

    response對(duì)象的使用(實(shí)例講解)

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

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

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

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

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

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

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

最新評(píng)論

花莲市| 东兴市| 江油市| 比如县| 新建县| 库伦旗| 龙口市| 清水河县| 南宁市| 靖州| 虹口区| 江安县| 吉隆县| 慈溪市| 汶川县| 嘉峪关市| 济源市| 保康县| 治多县| 龙口市| 博爱县| 永城市| 浏阳市| 双牌县| 桓台县| 吉隆县| 合川市| 镇远县| 刚察县| 腾冲县| 江达县| 湛江市| 乳山市| 抚州市| 垦利县| 克东县| 壶关县| 澎湖县| 揭西县| 黑龙江省| 广饶县|