diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java index a18ffc4..c0d2a75 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/controller/UserController.java @@ -60,6 +60,12 @@ public class UserController { return appletLoginService.appletLogin(loginReq); } + //小程序授权登录 + @ApiOperation(value = "小程序-获取sessionKey", notes = "小程序-获取sessionKey") + @GetMapping("/getSessionKey") + public Result getSessionKey(LoginReq loginReq) { + return appletLoginService.getSessionKey(loginReq); + } /** * 微信用户绑定手机号 @@ -73,9 +79,18 @@ public class UserController { result.setMessage("请授权手机号"); return result; } - return appletLoginService.bindPhone(codeBeanModel); + return appletLoginService.bindPhone2(codeBeanModel.getCode()); } +// /** +// * 微信用户绑定手机号 +// */ +// @PostMapping(value = "/bindPhone") +// @ApiOperation(value = "小程序-绑定手机号") +// public Result bindPhone(String phoneCode) { +// return appletLoginService.bindPhone(phoneCode); +// } + @PostMapping(value = "/updateUserInfo") @ApiOperation(value = "修改头像和昵称,传nickName和headimgurl") diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/AppletLoginService.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/AppletLoginService.java index 0697882..63a382b 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/AppletLoginService.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/AppletLoginService.java @@ -16,6 +16,13 @@ public interface AppletLoginService { */ Result appletLogin(LoginReq loginReq); + /** + * 获取SessionKey + * + * @param loginReq + * @return + */ + Result getSessionKey(LoginReq loginReq); /** * 微信用户绑定手机号 @@ -24,6 +31,15 @@ public interface AppletLoginService { */ Result bindPhone(CodeBeanModel codeBeanModel); + Result bindPhone2(String code); + +// /** +// * 微信小程序登录绑定手机号码接口 +// * @param code +// * @return +// */ +// Result bindPhone(String code); + Result updateUserInfo(CodeBeanModel codeBeanModel, String token); Result role(ReqUserRole reqUserRole, String token); diff --git a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/AppletLoginServiceImpl.java b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/AppletLoginServiceImpl.java index 710fa8f..1b39dfd 100644 --- a/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/AppletLoginServiceImpl.java +++ b/jeecg-boot-module-system/src/main/java/org/jeecg/modules/userCode/service/impl/AppletLoginServiceImpl.java @@ -41,6 +41,12 @@ import javax.annotation.Resource; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; import java.security.AlgorithmParameters; import java.security.Security; import java.util.Arrays; @@ -75,6 +81,72 @@ public class AppletLoginServiceImpl implements AppletLoginService { +// /** +// * 微信小程序登录接口 +// * @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"); +// log.info("mpAppId{}=====mpAppSecret{}=====Code{}======wxOpenid{}",mpAppId,mpAppSecret,loginReq.getCode(),wxOpenid); +// 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); +// //返回身份角色信息 新账号没有身份 +// map.put("boss", null); +// map.put("company", null); +// map.put("worker", null); +// result.setCode(200); +// result.setResult(map); +// return result; +// } else { +// 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 roleInfo = tbUserRoleService.getRoleInfo(member.getId(),false); +// //返回身份角色信息 +// map.put("boss", roleInfo.get("boss")); +// map.put("company", roleInfo.get("company")); +// map.put("worker", roleInfo.get("worker")); +// map.put("userInfo", member); +// map.put("token", token); +// result.setResult(map); +// result.setCode(200); +// } +// +// return result; +// } + /** * 微信小程序登录接口 * @param loginReq @@ -92,7 +164,6 @@ public class AppletLoginServiceImpl implements AppletLoginService { JSONObject json_test = httpConf.getJSONObject(loginUrl); String wxOpenid = json_test.getString("openid"); String sessionKey = json_test.getString("session_key"); - log.info("mpAppId{}=====mpAppSecret{}=====Code{}======wxOpenid{}",mpAppId,mpAppSecret,loginReq.getCode(),wxOpenid); if (StringUtils.isBlank(wxOpenid)) { throw new JeecgBootException("未获取到openid"); } @@ -107,6 +178,9 @@ public class AppletLoginServiceImpl implements AppletLoginService { member.setAppletOpenid(wxOpenid); member.setNickName(loginReq.getNickName()); member.setHeadImage(loginReq.getHeadimgurl()); + if(null != loginReq.getShareId()){ + member.setShareId(loginReq.getShareId()); + } // 生成token返回给小程序端 String token = JwtUtil.sign(member.getAppletOpenid(), wxOpenid); memberService.save(member); @@ -115,32 +189,61 @@ public class AppletLoginServiceImpl implements AppletLoginService { redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 100); map.put("userInfo", member); map.put("token", token); - //返回身份角色信息 新账号没有身份 - map.put("boss", null); - map.put("company", null); - map.put("worker", null); + 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 roleInfo = tbUserRoleService.getRoleInfo(member.getId(),false); - //返回身份角色信息 - map.put("boss", roleInfo.get("boss")); - map.put("company", roleInfo.get("company")); - map.put("worker", roleInfo.get("worker")); 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; } + /** + * 获取sessionKey + * @param loginReq + * @return + */ + @Transactional(rollbackFor = {Exception.class}) + public Result getSessionKey(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"); + log.info("mpAppId{}=====mpAppSecret{}=====Code{}======wxOpenid{}",mpAppId,mpAppSecret,loginReq.getCode(),wxOpenid); + if (StringUtils.isBlank(wxOpenid)) { + throw new JeecgBootException("未获取到openid"); + } + + return Result.OK("sessionKey", sessionKey); + } + @Transactional(rollbackFor = Exception.class) @Override @@ -286,7 +389,65 @@ public class AppletLoginServiceImpl implements AppletLoginService { } + @Transactional(rollbackFor = Exception.class) + @Override + public Result bindPhone2(String code) { + try { + String phoneNumber = this.getPhoneNumber(code); + return Result.OK(phoneNumber); + }catch (Exception e){ + return Result.error(e.getMessage()); + } + } + + private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; + public String getAccessToken() throws Exception { + String requestUrl = String.format(TOKEN_URL, mpAppId, mpAppSecret); + URL url = new URL(requestUrl); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + + try (BufferedReader br = new BufferedReader( + new InputStreamReader(conn.getInputStream(), "UTF-8"))) { + StringBuilder response = new StringBuilder(); + String responseLine; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + + org.json.JSONObject jsonResponse = new org.json.JSONObject(response.toString()); + return jsonResponse.getString("access_token"); + } + } + + private static final String API_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; + public String getPhoneNumber(String code) throws Exception { + URL url = new URL(API_URL + "?access_token=" + this.getAccessToken()); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; utf-8"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + + JSONObject jsonInput = new JSONObject(); + jsonInput.put("code", code); + + try (DataOutputStream os = new DataOutputStream(conn.getOutputStream())) { + byte[] input = jsonInput.toString().getBytes(StandardCharsets.UTF_8); + os.write(input, 0, input.length); + } + try (BufferedReader br = new BufferedReader( + new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder response = new StringBuilder(); + String responseLine; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + //获取手机号码 + return response.toString(); + } + } //解析电话号码 @@ -348,6 +509,9 @@ public class AppletLoginServiceImpl implements AppletLoginService { if (ValidateTool.isNotNull(codeBeanModel.getNickName())){ user.setNickName(codeBeanModel.getNickName()); } + if (ValidateTool.isNotNull(codeBeanModel.getPhoneNumber())){ + user.setPhone(codeBeanModel.getPhoneNumber()); + } user.setId(hanHaiMember.getId()); memberService.updateById(user); return Result.ok("修改成功");