python代码实现小程序登录流程时序总结
作者:Jeff的技术栈 发布时间:2022-10-16 17:30:14
标签:python,小程序,登录时序
官方文档
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
小程序登录
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
登录流程时序
说明:
调用wx.login()获取临时登录凭证code,并回传到开发者服务器。
调用auth.code2Session接口,换取用户唯一标识 OpenID和会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意:
会话密钥
session_key
是对用户数据进行加密签名的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。临时登录凭证 code 只能使用一次
小程序的登录总结
1 小程序端执行wx.login()获取code
2 将1中的code发送到后端,后端调用auth.code2Session这个接口,得到openid和session_key
3 自定义登入状态,我们生成一个key与openid和session_key相绑定。把key返回到小程序中
4 小程序端保存,然后下次请求需要登入的接口的时候,把key带上。
案例
# app.js的onLaunch中 因为登录是用户感觉不到的
App({
onLaunch: function () {
let that = this
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
console.log(res.code) //拿到code
wx.request({
url:that.globalData.baseurl+"/login/",
data:{'code':res.code},
method:'POST',
success(e){
console.log(e.data)
// wx.setStorageSync("token", e.data.data.token)
}
})
}
}),
globalData: {
userInfo: null,
baseurl:"http://127.0.0.1:8000"
}
# dango后台中
# urls.py 路由中
path('login/', user.Login.as_view()),
# user.py中
from rest_framework.views import APIView
from rest_framework.response import Response
from api.wx import wx_login
import hashlib, time
from django.core.cache import cache
from api.models import Wxuser
class Login(APIView):
def post(self, request):
param = request.data
print(request.data)
if not param.get('code'):
return Response({"status": 1, "msg": '缺少参数'})
else:
code = param.get("code")
user_data = wx_login.get_login_info(code)
if user_data:
val = user_data['session_key'] + "&" + user_data['openid']
md5 = hashlib.md5()
md5.update(str(time.clock()).encode("utf-8"))
key = md5.hexdigest()
cache.set(key, val) # 放进内存redis库中,把key传给前端当token.下次前台带着key就能拿到val
has_user = Wxuser.objects.filter(openid=user_data['openid']).first() # 判断openid是否存在
if not has_user:
Wxuser.objects.create(openid=user_data['openid'])
return Response({
"status": 0,
"msg": "ok",
"data": {"token": key}
})
else:
return Response({"status": 2, "data": "无效的code"})
# models.py中:
from django.db import models
class Wxuser(models.Model):
id = models.AutoField(primary_key=True)
openid=models.CharField(max_length=255)
name = models.CharField(max_length=50)
avatar = models.CharField(max_length=200)
language = models.CharField(max_length=50)
province = models.CharField(max_length=50)
city = models.CharField(max_length=50)
country = models.CharField(max_length=50)
#gender = models.CharField(max_length=50)
creat_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
def __str__(self):
return self.openid
# settings.py中:自己注册的微信小程序信息
AppId=""
AppSecret=""
code2Session="https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code"
# wx_login.py中:
from api.wx import settings
import requests
def get_login_info(code):
# 拼接路径
code_url = settings.code2Session.format(settings.AppId,settings.AppSecret,code)
response = requests.get(code_url) # 返回的是json数据
json_response = response.json() # 把json数据转换为字典
if json_response.get('session_key'):
return json_response
else:
return False
# cache缓存配置redis数据库
来源:https://www.cnblogs.com/guyouyin123/p/12482362.html


猜你喜欢
- 最近在看流畅的python,在看第14章节的itertools模块,对其itertools中的相关函数实现的逻辑的实现其中在zip_long
- 效果如下所示:项目需要动态生成面包屑导航,并且首页可以点击.其余为路径显示<el-menu :unique-opened="
- 本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过。本例使用python的tkinter做gui
- drop方法有一个可选参数inplace,表明可对原数组作出修改并返回一个新数组。不管参数默认为False还是设置为True,原数组的内存值
- 用户与Authentication通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了
- readlines的帮助信息>>> fr=open('readme.txt')>>> h
- 该教程是面向那些不知道如何通过java连接mysql数据库的新手,所以该教程用的方法不是最优的方法,但求是最好理解的方法。需要的工具:ecl
- 面临的问题在我设计一个分析系统中,我们公司的目标是能够处理来自数百万个端点的大量POST请求。web 网络处理程序将收到一个JSON文档,其
- 目录精确调整工作表的行高和列宽批量更改多个工作簿的数据格式批量更改工作簿的外观格式设置字体格式修改字体为宋体修改字号字体加粗字体颜色单元格填
- 前言调用,让客户端可以更具自身情况自由选择,服务端工作只需要做一份呢?还别说真还有一个准备好的轮子那就是今天的主角《grpc-gateway
- 通常文本设置要不在wxml中设置,再要不就是通过weml绑定在js中设置文字。wxml<view > <text>我
- Function ChkInvaildWord(Words) Const InvaildWords=&quo
- 介绍我们用django在本地调试完了之后,会在服务器上进行部署,如果是大佬那就忽略本文章,如果是萌新对编程命令不太熟悉,那就要用到宝塔了。流
- 如下所示:import numpy as npimport pandas as pdfrom pandas import Series,Da
- 基本对比使用方式使用场合优缺点是否需要安装需要的dll网址引用方式程序内引用程序初期确定使用MySql,前期添加引用大多数情况下使用在类文件
- python的版本及依赖的库的安装#版本python 3.7.1pip install pywin32==224pip install nu
- 设计是简单的如果你知道要放的东西该放到哪。曾经在某个电子杂志里看到一篇关于如何在平面设计中偷懒的文章,引发了我的一些思考,在平面设计中有这么
- 本节介绍 Python 中的另一个常用模块 —— statistics模块,该模块提供了用于计算数字数据的数理统计量的函数。它包含了很多函数
- 一、邮件发送示例邮件发送示例flask_email及smtplib原生邮件发送示例,适用于基于Flask框架开发,但是内部设置的定时任务发送
- 前言本文主要给大家介绍的关于Python批量压缩png的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:1.需求为什