From 31e0635038b94602149a807653836af49e220dd8 Mon Sep 17 00:00:00 2001 From: Augcl <17674666882@163.com> Date: Sat, 12 Oct 2024 17:05:57 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=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 | 21 ++ .../modules/service/impl/ApiLoginServiceImpl.java | 4 +- .../service/impl/AppletLoginServiceImpl.java | 232 +++++++++++++++++++++ .../api/employController/LoginApiController.java | 49 +++++ .../jeecg/modules/apiService/LoginApiService.java | 15 ++ .../apiService/impl/LoginApiServiceImpl.java | 39 ++++ 6 files changed, 358 insertions(+), 2 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-module-system/src/main/java/org/jeecg/modules/api/employController/LoginApiController.java 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..5af6465 --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/AppletLoginService.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.service; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.bean.LoginReq; + +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/ApiLoginServiceImpl.java b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/ApiLoginServiceImpl.java index 805657a..da585f9 100644 --- a/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/ApiLoginServiceImpl.java +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/ApiLoginServiceImpl.java @@ -47,13 +47,13 @@ public class ApiLoginServiceImpl implements ApiLoginService { * 微信公众号-appid */ - private String mpAppId = "wx15be4225a7e41a1e"; + private String mpAppId = ""; /** * 微信公众号-appSecret */ - private String mpAppSecret = "0fdb77429ffdf206c151af76a663041c"; + private String mpAppSecret = ""; /** 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..cafd4cd --- /dev/null +++ b/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/service/impl/AppletLoginServiceImpl.java @@ -0,0 +1,232 @@ +package org.jeecg.modules.service.impl; + +import com.alibaba.fastjson.JSONObject; +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; + +@Service +public class AppletLoginServiceImpl implements AppletLoginService { + //微信小程序appid(特易招) + private static final String mpAppId = ""; + //微信小程序appSecret(特易招) + private static final String mpAppSecret = ""; + + @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::getAppletOpenid,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); + memberService.save(member); + 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(200); + 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-module-system/src/main/java/org/jeecg/modules/api/employController/LoginApiController.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/employController/LoginApiController.java new file mode 100644 index 0000000..45e078a --- /dev/null +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/employController/LoginApiController.java @@ -0,0 +1,49 @@ +package org.jeecg.modules.api.employController; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.apiService.LoginApiService; +import org.jeecg.modules.bean.LoginReq; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Api(tags="小程序-登录相关接口") +@RestController +@RequestMapping("/api/login") +@Slf4j +public class LoginApiController { + + //授权登录 + @Resource + private LoginApiService loginApiService; + + + //小程序授权登录 + @ApiOperation(value="小程序-登录接口", notes="小程序-登录接口") + @GetMapping("/login") + public Result login(LoginReq loginReq){ + return loginApiService.login(loginReq); + } + + //获取用户协议 + @ApiOperation(value="小程序-获取用户协议", notes="小程序-获取用户协议") + @GetMapping("/getUserAgreement") + public Result getUserAgreement(){ + return loginApiService.getUserAgreement(); + } + + + //获取隐私政策 + @ApiOperation(value="小程序-获取隐私政策", notes="小程序-获取隐私政策") + @GetMapping("/getPrivacyPolicy") + public Result getPrivacyPolicy(){ + return loginApiService.getPrivacyPolicy(); + } + + +} 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..338f385 --- /dev/null +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiService/LoginApiService.java @@ -0,0 +1,15 @@ +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 getUserAgreement(); + + //获取隐私政策 + Result getPrivacyPolicy(); +} 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..01a37a8 --- /dev/null +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/apiService/impl/LoginApiServiceImpl.java @@ -0,0 +1,39 @@ +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 getUserAgreement() + { + + return Result.OK("用户协议"); + } + + //获取隐私政策 + @Override + public Result getPrivacyPolicy() + { + + return Result.OK("隐私政策"); + } +}