1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > springboot实现微信小程序授权登录

springboot实现微信小程序授权登录

时间:2023-05-26 12:25:28

相关推荐

springboot实现微信小程序授权登录

0. 引入依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.62</version></dependency>

1. 创建小程序配置类

@Data@ConfigurationProperties("wechat.mini")public class WeChatProperties {private String appId;private String appSecret;}

2. 相应的service

/*** 微信授权登录** @param wechatResultVO 授权返回的结果视图对象* @param stu 学生对象*/public void wechatMiniLogin(WechatResultVO wechatResultVO, Student stu) {if (StringUtils.isEmpty(stu.getOpenId())) {stu.setOpenId(wechatResultVO.getOpenId());stu.setAvatarUrl(wechatResultVO.getAvatarUrl());int flag = studentMapper.updateByPrimaryKeySelective(stu);if (flag <= 0) {throw new SamsException(false, StatusCode.AUTH_FAIL);}}}

3.相应的Controller

@PostMapping("/getUserInfo2WechatMini")public Result getUserInfo2WechatMini(@RequestBody WechatVO wechat) {Student stu = new Student();stu.setStuNum(wechat.getNum());stu = studentService.queryStuByNum(wechat.getNum());if (stu == null) {throw new SamsException(false, StatusCode.USER_INFO_NOT_FOUND);}String url = "https://api./sns/jscode2session?appid=" + weChatProperties.getAppId() + "&secret=" + weChatProperties.getAppSecret() + "&js_code=" + wechat.getCode() + "&grant_type=authorization_code";String result = HttpUtils.sendGet(url, null);if (result.contains("errcode")) {return new Result(false, StatusCode.MINI_AUTH_FAIL);}WechatVO wechatVO = JsonUtils.toBean(result, WechatVO.class);// 被加密的数据byte[] dataByte = Base64.decode(wechat.getEncryptedData());// 加密秘钥byte[] keyByte = Base64.decode(wechatVO.getSession_key());// 偏移量byte[] ivByte = Base64.decode(wechat.getIv());try {// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要int base = 16;if (keyByte.length % base != 0) {int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyByte, 0, temp, 0, keyByte.length);keyByte = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {WechatResultVO wechatResultVO = JsonUtils.toBean(new String(resultByte, StandardCharsets.UTF_8), WechatResultVO.class);studentService.wechatMiniLogin(wechatResultVO, stu);UserVO userVO = new UserVO();userVO.setNum(wechat.getNum());userVO.setPassword(wechat.getPassword());userVO.setType(true);return new Result(true, StatusCode.OK, wechatResultVO);} else {return new Result(false, StatusCode.MINI_AUTH_FAIL);}} catch (Exception e) {return new Result(false, StatusCode.MINI_AUTH_FAIL);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。