本文简单说下微信登录以及获取并解密比如手机号这样的数据。
微信登录
首先自行阅读小程序开发文档,构造请求。基本上前端给个jscode,后台就能向微信服务器发请求了,大概是这样:
url = "https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code".format(
self.appid, self.secret, jscode)
rc = requests.get(url)
result = rc.json()
errcode = result.get('errcode')
if errcode and errcode != 0:
self.logger.error('微信登录错误: %s' % traceback.format_exc())
openid = result['openid']
session_key = result['session_key']
假设我们有个内置的用户表。那么因为openid与微信号是唯一的,可以用来入库,与用户表绑定(第一次当然得提供用户名密码),下次就直接用openid到用户库里查一下,有的话就免登,构造一个含有有效期的token返回给前端。
前端可以把这个token本地化存储,如果没过期就直接用。如果过期了,就拿openid重新比对。
session_key也入库,用于解密。
获取并解密数据
参考微信文档。
下载里面有示例代码,还挺方便的。里面提到了一个数据签名校验,比如获取用户手机号,用户授权后,前端会返回两个字段
encryptedData
和iv
。根据用户id从库里拿出
sessionKey
,一起解密下:
def unpad(s):
return s[:-ord(s[len(s)-1:])]
# base64 decode
sessionKey = base64.b64decode(sessionKey)
encryptedData = base64.b64decode(encryptedData)
iv = base64.b64decode(iv)
cipher = AES.new(sessionKey, AES.MODE_CBC, iv)
decrypted = json.loads(unpad(cipher.decrypt(encryptedData)))
decrypted
就是最终的数据,有手机号什么的。当然还可以加个判断,如果decrypted['watermark']['appid'] != self.appid,那么水印不对。
坑
说的坑主要是库,要导入:
from Crypto.Cipher import AES
这个库不是自带的,需要安装,比较坑的是,一般人都会这么安装:pip install Crypto
或者pip install crypto
,都不对,或者都不够,需要安装这个:
pip install pycrypto
本文建议先安装pycrypto,然后去安装目录看看,如果是这样:
且crypto目录下有Cipher目录,那就接近成功了。接下来还需要把crypto目录改成Crypto,就大功告成!
至于安装目录,Windows在
C:\Users\你的用户名\AppData\Local\Continuum\anaconda3\envs\你得环境名\Lib\site-packages
,Mac在/Users/你的用户名/anaconda3/envs/你的环境名/lib/python3.7/site-packages
,自己试试找找。
其实还没完,在Windows下安装pycrypto也有坑。会各种编译不过去,报错:
然后就去微软找,后来找了这个下载链接,http://go.microsoft.com/fwlink/?LinkId=691126,下载,默认,安装时还挺慢的,十几分钟,安装完成后,继续安装pycrypto,又报错,
image.png
网上有一些解决方法,但是路径跟这个版本对不上,后来采纳了这种方法,安装前先set一个变量:
set CL=/FI"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\include\\stdint.h"
这里的路径请自行确认,确认文件在。
然后再pip install pycrypto
,终于成功了!记得去安装目录改下目录名。
参考
error: Microsoft Visual C++ 14.0 is required问题最佳解决方法
windows安装pycrypto出错问题
网友评论