fix 修复微信授权登录失败的bug

fix wechat/jsConfig 报错的bug
This commit is contained in:
damonyuan 2024-10-24 01:22:27 +08:00
parent 29f516aa6d
commit df9f40ade3
6 changed files with 74 additions and 33 deletions

View File

@ -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);
}
}

View File

@ -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<LoginUrlsVo> oaCodeUrl(@Validated @NotNull() @RequestParam("url") String url) {
public AjaxResult<LoginUrlsVo> 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<Object> oaAuthBind(@Validated @RequestBody UserBindWechatValidate BindOaValidate) {
Integer userId = LikeFrontThreadLocal.getUserId();
iUserService.bindOa(BindOaValidate, userId);
return AjaxResult.success();
}
}

View File

@ -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);
}
/**

View File

@ -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<UserAuth>()
.eq("unionid", unionId)
.last("limit 1"));
if (StringUtils.isNotNull(userAuth)) {
throw new OperateException("该微信已被绑定");
}
}
}
// 记录微信授权
UserAuth authModel = new UserAuth();
authModel.setUserId(userId);

View File

@ -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<String, Object> 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<String> array = Arrays.asList(
"onMenuShareTimeline",
"onMenuShareAppMessage",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone",
"openLocation",
"getLocation",
"chooseWXPay",
"updateAppMessageShareData",
"updateTimelineShareData",
"openAddress",
"scanQRCode");
List<String> array = Arrays.asList(
"onMenuShareTimeline",
"onMenuShareAppMessage",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone",
"openLocation",
"getLocation",
"chooseWXPay",
"updateAppMessageShareData",
"updateTimelineShareData",
"openAddress",
"scanQRCode");
Map<String,Object> 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<String,Object> 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);
}
}
}

View File

@ -17,4 +17,6 @@ public class UserBindWechatValidate implements Serializable {
@ApiModelProperty(value = "微信code", required = true)
private String code;
@ApiModelProperty(value = "key")
private String key;
}