若依整合微信小程序登录功能

这篇具有很好参考价值的文章主要介绍了若依整合微信小程序登录功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在网上很难搜索到若依来整合微信小程序登录的功能,自己就通过自己的理解整合了一下。这也是很久以前写的了,只是实现了功能,但登录逻辑不太好,改动也比较大。现在会看,感觉应该可以直接用若依注册用户接口来做微信小程序登录的功能。因为考研了,不想再去想改代码了,就把之前自己写的登录功能分享出来,仅供参考,如果用于生产环境可能不太好,自己用着玩吧。自己也可以看看用若依注册接口能不能实现。

注:因为写的时间太长了,下面的不知道粘的全不全,有小的问题可以自己改改

1.在ruoyi-admin 模块中的resource下的applicat.yml中加入配置

wx:
  appid: xxxxxxx
  secret: xxxxxxx
// 这里我做了个默认头像的url
  universalAvatar: xxxxxx

2. 在你创建的业务模块下引入https请求依赖

<!-- http请求工具类 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>

3. 创建一个实体类(这里我用了Lombok注解)

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class WxInfo {
    /**
     * 临时码
     */
    private String code;
    /**
     * 昵称
     */
    private String nickName;
    /**
     * 头像
     */
    private String avatarUrl;

}

4.修改实体这个包下的(package com.ruoyi.common.core.domain.model;)

public class RegisterBody extends LoginBody
{
    /**
     * 用户名
     */
    private String username;

    /**
     * 用户密码
     */
    private String password;

    @Override
    public String toString() {
        return "RegisterBody{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public void setPassword(String password) {
        this.password = password;
    }

    public RegisterBody(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public RegisterBody() {
    }
}

5. 创建controller(记得在springsecurity 配置中放开微信登录的接口)

@RestController
public class WxLoginController {
    protected final Logger log = LoggerFactory.getLogger(this.getClass());
    @Resource
    private AuthenticationManager authenticationManager;
    @Resource
    private ISysUserService userService;
    @Resource
    private TokenService tokenService;
    @Resource
    private SysUserRoleMapper sysUserRoleMapper;
    @Resource
    private SysUserMapper userMapper;

    @Value("${wx.appid}")
    private String appId;
    @Value("${wx.secret}")
    private String secret;
    @Value(("${wx.universalAvatar}"))
    private String universalAvatar;

    @PostMapping("/wxLogin")
    public AjaxResult wechatLogin(@RequestBody WxInfo wxInfo) {
        String code = wxInfo.getCode();
        if(code == null || "".equals(code)) {
            return AjaxResult.error("登录失败,请联系管理员");
        }
        String url = "https://api.weixin.qq.com/sns/jscode2session?" + "appid=" +
                appId +
                "&secret=" +
                secret +
                "&js_code=" +
                code +
                "&grant_type=authorization_code";
        // 创建client请求
        CloseableHttpClient client = HttpClientBuilder.create().build();
        // 构建get请求
        HttpGet get = new HttpGet(url);
        // 发送请求
        CloseableHttpResponse response = null;
        AjaxResult objectJsonResult = null;
        try {
            response = client.execute(get);
            assert response != null;
            log.info("请求响应码:{}",response.getStatusLine().getStatusCode());
            String result = EntityUtils.toString(response.getEntity());
            log.info("请求相应结果:{}",result);
            JSONObject jsonObject = JSON.parseObject(result);
            String openid = jsonObject.getString("openid");
            log.info("小程序唯一标识:{}", openid);
            String token = wxLogin(openid, openid, wxInfo.getNickName(), wxInfo.getAvatarUrl());
            // 查询用户角色信息
            List<String> roles = sysUserRoleMapper.selectUserRoleInfoByOpenId(openid);
            Map<String, Object> map = new HashMap<>(2);
            map.put("token", token);
            map.put("roles", roles);
            return AjaxResult.success(map);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 微信登录接口
     * @param username oppenId
     * @param password oppenId
     * @return token
     */
    public String wxLogin(String username, String password, String nickName, String avatarUrl)
    {
        SysUser sysUser = userService.selectUserByUserName(username);
        if (ObjectUtil.isEmpty(sysUser)) {
            // 注册用户
            log.info("微信用户不存在,注册中...");
            RegisterBody loginBody = new RegisterBody(username, password);
            Long userId = register(loginBody, nickName, avatarUrl);
            // 分配角色
            SysUserRole userRole = new SysUserRole();
            userRole.setRoleId(2L);
            userRole.setUserId((long) userId);
            int res = sysUserRoleMapper.batchUserRole(Collections.singletonList(userRole));
            if (res <= 0) {
                throw new CrudException("用户角色分配失败!");
            }
        }
        log.info("微信用户信息验证...");

        // 如果账户已经删除,则进行恢复
        if (!ObjectUtil.isEmpty(sysUser) && sysUser.getDelFlag().equals("2")) {
            SysUser updateUser = new SysUser();
            Long userId = sysUser.getUserId();
            updateUser.setUserId(userId);
            updateUser.setDelFlag("0");
            int userResult = userMapper.updateUser(updateUser);
            if (userResult <= 0) {
                throw new CrudException("用户登录信息恢复失败");
            }
            // 分配角色
            SysUserRole userRole = new SysUserRole();
            userRole.setRoleId(2L);
            userRole.setUserId((long) userId);
            int roleResult = sysUserRoleMapper.batchUserRole(Collections.singletonList(userRole));
            if (roleResult <= 0) {
                throw new CrudException("用户角色分配失败!");
            }
        }
        // 用户验证
        Authentication authentication = null;
        try
        {
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
            AuthenticationContextHolder.setContext(authenticationToken);
            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager.authenticate(authenticationToken);
        }
        catch (Exception e)
        {
            if (e instanceof BadCredentialsException)
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                throw new UserPasswordNotMatchException();
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
                throw new ServiceException(e.getMessage());
            }
        } finally {
            AuthenticationContextHolder.clearContext();
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        recordLoginInfo(loginUser.getUserId());

        //更新用户信息
        if (!StringUtils.isEmpty(nickName) || !StringUtils.isEmpty(avatarUrl)) {
            SysUser updateUser = new SysUser();
            updateUser.setUserId(loginUser.getUserId());
            if (!StringUtils.isEmpty(nickName)) {
                updateUser.setNickName(nickName);
            }
            if (!StringUtils.isEmpty(avatarUrl)) {
                updateUser.setAvatar(avatarUrl);
            }
            int res = userMapper.updateUser(updateUser);
            if (res <= 0) {
                throw new CrudException("更新用户信息失败");
            }
        }
        // 生成token
        return tokenService.createToken(loginUser);
    }

    /**
     * 注册
     */
    public Long register(RegisterBody registerBody, String nickName, String avatarUrl)
    {
        String username = registerBody.getUsername(), password = registerBody.getPassword();
        Long userId = 0L;
        if (StringUtils.isEmpty(username)) {
            throw new CrudException("用户名不能为空");
        } else if (StringUtils.isEmpty(password)) {
            throw new CrudException("用户密码不能为空");
        } else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username))) {
            throw new CrudException("保存用户'" + username + "'失败,注册账号已存在");
        } else {
            SysUser sysUser = new SysUser();
            sysUser.setUserName(username);
            sysUser.setNickName(StringUtils.isEmpty(nickName) ? "微信用户" : nickName);
            sysUser.setAvatar(StringUtils.isEmpty(avatarUrl) ? universalAvatar : avatarUrl);
            sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword()));
            sysUser.setRoleId(2L);
            boolean flag = userService.registerUser(sysUser);
            if (!flag)
            {
                throw new CrudException("注册失败,请联系系统管理人员");
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER,
                        MessageUtils.message("user.register.success")));
            }
            return sysUser.getUserId();
        }
    }

    /**
     * 记录登录信息
     *
     * @param userId 用户ID
     */
    public void recordLoginInfo(Long userId)
    {
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userId);
        sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
        sysUser.setLoginDate(DateUtils.getNowDate());
        userService.updateUserProfile(sysUser);
    }

}

6.新增查询方法(也就是上面要用到的)文章来源地址https://www.toymoban.com/news/detail-513700.html

// 查询用户角色信息
List<String> roles = sysUserRoleMapper.selectUserRoleInfoByOpenId(openid)

select
            r.role_name
        from
            sys_user u,
            sys_role r,
            sys_user_role ur
        where
            u.del_flag = '0'
          and
            u.user_name = #{userName}
          and
            u.user_id = ur.user_id
          and
            r.role_id = ur.role_id

到了这里,关于若依整合微信小程序登录功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现简单登录界面和登录功能

    客户端开发和学习过程中,登录功能是一个很常见的场景。本文将介绍,微信小程序开发过程中是如何实现登录界面和登录功能的。 话不多说,直接上代码。 (1)index.js文件,代码如下: (2)index.wxml文件,代码如下: (3)index.wxss文件,代码如下: 运行结果如下: 本文介绍了微信

    2024年02月12日
    浏览(92)
  • 微信小程序的一键登录功能

    微信小程序一键登录功能通常使用微信开放平台提供的开放接口实现。以下是实现步骤: 在微信开放平台创建应用并获取AppID和AppSecret。 在小程序中引入微信开放平台提供的js-sdk,并在app.js文件中初始化: 在小程序中添加一键登录的按钮,并在按钮的点击事件中调用微信开

    2024年02月08日
    浏览(39)
  • 微信小程序登录功能实现(最新)

    众所周知小程序登录自 2022年2月21日24时起回收通过open-data展示个人信息的能力 ,啥意思呢,就是头像展示成灰色,昵称展示成微信用户,例如: 话不多说直接正题。         首先介绍第一种,费力的方式:依然还是用 open-type 的值设置为 chooseAvatar ,当用户选择需要使用

    2024年02月08日
    浏览(59)
  • 【2023最新】微信小程序中微信授权登录功能和退出登录功能实现讲解

    教学视频地址: 视频地址 大家要跟着我的教学视频去配套着看代码,了解整个登录流程的实现思路最重要! 以上是我列出的 主要实现代码 , 页面样式那些根据自己需求去实现 ,我这就不贴了。

    2024年02月08日
    浏览(60)
  • 通过微信小程序实现登录功能

    [ ](https://dev.csdn.net/activity?utm_source=sale_sourcesale_source=q4AnCOkys7) 在微信公众平台中注册小程序,并获取 AppID。 在小程序中创建登录页面,包括用户名、密码输入框和登录按钮。 将用户名和密码通过 HTTPS POST 请求发送到后端服务器。 后端服务器验证用户名和密码是否正确,如果

    2023年04月13日
    浏览(71)
  • 微信小程序实现一个简单的登录功能

    微信小程序实现一个简单的登录功能。包括一个登录页面和一个用户信息展示页面。在登录页面中输入用户名和密码,点击登录按钮进行验证,如果验证成功,则跳转到用户信息展示页面,并展示用户的信息(例如用户名和头像)。如果验证失败,则提示登录失败信息。 在上

    2024年02月03日
    浏览(60)
  • 【第十八节:微信小程序 常用功能-登录】微信小程序入门,以思维导图的方式展开18

    若图片看不清,可私信给五木大大要高清大图哈。      效果               wxml页面         view class=\\\"login-container\\\"nn    view class=\\\"login\\\" wx:if=\\\"{{ !logged }}\\\"nn        view class=\\\"app-info\\\"nn            image class=\\\"app-logo\\\" src=\\\"../../images/logo.png\\\" /nn            text class

    2024年01月17日
    浏览(57)
  • 【h5+微信小程序】vue2实现h5扫码登录功能

    需要实现在同域名的h5页面上增加一个微信扫码登录的功能,如果用户已经有小程序的账号,可以直接登录。 使用 :vue2+微信小程序原生开发 可以实现上述功能的 前提 是:同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。域名已经配置。 可以用什么来区分

    2024年02月14日
    浏览(69)
  • 微信小程序一键登录功能,使用uni-app和springboot(JWT鉴权)

    目录 概述 微信登录接口说明  关于获取微信用户的信息 前端代码(uni-app) 后端代码(SpringBoot) 配置文件:application.yml  配置文件:Pom.xml  类:WeChatModel    类:WeChatSessionModel  类:UserInfoController 业务层实现类:UserInfoServiceImpl 工具类:JWTUtils 拦截器配置-自定义拦截器

    2024年02月09日
    浏览(72)
  • Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)

    目录 前言 下面展示操作流程 注册微信小程序 通过后台获取小程序码 前端处理 时序图理解 方案实现步骤 前言 很多业务场景之下我们需要实现  微信扫码登录  的需求,如: 同步网站与小程序的用户数据 。 需要获取用户微信相关基本信息,如头像、id等 实例:小程序上的

    2024年02月02日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包