注意

 @RequestMapping("/wxLoginInit")public void loginInit(HttpServletRequest request,HttpServletResponse response) throws IOException {/***这儿一定要注意!!首尾不能有多的空格(因为直接复制往往会多出空格),其次就是参数的顺序不能变动**///CommonUtil.APPID微信公众号的appIdString url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+CommonUtil.APPID+"&redirect_uri=" + URLEncoder.encode("http://hehehxixixx.free.idcfengye.com/wxLogin","UTF-8")+"&response_type=code" +"&scope=snsapi_userinfo" +"&state=STATE#wechat_redirect";//重定向到重定向地址response.sendRedirect(url);}
 @RequestMapping("/wxLogin")public String wxLogin(HttpServletRequest request,HttpServletResponse response){//微信公众号的APPID和APPSECRETString code=request.getParameter("code");System.out.println("****************code:"+code);// 获取网页授权access_token  openid 等Oauth2Token oauth2Token = getOauth2AccessToken(code);System.out.println("***********************************oauth2Token信息");// 网页授权接口访问凭证String accessToken = oauth2Token.getAccessToken();// 用户标识s String openId = oauth2Token.getOpenId();System.out.println(openId);// 获取用户信息WxUserDO wxUserInfo = getWxUserInfo(accessToken, openId);//保存用户信息OssSnsuser ossuser = new OssSnsuser();ossuser.setOpenid(wxUserInfo.getOpenId());ossuser.setNickname(wxUserInfo.getNickname());ossuser.setHeadImgurl(wxUserInfo.getHeadimgurl());ossSnsuserService.insertOssSnsuser(ossuser);System.out.println("***********************************用户信息unionId:" + wxUserInfo.getUnionid() + "***:" + wxUserInfo.getNickname());//具体业务startMap<String, Object> map = new HashMap<>();map.put("openId", wxUserInfo.getOpenId().toString());//int num = wxuserService.count(map);//if (num == 0) {//保存用户信息//    wxuserService.save(wxUserInfo);//}//具体业务end//返回你想要的地址try {response.sendRedirect("http://hehehxixixx.free.idcfengye.com/firsthome?openid="+wxUserInfo.getOpenId()+"&nickname="+ URLEncoder.encode(wxUserInfo.getNickname(),"UTF-8")+"&headimgurl="+wxUserInfo.getHeadimgurl());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return map.toString();}
 /*** 获取网页授权凭证** @param appId 公众账号的唯一标识* @param appSecret 公众账号的密钥* @param code* @return WeixinAouth2Token*/public static Oauth2Token getOauth2AccessToken(String code) { //optimizeOauth2Token wat = null;// 获取网页授权凭证com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(NetUtil.get(CommonUtil.REQUEST_URL.replace("APPID", CommonUtil.APPID).replace("SECRET", CommonUtil.APPSECRET).replace("CODE", code)));if (null != jsonObject) {try {wat = new Oauth2Token();wat.setAccessToken(jsonObject.getString("access_token"));wat.setExpiresIn(jsonObject.getInteger("expires_in"));wat.setRefreshToken(jsonObject.getString("refresh_token"));wat.setOpenId(jsonObject.getString("openid"));wat.setScope(jsonObject.getString("scope"));} catch (Exception e) {wat = null;int errorCode = jsonObject.getInteger("errcode");String errorMsg = jsonObject.getString("errmsg");log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}return wat;}/*** 通过网页授权获取用户信息** @param accessToken 网页授权接口调用凭证* @param openId 用户标识* @return SNSUserInfo*/public static WxUserDO getWxUserInfo(String accessToken, String openId) {WxUserDO wxUserInfo = null;// 通过网页授权获取用户信息com.alibaba.fastjson.JSONObject jsonObject =  JSON.parseObject(NetUtil.get(CommonUtil.USERINFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId)));if (null != jsonObject) {try {wxUserInfo = new WxUserDO();// 用户的标识wxUserInfo.setOpenId(jsonObject.getString("openid"));// 昵称wxUserInfo.setNickname(jsonObject.getString("nickname"));// 性别(1是男性,2是女性,0是未知)wxUserInfo.setSex(jsonObject.getInteger("sex"));// 用户所在国家wxUserInfo.setCountry(jsonObject.getString("country"));// 用户所在省份wxUserInfo.setProvince(jsonObject.getString("province"));// 用户所在城市wxUserInfo.setCity(jsonObject.getString("city"));// 用户头像wxUserInfo.setHeadimgurl(jsonObject.getString("headimgurl"));// 用户特权信息List<String> list = JSON.parseArray(jsonObject.getString("privilege"),String.class);wxUserInfo.setPrivilegeList(list);//与开放平台共用的唯一标识,只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。wxUserInfo.setUnionid(jsonObject.getString("unionid"));} catch (Exception e) {wxUserInfo = null;int errorCode = jsonObject.getInteger("errcode");String errorMsg = jsonObject.getString("errmsg");log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}return wxUserInfo;}
public class NetUtil {public static CloseableHttpClient httpClient = HttpClientBuilder.create().build();/*** get请求获取String类型数据* @param url 请求链接* @return*/public static String get(String url){StringBuffer sb = new StringBuffer();HttpGet httpGet = new HttpGet(url);try {HttpResponse response = httpClient.execute(httpGet);           //1HttpEntity entity = response.getEntity();InputStreamReader reader = new InputStreamReader(entity.getContent(),"utf-8");char [] charbufer;while (0<reader.read(charbufer=new char[10])){sb.append(charbufer);}}catch (IOException e){//1e.printStackTrace();}finally {httpGet.releaseConnection();}return sb.toString();}/*** post方式请求数据* @param url 请求链接* @param data post数据体* @return*/@SuppressWarnings("unchecked")public static String post(String url, Map<String,String> data){StringBuffer sb = new StringBuffer();HttpPost httpPost = new HttpPost(url);List<NameValuePair> valuePairs = new ArrayList<NameValuePair>();if(null != data) {for (String key : data.keySet()) {valuePairs.addAll((Collection<? extends NameValuePair>) new BasicNameValuePair(key, data.get(key)));}}try {// httpPost.setEntity(new UrlEncodedFormEntity((List<? extends org.apache.http.NameValuePair>) valuePairs));HttpResponse response = httpClient.execute(httpPost);HttpEntity httpEntity = response.getEntity();BufferedInputStream bis = new BufferedInputStream(httpEntity.getContent());byte [] buffer;while (0<bis.read(buffer=new byte[128])){sb.append(new String(buffer,"utf-8"));}}catch (UnsupportedEncodingException e){//数据格式有误e.printStackTrace();}catch (IOException e){//请求出错e.printStackTrace();}finally {httpPost.releaseConnection();}return sb.toString();}
}
public class Oauth2Token {// 网页授权接口调用凭证private String accessToken;// 凭证有效时长private int expiresIn;// 用于刷新凭证private String refreshToken;// 用户标识private String openId;// 用户授权作用域private String scope;public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public int getExpiresIn() {return expiresIn;}public void setExpiresIn(int expiresIn) {this.expiresIn = expiresIn;}public String getRefreshToken() {return refreshToken;}public void setRefreshToken(String refreshToken) {this.refreshToken = refreshToken;}public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public String getScope() {return scope;}public void setScope(String scope) {this.scope = scope;}}

微信oauth2的认证相关推荐

  1. java oauth2 severlet_【Servlet】基于Jsp的微信Oauth2认证 | 学步园

    挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核. 一.基本思想 二.基本过程 1.登陆微信的公众平台(点击打开链接),在左侧 ...

  2. 基于OAuth2的认证(译)

    OAuth 2.0 规范定义了一个授权(delegation)协议,对于使用Web的应用程序和API在网络上传递授权决策非常有用.OAuth被用在各钟各样的应用程序中,包括提供用户认证的机制.这导致许 ...

  3. 【django】用户登录模块实现步骤(二)之QQ登录工具AgentLogin和通过OAuth2.0认证获取openid【33】

    一.QQ登录工具AgentLogin 1.AgentLogin介绍 ⽬前只⽀持 腾讯QQ,微信,微博的第三⽅登录 该⼯具封装了QQ登录时对接QQ互联接⼝的请求操作.可⽤于快速实现QQ登录功能. 2.A ...

  4. 【Oauth2】SpringBoot整合Oauth2实现认证授权

    SpringBoot整合Oauth2实现认证授权 应用场景 OAuth2.0 协议的使用场景主要为:第三方登录和开放接口的调用 第三方登录就是使用微信等第三方的方式来登录一个应用或者网站,比如用微信账 ...

  5. Spring Security OAuth2.0认证授权知识概括

    Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...

  6. Oauth2.0 认证服务器搭建

    核心 POM <dependency><groupId>org.springframework.cloud</groupId><artifactId>s ...

  7. Spring Security OAuth2.0认证授权

    文章目录 1.基本概念 1.1.什么是认证 1.2 什么是会话 1.3什么是授权 1.4授权的数据模型 1.4 RBAC 1.4.1 基于角色的访问控制 2.基于Session的认证方式 3.整合案例 ...

  8. Spring Security OAuth2分布式系统认证解决方案

    目录 1 什么是分布式系统 2 分布式认证需求 3 分布式认证方案 3.1 选型分析 3.2 技术方案 4 OAuth2.0 4.1 OAuth2.0介绍 4.2 Spring Cloud Secur ...

  9. SpringSecurity OAuth2.0认证授权-part2

    此篇文章包含oauth2项目搭建.整合jwt.授权方式测试: 篇幅过长,拆分为: part1: 认证授权原理回顾及分布式系统认证方案: part2: oauth2项目搭建.授权方式测试: part3: ...

  10. C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决

            近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...

最新文章

  1. 【iOS】通讯录分组方式展示数据
  2. windows系统c 实现ftp服务器,windows系统c 实现ftp服务器
  3. python小学生课本剧_二年级上学期课本剧
  4. 计算机教师自媒体方向,教师和自媒体,我该选择哪个深耕?
  5. php路由地址,ThinkPHP6.0路由地址 - ThinkPHP6.0快速开发手册(案例版) - php中文网手册...
  6. ios系统定义的url
  7. 中国的第一座基站,你知道在哪吗?
  8. 7 php 内存泄漏_APP内存优化之内存泄漏
  9. T-SQL语言(一)
  10. JSP页面间传递参数
  11. 怎么在Telegram电报纸飞机中搜索频道群组机器人教程。
  12. oracle误删除数据之后的恢复方法
  13. c语言easyx背景图片,C++之设置背景图片(Easyx)
  14. 筒灯可以执行CAN/ULC-S101测试吗?与BS 476-21区别大吗?
  15. Git清理历史大文件
  16. java能做称重软件_java实现砝码称重
  17. 带掩码的自编码器MAE在各领域中的应用总结
  18. C/C++标准库之numeric
  19. OLAP实践 —— OLAP基本概念理解总计小记
  20. 探讨IT人的创业方向

热门文章

  1. 知乎周源微信_每周源代码16-风管磁带版
  2. MIUI11Android系统耗电,小米MIUI系统升级11,网友表示很费电,学习这个省电方法够你用三天!...
  3. 雷啊:淘宝上卖F22战斗机
  4. MyBatis之ResultMap结果集映射
  5. 「docker实战篇」python的docker- 抖音视频抓取(中)(25)
  6. 在linux中访问权限是755,在Linux系统中,一个文件的访问权限是755,其含义是什么?...
  7. git stash '储藏'当前工作状态
  8. Tensorflow-gpu2.0.0安装【显卡型号:GTX1050 TI】
  9. 8.Spring全家桶总结
  10. Vue中qrcode的使用方法(生成二维码插件) / 前端页面根据URL链接生成二维码