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

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

@[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);
      }
    
目录
相关文章
|
5月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
1566 12
|
9月前
|
开发框架 人工智能 小程序
小程序常见的 UI 框架
【10月更文挑战第17天】小程序 UI 框架为开发者提供了便捷的工具和资源,帮助他们快速构建高质量的小程序界面。在选择框架时,需要综合考虑各种因素,以找到最适合项目的解决方案。随着技术的不断进步,UI 框架也将不断发展和创新,为小程序开发带来更多的便利和可能性。
625 58
|
10月前
|
小程序 JavaScript 前端开发
小程序常见的UI框架
小程序常见的UI框架
592 60
|
8月前
|
小程序 前端开发 算法
|
9月前
|
移动开发 前端开发 Android开发
开发指南059-App实现微信扫描登录
App是用uniapp开发的,打包为apk,上传到安卓平板中使用
|
9月前
|
小程序 算法 前端开发
微信小程序---授权登录
微信小程序---授权登录
228 0
|
2月前
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
576 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
|
5月前
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
3月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
4月前
|
人工智能 自然语言处理 小程序
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
1363 11
技术小白如何利用DeepSeek半小时开发微信小程序?

热门文章

最新文章