微信小程序用户登陆和获取用户信息功能实现

官方文档:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

接口说明:

https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html

我们看官方这个图,梳理一下用户登陆的大概流程就是:

1.小程序获取code,将code发给服务器,

2.服务器将appid + appsecret + code发给微信接口

3.微信接口返回 session_key + openid给服务器

4.服务器定义登陆状态,返回token给小程序

5.小程序接收token并保存

1、做一个用户登陆按钮和获取用户信息按钮

复制代码
<view>
  <button bindtap="getUserInfo" type="primary">获取用户信息</button>
  <button bindtap="wxLogin" type="warn" >登陆</button>
</view>

2、调用微信官方的用户登陆方法和获取用户信息方法

复制代码
  //获取微信用户的头像和昵称
  getUserInfo() {
    wx.getUserProfile({
      desc: '用于完善会员资料', 
      success: res => {
        console.log('用户信息:', res.userInfo)
      },
      fail: err => {
        console.error('获取用户信息失败', err)
      }
    })
  },
  // 微信登陆
  wxLogin() {
    wx.login({
      success: (res) => {
        console.log(res.code)
      },
    })
  }

3、测试

这里我们可以看到当我点击"获取用户信息"按钮之后,成功返回的用户信息。这说明测试成功了,这里还得提一下,现在新版本的都不会显示用户昵称和头像了,之前旧版本的会直接返回用户真实的头像和昵称,所以不必纠结这一点,这不是问题。

当点击登陆按钮时,返回了code,这也说明咱们的代码是没问题的。

4、小程序发送code给服务器

复制代码
  // 发送请求
  sendRequest() {
    wx.request({
      url: 'http://localhost:8080/api/user/wxLogin',
      method:'POST',
      data: {
        jsCode: this.code // 将code作为jsCode字段放在data对象中
      },
      success: (res)=>{
        this.token = res.data.data;
        console.log('接收到的token为:' + this.token)
      }
    })
  }

<view>
  <button bindtap="getUserInfo" type="primary">获取用户信息</button>
  <button bindtap="wxLogin" type="warn" >登陆</button>
  <button bindtap="sendRequest" type="default" >发送请求</button>
</view>

5、服务器端代码

复制代码
@Override
public Result<String> wxLogin(WxLoginParam param) {
    System.out.println("打印code" + param.getJsCode());
    // 得到微信登录信息
    String response = payService.getWxLogin(param.getJsCode());
    if (StrUtil.isEmpty(response)) {
        return Result.fail(ResultCodeEnum.WX_ERROR);
    }
    // 微信会返回一段json,从中得到openid、session_key和unionid
    JSONObject resJson = JSONUtil.parseObj(response);
    String openid = resJson.getStr("openid");
    if (StrUtil.isEmpty(openid)) {
        Result<String> result = new Result<>();
        result.setCode(ResultCodeEnum.SERVICE_ERROR.getCode());
        result.setMessage("调用微信接口异常:" + resJson.get("errmsg"));
        return result;
    }
    // 根据微信用户信息查询
    LambdaQueryWrapper<User> usWrapper = Wrappers.lambdaQuery();
    usWrapper.eq(User::getOpenId, openid);
    synchronized (this) {
        User user = baseMapper.selectOne(usWrapper);
        if (Objects.isNull(user)) {
            // 如果是第一次登录则创建信息
            user = new User();
            user.setOpenId(openid);
            user.setInvokeFlag(ProjectConstant.INVOKE_FLAG_TRUE);
            baseMapper.insert(user);
        } else if (ProjectConstant.INVOKE_FLAG_FALSE.equals(user.getInvokeFlag())) {
            return Result.fail(ResultCodeEnum.ACCOUNT_STOP);
        }
        return Result.ok(JwtUtil.getToken(user.getId(), null));
    }
}

6、测试结果

可以看到我们已经成功地接收到了token,说明成功了。

相关推荐
Tutankaaa11 分钟前
从10队到50队:知识竞赛软件的高并发场景如何设计?
java·经验分享·后端·spring
下次再写23 分钟前
微服务架构实战:Spring Boot + Spring Cloud 从入门到精通
java·spring boot·spring cloud·微服务架构·服务注册与发现·分布式系统·api网关
bang冰冰29 分钟前
Trae工具安装和使用教程(新手零基础入门,全程无坑)
java·人工智能·python
阿丰资源30 分钟前
基于Spring Boot的网上摄影工作室系统(源码一键运行)
java·spring boot·后端
阿维的博客日记40 分钟前
容器是怎么管理 Bean 的?
java·bean
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第40题:Java中的深拷贝和浅拷贝有什么区别
java·开发语言·后端·面试
@小匠1 小时前
云之家表单数据解析 skills (yzj-form-parser)
java
云烟成雨TD1 小时前
Spring AI Alibaba 1.x 系列【48】状态图编译配置类:CompileConfig 源码解析
java·人工智能·spring
计算机学姐1 小时前
基于微信小程序的图书馆座位预约系统【uniapp+springboot+vue】
vue.js·spring boot·微信小程序·小程序·java-ee·uni-app·intellij-idea
贫民窟的勇敢爷们2 小时前
Java 与 Python 如何选型与融合
java·开发语言·python