第三方微信登录功能实现

登录流程

首先到微信开放平台查看网站应用开发登录微信的api文档,梳理出第三方微信登录的流程如下:
在这里插入图片描述

  1. 发送第三方登录请求
  2. 重定向到微信认证服务器
  3. 发送登录信息并校验(携带 appid,redirect_uri,status)
  4. 重定向到redirect_uri,返回code
  5. 发送code请求access_token
  6. 校验code,返回access_token
  7. 用access_token获取用户信息

实现

在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核。

在users的urls中进行路由配置:

from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^weixin_login/$', views.WeiXinLogin.as_view()),
    re_path(r'^redirect/$', views.get_redirect)
]

在users的views下进行视图编码:

import traceback
import requests
from django.views import View
from django.http import HttpResponseRedirect


APPID = 'wxe0d95453c412f118'  # 你自己的
APPSECRET = 'd785bt925fbc7ebed62734cfdpe5951c'  # 你自己的
Code = ''
State = ''


class WeiXinLogin(View):

    def get(self, request):
        # 获取前端传递过来的code跟state
        try:
            code = request.GET.get("code")
            state = request.GET.get("state")
        except Exception as e:
            print("获取code和stat参数错误:\n%s" % str(traceback.format_exc()))

        # 2.通过code换取网页授权access_token
        try:
            url = u'https://api.weixin.qq.com/sns/oauth2/access_token'
            params = {
                'appid': APPID,
                'secret': APPSECRET,
                'code': Code,
                'grant_type': 'authorization_code'
            }
            token_res = requests.get(url, params=params).json()

            access_token = token_res["access_token"]
            openid = token_res["openid"]
        except Exception as e:
            print("获取access_token参数错误:\n%s" % str(traceback.format_exc()))
            access_token = ''
            openid = ''

        # 3.如果access_token超时,那就刷新
        # 注意,这里我没有写这个刷新功能,不影响使用,如果想写的话,可以自己去看文档

        # 4.拉取用户信息
        try:
            user_info_url = u'https://api.weixin.qq.com/sns/userinfo'
            params = {
                'access_token': access_token,
                'openid': openid,
            }
            res = requests.get(user_info_url, params=params).json()
            print('获取的用户信息:%s' % res)
        except Exception as e:
            print("拉取用户信息错误:\n%s" % str(traceback.format_exc()))


def get_redirect(request):
    """
    返回重定向地址给前端获取code和state
    """
    ip = request.get_host()
    host = 'http://' + ip + '/login'
    return_url = 'https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&' \
                 'response_type=code&scope=SCOPE&state=%s#wechat_redirect' % (APPID, host, State)
    return HttpResponseRedirect(return_url)

总结

微信、qq和微博等第三方登录的整体流程相差不大,本代码中仅实现了第三方登录相关代码,后续会补齐jwt的方式进行用户登录的认证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值