微信三方登录实现原理准备工作

准备工作

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。
在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

授权流程说明

微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。
微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    第一步:请求CODE

第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接:
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

参数说明

参数 是否必须 说明
appid 是 应用唯一标识
redirect_uri 是 请使用urlEncode对链接进行处理
response_type 是 填code
scope 是 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即
state 否 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
返回说明

用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数
redirect_uri?code=CODE&state=STATE
若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数
redirect_uri?state=STATE
代码如下:

@RequestMapping(value = "/wxLoginPage", method = RequestMethod.POST)@ResponseBodypublic String wxLoginPage(HttpServletRequest request)  {// 用来前端生成二维码// 防止csrf攻击(跨站请求伪造攻击)String state = UUID.randomUUID().toString().replaceAll("-", "");String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +"appid="+constants.getWeCatGzAppId() +"&redirect_uri="+constants.getWeCatGzRedirectUrl()+"&response_type=code" +"&scope=snsapi_userinfo" +"&state="+state+"#wechat_redirect";return url;}

第二步:执行成功后会执行第一步的回调方法

 @RequestMapping("/callBack")public String callBack(HttpServletRequest request){//得到code用于交换tokenString code = request.getParameter("code");String state = request.getParameter("state");//判断state是否合法String stateStr = (String)request.getSession().getAttribute("wechat-kf-state");if(StringUtils.isEmpty(code)||StringUtils.isEmpty(state)||!state.equals(stateStr)){request.setAttribute("msg","非法操作,请重新登录!");return "userInfo";}//用户授权后的code换取tokenMap token = wechatService.getAccessToken(code,constants.getWeCatKfAppId(),constants.getWeCatKfAppSecret());//判断是否成功获取到了tokenif(token.get("errcode")!=null){request.setAttribute("msg","token获取失败,请重新登录");return "userInfo";}if(StringUtils.isEmpty((String)token.get("access_token"))||StringUtils.isEmpty((String)token.get("openid"))){request.setAttribute("msg","access_token拉取失败,请重新登录");return "userInfo";}//刷新accesstokenMap refreshToken = wechatService.refrehToken(constants.getWeCatKfAppId(), (String) token.get("refresh_token"));//使用token交换获取用户信息WxchatUser user = wechatService.getUserInfo(refreshToken);//将用户信息入栈request.setAttribute("user",user);return "userInfo";}

第三步:在回调方法中的通过code换取accesstoken、

/*** 通过code获取token* @return*/public Map getAccessToken(String code,String appid,String secret){//构建请求数据String urlToken = "https://api.weixin.qq.com/sns/oauth2/access_token";Map t = new HashMap();t.put("appid",appid);t.put("secret",secret);t.put("code",code);t.put("grant_type","authorization_code");//调用httpclient处理请求得到返回json数据String returnJson = HttpClientUtil.doGet(urlToken, t);Map token = (Map) JSONObject.parse(returnJson);return token;}

第四步:通过accesstoken和openid获取用户信息

/*** 通过token获取用户信息* @param token* @return*/public WxchatUser getUserInfo(Map token){String urlUser = "https://api.weixin.qq.com/sns/userinfo";//构建请求数据Map u = new HashMap();u.put("access_token",token.get("access_token"));u.put("openid",token.get("openid"));u.put("lang","zh_CN");//调用httpclient处理请求得到用户信息json数据String user = HttpClientUtil.doGet(urlUser, u);//转换成用户对象WxchatUser wxchatUser = JSONObject.parseObject(user, WxchatUser.class);return wxchatUser;}

第五步:刷新token(可省略这步)

 /*** 刷新token处理* @return*/public Map refrehToken(String appid,String refresh_token){String urlRefresh = "https://api.weixin.qq.com/sns/oauth2/refresh_token";//构建请求参数Map m = new HashMap();m.put("appid",appid);m.put("grant_type","refresh_token");m.put("refresh_token",refresh_token);//调用httpclient发出请求Map refreshToken = (Map)JSONObject.parse(HttpClientUtil.doGet(urlRefresh, m));return refreshToken;}

通过以上步骤即可实现微信三方授权登录。如有疑问欢迎留言。

微信公众平台三方授权登录(Java实现)相关推荐

  1. 微信公众号网页授权登录的超简单实现步骤

    微信开放平台为第三方移动程序提供分享.传播的接口, 使用户可将第三方程序的内容发布给好友或分享至朋友圈, 下面这篇文章主要给大家介绍了关于微信公众号网页授权登录的超简单实现方法, 需要的朋友可以参考下 ...

  2. java 模板接口开发_微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术 ...

  3. mp.weixin.php,GitHub - temberature/mp-php-sdk: 微信公众平台第三方授权php开发包, weixin mp developer SDK....

    mp-php-sdk 微信公众平台第三方授权php开发包, weixin mp developer SDK. 依赖https://github.com/dodgepudding/wechat-php- ...

  4. 【微信公众号H5授权登录】

    微信公众号H5授权登录 废话不多,直接上代码(这里只写代码的实现) 废话不多,直接上代码(这里只写代码的实现) 页面进来判断微信环境 onShow() {//设置初始值为false,微信环境下才能打开 ...

  5. 微信信息回复 java,微信公众平台开发中使用Java如何实现一个消息回复功能

    微信公众平台开发中使用Java如何实现一个消息回复功能 发布时间:2020-11-17 16:11:11 来源:亿速云 阅读:82 作者:Leah 本篇文章给大家分享的是有关微信公众平台开发中使用Ja ...

  6. java读取微信消息_微信公众平台开发中使用Java如何实现获取用户的信息

    微信公众平台开发中使用Java如何实现获取用户的信息 发布时间:2020-11-18 15:09:28 来源:亿速云 阅读:93 作者:Leah 本篇文章为大家展示了微信公众平台开发中使用Java如何 ...

  7. [JAVA实现]微信公众号网页授权登录,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  8. 【微信开发】[JAVA实现]微信公众号网页授权登录

    网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的.现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你. 请看流程图!看懂图,就懂了一半了: 其实整体流程大体只需三步:用户点 ...

  9. [JAVA实现]微信公众号网页授权登录

    网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的.现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你. 请看流程图!看懂图,就懂了一半了: 其实整体流程大体只需三步:用户点 ...

  10. 微信公众号java模拟登录_【微信公众平台改版后】Java模拟登录微信平台,主动推送消息给用户...

    一.简要说明 在博文<Java模拟登录微信公众平台,主动推送图文消息给用户>中提到使用Java语言登录微信公众平台,然后发送图文消息给用户,基本可以符合使用要求,但是在今年10月23日,微 ...

最新文章

  1. Android核心分析之二十二Android应用框架之Activity
  2. Adobe FrameMaker 2019中文版
  3. 弹性碰撞后速度方向_高三期中考后分析,不得不知道的重难点
  4. WebLogic域的创建与发布
  5. 接口文档下的渗透测试(Swagger)
  6. ZooKeeper 集群为啥最好奇数台?
  7. [python]python学习笔记(三)——编译
  8. 从硬件竞争到软实力PK——电视媒体竞争观察
  9. 《大学章句》光剑续编
  10. Github优秀开源项目
  11. idea创建svn分支
  12. 语音识别 | 数据堂方言语音数据集
  13. python画彩色城墙_只需 45 秒,Python 给故宫画一组手绘图!
  14. 大雪满弓刀之林冲 [转]
  15. Redis 模糊查询Key
  16. int 几个字节 java_java中int是几个字节
  17. 网店推广之百度百科推广
  18. 服务器c盘里会有大量.log文件,电脑C盘爆满怎么办?这3个文件夹放心删,瞬间多出10个G...
  19. Android 免 root 抓包简易教程
  20. 类似 迈图7608 Monentive7608 上海荟研 高新材料 印刷油墨 合成革离型纸 水性涂料基材润湿剂 超润湿剂资料

热门文章

  1. matlab:双或三方演化博弈,lotka-Volterra 1.双方演化博弈
  2. C语言项目-后宫选妃系统-第一天
  3. 计算机模块一试题答案,2016年职称计算机考试模块综合试题及答案(1)
  4. 深交所股票交易接口的概述
  5. 力扣刷题 DAY_76 贪心
  6. 备战数学建模23-数据包络分析
  7. kubectl exec
  8. oracle数据库exec用法,Sql中exec的用法
  9. 获取综合教务系统(URP)的数据包
  10. python符号或非并列,Python运算符