2021/9/3

文章目录

  • 一、前置准备
  • 二、微信登录流程分析
    • 第一步:请求code
    • 第二步:通过code获取access_token
    • 第三步:通过access_token调用获取用户信息
  • 三、接口核心代码详解
    • 1、编写生成微信二维码接口
    • 2、编写回调接口

一、前置准备

首先要去微信开放平台进行开发者资质认证

地址:https://open.weixin.qq.com/
腾讯的东西你肯定也明白(白嫖不可能滴—>需要审核费)

当通过认证之后,需要记录下来三个核心参数

1、appid
2、app
3、redirecturl

二、微信登录流程分析

文档地址:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

第一步:请求code

这一步的作用就是发起微信授权登录请求,当用户确认后,微信会带着临时票据code重定向到第三方应用

用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数(这个redirect_uri就是你填写的开发域名)

redirect_uri?code=CODE&state=STATE

第二步:通过code获取access_token

通过code参数加上AppID和AppSecret等,通过API换取access_token;

{
“access_token”:“ACCESS_TOKEN”,
“expires_in”:7200,
“refresh_token”:“REFRESH_TOKEN”,
“openid”:“OPENID”,
“scope”:“SCOPE”,
“unionid”: “o6_bmasdasdsad6_2sgVt7hMZOPfL”
}

返回的是json数据,由此我们可以将其转换成map集合,然后get到其中的access_token的值(通过谷歌的Gson包,其他的都可以)

Gson gson = new Gson();
HashMap mapResult = gson.fromJson(result, HashMap.class);
String accessToken = (String) mapResult.get("access_token");
String openId = (String) mapResult.get("openid");

第三步:通过access_token调用获取用户信息

这一步是通过凭证access_token去微信获取扫码用户的信息


也是通过转换为map格式,get到其中的value值

HashMap<String, Object> mapUserInfo = gson.fromJson(userInfo, HashMap.class);
String nickname = (String) mapUserInfo.get("nickname");
String avatar = (String) mapUserInfo.get("headimgurl");

三、接口核心代码详解

提示:以Java代码为例

注意:其中用到了一些工具类,例如HttpClientUtils用来进行远程调用,JwtUtils是使用jwt的工具类,还有一些其他的代码不再演示

1、编写生成微信二维码接口

既然要微信登录,那么肯定需要扫描二维码,没有二维码不就很扯犊子了吗。编写二维码接口,


注意下面的baseUrl,可以使用上方图片中拼接参数的方式,如果使用了这种方式,那么代码中的 format代码就可以省略

String qrUrl =String.format(baseUrl,ConstantVxUtil.VX_APP_ID, redirectUrl, “zsh”)

public String getQrConnect(HttpSession session) {// 微信开放平台授权baseUrl,这个baseUrl是固定不变的
//也可以拼接参数:https://open.../qrconnect?appid=你的appid &redirect_uri=.....
//如果用了拼接参数这种方法(和路径上加入参数类似),就不需要下面的String.format了String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +"?appid=%s" +"&redirect_uri=%s" +"&response_type=code" +"&scope=snsapi_login" +"&state=%s" +"#wechat_redirect";String redirectUrl = ConstantVxUtil.VX_REDIRECT_URL;try {// 使用utf-8方式编码redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}String qrUrl = String.format(baseUrl,ConstantVxUtil.VX_APP_ID,redirectUrl,"zsh");//重定向到二维码地址return "redirect:" + qrUrl;}

2、编写回调接口

当用户扫码点击确认登录之后就会调用这个接口,在这个接口中通过先前获取的code与appid、appsecret向微信换取凭证access_token,最后通过access_token和appid去微信获取用户信息(也就是解析access_token,懂得单点登录的兄弟应该都明白)

 @GetMapping("callback") //这个不要变public String callback(String code, String state, HttpSession session) {//下面两行代码是拼接参数,也可以使用类似于路径的那种方式 ?a=1&b=2String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +"?appid=%s" +"&secret=%s" +"&code=%s" +"&grant_type=authorization_code";String accessTokenUrl = String.format(baseAccessTokenUrl,ConstantVxUtil.VX_APP_ID,ConstantVxUtil.VX_APP_SECRET,code);String result = null;try {//向微信发出请求(参数:地址),获取access_tokenresult = HttpClientUtils.get(accessTokenUrl);} catch (Exception e) {throw new CommonException(40026, "accessToken获取失败!");}//解析accessToken,将其转换为key-value形式Gson gson = new Gson();HashMap mapResult = gson.fromJson(result, HashMap.class);String accessToken = (String) mapResult.get("access_token");String openId = (String) mapResult.get("openid");User user= userInfoService.getUserByOpenId(openId);//判断是不是第一次使用微信登录,如果不是第一次,就不需要将信息存入数据库了//如果是第一次使用微信登录,那么数据库存储的有if (user == null) {String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +"?access_token=%s" +"&openid=%s";String userInfoUrl = String.format(baseUserInfoUrl,accessToken,openId);String userInfo = null;try {//根据token去vx获取用户信息userInfo = HttpClientUtils.get(userInfoUrl);} catch (Exception e) {throw new CommonException(20001, "获取信息失败");}//解析用户信息,将其转换为key-value形式,以便获取其中的value值HashMap<String, Object> mapUserInfo = gson.fromJson(userInfo, HashMap.class);String nickname = (String) mapUserInfo.get("nickname");String avatar = (String) mapUserInfo.get("headimgurl");//存入数据库user= new User();user.setNickname(nickname).setAvatar(avatar).setOpenid(openId);userService.save(user);}String token = JwtUtils.getToken(user.getId(), user.getNickname());return "redirect:http://localhost:8555?token="+token;}

本文只讲述了两个接口代码,其他相关的代码(前端、工具类、xml等等)不再赘述。文章中的图片来源于微信开放平台的截图

2021/9/3

不懂第三方网站、App如何接入微信登录怎么办?这里我详解单点登录之第三方微信登录(建议收藏)相关推荐

  1. 本文是对优雅草蜻蜓C影视便捷追剧小程序微信支付配置教程-大部分小程序支付通用,从微信配置到后台的详解,其他小程序系统均可参考

    本文是对优雅草蜻蜓C影视便捷追剧小程序微信支付配置教程-大部分小程序支付通用,从微信配置到后台的详解,其他小程序系统均可参考 微信支付配置 1,下载工具 ​ 编辑切换为居中 添加图片注释,不超过 14 ...

  2. 对接微信支付之网页支付详解

    对接微信支付之网页支付详解 声明:转载请注明出处 阅读对象:本文针对的是网页中的扫码支付 温馨提示:微信支付坑比较多,阅读时请仔细一些,不要放过所有需要注意的内容 , 本人一路踩坑过来,希望大家引以为 ...

  3. 微信小程序详解 php,微信小程序canvas基础详解

    canvas 元素用于在网页上绘制图形.HTML5 的 canvas 元素使用 JavaScript 在网页上绘制2D图像.本文主要和大家分享微信小程序canvas基础详解,希望能帮助到大家. 一.了 ...

  4. 微信机器人网页版接口详解

    微信网页版接口详解 本系列会讲述微信机器人技术的实现,第一讲主要了解微信网页版给我们提供的http接口,这一步是做一个基于微信网页版机器人的基础和难点. 本讲将微信网页版的主要接口罗列出,并给出了入参 ...

  5. 微信小程序底部菜单详解

    微信小程序底部菜单详解 只需要在app.json里面修改配置,即可 {"pages":["pages/index/index","pages/logs ...

  6. 微信公众号开通步骤详解

    微信公众号开通步骤详解 微信服务验证 微信公众号接入第一步:开发URL指向的服务接口 开发接口 发布到外网能访问的服务 配置服务 设置白名单 微信服务验证 微信公众号接入第一步:开发URL指向的服务接 ...

  7. python模拟登录详细教程_Python模拟登录requests.Session应用详解

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

  8. 微信小程序详解 php,微信小程序列表开发详解

    本文主要和大家分享微信小程序列表开发详解,主要以代码的形式和大家分享,希望能帮助到大家. 一.知识点 (一).列表渲染 wx:for tip:wx:for="array"可以等于参 ...

  9. 【Android语音合成TTS】百度语音接入方法,和使用技巧详解

    请尊重他人的劳动成果,转载请注明出处:[Android语音合成TTS]百度语音接入方法,和使用技巧详解 Ps. 依托于百度开放云,百度语音为合作伙伴提供了业界领先.永久免费的语音技术服务,目前已上线的 ...

最新文章

  1. S8赛事落幕,阿里云边缘计算护航虎牙7000万低延时流畅直播
  2. linux php ftp扩展,Linux中如何安装 PHP 扩展?(方法介绍)
  3. android黑科技系列——静态分析技术来破解Apk
  4. window.location跳转页面
  5. ubuntu16.04安装PCL
  6. cvi中c语言只保留两位小数,保留两位小数,但要求只显示一位小数,怎么实现?...
  7. java xframeoptions,Header:X-Frame-Options开启与关闭方法
  8. 网站被攻击拿下—只因为程序员一个文件上传功能没写好
  9. Python 到底是怎么火起来的??网友:真的值!
  10. linux简单好玩的命令,有趣的Linux命令行玩法 cal
  11. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
  12. Eclipse开发环境设置(Maven+Spring MVC+Flex)
  13. 尚硅谷WebService技术精讲教程
  14. 门禁卡读写器—把手机秒变门禁卡与自己复制门禁卡
  15. 关于分布式服务中的中间件技术入门概述
  16. 调查问卷或量表用总分还是平均分好?
  17. 格局打开:NFT持有者决定IP天花板
  18. Google play aso 关键词覆盖指南
  19. 重新定义 \maketitle
  20. 把一个人的特点写具体作文_五年级把一个人的特点写具体作文500字5篇

热门文章

  1. Visual Studio下载速度慢解决办法
  2. MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度
  3. 【原创】IP摄像头技术纵览(一)---linux 内核编译,USB摄像头设备识别
  4. ffmpeg音频解码重采样(立体声转成单声道)
  5. Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)
  6. mini小程序入坑说明
  7. 编译安装0bda 8179无线网卡
  8. 2021-10-26第八章思考题
  9. 如何通过晋升答辩?既升职又加薪!
  10. Android获取手机屏幕宽度