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

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

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

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.新增查询方法(也就是上面要用到的)

// 查询用户角色信息
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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要追加额外费用) 随着移动互联网技术的发展和用户需求的变化,【小程序名称】应运而生,以其轻量化、便捷化的设计理念为用户提供了一种全新的服务模式。作为一款无需下载安装即可使用的应用,【小程序名称】依托于微信庞大的生态系统,让用户在微信内就能轻松实现各种功能操作。 【小程序名称】的核心功能主要集中在【具体服务领域】,例如在线购物、本地生活服务、教育学习或健康管理等。它简化了传统APP繁琐的注册登录流程,支持微信一键授权登录,极大地提升了用户体验。用户通过搜索或扫描二维码,瞬间即可开启使用,享受快速加载、流畅运行的服务。 该小程序界面设计简洁明了,布局合理,易于上手。同时,其特色功能如实时更新的信息推送、个性化推荐以及社交分享功能,让用户能够及时获取所需信息,并方便地将优质内容分享至朋友圈或好友,实现信息的高效传播与互动。 【小程序名称】注重数据安全与隐私保护,严格遵守国家法律法规和微信平台的规定,确保用户数据的安全无虞。此外,其背后的开发团队持续迭代更新,根据用户反馈不断优化产品性能,提升服务质量,致力于打造一个贴近用户需求、充满活力的小程序生态。 总结来说,【小程序名称】凭借其小巧便携、快捷高效的特性,不仅节省了用户的手机存储空间,更为用户提供了无缝衔接的便利服务,是现代生活中不可或缺的一部分,真正实现了“触手可及”的智能生活新体验。只需轻点屏幕,无限精彩尽在掌握之中。
### 回答1: Java整合微信小程序案例包括以下步骤: 1. 配置小程序开发环境:首先下载并安装微信开发者工具,并登录微信开放平台账号;然后新建一个小程序项目,获取到AppID。 2. 后端开发:使用Java语言进行后端开发,可以选择使用SpringBoot框架来简化开发。首先创建一个SpringBoot项目,然后引入相关依赖,如Spring MVC、MyBatis等。接着编写后端接口,实现与小程序进行数据交互。可以使用微信提供的开放接口,如登录、支付等;也可以自定义接口,处理业务逻辑。在后端开发过程中,需要注意保护AppID和AppSecret等敏感信息。 3. 前端开发:使用小程序开发框架进行前端开发,可以选择使用JavaScript、HTML和CSS等技术来实现。根据小程序的需求,编写界面和功能代码。可以利用小程序提供的API和组件,实现用户登录、数据展示、表单提交等功能。与后端进行数据交互时,可以使用小程序提供的wx.request()方法发送请求,并处理后台返回的数据。 4. 数据库设计和管理:根据实际需求,设计数据库表结构,并在后端代码中使用MyBatis等工具进行数据库操作。在后端接口的实现中,可以对数据库进行增删改查操作,以实现与小程序的数据交互。 5. 部署和测试:完成开发后,将后端代码部署到服务器上,确保服务器环境符合要求。然后在微信开发者工具中进行测试,检查小程序的功能是否正常,并进行错误修复和优化。 总结: Java整合微信小程序案例主要包括配置小程序开发环境、后端开发、前端开发、数据库设计和管理、部署和测试等步骤。这样可以实现前后端的数据交互,并提供丰富的功能体验。 ### 回答2: Java整合微信小程序是一种将Java后端与微信小程序前端进行整合的方法,可以实现微信小程序与后台数据的交互和业务逻辑的处理。 首先,我们需要通过使用Java开发框架(如Spring Boot)搭建后台服务器,编写后台接口来响应小程序的请求。这些接口可以通过RESTful API的形式暴露给小程序端,用于处理小程序发起的各种请求,比如用户登录验证、数据查询、数据更新等。 然后,我们需要使用微信开发者工具来创建一个微信小程序项目,编写小程序的前端页面和逻辑。在小程序中,我们可以使用微信提供的JS-SDK来实现与Java后端的交互。通过调用微信提供的API,我们可以向后台发送请求、获取响应数据等。同时,还可以通过微信提供的登录接口获取用户的openid等信息,实现用户登录鉴权。 接着,我们需要在Java后端中集成微信支付等功能。通过调用微信支付的API,我们可以实现小程序中的支付功能。在服务器端,我们可以根据微信支付的回调通知来处理支付结果,更新订单状态等。 此外,为了提高性能和安全性,我们可以使用缓存(如Redis)来缓存一些频繁访问的数据,避免频繁地访问数据库。同时,我们也可以采用一些安全策略,如加密传输、防护SQL注入等,保障数据的安全性。 总而言之,Java整合微信小程序案例中,我们需要通过编写后端接口来实现与微信小程序的交互,同时结合微信提供的API和SDK,实现用户登录、数据查询、数据更新和支付等功能。通过合理的架构设计和安全策略,可以确保整合的稳定性和安全性。 ### 回答3: Java整合微信小程序是通过使用Java开发语言来实现微信小程序的功能和接口调用。以下是一个可能的案例说明: 假设我们要开发一个在线商城的微信小程序,使用Java整合微信小程序可以实现如下功能: 1. 用户登录和授权:通过Java的第三方登录授权库,我们可以实现用户登录和授权的功能,使用户可以在小程序中使用自己的微信账号登录,并获取用户信息。 2. 商品展示和搜索:通过Java的Web开发框架,我们可以构建一个后台管理系统,用于管理商品信息。通过接口调用,将商品信息传输到微信小程序中,实现商品的展示和搜索功能。 3. 购物车和下单:通过Java的数据库操作技术,我们可以实现购物车和下单功能。当用户点击加入购物车按钮时,可以将商品信息和用户信息保存在数据库中。当用户点击下单按钮时,可以生成订单,并实时更新库存和销量信息。 4. 支付功能:通过Java的支付接口调用,我们可以实现支付功能。当用户选择支付方式并点击支付按钮时,可以调用微信支付接口进行支付操作,实现用户的支付功能。 5. 订单管理:通过Java的数据库操作技术,我们可以实现订单管理功能。管理员可以查看、处理和导出订单信息,以及进行物流查询和发货操作。 通过Java整合微信小程序,我们可以实现以上功能和更多定制化需求,使得商城小程序能够更加方便和高效地满足用户的购物需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值