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

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

@[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);
      }
    
目录
相关文章
|
16天前
|
小程序 前端开发 JavaScript
微信小程序MINA框架
【6月更文挑战第4天】微信小程序MINA框架是一个专为小程序设计的框架,它主要分为两大部分:页面视图层(View)和AppService应用逻辑层。下面我将结合代码和图示来详细讲解MINA框架。
16 0
|
5天前
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
24 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
4天前
|
SQL 小程序 JavaScript
微信小程序登录(保持登录状态)
微信小程序登录(保持登录状态)
17 1
|
12天前
|
XML JSON 数据安全/隐私保护
如何使用Fiddler抓取APP接口和微信授权网页源代码
Fiddler是一款强大的抓包工具,用于捕获HTTP/HTTPS流量,包括手机APP和微信授权页面的数据。下载安装Fiddler后,需设置电脑代理,如端口8888,并在手机上配置相同代理,确保两者在同一局域网。通过安装Fiddler证书,可解密HTTPS请求。在手机上打开目标应用或网页,Fiddler将显示请求详情,便于接口调试和数据查看。
19 0
如何使用Fiddler抓取APP接口和微信授权网页源代码
|
7天前
|
Java 测试技术 数据安全/隐私保护
微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
|
1月前
|
JavaScript Java 测试技术
基于SSM框架的童装购买平台微信小程序+vue.js附带文章和源代码设计说明文档ppt
基于SSM框架的童装购买平台微信小程序+vue.js附带文章和源代码设计说明文档ppt
23 1
|
1月前
|
小程序 JavaScript 数据库
小程序登录页面
该文介绍了使用小程序云开发实现登录和注册的步骤,包括界面设计和后端逻辑。界面使用了`wxss`和`wxml`编写,样式精致,包含手机号和密码输入、登录按钮、注册和忘记密码选项。在`js`中,重点处理了用户输入的账号和密码,通过云数据库查询验证用户是否存在,使用标志位`flag`判断,若账号或密码错误,显示相应提示。文章总结了利用for循环比对数据库账号的难点,并表达了作者的学习心得。
31 1
|
1月前
|
存储 小程序 前端开发
超简单实现小程序用户授权登录与退出
本文介绍了如何轻松实现小程序的用户授权登录与退出功能。通过调用微信的`wx.getUserProfile` API获取用户信息,成功后存储到本地以实现授权登录,并在WXML、CSS和JS中提供示例代码。用户信息存储使用`wx.setStorageSync`,退出登录则清除相关缓存,提升用户体验。
29 1
|
21天前
|
小程序 前端开发 Java
(JAVA)支付宝小程序登录相关(authToken获取用户唯一userId、encryptedData解密手机号)
(JAVA)支付宝小程序登录相关(authToken获取用户唯一userId、encryptedData解密手机号)
|
9天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的小程序疫苗预约网站系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的小程序疫苗预约网站系统的详细设计和实现(源码+lw+部署文档+讲解等)