点击查看 官方文档

1. 申请appid和appkey

  • appid:应用的唯一标识。在OAuth2.0认证过程中,appid的值即为oauth_consumer_key的值。
  • appkey:appid对应的密钥,访问用户资源时用来验证应用的合法性。在OAuth2.0认证过程中,appkey的值即为oauth_consumer_secret的值。

申请地址
https://connect.qq.com/manage.html#/

2. 授权流程

QQ登录和微信登陆一样也是采用的OAuth2.0的方式,即先获取一个授权的code然后拿着这个code去授权中心换取token,拿着这个token就可以访问具体的API接口了。

3. 代码详解

3.1 获取code

func GetAuthCode(w http.ResponseWriter, r *http.Request) {params := url.Values{}params.Add("response_type", "code")params.Add("client_id", AppId)params.Add("state", "test")str := fmt.Sprintf("%s&redirect_uri=%s", params.Encode(), redirectURI)loginURL := fmt.Sprintf("%s?%s", "https://graph.qq.com/oauth2.0/authorize", str)http.Redirect(w, r, loginURL, http.StatusFound)
}

它会自动打开一个网页,我们可以点击我们目前登陆的QQ号进行登陆,或扫码登陆

3.2 获取access_token

当我们点击QQ登陆后,它会回调我们后台的地址,回调地址的URL中会带上授权码code,我们根据这个code就可以获取access_token

func GetToken(w http.ResponseWriter, r *http.Request) {code := r.FormValue("code")params := url.Values{}params.Add("grant_type", "authorization_code")params.Add("client_id", AppId)params.Add("client_secret", AppKey)params.Add("code", code)str := fmt.Sprintf("%s&redirect_uri=%s", params.Encode(), redirectURI)loginURL := fmt.Sprintf("%s?%s", "https://graph.qq.com/oauth2.0/token", str)response, err := http.Get(loginURL)if err != nil {w.Write([]byte(err.Error()))}defer response.Body.Close()bs, _ := ioutil.ReadAll(response.Body)body := string(bs)resultMap := convertToMap(body)info := &PrivateInfo{}info.AccessToken = resultMap["access_token"]info.RefreshToken = resultMap["refresh_token"]info.ExpiresIn = resultMap["expires_in"]GetOpenId(info, w)
}

3.3 获取OpenId

OpenId是每一个具体用户在我们平台下的唯一标识,后面的所有请求都会带上这个OpenId

func GetOpenId(info *PrivateInfo, w http.ResponseWriter) {resp, err := http.Get(fmt.Sprintf("%s?access_token=%s", "https://graph.qq.com/oauth2.0/me", info.AccessToken))if err != nil {w.Write([]byte(err.Error()))}defer resp.Body.Close()bs, _ := ioutil.ReadAll(resp.Body)body := string(bs)info.OpenId = body[45:77]GetUserInfo(info, w)
}

3.4 获取用户信息

有了access_tokenopenId之后就可以去获取用户的信息了

func GetUserInfo(info *PrivateInfo, w http.ResponseWriter) {params := url.Values{}params.Add("access_token", info.AccessToken)params.Add("openid", info.OpenId)params.Add("oauth_consumer_key", AppId)uri := fmt.Sprintf("https://graph.qq.com/user/get_user_info?%s", params.Encode())resp, err := http.Get(uri)if err != nil {w.Write([]byte(err.Error()))}defer resp.Body.Close()bs, _ := ioutil.ReadAll(resp.Body)w.Write(bs)
}

3.5 全部代码

更具体的代码大家可以去我的GitHub上查看
https://github.com/pibigstar/go-demo/blob/master/sdk/qq/qq_pc_login.go

为了方便大家测试与使用,AppIdAppKey 我就暂时不删了,大家可以直接用我申请的号进行测试

Go语言版实现QQ扫码登陆相关推荐

  1. 网页版微信和微信公共号扫码登陆原理分析

    看到知乎上有关于微信扫码登陆原理的讨论.现将自己的分析结果写出来,供大家参考,不正确的地方望指正. 用户打开网页版微信: https://wx.qq.com/,微信为用户生成了一张包含uuid的二维码 ...

  2. 微信|QQ扫码登录网页版二维码失效问题解决方案 网站无法访问PC网页版如何解决 安卓软件历史版本下载 FV fooview悬浮球帮助教程

    前言 1. 手机端浏览器登录网页的同时再用微信或者QQ扫码登录出现二维码失效问题如何解决? 2.部分网站无法访问PC网页版如何解决?请看方案 目录 前言 1.方案 2.方案 使用Edge安卓浏览器访问 ...

  3. 在电脑版使用微信公众号或wap版扫码登陆解决方案

    介绍: 在微信端或手机浏览器端,使用微信或手机的登陆状态,扫码登陆电脑版. 实现: 1.电脑端登陆页面显示二维码,二维码内容为以当前时间的加密token作为参数的URL,并把这串加密token保存到数 ...

  4. 爬虫登陆实战 --- QQ音乐扫码登陆!真不难!

    授人以鱼不如授人以渔 爬虫教程千千万,总觉得市面的教程很少教到精髓. 这一期做一个本地扫码登陆获取Session的爬虫. 开始实战 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 ...

  5. (八)QRJDC正式版/QQ扫码登录直达青龙/Docker上的部署教程/很干很干/没水喝【2020年5月1日】

    交流群:点我跳转 懒人自助上车:不想自己动手的 来我这 低价捡漏:低价捡漏 好物分享 目录 QRJDC可以干嘛? 1 .拉取qrjdc镜像 2 .运行容器 3.浏览器访问 4 .对接青龙面板 5.更新 ...

  6. 利用临时二维码实现在电脑浏览器上的微信扫码登陆功能 - EasyWeChat版

    2019独角兽企业重金招聘Python工程师标准>>> 这个方法最开始用在还没有"微信开放平台"的时候,现在也有不少网站在用,简单说就是生成一个临时二维码放到服务 ...

  7. 第六天 黑马十次方 用户注册、用户登陆掌握js-cookie、微信扫码登陆、nuxt嵌套路由

    学习目标: ** 完成用户注册功能 完成用户登陆功能,掌握js-cookie的使用 完成微信扫码登陆的功能 完成用户中心嵌套布局,掌握nuxt嵌套路由的使用 ** 1 用户注册 1.1 页面构建 创建 ...

  8. 微信扫码登陆/微信公交号 登录PHP 自适应 UnionID统一用户

    <?php namespace Topxia\Component\OAuthClient; /**  * 微信扫码登陆  * Enter description here ...  * @aut ...

  9. java实现PC网站实现微信扫码登陆

    近期,开发一个项目要求PC网站可以进行扫码登陆. 1.前期工作 需要先在微信开放平台进行注册(https://open.weixin.qq.com/),并认证一个网站应用. 点击查看按钮,我们需要记录 ...

  10. 微信扫码登陆(JAVA)

    在web端用到weChat扫码登录,在手机扫码登陆成功后,跳转到相应的界面. 1.第一步请求code 调用接口:https://open.weixin.qq.com/connect/qrconnect ...

最新文章

  1. 拥有全球最大指令集的“意念打字“系统,创下世界纪录
  2. IT民工系列——c#操作Microsoft IE,实现自动登录吧!
  3. 跨网段实现内网互通_【供暖站组网】冠航SD-LAN助力河北石家庄市30个供暖站异地组网实现内网互联互通...
  4. 记录一下我使用的vim的配置文件
  5. GAN生成对抗网络-GAN原理与基本实现-去噪与卷积自编码器01
  6. 如何在Linux下安装PyCharm
  7. eclipse的tomcat运行mave web项目
  8. 如何让nodejs在linux后台运行
  9. DataGridView
  10. Asp.Net细节性问题技巧精萃
  11. Java11新特性及代码示例
  12. 刚体运动学公式_理论力学:运动学
  13. 巧妙使用css美化网页
  14. python爬虫:爬取猫眼TOP100榜的100部高分经典电影
  15. DS18B20温度转换与显示
  16. esrally 如何进行简单的自定义性能测试?
  17. DocumentFragment
  18. trainging contest#2(2011成都现场赛)D BY bly
  19. 甲骨文与亚马逊的云业务之争
  20. CentOS 终端启动 快捷键

热门文章

  1. Lambert 投影转换相关代码
  2. 8155_QFIL烧录
  3. sha256算法_以太坊2.0将弃用Keccak256,而启用SHA256哈希算法?
  4. 全国计算机office二级考试内容,2017年国家计算机二级office考试内容
  5. HBase的安装和配置
  6. 我的NVIDIA开发者之旅——Caffe教程(2)[Jetson TK1]Caffe工具环境(Linux)搭建实例
  7. node on mac
  8. pywin32+excel(一)——Python使用win32com/pywin32操作excel
  9. 海思hitool工具使用
  10. R语言快速入门课——结合各种生物信息学及医学案例,使R语言快速入门——R软件及Rstudio下载(同步课程正在更新中)