微信小程序【获取用户昵称头像和昵称(附源码)】

news2024/12/25 12:46:02

获取用户昵称头像和昵称

wx.getUserProfile

bindgetuserinfo

登录过程

前端源码:https://pan.baidu.com/s/1uz2Gm2FMB-8RFVkhlHY3kQ
提取码:zb4w
后端源码:https://pan.baidu.com/s/1iPpLrXzWnpAsk5UsfKesGw
提取码:8bwm

小程序登录

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

在这里插入图片描述

  • 说明
    • 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
    • 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key
    • 之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
  • 注意事项
    1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥
    2. 临时登录凭证 code 只能使用一次
  • appId 作用说明
    • appid 是微信账号的唯一标识,这个是固定不变的;
      如果了解微信公众号开发的就需要注意一下,小程序的appid 和 公众号的appid 是不一致的
  • session_key 功能说明
    微信客户端通过wx.getUserInfo()获取用户的信息
    后台有时候也需要获取微信客户端的用户信息,因此,就需要利用session_key这个秘钥来从微信平台中获取
    官方文档原文
    签名校验以及数据加解密涉及用户的会话密钥 session_key。 开发者应该事先通过 wx.login 登录流程获取会话密钥 session_key 并保存在服务器。为了数据不被篡改,开发者不应该把 session_key 传到小程序客户端等服务器外的环境。

在这里插入图片描述

登录-小程序

  1. 执行wx.login 登录获取小程序端的code
  2. 服务端根据code去微信端获取session_key并且缓存;同时生成access_token 保存在小程序端,维持登录状态;
  3. 小程序端请求服务端用户数据时,先wx.checkSession,有效就通过access_token 确定用户,找到session_key;无效就执行wx.login重新登录重新生成access_token,服务端重新获取session_key;
  4. 小程序端长时间不使用,服务端的session_key会失效,无法再用session_key去微信端获取数据,需要小程序端重新执行登录操作; 服务端要获取session_key 只能通过小程序端的登录来操作;

wx.checkSession

检查登录态是否过期

wx.login

调用接口获取登录凭证(code)

wx.request

请求自己小程序服器,并且携带了code,userInfo信息

后台

准备数据表

DROP TABLE IF EXISTS `wx_user`;
CREATE TABLE `wx_user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名称',
  `password` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码',
  `gender` tinyint(3) NOT NULL DEFAULT 0 COMMENT '性别:0 未知, 1男, 1 女',
  `birthday` date NULL DEFAULT NULL COMMENT '生日',
  `last_login_time` datetime(0) NULL DEFAULT NULL COMMENT '最近一次登录时间',
  `last_login_ip` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '最近一次登录IP地址',
  `user_level` tinyint(3) NULL DEFAULT 0 COMMENT '用户层级 0 普通用户,1 VIP用户,2 区域代理用户',
  `nickname` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称或网络名称',
  `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户手机号码',
  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户头像图片',
  `weixin_openid` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '微信登录openid',
  `status` tinyint(3) NOT NULL DEFAULT 0 COMMENT '0 可用, 1 禁用, 2 注销',
  `add_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除',
  `share_user_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `user_name`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Compact;

反向生成工具生成

  • WxUser.java
  • WxUserMapper.java
  • WxUserMapper.xml

准备封装前端传过来的数据

  • UserInfo
  • WxLoginInfo

小程序服器配置

导入微信小程序SDK

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-miniapp</artifactId>
    <version>3.3.0</version>
</dependency>

application.yml

oa:
  wx:
    app-id: wxf23b28b5e4ea4d6a
    app-secret: 212621faa31cdf0691367ea45b2b6041
    msgDataFormat: JSON

WxProperties

封装oa.wx的数据

@Data
@Configuration
@ConfigurationProperties(prefix = "oa.wx")
public class WxProperties {
	/**
	 * 设置微信小程序的appId
	 */
	private String appId;
	/**
	 * 设置微信小程序的Secret
	 */
	private String appSecret;
	/**
	 * 消息数据格式
	 */
	private String msgDataFormat;

}

WxConfig

注册WxMaService

@Configuration
public class WxConfig {
	@Autowired
	private WxProperties properties;

	@Bean
	public WxMaConfig wxMaConfig() {
		WxMaInMemoryConfig config = new WxMaInMemoryConfig();
		config.setAppid(properties.getAppId());
		config.setSecret(properties.getAppSecret());
		config.setMsgDataFormat(properties.getMsgDataFormat());
		return config;
	}

	@Bean
	public WxMaService wxMaService(WxMaConfig maConfig) {
		WxMaService service = new WxMaServiceImpl();
		service.setWxMaConfig(maConfig);
		return service;
	}

}

WxAuthController

@RequestMapping("/wx/auth")
public class WxAuthController {
    @Autowired
    private WxMaService wxService;
     @PostMapping("login_by_weixin")
    public Object loginByWeixin(@RequestBody WxLoginInfo wxLoginInfo, HttpServletRequest request) {

        //客户端需携带code与userInfo信息
        String code = wxLoginInfo.getCode();
        UserInfo userInfo = wxLoginInfo.getUserInfo();
        if (code == null || userInfo == null) {
            return ResponseUtil.badArgument();
        }
        //调用微信sdk获取openId及sessionKey
        String sessionKey = null;
        String openId = null;
        try {
            WxMaJscode2SessionResult result = this.wxService.getUserService().getSessionInfo(code);
            sessionKey = result.getSessionKey();//session id
            openId = result.getOpenid();//用户唯一标识 OpenID
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (sessionKey == null || openId == null) {
            log.error("微信登录,调用官方接口失败:{}", code);
            return ResponseUtil.fail();
        }else{
            log.info("openId={},sessionKey={}",openId,sessionKey);
        }
        //根据openId查询wx_user表
        //如果不存在,初始化wx_user,并保存到数据库中
        //如果存在,更新最后登录时间
        //....
        // token
        UserToken userToken = null;
        try {
            userToken = UserTokenManager.generateToken(user.getId());
        } catch (Exception e) {
            log.error("微信登录失败,生成token失败:{}", user.getId());
            e.printStackTrace();
            return ResponseUtil.fail();
        }
        userToken.setSessionKey(sessionKey);
        log.info("SessionKey={}",UserTokenManager.getSessionKey(user.getId()));
        Map<Object, Object> result = new HashMap<Object, Object>();
        result.put("token", userToken.getToken());
        result.put("tokenExpire", userToken.getExpireTime().toString());
        result.put("userInfo", userInfo);
        //....


        log.info("【请求结束】微信登录,响应结果:{}", JSONObject.toJSONString(result));

        return ResponseUtil.ok(result);
    }

响应给客户端数据有:

token userInfo

登录-小程序

将oa-mini项目导入到微信开发者工具中,这里注意一定要修改appid。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MDa1nMmi-1675423190494)(images\1668234059554.png)]

点击"修改",将弹出一个对话框,请在对话框中输入你的小程序测试号appid

在这里插入图片描述

login.js

user.loginByWeixin(res.userInfo).then(res => {
    app.globalData.hasLogin = true;
    wx.navigateBack({
    delta: 1
    })
})

user.js

function loginByWeixin(userInfo) {
  return new Promise(function(resolve, reject) {
    return login().then((res) => {
      //登录远程服务器
      util.request(api.AuthLoginByWeixin, {
        code: res.code,
        userInfo: userInfo
      }, 'POST').then(res => {
        if (res.errno === 0) {
          //存储用户信息
          wx.setStorageSync('userInfo', res.data.userInfo);
          wx.setStorageSync('token', res.data.token);
          resolve(res);
        } else {
          reject(res);
        }
      })

将userInfo,token数据保存到本地

util.js

function request(url, data = {}, method = "GET") {
  return new Promise(function (resolve, reject) {
    wx.request({
      url: url,
      data: data,
      method: method,
      timeout:6000,
      header: {
        'Content-Type': 'application/json',
        'X-OA-Token': wx.getStorageSync('token')
      },

如果使用util.request函数,每次请求都会携带’X-OA-Token’: wx.getStorageSync(‘token’);而服器已经保存了所有的token,所以服器通过token区分每个客户端

emoji

mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。

Linux系统中MySQL的配置文件为my.cnf。

Winows中的配置文件为my.ini。

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\\tools\\mysql-5.7.23-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\\tools\\mysql-5.7.23-winx64\\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

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

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

相关文章

Java poi之word文本图片内容提取

目录结构前言文档准备引入Maven依赖代码块提取结果验证孤勇者提取结果青鸟提取结果对比前言 应公司需求&#xff0c;需实现以下功能 word文本内容的替换&#xff1b;word文本内容的提取&#xff1b;word文档中图片的提取存放 此文章将使用Apache POI实现Word文档中文本内容及…

2023-2-3 刷题情况

二叉树着色游戏 题目描述 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中&#xff0c;给出二叉树的根节点 root&#xff0c;树上总共有 n 个节点&#xff0c;且 n 为奇数&#xff0c;其中每个节点上的值从 1 到 n 各不相同。 最开始时&#xff1a; 「一号」玩家从 …

BIGEMAP GIS Office添加离线地图

BIGEMAP GIS Office添加离线地图发布时间&#xff1a;2019-01-04 版权&#xff1a;BIGEMAP添加离线地图相关应用&#xff1a;搭建 离线地图 二次开发目的&#xff1a;搭建内网地图服务器&#xff0c;内网中可多人访问的地图服务&#xff0c;无需上网工具下载&#xff1a;1、BIG…

2023年企业必不可少的私域运营系统

随着人口红利消失、流量越来越贵、公域转化越来越难&#xff0c;2023年&#xff0c;能够提升用户全生命周期的私域运营&#xff0c;已经成为企业不得不做的事。 面对这种情况&#xff0c;企业必须要引入一款专业且高效的私域运营利器&#xff0c;来实现高效率私域运营管理。快…

二叉树层次遍历的C语言实现

二叉树 树是n个节点的有限集 每个节点事多有两颗子树的树称为 二叉树 二叉树的层次遍历 使用队列的数据结构&#xff0c;从树的根结点开始&#xff0c;依次将其左孩子和右孩子入队。而后每次队列中一个结点出队&#xff0c;都将其左孩子和右孩子入队&#xff0c;直到树中所有结…

Linux——死锁概念介绍和解决方式

目录 一.死锁概念介绍 二.死锁的解决方式 &#xff08;一&#xff09;.预防死锁 方式一&#xff1a;不请求 方式二&#xff1a;强制剥夺资源 方式三&#xff1a;线性分配资源 &#xff08;二&#xff09;.避免死锁&#xff1a;银行家算法 总体流程 安全性检查&#xf…

C语言---冒泡排序和快速排序

文章目录前言一、冒泡排序1.简介2.算法思路3.代码实现二、快速排序1.简介2.算法思路2.1左右指针法2.2挖坑法2.3前后指针法总结前言 交换排序有冒泡排序和快速排序这两种&#xff0c; 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两…

多目标跟踪:文献综述

文章目录摘要1、简介1.1、与其他相关综述的区别1.2、贡献1.3、综述的结构1.4. 外延2、 MOT问题2.1、问题公式化2.2、MOT的分类2.2.1、初始化方法2.2.2、处理方式2.2.3、输出类型2.2.4. 讨论3、MOT的组成3.1、外观模型3.1.1、视觉表征3.1.2. 统计测量3.2、运动模型3.2.1. 线性运…

安装httprunner manager遇到的坑

安装httprunner manager参考博客&#xff1a;https://www.cnblogs.com/MrqiuS/p/12944481.html安装mysqlclient报错Collecting mysqlclient1.3.12Downloading https://mirrors.aliyun.com/pypi/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/m…

maven利用springboot的配置文件进行多个环境的打包

在Spring Boot中多环境配置文件名需要满足application-{profiles.active}.properties的格式&#xff0c;其中{profiles.active}对应你的环境标识&#xff0c;可以随意命名&#xff0c;但要与pom文件中环境标识一样。至于哪个具体的配置文件会被加载&#xff0c;需要在applicati…

Docker系列 01

前言 学完这篇文章&#xff0c;你会知道Docker是什么&#xff1f;解决了什么问题以及如何安装Docker。在后续的系列文章中&#xff0c;我们会陆续介绍Docker的常用命令、镜像原理、Dockerfile以及网络管理等&#xff0c;让你对Docker有较为系统的认知&#xff0c;持续关注吧。 …

多继承的运用

//在封装一个领导类&#xff08;Leader&#xff09;:包括受保护成员&#xff1a;岗位、工资&#xff0c;完成其相关函数及show//由以上两个类共同把派生出学生干部类&#xff1a;引入私有成员&#xff1a;管辖人数&#xff0c;完成其相关函数以及show函数//在主程序中&#xff…

一刷代码随想录——动态规划

1.理论基础如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。对于动态规划问题&#xff0c;我将拆解…

24考研——高等数学的基础概念定理(一)——第一章|函数、极限、连续

今天考试&#xff0c;考定理&#xff0c;我是真没想到这些定理&#xff0c;脑袋瓜子嗡嗡的&#xff0c;害&#xff0c;废话少说&#xff0c;直接开干 文章目录一、基础概念定理1.1 收敛数列的性质&#xff08;唯一性、有界性、保号性、数列与子列关系&#xff09;1.2 函数极限的…

一款语文老师写的word办公神级插件

没错&#xff0c;正如题所说&#xff0c;这是一款语文老师开发的word办公神级插件----不坑盒子&#xff0c;小编体验了一下还真是太强大了&#xff01;双击exe文件&#xff0c;选择任意安装目录即可开始安装如果你的电脑缺少运行库&#xff0c;软件会自动帮你下载安装好安装完成…

QT模块化编程 pro pri 子工程 使用

如果工程过大时&#xff0c;就需要分子模块&#xff0c;Qt 也给我们提供了一种方式 Pri&#xff1b; 这里我们来看看Pri在项目中的使用&#xff0c;项目使用实际上也是很有主要可以模块清晰化&#xff0c;能提高程序的可扩展性。 网上这种写的很多&#xff0c;但少有写明白的&…

EGFR靶点药物研发进展-销售数据-上市药品前景分析

根据世界卫生组织的最新报告&#xff0c;与世界上其他癌症相比&#xff0c;肺癌导致的死亡率最高。非小细胞肺癌 (NSCLC) 约占肺癌病例总数的 85%。大量的风险因素归因于肺癌的发展&#xff0c;表皮生长因子受体 (EGFR) 是最常见的突变驱动基因之一&#xff0c;通过调节 PI3K/A…

Sentinel之授权规则与规则持久化

一、上集回顾上级文章地址&#xff1a;【SpringCloud】Sentinel 之隔离与降级_面向架构编程的博客-CSDN博客我们先来回顾一下Sentinel控制台上面的功能&#xff1a;所以&#xff0c;本章节就来研究 "授权规则"这一功能模块。二、授权规则授权规则可以对请求方来源做判…

XV6实验(2020)

XV6实验记录(2020) 环境搭建 参考连接 Lab guidance (mit.edu) 6.S081 / Fall 2020 (mit.edu) xv6 book中文版 Lab1:Xv6 and Unix utilities 实现几个unix实用工具&#xff0c;熟悉xv6的开发环境以及系统调用 Boot xv6 就是准备环境&#xff0c;克隆仓库&#xff0c;编…

代码随想录算法训练营第五十三天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

一、1143.最长公共子序列 题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不…