Python开发微信小程序后端开发小坑

本文简单说下微信登录以及获取并解密比如手机号这样的数据。

微信登录

首先自行阅读小程序开发文档,构造请求。基本上前端给个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也入库,用于解密。

获取并解密数据

参考微信文档

image.png

下载里面有示例代码,还挺方便的。里面提到了一个数据签名校验,比如获取用户手机号,用户授权后,前端会返回两个字段encryptedDataiv
根据用户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,然后去安装目录看看,如果是这样:

image.png

且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也有坑。会各种编译不过去,报错:

image.png

然后就去微软找,后来找了这个下载链接,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,终于成功了!记得去安装目录改下目录名。
如果还不行,就再安装pip install pycryptodome,总之很玄学。

参考

error: Microsoft Visual C++ 14.0 is required问题最佳解决方法
windows安装pycrypto出错问题