在Django项目中接入微信登录,本质是利用微信开放平台提供的OAuth2.0授权码模式,让用户在微信侧确认授权后,我们的后端通过code换取access_token与openid,再按需拉取昵称、头像等用户信息。下面直接看具体实现方式。

一、前置准备与配置
你需要到微信开放平台创建网站应用,拿到appid和appsecret,并配置授权回调域名。在Django的settings.py里保存这些配置:
# settings.py WECHAT_APPID = 'your_appid' WECHAT_APPSECRET = 'your_appsecret' WECHAT_REDIRECT_URI = 'https://ipipp.com/wechat/callback/'
二、构造授权链接获取code
前端或视图中将用户重定向到微信授权地址,scope用snsapi_userinfo可拿详细信息:
# views.py
from django.conf import settings
from django.shortcuts import redirect
def wechat_login(request):
appid = settings.WECHAT_APPID
redirect_uri = settings.WECHAT_REDIRECT_URI
# 注意redirect_uri需要urlencode,这里简化示意
url = ('https://open.weixin.qq.com/connect/qrconnect?appid=%s'
'&redirect_uri=%s&response_type=code&scope=snsapi_userinfo'
'&state=django#wechat_redirect') % (appid, redirect_uri)
return redirect(url)
三、回调中用code换openid与access_token
微信回调我们的地址并带上code,后端请求接口换取凭证:
# views.py
import requests
from django.http import JsonResponse
def wechat_callback(request):
code = request.GET.get('code')
appid = settings.WECHAT_APPID
secret = settings.WECHAT_APPSECRET
token_url = ('https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s'
'&secret=%s&code=%s&grant_type=authorization_code'
% (appid, secret, code))
resp = requests.get(token_url).json()
openid = resp.get('openid')
access_token = resp.get('access_token')
# 下一步用这两个值拉取用户信息
return JsonResponse({'openid': openid})
四、获取用户信息并完成登录
拿到access_token和openid后,调用用户info接口,并在本地User模型里绑定openid实现自动登录:
# views.py 续写
def get_user_info(access_token, openid):
info_url = ('https://api.weixin.qq.com/sns/userinfo?access_token=%s'
'&openid=%s&lang=zh_CN' % (access_token, openid))
data = requests.get(info_url).json()
return data # 包含nickname、headimgurl等
# 在wechat_callback中调用并绑定
# user, created = User.objects.get_or_create(username=openid)
# user.nickname = data.get('nickname')
# user.save()
五、注意事项
- 回调域名不要带http前缀,只填域名。
- code五分钟内有效且只能使用一次。
- access_token接口每日调用限额,注意缓存。
如果做公众号网页授权,把qrconnect换成authorize,其余OAuth2.0流程一致。