⼩程序开发5后端解析wx.getUserInfor中的⽤户信息,⼩
程序⽀付
后端,如何解析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,进⾏解密。
地址 developers.weixin.qq/miniprogram/dev/framework/open-ability/signature.html
6 解密成功以后保存到数据,数据库的字符集⼀定要是utf8mb4,因为utf8默认是3字节,这类带表情包名字必须4字节才能保存表情包
没有敏感信息,⽆法获得⽤户信息
可以得到⽤户信息
数据库utf8mb4:
当要⽤到名字,表情包时,创建数据库设为utf8mb4格式
django中settings⽂件配置
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.sql',
'NAME': 'python13',
'USER':'root',
'PASSWORD':'',
'HOST':'127.0.0.1',
'PORT': 3306,
'OPTIONS': {'charset': 'utf8mb4'},  # 设为4字节,兼容符号    }
}
如官⽅的sdk没有Crypto包⽤下⾯的⽅法解决:
pip install pycryptodome
代码⽰例:
⼩程序前端:
app.js
//app.js
App({
/*
当⼩程序初始化完成,会触发onlaunch(全局只触发⼀次)  */
onLaunch: function () {
// 登录
<_login()
//this 就是当前app对象
},
my_login:function(){
let that = this
wx.login({
success: res => {
// 发送 de 到后台换取 openId, sessionKey, unionId        console.de)
url: that.globalData.baseurl + 'login/',
data: { 'code': de },
method: "POST",
success(e) {
wx.setStorageSync('token', e.ken)
}
})
}
})
console.log("⼩程序的初始化:onlaunch")
},
/**可以在全局使⽤ */
globalData: {
userInfo: null,
baseurl:"127.0.0.1:8000/"
}
})
test3.wxml
<button open-type="getUserInfo" bindgetuserinfo='user1'>⽤户信息</button> test3.js
// pages/test3/test3.js
const app = getApp()  // 引⽤app模块
Page({
user1:function(e){
// this 当前页⾯,也就是page对象
// console.log('e', e.detail) // 等同于wx.getUserInfo⽅法
success(res) {
if (res.authSetting['scope.userInfo']) { // 获取⽤户信息权限
wx.checkSession({  // 确认⽤户session_key有⽆过期
success() {
//session_key 未过期,并且在本⽣命周期⼀直有效
success: (res) => {
console.log('res', res)  // 这个res⾥⾯就是⽤户信息
// 将数据发送到后端
// 这⾥是发送iv,encryptedData
url: app.globalData.baseurl+'getinfo/',
data:{
iv:res.iv,
ptedData,
token: wx.getStorageSync('token')
},
method:"POST",代码转换
success:(e) => {
console.log('后台返回的数据',e)
}
})
}
})
},
fail() {
// session_key 已经失效,需要重新执⾏登录流程
<_login()  // 通过开头导⼊const app = getApp(),获取app对象              wx.getUserInfo({
success: (res) => {
console.log('res', res)  // 这个res⾥⾯就是⽤户信息
////这⾥是发送iv,encryptedData,还没写
url: 'url',
})
}
})
}
})
}
}
})
},
})
django后端:
urls.py
f.urls import url
ib import admin
from app01.views import test,user,pay
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^getinfo/', user.Info.as_view()),
url(r'^pay/',pay.Pay.as_view())
]
views/user.py
from rest_framework.views import APIView
from  sponse import  Response
from app01.wx import  wx_login
ache import cache
import hashlib,time
dels import Wxuser
from app01.wx import WXBizDataCrypt
_ser import wx_user_ser
class Login(APIView):
def post(self,request):
param = request.data
if ("code"):
return Response({"status":1,"msg":"缺少参数"})
else:
code = ("code")
user_data = _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"))    # 当前cpu的时间              md5.update(user_data['session_key'].encode("utf-8"))
key = md5.hexdigest()
cache.set(key,val,7200)
has_user = Wxuser.objects.filter(openid=user_data['openid']).first() if not has_user:
ate(openid=user_data['openid'])
return Response({
"status":0,
"msg":"ok",
"data":{"token":key}
})
else:
return  Response({"status":2,"msg":"⽆效的code"})
class Info(APIView):
def post(self,request):
param = request.data
('iv') ('token') ('encryptedData'):
session_key_openid = (('token'))
if session_key_openid:
session_key,openid = session_key_openid.split('&')
# 解密
user_info = _info(session_('encryptedData'),('iv'))
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':'缺少参数'})
wx/settings.py
AppId="..."
AppSecret='...'
code2Session = 'api.weixin.qq/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code' pay_mchid ='1415981402'
pay_apikey = 'xi34nu5jn7x2uujd8u4jiijd2u5d6j8e'
wx/wx_login.py
from  app01.wx import settings
import requests
def get_login_info(code):
code_url = de2Session.format(settings.AppId,settings.AppSecret,code)
response = (code_url)
json_response = response.json() # 把json格式数据转换为字典
print("json_response",json_response)
if ("session_key"):
return json_response
else:
return  False
wx/WXBizDataCrypt.py
import base64
import json
from Crypto.Cipher import AES
from app01.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)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。