From df9f40ade3cc5b8993d6cf1d2179afd28ec66ffd Mon Sep 17 00:00:00 2001 From: damonyuan <404054358@qq.com> Date: Thu, 24 Oct 2024 01:22:27 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?bug=20fix=20wechat/jsConfig=20=E6=8A=A5=E9=94=99=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/exception/OperateException.java | 3 + .../mdd/front/controller/LoginController.java | 19 +++++- .../front/service/impl/LoginServiceImpl.java | 3 +- .../front/service/impl/UserServiceImpl.java | 14 ++++ .../front/service/impl/WechatServiceImpl.java | 66 +++++++++++-------- .../users/UserBindWechatValidate.java | 2 + 6 files changed, 74 insertions(+), 33 deletions(-) diff --git a/server/like-common/src/main/java/com/mdd/common/exception/OperateException.java b/server/like-common/src/main/java/com/mdd/common/exception/OperateException.java index b980110e..f9489bcb 100644 --- a/server/like-common/src/main/java/com/mdd/common/exception/OperateException.java +++ b/server/like-common/src/main/java/com/mdd/common/exception/OperateException.java @@ -15,4 +15,7 @@ public class OperateException extends BaseException { super(errCode, msg, ErrorEnum.SHOW_MSG.getCode()); } + public OperateException(String msg, Integer errCode, Integer showCode) { + super(errCode, msg, showCode); + } } diff --git a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java index 1be98d48..0b650706 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java @@ -5,9 +5,12 @@ import com.mdd.common.aop.NotPower; import com.mdd.common.core.AjaxResult; import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.service.ILoginService; +import com.mdd.front.service.IUserService; import com.mdd.front.validate.login.*; +import com.mdd.front.validate.users.UserBindWechatValidate; import com.mdd.front.vo.login.LoginUrlsVo; import com.mdd.front.vo.login.LoginTokenVo; +import com.mdd.front.vo.user.UserInfoVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -27,6 +30,8 @@ public class LoginController { @Resource ILoginService iLoginService; + @Resource + IUserService iUserService; @NotLogin @PostMapping("/register") @@ -82,16 +87,16 @@ public class LoginController { LoginTokenVo vo = iLoginService.officeLogin(code, terminal); return AjaxResult.success(vo); } - @NotLogin - @GetMapping("/oaCodeUrl") + @GetMapping("/codeUrl") @ApiOperation(value="公众号链接") - public AjaxResult oaCodeUrl(@Validated @NotNull() @RequestParam("url") String url) { + public AjaxResult codeUrl(@Validated @NotNull() @RequestParam("url") String url) { LoginUrlsVo vo = new LoginUrlsVo(); vo.setUrl(iLoginService.oaCodeUrl(url)); return AjaxResult.success(vo); } + @NotLogin @GetMapping("/scanCodeUrl") @ApiOperation(value="PC扫码链接") @@ -122,4 +127,12 @@ public class LoginController { return AjaxResult.success(); } + @NotLogin + @PostMapping("/oaAuthBind") + @ApiOperation(value="绑定微信公众号") + public AjaxResult oaAuthBind(@Validated @RequestBody UserBindWechatValidate BindOaValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + iUserService.bindOa(BindOaValidate, userId); + return AjaxResult.success(); + } } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java index 35fa9819..0c887899 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java @@ -225,7 +225,8 @@ public class LoginServiceImpl implements ILoginService { public String oaCodeUrl(String url) { WxMpService wxMpService = WxMnpDriver.oa(); WxMpOAuth2ServiceImpl wxMpOAuth2Service = new WxMpOAuth2ServiceImpl(wxMpService); - return wxMpOAuth2Service.buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, null); + String state = ToolUtils.makeMd5(ToolUtils.makeToken()); + return wxMpOAuth2Service.buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, state); } /** diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java index f7265221..d89d5aa1 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java @@ -375,6 +375,8 @@ public class UserServiceImpl implements IUserService { String uniId = wxOAuth2AccessToken.getUnionId(); String openId = wxOAuth2AccessToken.getOpenId(); String unionId = uniId == null ? "0" : uniId; + Integer terminal = ClientEnum.OA.getCode(); + String key = bindOaValidate.getKey(); // 授权校验,未授权创建授权,已授权返回 bindWechatAuth(openId, unionId, ClientEnum.OA.getCode(), userId); @@ -445,6 +447,18 @@ public class UserServiceImpl implements IUserService { } } + if (StringUtils.isNotNull(unionId)) { + if (unionId.equals("0") == false) { + //在用unionid找记录,防止生成两个账号,同个unionid的问题 + UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper() + .eq("unionid", unionId) + .last("limit 1")); + if (StringUtils.isNotNull(userAuth)) { + throw new OperateException("该微信已被绑定"); + } + } + } + // 记录微信授权 UserAuth authModel = new UserAuth(); authModel.setUserId(userId); diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/WechatServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/WechatServiceImpl.java index cb50ce93..1e09119a 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/WechatServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/WechatServiceImpl.java @@ -1,5 +1,8 @@ package com.mdd.front.service.impl; +import com.alibaba.fastjson2.JSONArray; +import com.mdd.common.enums.ErrorEnum; +import com.mdd.common.exception.OperateException; import com.mdd.common.plugin.wechat.WxMnpDriver; import com.mdd.common.util.ConfigUtils; import com.mdd.front.service.IWechatService; @@ -12,36 +15,41 @@ public class WechatServiceImpl implements IWechatService { @Override public Map jsConfig(String url) throws Exception { - String appId = ConfigUtils.get("oa_setting", "app_id"); - String accessToken = WxMnpDriver.mnp().getAccessToken(); - String jsapiTicket = WxMnpDriver.getJsSdkGetTicket(accessToken); - String timestamp = Long.toString(System.currentTimeMillis() / 1000); - String nonceStr = UUID.randomUUID().toString(); - String signature = WxMnpDriver.buildJSSDKSignature(jsapiTicket,timestamp,nonceStr,url); + try { + String appId = ConfigUtils.get("oa_setting", "app_id"); + String accessToken = WxMnpDriver.oa().getAccessToken(); + String jsapiTicket = WxMnpDriver.getJsSdkGetTicket(accessToken); + String timestamp = Long.toString(System.currentTimeMillis() / 1000); + String nonceStr = UUID.randomUUID().toString(); + String signature = WxMnpDriver.buildJSSDKSignature(jsapiTicket,timestamp,nonceStr,url); - List array = Arrays.asList( - "onMenuShareTimeline", - "onMenuShareAppMessage", - "onMenuShareQQ", - "onMenuShareWeibo", - "onMenuShareQZone", - "openLocation", - "getLocation", - "chooseWXPay", - "updateAppMessageShareData", - "updateTimelineShareData", - "openAddress", - "scanQRCode"); + List array = Arrays.asList( + "onMenuShareTimeline", + "onMenuShareAppMessage", + "onMenuShareQQ", + "onMenuShareWeibo", + "onMenuShareQZone", + "openLocation", + "getLocation", + "chooseWXPay", + "updateAppMessageShareData", + "updateTimelineShareData", + "openAddress", + "scanQRCode"); - Map map = new HashMap<>(); - map.put("url", url); - map.put("jsapi_ticket", jsapiTicket); - map.put("nonceStr", nonceStr); - map.put("timestamp", timestamp); - map.put("signature", signature); - map.put("appid", appId); - map.put("jsApiList", array); - return map; + Map map = new HashMap<>(); + map.put("url", url); + map.put("jsapi_ticket", jsapiTicket); + map.put("nonceStr", nonceStr); + map.put("timestamp", timestamp); + map.put("signature", signature); + map.put("appId", appId); + map.put("jsApiList", array); + map.put("openTagList", new JSONArray()); + map.put("debug", false); + return map; + } catch (Exception e) { + throw new OperateException(e.getMessage(), ErrorEnum.FAILED.getCode(), -1); + } } - } diff --git a/server/like-front/src/main/java/com/mdd/front/validate/users/UserBindWechatValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/users/UserBindWechatValidate.java index 0e7b73ef..82fd4061 100644 --- a/server/like-front/src/main/java/com/mdd/front/validate/users/UserBindWechatValidate.java +++ b/server/like-front/src/main/java/com/mdd/front/validate/users/UserBindWechatValidate.java @@ -17,4 +17,6 @@ public class UserBindWechatValidate implements Serializable { @ApiModelProperty(value = "微信code", required = true) private String code; + @ApiModelProperty(value = "key") + private String key; }