From 95e70ebfbbeb10a912620eb6a6f0b5f393d4163d Mon Sep 17 00:00:00 2001 From: lzx_mac <2602107437@qq.com> Date: Mon, 26 Aug 2024 21:36:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=8E=88=E6=9D=83=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/modules/service/AppletLoginService.java | 26 +++ .../service/impl/AppletLoginServiceImpl.java | 239 +++++++++++++++++++++ .../jeecg/modules/service/AppletLoginService.class | Bin 0 -> 386 bytes .../service/impl/AppletLoginServiceImpl.class | Bin 0 -> 6424 bytes .../noticeapicontroller/LoginApiController.java | 40 ++-- .../jeecg/modules/apiservice/LoginApiService.java | 13 ++ .../apiservice/impl/LoginApiServiceImpl.java | 38 ++++ 7 files changed, 329 insertions(+), 27 deletions(-) create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/AppletLoginService.java create mode 100644 jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/AppletLoginServiceImpl.java create mode 100644 jeecg-boot-base/jeecg-boot-base-core/target/classes/org/jeecg/modules/service/AppletLoginService.class create mode 100644 jeecg-boot-base/jeecg-boot-base-core/target/classes/org/jeecg/modules/service/impl/AppletLoginServiceImpl.class create mode 100644 jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/LoginApiService.java create mode 100644 jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/impl/LoginApiServiceImpl.java diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/AppletLoginService.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/AppletLoginService.java new file mode 100644 index 0000000..0d1fcbb --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/AppletLoginService.java @@ -0,0 +1,26 @@ +package org.jeecg.modules.service; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.bean.LoginReq; + +/** + * @Author lzx + * @Date 2022-05-13 15:56 + **/ +public interface AppletLoginService { + + /** + * 微信小程序登录接口 + * @param loginReq + * @return + */ + Result appletLogin(LoginReq loginReq); + + +// /** +// * 微信小程序登录绑定手机号码接口 +// * @param loginReq +// * @return +// */ +// Result bindPhone(LoginReq loginReq); +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/AppletLoginServiceImpl.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/AppletLoginServiceImpl.java new file mode 100644 index 0000000..d32b299 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/AppletLoginServiceImpl.java @@ -0,0 +1,239 @@ +package org.jeecg.modules.service.impl; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.system.util.JwtUtil; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.modules.bean.HttpConf; +import org.jeecg.modules.bean.LoginReq; +import org.jeecg.modules.hanHaiMember.entity.HanHaiMember; +import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService; +import org.jeecg.modules.service.AppletLoginService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * @Author lzx + * @Date 2022-05-13 15:55 + **/ +@Slf4j +@Service +@SuppressWarnings("all") +public class AppletLoginServiceImpl implements AppletLoginService { + //微信小程序appid(一通告) + private static final String mpAppId = "wx3c24e397e3b132ea"; + //微信小程序appSecret(一通告) + private static final String mpAppSecret = "21b26094216042af6cb0d148a90ecac2"; + + @Resource + private IHanHaiMemberService memberService; + + @Resource + private RedisUtil redisUtil; + @Resource + private HttpConf httpConf; + + + + + /** + * 微信小程序登录接口 + * @param loginReq + * @return + */ + @Transactional(rollbackFor = {Exception.class}) + public Result appletLogin( LoginReq loginReq) { + Result result = new Result<>(); + Map map = new HashMap<>(); + if (StringUtils.isBlank(loginReq.getCode())) { + throw new JeecgBootException("小程序code为空"); + } + String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + mpAppId + "&secret=" + mpAppSecret+ "&js_code=" + loginReq.getCode() + "&grant_type=authorization_code"; + //使用工具类 + JSONObject json_test = httpConf.getJSONObject(loginUrl); + String wxOpenid = json_test.getString("openid"); + String sessionKey = json_test.getString("session_key"); + if (StringUtils.isBlank(wxOpenid)) { + throw new JeecgBootException("未获取到openid"); + } + + HanHaiMember member = memberService.lambdaQuery().eq(HanHaiMember::getAppOpenid,wxOpenid).one(); + if (member == null) { + //如果user等于null说明该用户第一次登录,数据库没有该用户信息。 + loginReq.setOpenid(wxOpenid); + loginReq.setSession_key(sessionKey); + member = new HanHaiMember(); +// member.setSesssionKey(sessionKey); + member.setAppletOpenid(wxOpenid); + member.setNickName(loginReq.getNickName()); + member.setHeadImage(loginReq.getHeadimgurl()); + // 生成token返回给小程序端 + String token = JwtUtil.sign(member.getAppletOpenid(), wxOpenid); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + // 设置超时时间 + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); + map.put("userInfo", member); + map.put("token", token); + + result.setCode(905); + result.setResult(map); + return result; + } else { + member.setHeadImage(loginReq.getHeadimgurl()); +// member.setSessionKey(sessionKey); + memberService.saveOrUpdate(member); + // 生成token返回给小程序端 + String token = JwtUtil.sign(member.getAppletOpenid(), wxOpenid); + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + // 设置超时时间 + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); + map.put("userInfo", member); + map.put("token", token); + //用户id做im账号 + result.setResult(map); + result.setCode(200); +// result.setMessage(member.getNickName()+"已于"+member.getCreateTime()+"注册成功!请勿重复注册!"); +// // 未绑定手机号,跳转授权绑定手机号 +// if (StringUtils.isBlank(member.getPhone())) { +// result.setMessage("该微信用户尚未绑定手机号,请授权手机进行绑定"); +// result.setCode(905); +// result.setResult(map); +// return result; +// } + } + return result; + } + + +// /** +// * 微信小程序登录绑定手机号码接口 +// * @param loginReq +// * @return +// */ +// @Transactional(rollbackFor = Exception.class) +// @Override +// public Result bindPhone(LoginReq loginReq) { +// Result result = new Result<>(); +// if (StringUtils.isEmpty(loginReq.getEncryptedData())) { +// result.setCode(500); +// result.setMessage("请授权手机号"); +// return result; +// } +// String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" + mpAppId + "&secret=" + mpAppSecret+ "&js_code=" + loginReq.getCode() + "&grant_type=authorization_code"; +// CloseableHttpClient client = null; +// CloseableHttpResponse response = null; +// try { +// // 创建http GET请求 +// HttpGet httpGet = new HttpGet(loginUrl); +// client = HttpClients.createDefault(); +// // 执行请求 +// response = client.execute(httpGet); +// HttpEntity entity = response.getEntity();//得到返回数据 +// String resultStr = EntityUtils.toString(entity); +// JSONObject json_test = JSONObject.parseObject(resultStr); +// String wxOpenid = json_test.getString("openid"); +// if (StringUtils.isEmpty(wxOpenid)) { +// return result.error500("未获取到openid"); +// } +// String sessionKey = json_test.getString("session_key"); +// // 保存sessionKey,用于解析手机号码 +// loginReq.setOpenid(wxOpenid); +// loginReq.setSession_key(sessionKey); +// String userPhone = getPhoneNumber(loginReq); +// HanHaiMember one = memberService.lambdaQuery().eq(HanHaiMember::getAppletOpenid, wxOpenid).one(); +// if(one!=null){ +// return result.OK("请不要重复注册"); +// } +// HanHaiMember member = new HanHaiMember(); +// member.setSessionKey(sessionKey); +// member.setAppletOpenid(wxOpenid); +// member.setNickName(loginReq.getNickName()); +// member.setHeadImage(loginReq.getHeadimgurl()); +// member.setPhone(userPhone); +// +// +// //判断用户是否存在 +// HanHaiMember boolOne = memberService.lambdaQuery().eq(HanHaiMember::getAccount, loginReq.geta()).one(); +// boolean bool = false; +// if(one != null){ +// bool = true; +// } +// +// if(!bool){ +// member.setId(boolOne.getId()); +// memberService.updateById(member); +// }else{ +// memberService.save(member); +// } +// +// +// +// return result.OK("注册成功",member); +// }catch(Exception e) { +// e.printStackTrace(); +// return Result.error("操作失败,请联系系统管理员!"); +// } +// +// } +// +// +// +// /** +// * 解析电话号码 +// * @param loginReq +// * @return +// */ +// public String getPhoneNumber(LoginReq loginReq) { +// String encryptedData = loginReq.getEncryptedData(); +// String session_key = loginReq.getSession_key(); +// String iv = loginReq.getIv(); +// // 被加密的数据 +// byte[] dataByte = Base64.decodeBase64(encryptedData); +// // 加密秘钥 +// byte[] keyByte = Base64.decodeBase64(session_key); +// // 偏移量 +// byte[] ivByte = Base64.decodeBase64(iv); +// 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/PKCS5Padding", "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) { +// String result = new String(resultByte, "UTF-8"); +// JSONObject userPhoneObj = JSONObject.parseObject(result); +// Map userMap = new HashMap<>(); +// for (Map.Entry entry : userPhoneObj.entrySet()) { +// userMap.put(entry.getKey(), entry.getValue()); +// } +// // 获取phoneNumber 带区号 +// String userPhone = (String) userMap.get("phoneNumber"); +// return userPhone; +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return null; +// } + +} diff --git a/jeecg-boot-base/jeecg-boot-base-core/target/classes/org/jeecg/modules/service/AppletLoginService.class b/jeecg-boot-base/jeecg-boot-base-core/target/classes/org/jeecg/modules/service/AppletLoginService.class new file mode 100644 index 0000000000000000000000000000000000000000..d09fb46200e664c56da99ef8838c3860969d7a03 GIT binary patch literal 386 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 login(LoginReq loginReq){ + return loginApiService.login(loginReq); } - @ApiOperation(value="小程序-退出接口", notes="小程序-退出接口") - @GetMapping("/logout") - public String logout(){ - return "退出成功"; - } - @ApiOperation(value="小程序-注册接口", notes="小程序-注册接口") - @GetMapping("/register") - public String register(){ - return "注册成功"; - } - @ApiOperation(value="小程序-找回密码接口", notes="小程序-找回密码接口") - @GetMapping("/forget") - public String forget(){ - return "找回密码成功"; - } - @ApiOperation(value="小程序-发送验证码接口", notes="小程序-发送验证码接口") - @GetMapping("/sendCode") - public String sendCode(){ - return "发送验证码成功"; - } - @ApiOperation(value="小程序-绑定手机接口", notes="小程序-绑定手机接口") - @GetMapping("/bindPhone") - public String bindPhone(){ - return "绑定手机成功"; - } } diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/LoginApiService.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/LoginApiService.java new file mode 100644 index 0000000..8e2ff95 --- /dev/null +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/LoginApiService.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.apiservice; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.bean.LoginReq; + +public interface LoginApiService { + + //小程序-登录接口 + Result login(LoginReq loginReq); + + //小程序-退出接口 + Result logout(); +} diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/impl/LoginApiServiceImpl.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/impl/LoginApiServiceImpl.java new file mode 100644 index 0000000..678fb2a --- /dev/null +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiservice/impl/LoginApiServiceImpl.java @@ -0,0 +1,38 @@ +package org.jeecg.modules.apiservice.impl; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.apiservice.LoginApiService; +import org.jeecg.modules.bean.LoginReq; +import org.jeecg.modules.service.AppletLoginService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class LoginApiServiceImpl implements LoginApiService { + + @Resource + private AppletLoginService appletLoginService; + + //小程序-登录接口 + @Override + public Result login(LoginReq loginReq) + { + return appletLoginService.appletLogin(loginReq); + } + + //小程序-退出接口 + @Override + public Result logout() + { + return null; + } + + + + + + + + +}