SpringBoot集成微信小程序(二)【登录、获取头像昵称及手机号】

news2025/1/12 1:45:11

一、背景

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

微信小程序官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

二、技术栈

  • SpringBoot 2.0
  • MyBatis-Plus
  • MySQL
  • Redis
  • Sa-Token
  • weixin-java-miniapp

三、第一个小程序

参考微信步骤:https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/getstart.html#%E7%94%B3%E8%AF%B7%E8%B4%A6%E5%8F%B7

四、登录时序图

在这里插入图片描述

五、实现

5.1 登录

5.1.1 wx.login获取code登录

onLaunch(options) {
        wx.login({
            success: function (res) {
                if (res.code) {
                    // 发起网络请求获取 session_key 和 openid
                    wx.request({
                        url: "http://localhost:8087/auth/login?code=" + res.code,
                        method: 'POST',
                        success: function (response) {
                        	if (response.data.code === 200) {
	                        	const token= response.data.data;
	                            wx.setStorageSync('token', token);
                        	} else {
                        		console.log("登录失败")
                        	}
                        },
                        fail: function (e) {
                        }
                    });
                }
            }
        });
    },

5.1.2 后端实现

private final WxMaService wxMaService;

private final RedisTemplate<String, Object> redisTemplate;

@ApiOperation("微信登录")
@PostMapping(value = "/login")
public ResultVO<String> login(@Valid @NotBlank(message = "微信code不能为空") String code) throws WxErrorException {
    WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);
    if (null == sessionInfo) {
        return ResultVO.fail("获取session失败");
    }
    // todo 模拟通过openid查询用户
    String openid = sessionInfo.getOpenid();
    Long userId = 1L;

    // 登录
    StpUtil.login(userId);

    // token
    String tokenValue = StpUtil.getTokenValue();

    // 缓存用户信息
    UserLoginVO loginVO = new UserLoginVO();
    loginVO.setId(userId);
    loginVO.setWxOpenId(openid);
    loginVO.setToken(tokenValue);
    redisTemplate.opsForValue().set("userinfo:" + userId, JSONObject.toJSONString(loginVO));

    return ResultVO.success(tokenValue);
}

5.2 获取头像

<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
  <image class="avatar" src="{{avatarUrl}}"></image>
</button>
Page({
    data: {
        avatarUrl: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
    },
    onLoad: function (options) {
        // 页面创建时执行
    },
    onShow: function () {
        // 页面出现在前台时执行
    },
    onReady: function () {
        // 页面首次渲染完毕时执行
    },
    onHide: function () {
        // 页面从前台变为后台时执行
    },
    onUnload: function () {
        // 页面销毁时执行
    },
    onChooseAvatar(e) {
        const {avatarUrl} = e.detail
        this.setData({
            avatarUrl,
        });
        // todo 上传文件
    }
})

5.3 获取昵称

<input model:value="{{nickName}}" bindinput="bindKeyInput" type="nickname" class="weui-input" placeholder="请输入昵称"/>
Page({
    data: {
        nickName: ''
    },
    onLoad: function (options) {
        // 页面创建时执行
    },
    onShow: function () {
        // 页面出现在前台时执行
    },
    onReady: function () {
        // 页面首次渲染完毕时执行
    },
    onHide: function () {
        // 页面从前台变为后台时执行
    },
    onUnload: function () {
        // 页面销毁时执行
    },
    // 输入框变化事件触发
    bindKeyInput(e) {
        this.setData({
            nickName: e.detail.value
        })
    }
})

5.4 获取手机号

<button class="login-btn" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
// 将code发送到服务器换取手机号进行绑定
wx.request({
    url: "http://localhost:8087/auth/getPhoneNumber?pcode=" + res.code,
    method: 'POST',
    success: function (res) {
        if (res.data.code === 200) {
			const phoneNumber = res.data.data;
		}
    },
    fail: function (e) {
        console.log("注册失败")
    }
});
@ApiOperation("获取手机号")
@GetMapping(value = "/getPhoneNumber")
public ResultVO<String> getPhoneNumber(@Valid @NotBlank(message = "微信pcode不能为空") String pcode) throws WxErrorException {
    WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(pcode);
    if (phoneNoInfo == null) {
        return ResultVO.fail("获取手机号失败");
    }

    return ResultVO.success(phoneNoInfo.getPhoneNumber());
}

六、至此本节结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RFID在晶圆搬运机中的智能化实践

RFID在晶圆搬运机中的智能化实践 应用背景 在半导体制造行业&#xff0c;晶圆搬运是一个至关重要的环节&#xff0c;它不仅影响生产效率&#xff0c;还直接关系到产品的质量和成本。在如今的多品种少量生产中&#xff0c;要保障生产效率和品质&#xff0c;工序管理至关重要。…

Python环境安装及PIP安装(Mac OS版)

官网 https://www.python.org/downloads/ 安装python python-3.12.1-macos11.pkg下载后&#xff0c;安装一直下一步即可 验证是否安装成功&#xff0c;执行python3命令和pip3命令 配置环境变量 获取python3安装位置并配置在.bash_profile #查看python路径 which python3#…

卫星图像检测,分割,跟踪,超分辨率,数据集调研

卫星图像检测&#xff0c;分割&#xff0c;跟踪&#xff0c;超分辨率&#xff0c;数据集调研 超分辨率Image super-resolution: A comprehensive review, recent trends, challenges and applicationsA Review of GAN-Based Super-Resolution Reconstruction for Optical Remot…

ppt模板免费网站有哪些?自动美化工具推荐

新的8月&#xff0c;是时候以全新面貌迎接高效办公挑战了&#xff01; 想要你的PPT演示脱颖而出&#xff0c;却苦于找不到精美又免费的模板&#xff1f; 别担心&#xff0c;今天我来告诉你们&#xff1a;哪个软件有精美免费ppt模板&#xff1f; 今天我为你们精心汇总了6款PPT…

二维高斯拟合20240815

二维高斯拟合 高斯函数表达式 二维高斯函数是一个在二维空间中用来表示高斯分布的函数&#xff0c;常用于统计学、图像处理和机器学习等领域。其数学表达式通常为&#xff1a; f ( x , y ) 1 2 π σ x σ y 1 − ρ 2 exp ⁡ ( − 1 2 ( 1 − ρ 2 ) ( ( x − μ x ) 2 σ …

面向未来的算力网络连接技术架构

面向未来的算力网络连接发展特点与实践 物理层网络基础设施是算力网络的“最后一公里”&#xff0c;光纤光缆等物理层网络基础设施的发展有助于保障算力网络基础设施的稳健发展。物理层核心技术发生了巨大变化&#xff0c;在交换、传输等方面不断更新迭代&#xff0c;当前铜缆的…

【云原生】看一眼haproxy,秒变技术大佬(理论篇)

一、负载均衡 1、什么是负载均衡&#xff1f; 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均衡将特定的业务(网络服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&…

Secure CRT 9.x版本高亮着色配置文件

Secure CRT的网络配置文件高亮显示&#xff0c;还在完善&#xff0c;逐渐适配不同厂商 设备名字自动蓝色高亮显示设备接口名高亮显示IPv4地址、IPv6地址、MAC地址高亮显示掩码、反掩码高亮显示设备SN号高亮显示接口状态、设备状态等高亮显示各路由协议高亮显示 【下载地址】效果…

基于Spring Boot的疗养院管理系统的设计与实现

TOC springboot234基于Spring Boot的疗养院管理系统的设计与实现 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。…

输出Docker容器的启动命令行脚本

当Docker容器启动后&#xff0c;如果忘记启动参数&#xff0c;比如目录挂载、端口映射等&#xff0c;可以通过Portainer等容器管理工具查看。但是&#xff0c;有时希望能获取容器启动的命令行&#xff0c;因为需要再启动一个类似容器&#xff0c;怎么办呢&#xff1f; 有一款工…

【Python养成】:输出两个等腰三角形且平行方向

项目场景&#xff1a; 遇到一个小小的高中小程序题目&#xff0c;有趣就做 了一下&#xff0c;供大家参考。 问题描述 要求使用python编程&#xff0c;实现如下图形。 原因分析&#xff1a; 其实就是 找规律和找空格。先左边后右边。具体解释可以找AI。太简单了没必要亲自讲解…

Linux 7 x86平台上安装达梦8数据库

1、环境描述 2、安装前准备 2.1 操作系统信息调研 Linux平台需要通过命令查看操作系统版本、位数、磁盘空间、内存等信息。 CPU信息 [rootray1 ~]# cat /proc/cpuinfo | grep -E "physical id|core id|cpu cores|siblings|cpu MHz|model name|cache size"|tail -n…

【PY模型训练】最终测试

Anacoda3 安装 1. conda -V 2.conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ 3.打开.condarc文件,将下面内容直接放入.condarc文件里面 channels: - conda-forge - defaults show_channel_urls: true default_ch…

【Qt】 QWidget的cursor属性

QWidget的cursor属性 cursor属性可以设置当鼠标指向不同控件&#xff0c;不同窗口会产生不同的效果。 API说明 cursor() 获取到当前 widget 的 cursor 属性, 返回 QCursor 对象. 当⿏标悬停在该 widget 上时, 就会显⽰出对应的形状. setCursor(const QCursor& cursor) …

CSS——less

一、less简介 1、less是一门css的预处理语言。是一个css的增强版&#xff0c;通过less可以编写更少的代码实现更强大的样式。 2、css原先也只支持变量的设置。 变量的设置可以便捷更改一样的样式&#xff0c;其中&#xff0c;calc&#xff08;&#xff09;是计算函数。 3、在le…

【6大设计原则】精通设计模式之里氏代换原则:从理论到实践,掌握代码演化的黄金法则

一、引言 1.1 设计模式的必要性 在软件开发的复杂性面前&#xff0c;设计模式提供了一套成熟的解决方案&#xff0c;它们是经过多年实践总结出来的&#xff0c;能够帮助我们应对各种编程难题。设计模式不仅仅是一种编程技巧&#xff0c;更是一种编程哲学&#xff0c;它能够提…

CSS——动画(animation)

一、过渡&#xff08;transition&#xff09; 1、通过过渡可以指定一个属性发生变化时的切换方式 2、通过过渡可以创建一些非常好的效果&#xff0c;提升用户体验 3、常用属性值 ① transition-property 指定要执行过渡的属性 多个属性间使用&#xff0c;隔开如果所有…

Ubuntu24.04搭建maxkb开发环境

接上文&#xff1a;windows10搭建maxkb开发环境&#xff08;劝退指南&#xff09; 上文在windows10环境搭建maxkb开发环境遇到各种坑&#xff0c;后面就转战ubuntu平台&#xff0c;果然比较顺利的完成开发环境搭建。当然遇到相关的问题还是可以参考上文《windows10搭建maxkb开发…

数据库根据日期统计SQL编写记录

统计每天产生多少数据 SELECT to_char("日期字段",YYYY-MM-dd) time ,count(*) FROM "表名" GROUP BY time;统计每月产生多少数据 SELECT to_char("日期字段",YYYY-MM) time ,count(*) FROM "表名" GROUP BY time;统计每年产生多少数…