小程序后台数据交互-个人中心

news2024/11/16 21:21:47

目录

一,获取用户昵称和头像

登录过程

二,登录-小程序

三,后台

小程序服器配置


一,获取用户昵称和头像

登录过程

小程序登录

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

  • 说明

    • 调用 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信息

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

三,后台

小程序服器配置

导入微信小程序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

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

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

相关文章

SOFARegistry | 聊一聊服务发现的数据一致性

文&#xff5c;肖健&#xff08;花名&#xff1a;昱恒&#xff09;蚂蚁集团技术专家专注于服务发现领域&#xff0c;目前主要从事蚂蚁注册中心 SOFARegistry 设计、研发工作。本文 9492 字 阅读 24 分钟PART. 1前言1.1 什么是服务发现在微服务的体系中&#xff0c;多个应用程序…

Hydra(九头蛇)工具使用

Hydra工具使用1.Hydra简介1.1.Hydra介绍1.2.Hydra支持协议1.3.Hydra下载2.Hydra使用2.1.Hydra基本使用方式2.2.Hydra常用参数2.3.Hydra注意事项2.4.Kail字典2.5.Hydra密码生成器3.Hydra案例3.1.创建账号密码文件3.2.SSH协议爆破3.2.1.靶机信息3.2.2.开始爆破3.2.2.1.不知账号3.…

C#语言实例源码系列-游戏-实现华容道

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

Rust个人学习之聊聊Rust的变量

今天看了Rust的变量相关内容&#xff0c;Rust变量很重要的一个设计点是: Rust变量默认是不可变的。 很难理解? 我们接下来一起研究一下Rust的变量&#xff0c; 在Rust中变量是通过关键字let进行声明的 let x 5; 上述语句就是定义了一个名称为x的变量&#xff0c;变量的值为…

修改esp idf hello_world_main.c,验证Strategy 策略基类。出现一个问题,加以解决

修改esp32 idf hello_world_main.c&#xff0c;验证Strategy 策略基类。出现几个问题&#xff0c;加以解决&#xff1a; 错误&#xff1a; …/main/hello_world_main.cpp: In function ‘void test01()’: …/main/hello_world_main.cpp:77:12: error: deleting object of ab…

入门力扣自学笔记228 C++ (题目编号:2042)

2042. 检查句子中的数字是否递增题目&#xff1a;句子是由若干 token 组成的一个列表&#xff0c;token 间用 单个 空格分隔&#xff0c;句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 &#xff0c;要么是一个由小写英文字母组成的 单词…

很好用的gRPC和WebSocket调试工具Apipost!强烈推荐

随着软件开发行业的发展&#xff0c;越来越多的公司和开发人员在工作中会涉及到gRPC和WebSocket等接口类型&#xff0c;但是目前市面上能支持这种接口的调试工具却几乎没有&#xff0c;国外的工具大都晦涩难懂&#xff0c;不符合我们的开发习惯&#xff0c;很难上手使用。 经过…

Android开发——APP ANR治理

一、背景介绍 ANR&#xff08;Application Not Response&#xff09;指应用程序无响应&#xff0c;通常出现在主线程被阻塞时&#xff0c;并伴随ANR弹窗出现。ANR发生时要么关闭当前app&#xff0c;要么等待&#xff0c;等待的结果大概率还是继续ANR&#xff0c;最终需要杀掉应…

在msys2上安装武汉大学的开源PPP解算软件-PRIDE PPP-AR

最近一篇文章《免费提供POSMV的GNSS数据解算服务&#xff0c;验潮仪丢失的一种补救》发表了以后&#xff0c;有一位相识的网友提供了一个重要信息&#xff1a;武汉大学PPP解算软件名字为PRIDE PPP-AR 开源了&#xff0c;其GUI自动下载星历文件进行自主解算。PRIDE PPP-AR 的官网…

2022年中小企业数字化转型路径报告(附下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿2023年&#xff0c;如何科学制定年度规划&#xff1f;《底层逻辑》高清配图清华大学256页…

(机器学习深度学习常用库、框架|Pytorch篇)第三节:Pytorch之torchvision详解

文章目录一&#xff1a;torchvision概述二&#xff1a;torchvision.datasets&#xff08;1&#xff09;官方数据集&#xff08;2&#xff09;自定义数据集类&#xff08;3&#xff09;ImageFolder手动实现三&#xff1a;torchvision.transforms四&#xff1a;torchvision.model…

【元宇宙欧米说】左手追星,右手造富——用Web3加持娱乐行业

娱乐圈如何才能与资本市场保持步调一致&#xff1f;Web3浪潮来袭&#xff0c;文娱行业如何才能踏上Web3世界的巨轮&#xff1f; 1月4日下午三点&#xff0c;VegaIdol联合创始人Linnea将以**“左手追星&#xff0c;右手造富——用Web3加持娱乐行业”为题&#xff0c;与大家共同…

界面组件DevExpress WinForms v22.2 -全新升级的皮肤和矢量图标

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

RabbitMQ的简单介绍与使用

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;曾经在某央企公司实习&#xff0c;目前入职某税务公司。本篇文章将记录和分享RabbitMQ相关的知识点。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复习中&#xff…

乐视宣布每周工作4天半

老板跑了&#xff0c;公司不但没倒&#xff0c;而且员工还过上了不加班不内卷的神仙生活。 典型的老虎不在家&#xff0c;规矩自己定啊&#xff01; 神仙日子 前段时间&#xff0c;网上流传着一则消息&#xff0c;说乐视目前还有400多名员工&#xff0c;靠着《甄嬛传》版权和…

Cadence PCB仿真使用Allegro PCB SI 创建含差分对网络元器件的IBIS模型图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 1,概述 本文简单介绍使用Allegro PCB SI软件为BRD PCB设计文件中的含有差分对网络的元器件创建IBIS模型的方法。 2,创建方法 第1步:确定打开PCB文件的软件是 Allegro PCB SI 如果不是Allegro PCB SI,可执行File→Chan…

回望2022,依然值得仰望星空

转眼间 2022 年已经过去&#xff0c;这是我在 CSDN 创作的第二年&#xff0c;在文章的创作上也是脱离“博客新手”身份&#xff0c;正式蜕变为“博客老手”的一年&#xff0c;各方面收获颇丰。2021 初见 CSDN来到 CSDN 是在 2020 年的 11 月份&#xff0c;但是那时候并没有开始…

传感器与传感器通道

传感器 Def:以一定精确度 把 被测量转换为与之有确定对应关系的&#xff0c;便于应用的某种物理量的测量系统。 作用&#xff1a; 捕获并转换信息&#xff0c;非电量物理参数转换为电参数。 e.g: 速度 ->电压&#xff0c;电流 组成&#xff1a; 敏感元件&#xff08;直接感受…

css移动端适配最佳实践

移动端适配&#xff0c;在移动端里经常有遇到&#xff0c;在不同分辨率移动端设备精确还原UI设计稿&#xff0c;这是一个令人抓狂的问题&#xff0c;好在有flex&#xff0c;box布局解决了自适应很大一部分问题。 在开始本文之前主要介绍几种笔者常用的适配方案 1、设置meta标…

美赛Day1

1 层次分析法 评价类问题 1.1 模型介绍 1.1.1 模型介绍 在对B的评价中&#xff0c;判断A个物体哪个最好。将B分为k个可以评价的方面分别进行打分&#xff08;每个方面A个物体的分数和为1&#xff09;&#xff0c;最终对A个物体的k个方面加权求和进行比较。 1.1.2 解题思路…