微信oauth2的认证
注意
@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的认证相关推荐
- java oauth2 severlet_【Servlet】基于Jsp的微信Oauth2认证 | 学步园
挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核. 一.基本思想 二.基本过程 1.登陆微信的公众平台(点击打开链接),在左侧 ...
- 基于OAuth2的认证(译)
OAuth 2.0 规范定义了一个授权(delegation)协议,对于使用Web的应用程序和API在网络上传递授权决策非常有用.OAuth被用在各钟各样的应用程序中,包括提供用户认证的机制.这导致许 ...
- 【django】用户登录模块实现步骤(二)之QQ登录工具AgentLogin和通过OAuth2.0认证获取openid【33】
一.QQ登录工具AgentLogin 1.AgentLogin介绍 ⽬前只⽀持 腾讯QQ,微信,微博的第三⽅登录 该⼯具封装了QQ登录时对接QQ互联接⼝的请求操作.可⽤于快速实现QQ登录功能. 2.A ...
- 【Oauth2】SpringBoot整合Oauth2实现认证授权
SpringBoot整合Oauth2实现认证授权 应用场景 OAuth2.0 协议的使用场景主要为:第三方登录和开放接口的调用 第三方登录就是使用微信等第三方的方式来登录一个应用或者网站,比如用微信账 ...
- Spring Security OAuth2.0认证授权知识概括
Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...
- Oauth2.0 认证服务器搭建
核心 POM <dependency><groupId>org.springframework.cloud</groupId><artifactId>s ...
- Spring Security OAuth2.0认证授权
文章目录 1.基本概念 1.1.什么是认证 1.2 什么是会话 1.3什么是授权 1.4授权的数据模型 1.4 RBAC 1.4.1 基于角色的访问控制 2.基于Session的认证方式 3.整合案例 ...
- Spring Security OAuth2分布式系统认证解决方案
目录 1 什么是分布式系统 2 分布式认证需求 3 分布式认证方案 3.1 选型分析 3.2 技术方案 4 OAuth2.0 4.1 OAuth2.0介绍 4.2 Spring Cloud Secur ...
- SpringSecurity OAuth2.0认证授权-part2
此篇文章包含oauth2项目搭建.整合jwt.授权方式测试: 篇幅过长,拆分为: part1: 认证授权原理回顾及分布式系统认证方案: part2: oauth2项目搭建.授权方式测试: part3: ...
- C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决
近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...
最新文章
- 【iOS】通讯录分组方式展示数据
- windows系统c 实现ftp服务器,windows系统c 实现ftp服务器
- python小学生课本剧_二年级上学期课本剧
- 计算机教师自媒体方向,教师和自媒体,我该选择哪个深耕?
- php路由地址,ThinkPHP6.0路由地址 - ThinkPHP6.0快速开发手册(案例版) - php中文网手册...
- ios系统定义的url
- 中国的第一座基站,你知道在哪吗?
- 7 php 内存泄漏_APP内存优化之内存泄漏
- T-SQL语言(一)
- JSP页面间传递参数
- 怎么在Telegram电报纸飞机中搜索频道群组机器人教程。
- oracle误删除数据之后的恢复方法
- c语言easyx背景图片,C++之设置背景图片(Easyx)
- 筒灯可以执行CAN/ULC-S101测试吗?与BS 476-21区别大吗?
- Git清理历史大文件
- java能做称重软件_java实现砝码称重
- 带掩码的自编码器MAE在各领域中的应用总结
- C/C++标准库之numeric
- OLAP实践 —— OLAP基本概念理解总计小记
- 探讨IT人的创业方向
热门文章
- 知乎周源微信_每周源代码16-风管磁带版
- MIUI11Android系统耗电,小米MIUI系统升级11,网友表示很费电,学习这个省电方法够你用三天!...
- 雷啊:淘宝上卖F22战斗机
- MyBatis之ResultMap结果集映射
- 「docker实战篇」python的docker- 抖音视频抓取(中)(25)
- 在linux中访问权限是755,在Linux系统中,一个文件的访问权限是755,其含义是什么?...
- git stash '储藏'当前工作状态
- Tensorflow-gpu2.0.0安装【显卡型号:GTX1050 TI】
- 8.Spring全家桶总结
- Vue中qrcode的使用方法(生成二维码插件) / 前端页面根据URL链接生成二维码