一、登录会话密钥 session_key 有效性

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

开发者如果遇到因为 session_key 不正确而校验签名失败或解密失败,请关注下面几个与 session_key 有关的注意事项。

  1. wx.login 调用时,用户的 session_key 可能会被更新而致使旧 session_key 失效(刷新机制存在最短周期,如果同一个用户短时间内多次调用 wx.login,并非每次调用都导致 session_key 刷新)。开发者应该在明确需要重新登录时才调用 wx.login,及时通过 auth.code2Session 接口更新服务器存储的 session_key。
  2. 微信不会把 session_key 的有效期告知开发者。我们会根据用户使用小程序的行为对 session_key 进行续期。用户越频繁使用小程序,session_key 有效期越长。
  3. 开发者在 session_key 失效时,可以通过重新执行登录流程获取有效的 session_key。使用接口 wx.checkSession可以校验 session_key 是否有效,从而避免小程序反复执行登录流程。
  4. 当开发者在实现自定义登录态时,可以考虑以 session_key 有效期作为自身登录态有效期,也可以实现自定义的时效性策略。

二、解决登录session_key 的问题

通过wx.checkSession判断是否过期。

第一步:在生命周期中onLaunch调用一次写的登录方法
第二步:在其他地方通过wx.checkSession判断是否过期,如果过期再次调用登录方法,更新session_key

案例:解决session_key 过期问题,发送个人信息后台解密

# app.js中:
//app.js
App({ /*
当小程序初始话完成,会触发onlaunch(全局只触发一次)
*/
onLaunch: function () {
// 登录
this.my_login() },
my_login:function(){
let that = this
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
console.log(res.code)
wx.request({
url: that.globalData.baseurl + "login/",
data: { "code": res.code },
method: "POST",
success(e) {
wx.setStorageSync('token', e.data.data.token)
}
})
}
})
},
globalData: {
userInfo: null,
baseurl:"http://127.0.0.1:8000/"
}
}) # 页面js中: // 先拿到app全局对象
const app = getApp() user1:function (e) { wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) { wx.getUserInfo({
success: (res) => {
console.log("res",res) //这个res就是用户的信息
// 将数据发送后端
wx.request({
// 发送iv,encryptedData
url: app.globalData.baseurl + "getinfo/",
data:{
iv:res.iv,
encryptedData: res.encryptedData,
token:wx.getStorageSync("token")
},
method:"POST",
success:(e) =>{
console.log('后台返回的数据',e)
}
})
},
}) // 判断是否过期
wx.checkSession({
success() {
//session_key 未过期,并且在本生命周期一直有效
},
fail() {
// session_key 已经失效,需要重新执行登录流程
app.my_login() // 重新登录,更新session_key wx.getUserInfo({
success: (res) => {
console.log("res啦啦啦", res) //这个res就是用户的信息
// 将数据发送后端
wx.request({
// 发送iv,encryptedData
url: 'url',
})
},
})
}
})
}
}
}) }

后端解密信息,存入数据库

# 登录:略
# urls.py
path('getinfo/', user.Info.as_view()), # user.py
from django.core.cache import cache
from api.models import Wxuser
from api.wx import WXBizDataCrypt
from api.my_ser import wx_user_ser
from rest_framework.response import Response class Info(APIView):
def post(self, request):
param = request.data
if param['iv'] and param.get("token") and param.get("encryptedData"):
iv = param['iv']
encryptedData = param.get("encryptedData")
session_key_openid = cache.get(param.get("token"))
if session_key_openid:
sessionKey, openid = session_key_openid.split("&")
# 解密
user_info = WXBizDataCrypt.WXBizDataCrypt.get_info(sessionKey, encryptedData, iv)
print('user_info', user_info)
save_data = {
"name": user_info['nickName'],
"avatar": user_info['avatarUrl'],
"language": user_info['language'],
"province": user_info['province'],
"city": user_info['city'],
"country": user_info['country'],
}
# 把用户信息存入数据库
Wxuser.objects.filter(openid=openid).update(**save_data)
# 测试:把童虎信息返回给前台
user = Wxuser.objects.filter(openid=openid).first()
user = wx_user_ser(instance=user, many=False).data
return Response({
"status": 0,
"msg": "ok",
"data": user
})
else:
return Response({"code": 2, "msg": "无效的token"})
else:
return Response({"code": 1, "msg": "缺少参数"})
# 检测对字典排序 # WXBizDataCrypt文件,下载的解密,然后二次封装的
import base64
import json
from Crypto.Cipher import AES
from api.wx import settings class WXBizDataCrypt:
def __init__(self, appId, sessionKey):
self.appId = appId
self.sessionKey = sessionKey def decrypt(self, encryptedData, iv):
# base64 decode
sessionKey = base64.b64decode(self.sessionKey)
encryptedData = base64.b64decode(encryptedData)
iv = base64.b64decode(iv) cipher = AES.new(sessionKey, AES.MODE_CBC, iv) decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData))) if decrypted['watermark']['appid'] != self.appId:
raise Exception('Invalid Buffer') return decrypted def _unpad(self, s):
return s[:-ord(s[len(s)-1:])] @classmethod
def get_info(cls,sessionKey,encryptedData,iv):
# appId = settings.AppId
# sessionKey = sessionKey
# encryptedData = encryptedData
# iv = iv
#
# # 实例化这个类 WXBizDataCrypt
# pc = cls(appId, sessionKey)
# return pc.decrypt(encryptedData, iv) # 简化为:
return cls(settings.AppId, sessionKey).decrypt(encryptedData, iv)

mysql数据库存表情设置

1.mysql数据库类型
2.配置:默认是utf8,3个字节。表情是4个字节,需要设置:'OPTIONS': {'charset': 'utf8mb4'}, import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'python13',
'USER': 'root',
'PASSWORD': '123',
'HOST': 'localhost',
'PORT': 3306,
'OPTIONS': {'charset': 'utf8mb4'},
}
}

三、后端,如何解析wx.getUserInfor中的用户信息。

1 我们用encryptedData和iv,进行解密,必须要用到session_key,所以用必须是登入状态。
2 但是session_key是有有效期。而且session_key的有效期,不是一个固定值,他是通过用户行为来决定,session_key的有效期时间。
3 但是我们可以通过wx.checkSession来判断有没有过期。
4 保证session_key没有过期的情况下。我们将iv,encryptedData,token(登入凭证)发送到后端.
5 后端使用官方提供的sdk,进行解密。
6 解密成功以后保存到数据,数据库的字符集一定要是utf8mb4,才能保存表情包

如官方的sdk没有Crypto包用下面的方法解决:

pip install pycryptodome

用户信息官方文档

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html

数据加密官方文档

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

小程序session_key失效解决方案、后台解密个人数据信息的更多相关文章

  1. 微信小程序,请求php后台返回json数据多出隐藏字符问题

    这几天在做一个微信小程序注册登录页面的时候碰到一个问题,就是使用wx.request api的时候success中返回的JSON数据前面会多出空白字符,后面网上查了一下是说php bom头问题(详细介 ...

  2. 微信小程序 Session 失效

    微信小程序 Session 失效 微信小程序,前端请求后端,中间多了个微信服务器,所以请求的流程就是 页面--微信服务器--目标服务器 这就导致了一个问题 session 每次请求都是一个新的会话 解 ...

  3. Spring Boot+微信小程序_保存微信登录者的个人信息

    1. 前言 微信小程序开发平台,提供有一类 API,可以让开发者获取到微信登录用户的个人数据.这类 API 统称为开放接口. Tip:微信小程序开发平台,会把微信登录用户的个人信息分为明文数据和敏感数 ...

  4. 微信小程序开发:学习笔记[9]——本地数据缓存

    微信小程序开发:学习笔记[9]——本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...

  5. 微信小程序 bug及解决方案

    1.小程序遮罩滚动穿透问题 解决方案: <view class="mask" wx:if="{{showVipRights}}" catchtap='hi ...

  6. C#微信小程序服务端获取用户解密信息

    using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.C ...

  7. 小程序Openid 获取,服务器 encryptedData 解密 遇到的坑

    获取客户 openId 和 unionId 需要以下步骤(都为必须步骤) 1.从验证从客户端传上来code, 获取sessionKey (需要配合小程序appid ,secret 发送到微信服务器) ...

  8. 微信小程序session_key和access_token傻傻分不清楚

    之前一直对着文档使用特定接口, 今天闲来仔细研究一下各个接口的使用, 然后发现了session_key和access_token两个关键字意义有点重复啊? 目测都是某种钥匙来打开一扇门的, 那为什么有 ...

  9. 微信小程序session_key解析中反斜杠问题处理 Java解析

    Java服务端微信小程序解密用户信息.手机号需用到session_key也需要decode,以下是官方描述: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId ...

随机推荐

  1. android基于MVP小说网络爬虫、宝贝社区APP、仿虎扑钉钉应用、滑动阴影效果等源码

    Android精选源码 android宝贝社区app源码 android仿Tinder最漂亮的一个滑动效果 android仿滴滴打车开具发票页,ListView粘性Header Android基于MV ...

  2. Leetcode14._最长公共前缀

    题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&q ...

  3. BadRequestException

    package me.zhengjie.common.exception; import lombok.Getter; import org.springframework.http.HttpStat ...

  4. Qt uchar * 转 QImage

    QImage(uchar * data, int width, int height, Format format) QImage(const uchar * data, int width, int ...

  5. Java IO: FileReader和FileWriter

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍FileReader和FileWriter.与FileInputStream和File ...

  6. 吴裕雄--python学习笔记:os模块函数

    os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. os.getcwd:得 ...

  7. Acwing 843. n-皇后问题

    n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行.同一列或同一斜线上. 现在给定整数n,请你输出所有的满足条件的棋子摆法. 输入格式 ...

  8. CentOS7安装Ceph

    CentOS 7 下安装Ceph-nautilus 本问主要记录在CentOS 7下如何安装Ceph-nautilus,安装过程中遇到的一些问题及解决方法. 实验准备 以下是本次实验所用到的机器(采用 ...

  9. 杂记:Linux下gcc升级

    公司要求,需要在CentOS6.5系统下进行一些测试.因为编写的测试程序中使用了一些C++11之后新增的特性,而CentOS6.5中安装的gcc版本为4.4.7,并不支持C++11,所以需要对gcc进 ...

  10. Janet Wu price

    上次也是第一次参加百公里是2012的时候,那年的主题是一路有你,和一群同事从深圳湾走到福田,最后累了就回家了,那晚应该是睡得很好吧. 今年是提前报名了,虽然还不确定是否参加.因为说实话,我不喜欢拥堵的 ...