Java利用wxJava实现微信登录和绑定(小程序方式)
一、准备工作:
1.去gitee上引入pom坐标
(图片来源网络,侵删)
https://gitee.com/binary/weixin-java-tools
com.github.binarywang weixin-java-miniapp 4.6.0
2.根据配置配置service
@Configuration public class WxConfig { @Autowired private WxProperties properties; @Bean public WxMaConfig wxMaConfig() { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); config.setAppid(properties.getAppid()); config.setSecret(properties.getSecret()); return config; } @Bean public WxMaService wxMaService(WxMaConfig maConfig) { WxMaService service = new WxMaServiceImpl(); service.setWxMaConfig(maConfig); return service; } }
3.获取微信二维码(包含绑定和登录)
public ResultVo createUnlimitWxaCode(WxLoginDTO wxLoginDTO) { // sendPost方法的额外参数 Map extraParam = new HashMap(); // 小程序码宽度 String accessToken = null; try { accessToken = wxMaService.getAccessToken(); } catch (WxErrorException e) { throw new ApiException("获取二维码失败,请稍后再试"); } if (accessToken == null) { return new ResultVo("access_token为空!"); } // 获取小程序码的接口头部 拼接完整的URl String url = properties.getUrl() + "?access_token=" + accessToken; JSONObject paramJSON = new JSONObject(); Map requestParam = new HashMap(); // 扫码后需要跳转的页面 if (Objects.equals(wxLoginDTO.getScene().substring(0, 1), "b")) { requestParam.put("page", properties.getPage()); } if (!Objects.equals(active,"pro")) { requestParam.put("env_version", "trial"); requestParam.put("check_path", false); } String scene = wxLoginDTO.getScene(); // 携带的参数 requestParam.put("scene", scene); // 小程序码的宽度 requestParam.put("width", 200); log.info("绑定小程序小程序码scene:{}", scene); // sendPost额外参数 判断用户是发起获取小程序码还是其他的连接 extraParam.put("type", "getQrCode"); // 发起连接 String base64String = this.sendPost(url, requestParam, extraParam); return new ResultVo(base64String); }
4.利用code获取openid
public ResultVo getOpenId(WxLoginDTO wxLoginDTO) { try { WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(wxLoginDTO.getCode()); if (sessionInfo != null) { return new ResultVo(200, "获取成功", sessionInfo.getOpenid()); } return new ResultVo(400, "获取失败"); } catch (WxErrorException e) { throw new ApiException("微信二维码获取失败,请稍后再试"); } }
5.绑定用户
public ResultVo bindWxUser(WxLoginDTO wxLoginDTO) { try { String customerCode = wxLoginDTO.getScene().substring(1); User user = userMapper.selectBy(customerCode); if (ObjectUtil.isEmpty(user)) { return new ResultVo(400, "未检测到用户信息"); } User userByOpenId = userMapper.selectByOpenId(wxLoginDTO.getOpenid()); if (ObjectUtil.isNotEmpty(userByOpenId)) { return new ResultVo(400, "您的微信已被其他账号绑定"); } user.setOpenid(wxLoginDTO.getOpenid()); user.setIsBindWeChat("1"); userMapper.updateByPrimaryKeySelective(user); return new ResultVo(200, "绑定成功"); } catch (Exception e) { return new ResultVo(400, "绑定失败,请稍后再试"); } }
6.前端轮询访问状态
public ResultVo getWxaCodeStatus(WxLoginDTO wxLoginDTO) { String key = "wxaScene:" + wxLoginDTO.getScene(); String status = redisUtil.getCacheObject(key); try { if (Objects.equals(WxScanStatusEnum.LOGIN.state(), status)) { key = "wxaScene:" + wxLoginDTO.getScene() + "_" + WxScanStatusEnum.LOGIN.state(); String openid = redisUtil.getCacheObject(key); //根据openid查询用户记录 User user = userMapper.selectByOpenId(openid); //根据openid未得到用户记录 if (user == null) { return new ResultVo(400, "请登录后前往【个人中心-安全中心】,绑定关联微信"); } Map map = userService.getLoginMap(user); return new ResultVo(200, "登陆成功", map); } } catch (Exception e) { throw new ApiException("登陆失败!请稍后再试"); } return new ResultVo(200, "获取成功", status); }
7.后台根据前端设置状态
public ResultVo setWxaCodeStatus(WxLoginDTO wxLoginDTO) { if (StringUtils.isBlank(wxLoginDTO.getScanStatus())) { return new ResultVo(400, "参数为空"); } if (Objects.equals(wxLoginDTO.getScanStatus(), WxScanStatusEnum.LOGIN.state()) && StringUtils.isBlank(wxLoginDTO.getOpenid())) { return new ResultVo(200); } String key = "wxaScene:" + wxLoginDTO.getScene(); if (Objects.equals(wxLoginDTO.getScanStatus(), WxScanStatusEnum.LOGIN.state())) { User userByOpenId = userMapper.selectByOpenId(wxLoginDTO.getOpenid()); if (ObjectUtil.isEmpty(userByOpenId)) { return new ResultVo(400, "请登录后前往【个人中心-安全中心】,绑定关联微信"); } redisUtil.setCacheObject(key, wxLoginDTO.getScanStatus(), 300, TimeUnit.SECONDS); redisUtil.setCacheObject(key + "_" + wxLoginDTO.getScanStatus(), wxLoginDTO.getOpenid(), 300, TimeUnit.SECONDS); } else { redisUtil.setCacheObject(key, wxLoginDTO.getScanStatus(), 300, TimeUnit.SECONDS); } return new ResultVo(200); }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。