接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权。

第一步:准备阶段

打开QQ互联,并登录你的QQ账号。再点击导航上的“应用管理”,创建应用获取appid和appkey。





其中要注意的是网站名称要和备案的网站名称一致,否则会审核不通过



创建完应用以后就可以获得appid和appkey了,即使审核没通过也没关系,测试也可以使用。

第二步:具体开发

  • 创建web应用

    创建完成之后,打开models.py文件,编写模型:
class Users(models.Model):
qq_openid = models.CharField(max_length=64, null=True) # QQ的关联OpenID
description = models.CharField(max_length=200, null=True) # 个性签名
nickname = models.CharField(max_length=30, null=True) # 用户昵称
head = models.CharField(max_length=100, null=True) # 用户头像
sex = models.CharField(max_length=2, null=True) # 性别

模型用于存储QQ登录返回的openid值。这个openid是与QQ互联创建的应用一一对应。

在总的urls路由中,加入对应应用路由。

from django.contrib import admin
from django.urls import include, path urlpatterns = [
path('login/', include('login.urls')), # 登录模块
]

打开对应应用目录下urls.py文件,填写对用的路由:

from django.urls import path
from . import views urlpatterns = [
path('oauth/qq/login', views.qq_login),# qq登录
path('qq/connect/callback.php', views.qq_check), # 回调路由
]
  • 开发登录模块

    1.在工程目录settings.py中设置常量
'''QQ登录常量'''
QQ_APP_ID = "appid"
QQ_APP_KEY = "appkey"
REDIRECT_URI = "回调地址"

2.在对应应用的文件夹下创建qq_oauth.py文件,编辑qq_oauth.py文件:

import requests
import json class OAuthQQ:
def __init__(self, client_id, client_key, redirect_uri):
self.client_id = client_id
self.client_key = client_key
self.redirect_uri = redirect_uri def get_auth_url(self):
"""获取授权页面的网址"""
return 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=' + self.client_id + '&state=1&scope=get_user_info&redirect_uri=' + self.redirect_uri def get_access_token(self, code):
"""根据code获取access_token"""
url = "https://graph.qq.com/oauth2.0/token" querystring = {
"grant_type": "authorization_code",
"client_id": self.client_id,
"client_secret": self.client_key,
"code": code,
"redirect_uri": self.redirect_uri
} response = requests.request("GET", url, params=querystring)
return response.text.split('=', 3)[1].split('&', 1)[0] def get_openid(self, access_token): # 获取用户的openid
url = "https://graph.qq.com/oauth2.0/me" querystring = {"access_token": access_token} response = requests.request("GET", url, params=querystring)
call_back = str(response.text)[9:-3]
return json.loads(call_back)['openid'] def get_user_info(self, access_token, qq_openid): # 获取用户的详细信息
url = "https://graph.qq.com/user/get_user_info" querystring = {
"access_token": access_token,
"oauth_consumer_key": self.client_id,
"openid": qq_openid
} response = requests.request("GET", url, params=querystring) return json.loads(response.text)

3.编辑对应应用的文件夹下views.py文件:

from .qq_oauth import OAuthQQ

def qq_login(request):  # QQ第三方登录
# 获取 得到Authorization Code的地址
url = OAuthQQ(settings.QQ_APP_ID,
settings.QQ_APP_KEY,
settings.REDIRECT_URI).get_auth_url()
# 重定向到授权页面
return HttpResponseRedirect(url) def qq_check(request): # 第三方QQ登录,回调函数
"""登录之后,会跳转到这里。需要判断code和state"""
code = request.GET.get('code', None)
authqq = OAuthQQ(settings.QQ_APP_ID, settings.QQ_APP_KEY, settings.REDIRECT_URI)
access_token = authqq.get_access_token(code) # 获取access_token
time.sleep(0.05) # 稍微停一下,给系统调用接口一点时间 qq_openid = authqq.get_openid(access_token) # 获取用户的openid if_new_user = models.Users.objects.filter(qq_openid=qq_openid).first() # 通过openid判断是否是新用户
if if_new_user is not None:
#老用户处理逻辑
else:
# 新用户业务处理逻辑
总结:

大体思路是用户点击QQ登录按钮调用qq_login方法然后跳转到登陆授权页面,当用户授权登录之后,QQ会跳转到回调页面,get方式携带code。得到code以后使用get_access_token方法得到access_token。

得到access_token后拿来获取openid。获取到openid之后,通过openid判断是否是新用户,来调取get_user_info方法获取用户的详细信息。

我用Django搭网站(2)-QQ登录的更多相关文章

  1. 我用Django搭网站(1)-新浪微博登录

    新浪微博第三方登录使用的是OAuth2.0,开发前提已经注册开发者帐号,是开发者. OAuth简介 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提 ...

  2. 网站集成QQ登录功能

    最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...

  3. 网站集成QQ登录功能(转)

    最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...

  4. django项目学习之QQ登录

    最近在用django框架写一个商城项目(前后端分离),里面用到的一些技术其他项目也可以借鉴,于是就想写一些博客记录,以防自己忘记,今天先写一个关于登录接口中引入QQ登录接口的流程. 关于QQ登录接口的 ...

  5. 网站接入QQ登录的两种方法

    第一种使用系统自带按钮登录,但是这样会弹出新窗口,不喜欢 //调用QC.Login方法,指定btnId参数将按钮绑定在容器节点中 QC.Login({ //btnId:插入按钮的节点id,必选 btn ...

  6. asp.net网站接入QQ登录

    这两天在做网站第三方登录,总结一下QQ登录吧,支付宝就不用了(下载dome把ID什么的换一换就基本可以了.),本文主要说的是代码的实现方式,逻辑部分主要还是根据帮助文档来的.不懂的同学可以先看看文档. ...

  7. 网站使用QQ登录问题小结

    关于网站如何使用QQ登陆这个问题就不多说了,很简单,登陆connect.qq.com找到相应的SDK,下载下来,里面会有demo,将相应的appid,appkey和回调地址callback改成自己的就 ...

  8. 我用Django搭网站(3)-表单RSA加密

    之前开发项目时因为种种原因一直使用明文提交,表单直接明文提交非常不安全,只要稍加操作就能轻易获取用户的信息.在众里寻他千百度之后决定使用RSA加密方式,简单可靠. 项目准备 一.安装PyCrypto库 ...

  9. pc版qq登录及移动版qq登录的申请过程

    1.在哪里接入?    网站接入QQ登录在QQ互联(https://connect.qq.com)上创建:移动应用也可以在QQ互联(https://connect.qq.com)上创建,但是不推荐如此 ...

随机推荐

  1. POJ2478(欧拉函数)

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15242   Accepted: 6054 D ...

  2. 分布式缓存系统 Memcached CAS协议

    Memcached在1.2.4版本后新增了CAS(Check and Set)协议,主要用于并发控制:memcached中同一个item同时被多个线程(多个客户端)更改的并发问题.CAS协议最本质的东 ...

  3. python学习(六) 抽象

    6.1 懒惰即美德 斐波那契数列: >>> fabs = [0, 1]>>> for i in range(8): fabs.append(fabs[-1] + f ...

  4. pandas索引操作

    Pandas的索引操作 索引对象Index 1. Series和DataFrame中的索引都是Index对象 示例代码: print(type(ser_obj.index)) print(type(d ...

  5. 从javascript的循环问题来看待闭包本质

    第一次接触这个问题还是在我刚开始学js的时候,当时就是一头雾水,时隔一年多了,突然又想起了这个问题,在这个春气盎然的周末,我就坐下来研究下并把结果和大家分享下: 先看代码:demo.html < ...

  6. : error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    打开项目----项目属性---配置属性----C/C++ ----预处理器----预处理定义,添加_CRT_SECURE_NO_WARNINGS

  7. Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart)

    在接触WebService时值得收藏的一篇文章: 在调试Axis1.4访问WebService服务时,出现以下错误: Unable to find required classes (javax.ac ...

  8. 性能调试工具——oprofile

    oprofile利用cpu硬件层面提供的性能计数器(performance counter),通过计数采样,帮助我们从进程.函数.代码层面找出占用cpu的"罪魁祸首". 常用命令 ...

  9. Mac mysql-忘记数据库密码

    第一步: 关闭mysql服务:苹果->系统偏好设置最下边点mysql 在弹出页面中关闭mysql服务(点击stop mysql server) 第二步: 进入终端输入:cd /usr/local ...

  10. 前端html数组去重的方法

    数组去重 用到的知识点: 1:indexOf() 该方法是返回数组中元素第一次出现的索引值: 如果有,则正常返回索引值: 如果检索的内容不存在于数组中,则返回-1 2:for循环 练习:数组去重 // ...