结合若依框架实现微信小程序授权登录

简介: 结合若依框架实现微信小程序授权登录

@[TOC]

1 前言

通过若依框架实现微信小程序的授权登录。


[https://www.bilibili.com/video/BV1iM411E7RE/?spm_id_from=333.337.search-card.all.click&vd_source=c15794e732e28886fefab201ec9c6253](https://www.bilibili.com/video/BV1iM411E7RE/?spm_id_from=333.337.search-card.all.click&vd_source=c15794e732e28886fefab201ec9c6253)
## 1.1 环境准备
* 下载`ruoyi-vue`代码
[https://gitee.com/y_project/RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue)
* 下载`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/e9cad6b79c3f4d6d829edc36e99371af.png)
# 2.小程序代码
* `app`模块配置微信登录
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/f29722712e68419a9f56f26f3fad080d.png)
## 2.1 新增按钮微信授权登录
* 在登录按钮下,新增微信授权登录按钮
```html
<button @click="wxHandleLogin" class="login-btn cu-btn block bg-green lg round">微信授权登录</button>

2.2 创建wx.Login和wxHandleLogin方法

  • 调用uni.getProvider获取服务商信息
  • 调用uni.login获取code,并保存
  • 调用uni.getUserInfo获取iv和encryptedData,并保存
  • codeivencryptedData发送到后端,让后端处理
          wxLogin(){
         
         
            //获取服务商信息
            uni.getProvider({
         
         
                service: "Oauth",
                        success: (res) => {
         
         
                            console.log(res);
                            if(~res.provider.indexOf("WeiXin")){
         
         
                                //登录
                                uni.login({
         
         
                                    provider: "WeiXin",
                                    success: (loginRes) => {
         
         
                                        console.log("登录",loginRes);
                                        this.wxLoginForm.code = loginRes.code;
                                    }
                                })
                            }
                        }
            })
        },
    

    3.后端代码

    3.1 yml配置文件中新增微信小程序id和秘钥

  • 新增配置类WxAppConfig

    public class WxAppConfig {
         
         
    
      /** AppId */
      private String appfId;
    
      /** AppSecret */
      private String appfSecret;
    
      public String getAdppId() {
         
         
          return appId;
      }
    
      public void setAppdId(String appId) {
         
         
          this.appId = appId;
      }
    
      public String getAppSecret() {
         
         
          return appSecret;
      }
    
      public void setAppSecret(String appSecret) {
         
         
          this.appSecret = appSecret;
      }
    }
    

    3.2 在数据库中新增open_id和union_id字段

    在这里插入图片描述

    3.3 在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;
      }
    

    3.4 SysUserMapper新增selectWxUserByOpenId

    /**
       * 根据openId查询用户信息
       * @param openId
       * @return
       */
      public SysUser selectWxUserByOpenId(String openId);
    

    3.5 SysLoginController新增接口wxLogin

    /**
    * 登录验证
    *
    * @author ruoyi
    */
    @RestController
    public class SysLoginController
    {
         
         
      @PostMapping("/wxLogin")
      public AjaxResult wxLogin(@RequestBody WxLoginBody wxLoginBody)
      {
         
         
          logger.info("登录参数:" + JSON.toJSONString(wxLoginBody));
          String code = wxLoginBody.getCode();
          //秘钥
          String encryptedIv = wxLoginBody.getEncryptedIv();
          //加密数据
          String encryptedData = wxLoginBody.getEncryptedData();
    
          //想微信服务器发送请求获取用户信息
          String url = "https://api.weixin.qq.com/snns/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");
    
          //解密
          String decryptResult = "";
          try {
         
         
              //如果没有绑定微信开放平台,解析结果是没有unionid的。
              decryptResult = decrypt(sessionKey,encryptedIv,encryptedData);
          } catch (Exception e) {
         
         
              e.printStackTrace();
              return AjaxResult.error("微信登录失败!");
          }
    
          if (StringUtils.hasText(decryptResult)){
         
         
              //如果解析成功,获取token
              String token = loginService.wxLogin(decryptResult);
              AjaxResult ajax = AjaxResult.success();
              ajax.put(Constants.TOKEN, token);
              return ajax;
          }else{
         
         
              return AjaxResult.error("微信登录失败!");
          }
      }
    
      }
    }
    

    3.6 SysLoginService新增wxLogin方法

    /**
       * 微信登录
       *
       * @param decryptResult 登录凭证 只能用一次
       * @return
       */
      public String wxLogin(String decryptResult){
         
         
          //字符串转json
          JSONObject jsonObject = JSONObject.parseObject(decryptResult);
    //        String unionid = jsonObject.getString("unionid");
          String openId = jsonObject.getString("openId");
          //获取nickName
          String nickName = jsonObject.getString("nickName");
          //获取头像
          String avatarUrl = jsonObject.getString("avatarUrl");
          //还可以获取其他信息
          //根据openid判断数据库中是否有该用户
          //根据openid查询用户信息
          SysUser wxUser = userMapper.selectWxUserByOpenId(openId);
    
          //如果查不到,则新增,查到了,则更新
          SysUser user = new SysUser();
          if (wxUser == null) {
         
         
              // 新增
              user.setUserName(IdUtils.fastSimpleUUID());
              user.setNickName(nickName);
              user.setAvatar(avatarUrl);
              wxUser.setUnionId(unionid);
              user.setOpenId(openId);
              user.setCreateTime(DateUtils.getNowDate());
              //新增 用户
              userMapper.insertUser(user);
          }else {
         
         
              //更新
              user = wxUser;
              user.setNickName(nickName);
              user.setAvatar(avatarUrl);
              user.setUpdateTime(DateUtils.getNowDate());
              userMapper.updateUser(user);
          }
    
          //组装token信息
          LoginUser loginUser = new LoginUser();
          loginUser.setOpenId(openId);
          //如果有的话设置
          loginUser.setUser(user);
          loginUser.setUserId(user.getUserId());
    
          // 生成token
          return tokenService.createToken(loginUser);
      }
    
目录
相关文章
|
3月前
|
人工智能 小程序 安全
小程序跨平台框架未来的发展趋势是什么?
小程序跨平台框架未来的发展趋势是什么?
376 128
|
6月前
|
机器人 数据安全/隐私保护 Python
企业微信自动回复软件,企业微信自动回复机器人,python框架分享
企业微信机器人包含完整的消息处理流程,支持文本消息自动回复、事件处理、消息加密解密等功能
|
6月前
|
JSON 机器人 API
微信机器人自动回复插件,vx自动回复机器人脚本助手,python框架分享
这个微信机器人系统包含三个主要模块:主程序基于itchat实现微信消息监听和自动回复功能
|
6月前
|
JSON 机器人 数据安全/隐私保护
微信自动聊天机器人, 微信自动回复机器人,python框架分享
这个微信机器人实现包含主程序、配置文件、工具函数和测试脚本四个模块。主程序使用itchat库
|
7月前
|
人工智能 监控 数据可视化
微信养号脚本插件,全自动化工具,【autojs实现框架】
这是一套微信养号自动化脚本,包含主脚本`wechat_auto.js`和配置文件`config.json`。脚本实现自动浏览朋友圈、订阅号新闻文章及指定公众号历史文章三大功能,支持自定义滚动次数、阅读时长与运行时间等参数。特点包括随机化操作、多种浏览模式交替及完善的日志记录。配套UI模块提供可视化控制界面,方便监控任务状态与调整参数。下载地址:https://www.pan38.com/share.php?code=n6cPZ,提取码:8888(仅供学习参考)。
|
11月前
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
6132 38
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
11月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
3418 12
|
小程序 前端开发 算法
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
3377 7

热门文章

最新文章