结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

简介: 结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

@[TOC]


[https://www.bilibili.com/video/BV1mg4y1s75r/?spm_id_from=333.337.search-card.all.click&vd_source=c15794e732e28886fefab201ec9c6253](https://www.bilibili.com/video/BV1mg4y1s75r/?spm_id_from=333.337.search-card.all.click&vd_source=c15794e732e28886fefab201ec9c6253)
# 1 前言
结合`RuoYi-Cloud`和`RuoYi-App`实现微信小程序的授权登录。
之前讲过前后端分离版的授权登录,逻辑大致一致,不同点有:
* 微信头像和昵称的获取方式。由于最新的本地库通过`getUserProfile`和`getUserInfo`获取不到用户头像和昵称。采用头像昵称填写功能。(备注:[https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01))
* 微服务端采用`OpenFeign`进行远程调用,不会远程调用的粉丝,可以学习一下。`Feign`的底层是`Spring3.0`的`RestTemplate`,若依的`RestTemplate`又借助于`OkHttp`。相对于`Feign`本身来讲,`OpenFeign`是支持`Spring MVC`的注解的,用起来**非常方便**。
## 1.1 环境准备
* 下载`RuoYi-Cloud`代码
 [添加链接描述https://gitee.com/y_project/RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
 * 下载`RuoYi-App`代码
 [https://gitee.com/y_project/RuoYi-App](https://gitee.com/y_project/RuoYi-App)
 ## 1.2 登录流程图
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0d21e927990249ebac98063d37b3a2de.png)
# 2 小程序代码
* 微信开发者工具基础库用的`2.30.*`
* `app`模块配置微信登录
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/a5865008b9ce49e6bccdfe0201459a37.png)
* 使用自己的`appid`
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/582b40a9e0434a79a7084871191dbd79.png)
## 2.1 RuoYi-App编辑api/login.js
* 登录、退出接口路径加`/auth`
* 获取用户信息接口路径加`/system`
* 获取验证码接口路径换成`/code`
```javascript
import request from '@/utils/request'

// 登录方法
export function login(username, password, code, uuid) {
  const data = {
    username,
    password,
    code,
    uuid
  }
  return request({
    'url': '/auth/login',
    headers: {
      isToken: false
    },
    'method': 'post',
    'data': data
  })
}

// 获取用户详细信息
export function getInfo() {
  return request({
    'url': '/system/user/getInfo',
    'method': 'get'
  })
}

// 退出方法
export function logout() {
  return request({
    'url': '/auth/logout',
    'method': 'delete'
  })
}

// 获取验证码
export function getCodeImg() {
  return request({
    'url': '/code',
    headers: {
      isToken: false
    },
    method: 'get',
    timeout: 20000
  })
}

2.4 新增按钮微信授权登录

  • 在登录按钮下,新增微信授权登录按钮

    <button @click="wxHandleLogin" class="login-btn cu-btn block bg-green lg round">微信授权登录</button>
    

    2.6 新增wxHandleLogin方法获取code

    // 微信登录
      async wxHandleLogin() {
         
              uni.getProvider({
         
                  service:'Oauth',
                  success: (res) => {
         
                      console.log(res);
                      if(res.provider.indexOf("WeiXin")){
         
                          //登录
                          uni.login({
         
                              provider:'WeiXin',
                              success: (loginRes) => {
         
                              }
                          })
                      }
                  }
              })
      }
    

    2.9 创建sendWxLoginFormToLocalService方法

    //向本地服务发起请求
      sendWxLoginFormToLocalService(){
         
                  console.log("向后端发起请求" + this.wxLoginForm);
                  this.$store.dispatch('wxLogin', this.wxLoginForm).then(() => {
         
                    this.$modal.closeLoading()
                  }).catch(() => {
         
    
                  })  
      }
    

    3 微服务代码

    3.5 auth服务TokenController添加接口wxLogin

      public R<?> wxLogin(@RequestBody WxLoginBody wxLoginBody){
         
          String code = wxLoginBody.getCode();
    
          //想微信服务器发送请求获取用户信息
          String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppConfig.getAppId() + "&secret=" + wxAppConfig.getAppSecret() + "&js_code=" + code + "&grant_type=authorizatinon_code";
          String res = restTemplate.getForObject(url, String.class);
          JSONObject jsonObject = JSONObject.parseObject(res);
    
          //获取session_key和openid
          String sessionKey = jsonObject.getString("session_key");
          String openid = jsonObject.getString("openid");
    
          if (StringUtils.hasText(openid)){
         
              // 如果解析成功,获取token
              LoginUser userInfo = sysLoginService.wxLogin(openid);
              // 获取登录token
              return R.ok(tokenService.createToken(userInfo));
          }else{
         
              return R.fail("微信登录失败!");
          }
      }
    

    3.7 ruoyi-api模块新增远程调用

    /**
       * 通过openid查询用户信息
       *
       * @param openid openid 用户唯一标识
       * @param source 请求来源
       * @return 结果
       */
      @GetMapping("/user/getInfoByOpenid/{openid}")
      public R<LoginUser> getInfoByOpenid(@PathVariable("openid") String openid, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    

    3.9 system服务SysUserController新增内部接口getInfoByOpenid和addWxUser

  • 数据库添加unionIdopenId
  • domain (SysUser)

    /** unionId */
      private String unionId;
    
      /** openId */
      private String openId;
    
       public String getUnionId() {
         
          return unionId;
      }
    
      public void setUnionId(String unionId) {
         
          this.unionId = unionId;
      }
    
      public String getOpenId() {
         
          return openId;
      }
    
      public void setOpenId(String openId) {
         
          this.openId = openId;
      }
    
  • controller 层(SysUserController)

      /**
       * 根据openid获取当前用户信息
       */
      public R<LoginUser> getInfoByOpenid(@PathVariable("openid") String openid)
      {
         
          SysUser sysUser = userService.selectUserByOpenid(openid);
          LoginUser sysUserVo = new LoginUser();
          if (StringUtils.isNull(sysUser))
          {
         
              sysUserVo.setSysUser(null);
              return R.ok(sysUserVo);
          }
          return R.ok(sysUserVo);
      }
    
      /**
       * 新增微信用户信息
       */
      public R<SysUser> addWxUser(@RequestBody SysUser sysUser)
      {
         
          String username = sysUser.getUserName();
          userService.insertWxUser(sysUser);
          return R.ok(sysUser);
      }
    
  • service 层(SysUserServiceImpl)
    接口:

      /**
       * 通过openid查询用户
       *
       * @param openid 用户唯一标识
       * @return 用户对象信息
       */
      public SysUser selectUserByOpenid(String openid);
    
      /**
       * 新增微信用户信息
       *
       * @param user 用户信息
       * @return 结果
       */
      public int insertWxUser(SysUser user);
    

    实现类:

      /**
       * 通过openid查询用户
       *
       * @param openid 用户唯一标识
       * @return 用户对象信息
       */
      @Override
      public SysUser selectUserByOpenid(String openid)
      {
         
          return userMapper.selectUserByOpenid(openid);
      }
    
      /**
       * 新增微信用户信息
       *
       * @param user 用户信息
       * @return 结果
       */
      @Override
      public int insertWxUser(SysUser user)
      {
         
          // 新增用户信息
          return userMapper.insertUser(user);
      }
    

    mapper 层 (SysUserMapper)

    /**
       * 通过openid查询用户
       *
       * @param openid 用户唯一标识
       * @return 用户对象信息
       */
      public SysUser selectUserByOpenid(String openid);
    

    mybatis.xml (SysUserMapper.xml)
    ```xml
    u.union_id, u.open_id,

....



where u.open_id = #{openId} and u.del_flag = '0'

....


insert into sys_user(
user_id,
dept_id,
user_name,
nick_name,
email,
avatar,
phonenumber,
sex,
password,
status,
create_by,
remark,
open_id,
union_id,
create_time
)values(
#{userId},
#{deptId},
#{userName},
#{nickName},
#{email},
#{avatar},
#{phonenumber},
#{sex},
#{password},
#{status},
#{createBy},
#{remark},
#{openId},
#{unionId},
sysdate()
)

```

目录
相关文章
|
4月前
|
小程序 搜索推荐 JavaScript
引入小程序平台对app有啥好处
引入小程序平台对app有啥好处
175 1
|
9月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
166 0
|
5月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
258 5
|
5月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
7月前
|
小程序 安全 JavaScript
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
479 1
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
|
7月前
|
人工智能 小程序 前端开发
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
451 0
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
|
8月前
|
消息中间件 缓存 小程序
婚恋交友相亲公众号app小程序系统源码「脱单神器」婚恋平台全套代码 - 支持快速二次开发
这是一套基于SpringBoot + Vue3开发的婚恋交友系统,支持微信公众号、Uniapp小程序和APP端。系统包含实名认证、智能匹配、视频相亲、会员体系等功能,适用于婚恋社交平台和相亲交友应用。后端采用SpringBoot 3.x与MyBatis-Plus,前端使用Vue3与Uniapp,支持快速部署和二次开发。适合技术团队或有经验的个人创业者使用。
556 8
|
7月前
|
小程序 Java 关系型数据库
圈子系统公众号app小程序系统源码圈子系统带即时通讯 多级圈子系统源码 兴趣小组系统开源 私密圈子系统代码 会员制社区系统
本圈子系统解决方案提供即时通讯、多级圈子、兴趣小组、私密社区及会员制管理功能。支持开源与商业方案,推荐ThinkSNS+、EasyClub及OpenFire等系统,并提供前后端技术选型建议,助力快速搭建社交平台。
404 0
|
9月前
|
存储 人工智能 移动开发
uni-app+vue3接入deepseek-v3搭建跨端ai流式(小程序+app+h5)
基于Uniapp+Vue3+Markdown接入DeepSeek-V3聊天大模型,支持编译到H5+小程序+App端。实现流式输出、支持亮色/暗黑主题、代码高亮、会话本地存储等功能。
1684 12

热门文章

最新文章