From f1710cccd45272623ed5fc4167271b0660128519 Mon Sep 17 00:00:00 2001 From: TS-QD1 Date: Fri, 7 Apr 2023 18:48:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=A4=9AappKey?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wechat/miniapp/MiniappProperties.java | 25 +++--- .../wechat/sign/SignMiniappController.java | 12 +++ .../pojo/vos/sign/MiniappLoginMultiVO.java | 31 ++++++++ .../service/sign/IMiniappSignService.java | 11 +++ .../sign/impl/MiniappSignServiceImpl.java | 44 +++++++++++ .../service/miniapp/IMiniappUserService.java | 8 ++ .../miniapp/impl/MiniappUserServiceImpl.java | 79 ++++++++++++------- .../mybatis/mapper/miniapp-user-mapper.xml | 8 ++ 8 files changed, 175 insertions(+), 43 deletions(-) create mode 100644 login-wechat/src/main/java/ink/wgink/login/wechat/pojo/vos/sign/MiniappLoginMultiVO.java diff --git a/basic-properties/src/main/java/ink/wgink/properties/wechat/miniapp/MiniappProperties.java b/basic-properties/src/main/java/ink/wgink/properties/wechat/miniapp/MiniappProperties.java index 940284f6..d1868478 100644 --- a/basic-properties/src/main/java/ink/wgink/properties/wechat/miniapp/MiniappProperties.java +++ b/basic-properties/src/main/java/ink/wgink/properties/wechat/miniapp/MiniappProperties.java @@ -3,6 +3,9 @@ package ink.wgink.properties.wechat.miniapp; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; +import java.util.List; +import java.util.Map; + /** * When you feel like quitting. Think about why you started * 当你想要放弃的时候,想想当初你为何开始 @@ -23,6 +26,7 @@ public class MiniappProperties { private String grantType; private String appKey; private String appSecret; + private Map appKeySecrets; public Boolean getActive() { return active == null ? false : active; @@ -72,20 +76,11 @@ public class MiniappProperties { this.appSecret = appSecret; } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("{"); - sb.append("\"active\":") - .append(active); - sb.append(",\"authorizeUrl\":\"") - .append(authorizeUrl).append('\"'); - sb.append(",\"grantType\":\"") - .append(grantType).append('\"'); - sb.append(",\"appKey\":\"") - .append(appKey).append('\"'); - sb.append(",\"appSecret\":\"") - .append(appSecret).append('\"'); - sb.append('}'); - return sb.toString(); + public Map getAppKeySecrets() { + return appKeySecrets; + } + + public void setAppKeySecrets(Map appKeySecrets) { + this.appKeySecrets = appKeySecrets; } } diff --git a/login-wechat/src/main/java/ink/wgink/login/wechat/controller/wechat/sign/SignMiniappController.java b/login-wechat/src/main/java/ink/wgink/login/wechat/controller/wechat/sign/SignMiniappController.java index 5a7f3d53..51aea2b3 100644 --- a/login-wechat/src/main/java/ink/wgink/login/wechat/controller/wechat/sign/SignMiniappController.java +++ b/login-wechat/src/main/java/ink/wgink/login/wechat/controller/wechat/sign/SignMiniappController.java @@ -4,6 +4,7 @@ import ink.wgink.annotation.CheckRequestBodyAnnotation; import ink.wgink.exceptions.PropertiesException; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.login.wechat.pojo.vos.sign.MiniappLoginVO; +import ink.wgink.login.wechat.pojo.vos.sign.MiniappLoginMultiVO; import ink.wgink.login.wechat.service.sign.IMiniappSignService; import ink.wgink.pojo.result.ErrorResult; import ink.wgink.pojo.result.SuccessResultData; @@ -49,4 +50,15 @@ public class SignMiniappController { return new SuccessResultData<>(miniAppSignService.defaultSign(miniAppLoginVO)); } + @ApiOperation(value = "默认登录", notes = "通过jsCode完成用户与微信openid绑定并返回token") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("default-multi") + @CheckRequestBodyAnnotation + public SuccessResultData defaultSignMulti(@RequestBody MiniappLoginMultiVO miniappLoginMultiVO) throws Exception { + if (!miniAppProperties.getActive()) { + throw new PropertiesException("小程序配置未激活"); + } + return new SuccessResultData<>(miniAppSignService.defaultSignMulti(miniappLoginMultiVO)); + } + } diff --git a/login-wechat/src/main/java/ink/wgink/login/wechat/pojo/vos/sign/MiniappLoginMultiVO.java b/login-wechat/src/main/java/ink/wgink/login/wechat/pojo/vos/sign/MiniappLoginMultiVO.java new file mode 100644 index 00000000..9da18ff9 --- /dev/null +++ b/login-wechat/src/main/java/ink/wgink/login/wechat/pojo/vos/sign/MiniappLoginMultiVO.java @@ -0,0 +1,31 @@ +package ink.wgink.login.wechat.pojo.vos.sign; + +import ink.wgink.annotation.CheckEmptyAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: WechatMiniProgramLoginVO + * @Description: 小程序登录VO + * @Author: WangGeng + * @Date: 2020/5/9 18:12 + * @Version: 1.0 + **/ +@ApiModel +public class MiniappLoginMultiVO extends MiniappLoginVO { + + @ApiModelProperty(name = "appKey", value = "appKey") + @CheckEmptyAnnotation(name = "appKey") + private String appKey; + + public String getAppKey() { + return appKey; + } + + public void setAppKey(String appKey) { + this.appKey = appKey; + } +} diff --git a/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/IMiniappSignService.java b/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/IMiniappSignService.java index 5165b295..21546cd2 100644 --- a/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/IMiniappSignService.java +++ b/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/IMiniappSignService.java @@ -1,5 +1,6 @@ package ink.wgink.login.wechat.service.sign; +import ink.wgink.login.wechat.pojo.vos.sign.MiniappLoginMultiVO; import ink.wgink.login.wechat.pojo.vos.sign.MiniappLoginVO; import ink.wgink.login.wechat.pojo.vos.update.MiniappUpdatePhoneVO; @@ -26,6 +27,14 @@ public interface IMiniappSignService { */ String defaultSign(MiniappLoginVO miniAppLoginVO) throws Exception; + /** + * 默认登录,多APPID + * + * @param miniappLoginMultiVO + * @return + */ + String defaultSignMulti(MiniappLoginMultiVO miniappLoginMultiVO) throws Exception; + /** * 更新电话 * @@ -34,4 +43,6 @@ public interface IMiniappSignService { * @return */ String updatePhone(String token, MiniappUpdatePhoneVO miniappUpdatePhoneVO) throws UnsupportedEncodingException; + + } diff --git a/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/impl/MiniappSignServiceImpl.java b/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/impl/MiniappSignServiceImpl.java index 9d2e01a5..86eadd68 100644 --- a/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/impl/MiniappSignServiceImpl.java +++ b/login-wechat/src/main/java/ink/wgink/login/wechat/service/sign/impl/MiniappSignServiceImpl.java @@ -8,6 +8,7 @@ import ink.wgink.exceptions.WechatUserInfoException; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.login.base.service.BaseAppSignService; import ink.wgink.login.wechat.pojo.bos.miniapp.MiniappPhoneDataBO; +import ink.wgink.login.wechat.pojo.vos.sign.MiniappLoginMultiVO; import ink.wgink.login.wechat.pojo.vos.sign.MiniappLoginVO; import ink.wgink.login.wechat.pojo.vos.update.MiniappUpdatePhoneVO; import ink.wgink.login.wechat.service.sign.IMiniappSignService; @@ -92,6 +93,49 @@ public class MiniappSignServiceImpl extends BaseAppSignService implements IMinia return getMiniappToken(userPO); } + @Override + public String defaultSignMulti(MiniappLoginMultiVO miniappLoginMultiVO) throws Exception { + if (miniappLoginMultiVO == null) { + throw new PropertiesException("未有相关配置"); + } + String appid = miniappLoginMultiVO.getAppKey(); + String secret = miniappProperties.getAppKeySecrets().get(miniappLoginMultiVO.getAppKey()); + if (StringUtils.isBlank(secret)) { + throw new PropertiesException("配置有误"); + } + Map params = new HashMap<>(2); + params.put("appid", appid); + params.put("secret", secret); + params.put("js_code", miniappLoginMultiVO.getJsCode()); + params.put("grant_type", miniappProperties.getGrantType()); + + StringBuilder url = new StringBuilder(miniappProperties.getAuthorizeUrl()); + url.append("?appid={appid}&secret={secret}&js_code={js_code}&grant_type={grant_type}"); + RestTemplate restTemplate = new RestTemplate(); + + String resultJson = restTemplate.getForObject(url.toString(), String.class, params); + MiniappUserInfoBO miniappUserInfoBO = JSONObject.parseObject(resultJson, MiniappUserInfoBO.class); + if (miniappUserInfoBO == null) { + throw new WechatUserInfoException("获取微信用户信息失败"); + } + if (miniappUserInfoBO.getErrcode() != null && miniappUserInfoBO.getErrcode() != 0) { + throw new WechatAccessTokenForUserException(String.format("获取用户信息失败,错误码:%s,错误信息:%s", miniappUserInfoBO.getErrcode(), miniappUserInfoBO.getErrmsg())); + } + LOG.debug("绑定用户"); + String userId = miniappUserService.createAndReturnUserId(appid, miniappUserInfoBO.getOpenid()); + UserPO userPO = userService.getPO(userId); + if (userPO == null) { + throw new SearchException("用户不存在"); + } + // 加入管理队列 + MiniappManager.getInstance().addUser(userId, miniappUserInfoBO); + if (miniappUserCreateHandleService != null) { + // 自定义新增处理 + miniappUserCreateHandleService.handle(userPO, miniappUserInfoBO.getOpenid()); + } + return getMiniappToken(userPO); + } + @Override public String updatePhone(String token, MiniappUpdatePhoneVO miniappUpdatePhoneVO) throws UnsupportedEncodingException { String userId = getAppTokenUser(token).getId(); diff --git a/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/IMiniappUserService.java b/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/IMiniappUserService.java index 1ab95c51..e102eae7 100644 --- a/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/IMiniappUserService.java +++ b/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/IMiniappUserService.java @@ -116,4 +116,12 @@ public interface IMiniappUserService extends IMiniappUserBaseService { */ List listPOByUserCodes(List userCodes); + /** + * 通过openId获取用户 + * + * @param openId + * @return + */ + List listPOByOpenId(String openId); + } diff --git a/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/impl/MiniappUserServiceImpl.java b/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/impl/MiniappUserServiceImpl.java index b3f026f6..ca33ff22 100644 --- a/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/impl/MiniappUserServiceImpl.java +++ b/module-wechat/src/main/java/ink/wgink/module/wechat/service/miniapp/impl/MiniappUserServiceImpl.java @@ -51,33 +51,47 @@ public class MiniappUserServiceImpl extends DefaultBaseService implements IMinia @Override public String createAndReturnUserId(String appKey, String openId) { - MiniappUserPO miniAppUserPO = getPO(appKey, openId); - if (miniAppUserPO != null) { - LOG.debug("已经绑定小程序用户"); - return miniAppUserPO.getUserId(); + List miniAppUserPOS = listPOByOpenId(openId); + LOG.debug("判断是否绑定过系统用户"); + String userId; + if (miniAppUserPOS.size() == 0) { + LOG.debug("没有绑定过系统用户,新增"); + // 随机字符串 + String randomUserName = WStringUtil.randomSubStr(openId, 6); + UserVO userVO = new UserVO(); + userVO.setUserUsername(MINIAPP_RANDOM_USER_PREFIX + randomUserName); + userVO.setUserName("微信M" + randomUserName); + userVO.setUserPassword(defaultPassword); + userVO.setUserState(0); + // 公共用户 + userVO.setUserType(3); + userId = userService.saveAndReturnId(userVO, true); + } else { + LOG.debug("绑定过系统用户"); + userId = miniAppUserPOS.get(0).getUserId(); } - // 随机字符串 - String randomUserName = WStringUtil.randomSubStr(openId, 6); - UserVO userVO = new UserVO(); - userVO.setUserUsername(MINIAPP_RANDOM_USER_PREFIX + randomUserName); - userVO.setUserName("微信M" + randomUserName); - userVO.setUserPassword(defaultPassword); - userVO.setUserState(0); - // 公共用户 - userVO.setUserType(3); - String userId = userService.saveAndReturnId(userVO, true); + LOG.debug("判断是否绑定过小程序用户"); + boolean isBindMiniappUser = false; + for (MiniappUserPO miniappUserPO : miniAppUserPOS) { + if (StringUtils.equals(miniappUserPO.getAppId(), appKey)) { + isBindMiniappUser = true; + break; + } + } + if (!isBindMiniappUser) { + LOG.debug("没有绑定过小程序用户appId:{},绑定", appKey); + Map params = getHashMap(6); + params.put("appId", appKey); + params.put("openId", openId); + params.put("userId", userId); + params.put("isInitAccount", 1); + params.put("gmtCreate", DateUtil.getTime()); + miniappUserDao.save(params); - Map params = getHashMap(6); - params.put("appId", appKey); - params.put("openId", openId); - params.put("userId", userId); - params.put("isInitAccount", 1); - params.put("gmtCreate", DateUtil.getTime()); - miniappUserDao.save(params); - - Long id = Long.parseLong(params.get("id").toString()); - String userCode = ShareCodeUtil.gen(id); - updateUserCode(userCode, openId); + Long id = Long.parseLong(params.get("id").toString()); + String userCode = ShareCodeUtil.gen(id); + updateUserCode(userCode, appKey, openId); + } return userId; } @@ -184,7 +198,9 @@ public class MiniappUserServiceImpl extends DefaultBaseService implements IMinia @Override public List listPO(String userId) { - return null; + Map params = getHashMap(2); + params.put("userId", userId); + return listPO(params); } @Override @@ -228,10 +244,17 @@ public class MiniappUserServiceImpl extends DefaultBaseService implements IMinia return listPO(params); } - private void updateUserCode(String userCode, String openId) { + @Override + public List listPOByOpenId(String openId) { + Map params = getHashMap(2); + params.put("openId", openId); + return listPO(params); + } + + private void updateUserCode(String userCode, String appKey, String openId) { Map params = getHashMap(6); params.put("userCode", userCode); - params.put("appId", miniappProperties.getAppKey()); + params.put("appId", appKey); params.put("openId", openId); miniappUserDao.updateUserCode(params); } diff --git a/module-wechat/src/main/resources/mybatis/mapper/miniapp-user-mapper.xml b/module-wechat/src/main/resources/mybatis/mapper/miniapp-user-mapper.xml index c2dfb63f..c5d1c6fb 100644 --- a/module-wechat/src/main/resources/mybatis/mapper/miniapp-user-mapper.xml +++ b/module-wechat/src/main/resources/mybatis/mapper/miniapp-user-mapper.xml @@ -124,6 +124,14 @@ #{userIds[${index}]} + + AND + user_id = #{userId} + + + AND + open_id = #{openId} + AND user_code IN