diff --git a/ruoyi-ui/src/views/wxsetting/wxAuth/index.vue b/ruoyi-ui/src/views/wxsetting/wxAuth/index.vue index a9447166..ebf98a1b 100644 --- a/ruoyi-ui/src/views/wxsetting/wxAuth/index.vue +++ b/ruoyi-ui/src/views/wxsetting/wxAuth/index.vue @@ -48,17 +48,18 @@ export default { methods: { wechatLogin() { // 处理微信授权登录 - let rd = this.getQueryString("rd") || ""; - let openId = this.getQueryString("openId") || ""; + //let rd = this.getQueryString("rd") || ""; + let code = this.getQueryString("code") || ""; // token === '' && openId != '' 只要这种情况,未绑定账号 - if (openId != "" && rd != "") { + if (code != "") { // 绑定账号 - console.log("接口返回===>", openId, this.uId, rd); - this.saveBinding(uId, openId); + console.log("接口返回===>", code, this.uId); + this.saveBinding(uId, code); } else { + const hrefUrl = window.location.href; // 如果绑定了,返回成功 console.log("我要去登录了===>"); - window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe6fd9ad863ac09bf&redirect_uri=https://szgc.jhncidg.com/jhapi/wxAuth/userInfo&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"; + window.location = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe6fd9ad863ac09bf&response_type=code&scope=snsapi_base&redirect_uri="+encodeURIComponent(hrefUrl)+"&state=STATE#wechat_redirect"; } }, saveBinding(uId, openId) { @@ -66,7 +67,7 @@ export default { * uId 小程序openId * openId 公众号openId */ - wxBinding({ openId: uId, msgOpenId: openId }).then((response) => { + wxBinding({ openId: uId, code: code }).then((response) => { if (response.code == 200) { this.successVisible = true; } else { diff --git a/ruoyi-wechat/src/main/java/com/ruoyi/web/userLogin/service/impl/WechatUserLoginServiceImpl.java b/ruoyi-wechat/src/main/java/com/ruoyi/web/userLogin/service/impl/WechatUserLoginServiceImpl.java index cbeb1acc..5e859fa3 100644 --- a/ruoyi-wechat/src/main/java/com/ruoyi/web/userLogin/service/impl/WechatUserLoginServiceImpl.java +++ b/ruoyi-wechat/src/main/java/com/ruoyi/web/userLogin/service/impl/WechatUserLoginServiceImpl.java @@ -133,7 +133,7 @@ public class WechatUserLoginServiceImpl implements IWechatUserLoginService { map.put("openId",openId); //验证手机号码是否绑定 List> checkList = wechatUserLoginMapper.checkBindByOpenId(openId); - if(StringUtils.isNotNull(checkList)){ + if(StringUtils.isNotEmpty(checkList)){ //将公众号openid传入到个人信息中... userInfo.put("msgOpenId",checkList.get(0).get("msgOpenId")); wechatUserLoginMapper.updateUserOpenId(map); diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/controller/WxAuthController.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/controller/WxAuthController.java index 3e9cf256..65d193f8 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/controller/WxAuthController.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/controller/WxAuthController.java @@ -52,19 +52,19 @@ public class WxAuthController extends BaseController { */ @Anonymous @GetMapping("/authorize") - public void authorize(HttpServletResponse response) throws Exception { - log.info("【微信网页授权】进来了,参数={}"); + public void authorize(@RequestParam(value = "returnUrl", defaultValue = "https://szgc.jhncidg.com") String returnUrl, HttpServletResponse response) throws Exception { + log.info("【微信网页授权】进来了,参数={}", returnUrl); //1. 配置 //2. 调用方法 - String url = RuoYiConfig.getProjectUrl() + "/jhapi/wxAuth/userInfo"; + String url = RuoYiConfig.getProjectUrl() + "wxAuth/userInfo"; /* * 相当于这种形式 * URLEncoder.decode(returnUrl,"UTF-8" * https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect */ - String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_USER_INFO, "/"); + String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_USER_INFO, returnUrl); log.info("【微信网页授权】获取code,result={}", redirectUrl); - response.sendRedirect(URLEncoder.encode(redirectUrl, "UTF-8")); + response.sendRedirect(redirectUrl); } /** @@ -75,7 +75,8 @@ public class WxAuthController extends BaseController { */ @Anonymous @GetMapping("/userInfo") - public void userInfo(@RequestParam("code") String code,@RequestParam("state") String state,HttpServletResponse response) throws Exception { + public void userInfo(@RequestParam("code") String code, + @RequestParam("state") String returnUrl,HttpServletResponse response) throws Exception { /*当用户同意授权后,会回调所设置的url并把authorization code传过来, 然后用这个code获得access token,其中也包含用户的openid等信息*/ WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken(); @@ -89,16 +90,15 @@ public class WxAuthController extends BaseController { // 拿到openid String openId = wxMpOAuth2AccessToken.getOpenId(); - String returnUrl = RuoYiConfig.getProjectUrl() + "/#/wxAuth?rd="+System.currentTimeMillis()+"&openid=" + openId; - returnUrl = URLEncoder.encode(returnUrl, "UTF-8"); log.info("【openid:】{}", openId); - log.info("【我是前端要回调的地址:】{}", returnUrl); + log.info("【我是前端要回调的地址:】{}", returnUrl + "&openid=" + openId); // 顺便获取一下用户信息 WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, "zh_CN"); log.info("【用户信息:】{}", wxMpUser.toString()); + //注意拼接参数,第一个参数需要加问号,之后参数使用&拼接的问题 //return "redirect:" + returnUrl + "/#/?openid=" + openId; - response.sendRedirect(returnUrl); + response.sendRedirect(returnUrl + "&rd="+System.currentTimeMillis()+"&openid=" + openId); } /** @@ -108,13 +108,31 @@ public class WxAuthController extends BaseController { * 获取用户信息类,最后重定向到指定url */ @Anonymous + @ResponseBody @PostMapping("/binding") public AjaxResult binding(@Validated @RequestBody WxBindingVo vo) throws Exception { - /*当用户同意授权后,将小程序openId和公众号OpenId进行绑定*/ - SysUserOpenid sysUserOpenid = sysUserOpenidService.selectSysUserOpenidByOpenId(vo.getOpenId()); - if(sysUserOpenid!=null){ - sysUserOpenid.setMsgOpenId(vo.getMsgOpenId()); - return toAjax(sysUserOpenidService.updateSysUserOpenid(sysUserOpenid)); + /*当用户同意授权后,会回调所设置的url并把authorization code传过来, + 然后用这个code获得access token,其中也包含用户的openid等信息*/ + WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken(); + try { + //获取access token + wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(vo.getCode()); + //log.info("【AccessToken:】{}", wxMpOAuth2AccessToken.getAccessToken()); + // 拿到openid + String openId = wxMpOAuth2AccessToken.getOpenId(); + log.info("【openid:】{}", openId); + // 顺便获取一下用户信息 + //WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, "zh_CN"); + //log.info("【用户信息:】{}", wxMpUser.toString()); + /*当用户同意授权后,将小程序openId和公众号OpenId进行绑定*/ + SysUserOpenid sysUserOpenid = sysUserOpenidService.selectSysUserOpenidByOpenId(vo.getOpenId()); + if(sysUserOpenid!=null){ + sysUserOpenid.setMsgOpenId(openId); + return toAjax(sysUserOpenidService.updateSysUserOpenid(sysUserOpenid)); + } + } catch (WxErrorException e) { + log.error("【微信网页授权】{}", e); + return error(); } return error(); } diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/domain/vo/WxBindingVo.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/domain/vo/WxBindingVo.java index baa92863..a68dba14 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/domain/vo/WxBindingVo.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/wxsetting/domain/vo/WxBindingVo.java @@ -20,8 +20,11 @@ public class WxBindingVo { private String openId; /** 公众号openId */ - @NotBlank(message = "公众号openId不能为空") - @Size(max = 128, message = "小程序openId最大128位") private String msgOpenId; + /** 小程序openId */ + @NotBlank(message = "公众号授权不能为空") + @Size(max = 128, message = "公众号授权最大128位") + private String code; + }