python 网页微信登录思路+成功案列

 
下面这些链接都 需要自己拼接
 
 

第一步:获取AppID  AppSecret (不做解释,自己去微信公众平台申请) 

 

第二步:生成扫描二维码,获取code 

https://open.weixin.qq.com/connect/qrconnect?appid=AppID&redirect_uri=http://www.baidu.com&response_type=code&scope=snsapi_login&state=2014#wechat_redirect

 

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

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=AppID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

 

第五步:通过access_token和openid获取用户的基础信息,包括头像、昵称、性别、地区

https://api.weixin.qq.com/sns/userinfo?access_token=bezXEiiBSKSxW0eoblIewFNHqAG-PyW9OqI_L81E4ZCi2cFpfoJTyQc0xKlPPCtqK1kLJfiRbVrpoOVLw7fjpqh52bn7C68SHa2HSgYsVPXZPvJvtayDa57-_7TeHYw&openid=o39YsbmuV_bIPGpj1MTe

 

 

第六步,上代码

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

 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值