热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

202193文章目录一、前置准备二、微信登录流程分析第一步:请求code第二步:通过code获取access_token第三步:通过acc

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



推荐阅读
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 本文讨论了如何在微信支付宝两套小程序中生成一张二维码,实现支付宝扫码进入支付宝小程序和微信扫码进入微信小程序的对应桌号进行点餐的功能,提供了一些实现方案供参考。 ... [详细]
  • 智能消息服务数字短信使用FAQ
    本文介绍了智能消息服务数字短信的开通流程和操作步骤,包括开通数字短信的路径、申请流程、控制台操作以及API接口对接模式。同时还介绍了数字短信模板的创建规则和要求,包括审核状态的说明和建议。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 美团0.99元充10元话费,秒到账,超简单!领券充值教程
    本文介绍了美团活动中,新用户可以领取9元话费券,0.99元充值10元话费的方法,同时提供了老用户领取5元话费券的可能性。通过扫描二维码参加活动,用户可以在美团app中查看并立即使用红包卡券充值话费。此外,文章还提到了话费充值秒到账的特点,以及美团活动中的满30减15外卖券优惠。对于新用户和老用户来说,这是一个简单且划算的充值方式。 ... [详细]
  • 转化率低?应该这样做数据分析!
    在互联网业务中,转化率无处不在:投放转化率:有多少人从广告链接,进到我们的商品页面?购买转化率: ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • 求职屡屡碰壁,埋头苦学5个月斩获16000元offer,终于懂了没有人能随随便便成功
    求职屡屡碰壁,埋头苦学5个月斩获16000元offer,终于懂了没有人能随随便便成功-我以前一直认为,只要有耐心,有决心,有信心,就可以在社会上立足,干出一番事业。但是经历了社会的 ... [详细]
  • PHP小习题:PHP小练习题前几天在百度知道里面看到有位网友询问如何制作一下的小程序:用php语言设计一个小程序,计算今天到达下月的天数、全部输出这些天数,并使得每天的日期以三种颜 ... [详细]
  • 我一直都有记录信息的习惯,不知是从什么时候开始,大约是在工作后不久。如今还真有点庆幸从那时开始记了点东西,当然是电子版的,写 ... [详细]
  • 智慧博物馆信息系统建设方案
    3.信息化系统建设3.1博物馆RFID藏品管理系统3.1.1系统概述博物馆藏品保管是一项十分复杂又繁琐的工作。从事保管工作除了经常、及时地进行藏品的登记、分类、编目、保养和修 ... [详细]
  • 微软宣布从今年5月开始停止向PC制造商提供32位Windows 10,意味着64位版本将成为主流。尽管Windows 10系统存在一些bug,但全球已有超过10亿台活跃设备在使用。微软表示,从Windows 10 2004版本开始,所有新的Windows 10系统都将要求使用64位版本,不再发布32位版本。这一变化不会影响使用较早版本Windows 10中的32位客户系统。微软仍然致力于在这些设备上提供支持。 ... [详细]
  • 开发笔记:图像识别基于主成分分析算法实现人脸二维码识别
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了图像识别基于主成分分析算法实现人脸二维码识别相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
blue的诱惑的快乐生活_708
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有