微信三方登陆和授权

来源:互联网 发布:php 过滤二维数组重复 编辑:程序博客网 时间:2024/06/05 20:23

1.基于开放平台的三方登陆

登陆微信开放平台,然后在“管理中心”添加一个网战应用,通过后拿到网站对应的appId和appSecret并配置网站的回调域名,回调域名是配置扫码后,微信的跳转页面,此时,会带上一个code值,如我配置的回调域名为:www.test.com那么在我用微信扫码登陆之后,会自动跳转到:www.test.com?code=XXXXX&state=XXX,此处我们需要code值,可以在域名对应的页面里初始化的时候抓取到code,并调用自己写的接口来获取用户信息,至此,微信扫码登陆完成。
微信扫码登陆二维码URL:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect  替换其中appid和redirect_uri然后复制当前URL到自己的网站上对应的位置,当用户点击URL时,会弹出二维码,用微信扫码后,自动登录网站。更详细说明请参照开放平台上对应的API文档。
 后端使用java编写:
/**  * 微信登陆回调用接口  * @param code 微信授权后自动携带的参数  * @param state  * @param response  * @param request  */@RequestMapping(value = "/auth",method = RequestMethod.GET)public void fromWechat(String code, String state, HttpServletResponse response, HttpServletRequest request){    Optional.ofNullable(code).ifPresent(c -> {       String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ RobotTools.appId+ "&secret="+RobotTools.appSecret+"&code="+code+"&grant_type=authorization_code";       String res = RobotTools.doGet(url);       if(res.contains("access_token")){          JSONObject jsonObject = JSONObject.fromObject(res);          String accessToken = jsonObject.getString("access_token");          String optionId = jsonObject.getString("openid");          String userUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+optionId;          String userInfo = RobotTools.doGet(userUrl);          JSONObject userJson = JSONObject.fromObject(userInfo);          String nickname = userJson.getString("nickname");          String headUrl = userJson.getString("headimgurl");          String unionId = userJson.getString("unionid"); //用户唯一标识,同一用户id相同          User user = this.getUser(headUrl,nickname,unionId,request);          try {              response.sendRedirect("http://www.test.com/account/login?token="+user.getToken());          }catch (IOException e){              e.printStackTrace();          }      }   });}

此处获取到用户信息后,可以直接返回用户信息给前段,不一定需要做跳转处理,具体看需求。
逻辑是:根据微信返回给我们的code,由前段ajax发起请求,先获取accesstoken和openId再获取微信的用户信息。
需要注意:对于微信返回过来的图片url,我们最好单独存放到自己的服务器,防止以后微信用户修改了图片后,在我们的网站上抓取的图片也被修改。
需要注意:微信开放平台提供的三方登陆目前只支持web端扫码登陆,原生的IOS和安卓登陆,暂不支持移动端h5的登陆。

2.微信服务号授权

登陆微信服务号(已授权),点击接口权限,找到网页授权,配置回调域名,配置规则在微信设置页有详细的解释。
服务号授权主要用来对一些挂在服务号下的三方网站的授权登陆,在配置好上面的回调域名后,将官方文档提供的高级接口URL:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
放置在微信自定义菜单跳转链接URL中,其中需要注意:appId对应着服务号ID,redirect_uri是经过加密处理的回调域名或其域名下的子文件页面,scope有两种:snsapi_base和snsapi_userinfo前者用来做静默授权,后者用来做非静默授权,如果想要获取用户信息,只能使用第二种;
处理逻辑大致与开放平台登陆一直,用户点击链接后,在redirect_uri对应的页面中初始化发送后台请求获取用户信息。
/** * 微信服务号授权登陆 * @return */@RequestMapping(value = "/auth2",method = RequestMethod.GET)public ApiResult<User> auth2(String code,HttpServletRequest request,HttpServletResponse response){    if(StringUtils.isEmpty(code)){        log.warn("微信授权失败,code为空");        return ApiResult.fail("微信授权失败,code为空");    }    String accessUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+RobotParam.fzzsAppId+            "&secret="+RobotParam.fzzsSecret+"&code="+code+"&grant_type=authorization_code";    String resultAccess = RobotTools.doGet(accessUrl);    JSONObject jsonObject = JSONObject.fromObject(resultAccess);    String accessToken = jsonObject.getString("access_token");    String openId = jsonObject.getString("openid");    String userUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openId;    String userInfo = RobotTools.doGet(userUrl);    JSONObject userJsonObject = JSONObject.fromObject(userInfo);    String unionId = userJsonObject.getString("unionid");    if(StringUtils.isEmpty(unionId)){        log.warn("微信授权失败,获取微信用户信息失败");        return ApiResult.fail("微信授权失败,获取微信用户信息失败");    }    String headUrl = userJsonObject.getString("headimgurl");    String nickname = userJsonObject.getString("nickname");    User user = this.getUser(headUrl,nickname,unionId,request);    return ApiResult.success(user);}

原创粉丝点击