下面这些链接都 需要自己拼接
第一步:获取AppID AppSecret (不做解释,自己去微信公众平台申请)
第二步:生成扫描二维码,获取code
redirect_uri 只能存放一个域名,需要配置对!!!
例如: https://www.cvccode.com
AppID 这个是服务号的
第三步:通过code获取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=AppID&secret=AppSecret&code=00294221aeb06261d5966&grant_type=authorization_code
第四步:因接口频率有次数限制,如果需要,刷新access_token
第五步:通过access_token和openid获取用户的基础信息,包括头像、昵称、性别、地区
第六步,上代码
from urllib.parse import quote
import requests
from django.shortcuts import redirect
from community.models import Friends
from utils.connection_pool import my_redis_pool
from .models import User,User_wx
from django.http import HttpResponse
import json
from utils.forms import LoginForm,CodeLoginForm,FindPasswordForm
import datetime
from django.contrib.auth import authenticate
from django.db import transaction
import uuid
from utils.common import md5_openid, get_code, check_user
from utils.aliyunsm import send_sms
# 获取地址
# WX_IP XXXXXX 你的IP地址
def Wxpath(request):
if request.method == "GET":
url="https://open.weixin.qq.com/connect/qrconnect?appid={0}&redirect_uri={1}&scope=snsapi_login&response_type=code&state=c76d65ce880a205a3edebf76336ca135&connect_redirect=1#wechat_redirect"
redirect_uri = "https://cvccode.com/chaowei/wxlogin/"
redirect_uri = quote(redirect_uri)
return redirect(url.format(WX_IP,redirect_uri))
# 微信登录 WX_IP WX_SCREXT
def Wxlogin(request):
if request.method=="GET":
# 获取用户信息
code = request.GET.get("code")
if not code:
result = {"result": "1", "data": "缺少参数"}
return HttpResponse(json.dumps(result, ensure_ascii=False), content_type="application/json,charset=utf-8")
user = check_user(request)
token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&connect_redirect=1&grant_type=authorization_code"
data = requests.get(token_url.format(WX_IP, WX_SCRECT, code))
data = json.loads(data.content.decode("utf-8"))
# 获取 access_token
access_token = data['access_token']
open_id = data['openid']
unionid = data['unionid']
# 绑定用户
if user:
user.bindWeChat = '1'
user.unionid = unionid
User_wx.objects.create(
user_id=user.id,
union_id=unionid,
update_time=datetime.datetime.now(),
web_open_id=data['openid']
)
result = {"result": "0", "data": "绑定微信成功"}
return HttpResponse(json.dumps(result, ensure_ascii=False), content_type="application/json,charset=utf-8")
# 第一次扫码登陆
else:
# 获取用户信息
user_url = "https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}"
data = requests.get(user_url.format(access_token, open_id))
data = json.loads(data.content.decode("utf-8"))
obj = User.objects.create_user(
username=data['nickname'],
open_id=md5_openid(),
password="123456",
avatar=data['headimgurl'],
unionid=data['unionid'],
date_joined=datetime.datetime.now(),
last_login=datetime.datetime.now()
)
User_wx.objects.create(
user_id= obj.id,
union_id = data['unionid'],
update_time = datetime.datetime.now(),
web_open_id = data['openid']
)
Friends.objects.create(
is_del=0,
friend_id=obj.id,
user_id=obj.id,
update_time=datetime.datetime.now()
)
token = set_token(obj)
result = {
"result": 0,
"data":{
"userInfo":{
"name": obj.username,
"child_name": obj.child_name,
"icon": obj.avatar,
"token": str(token),
"mobile": obj.mobile,
"openid": obj.open_id
}
}
}
# 响应
return HttpResponse(json.dumps(result, ensure_ascii=False),
content_type="application/json,charset=utf-8")
refresh_token,30天过期。 access_token 2小时过期。
可以通过 refresh_token 更新 access_token 重新为 2小时 ,需要的自行体会。
# 刷新 token
def refresh_token():
# 取出 refresh_token 进行 刷新 access_token
refresh_token = my_redis_pool.get("refresh_token")
if not refresh_token:
# 4、refresh_token 失效,用户重新授权 30d
refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token=REFRESH_TOKEN"
data = requests.get(refresh_token_url.format(WX_PARENT_APP_ID))
data = json.loads(data.content.decode("utf-8"))
refresh_token = data['refresh_token']
my_redis_pool.set('refresh_token', refresh_token, timeout=60*60*24*29)
# 通过 refresh_token 刷新
refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type={1}&refresh_token=REFRESH_TOKEN"
data = requests.get(refresh_token_url.format(WX_PARENT_APP_ID,refresh_token))
data = json.loads(data.content.decode("utf-8"))
access_token = data['access_token']
return access_token