wxviews.py
import base64
import json
from Crypto.Cipher import AES
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:])]
demo
from WXBizDataCrypt import WXBizDataCrypt
def main():
appId = 'wx4f4bc4dec97d474b'
sessionKey = 'tiihtNczf5v6AKRyjwEUhQ=='
encryptedData = 'CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew=='
iv = 'r7BXXKkLb8qrSNn05n0qiA=='
pc = WXBizDataCrypt(appId, sessionKey)
print pc.decrypt(encryptedData, iv)
if __name__ == '__main__':
main()
其中包含解密
python3 对称加密算法AES、DES3
注:python3 安装 Crypto 是
pip3 install pycryptodome
如果下载比较慢翻我第二章文章有镜像
微信官方给的
是这样的
为了确保开放接口返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。
1通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )
2开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。
小程序index.js
login() {
wx.getUserInfo({
success(res){
console.log(res)
var userinfo = res.userInfo
console.log(userinfo)
}
})```
打印出来的是
{errMsg: “getUserInfo:ok”, rawData: “{“nickName”:“张”,“gender”:1,“language”:“zh_CN”,“cit…snf1Tyy9fVm3GqwUQASDWDKweuo12GuarBWeonyuOlg/132”}”, userInfo: {…}, signature: “dde08e00a9d5eaba4956abdea5802693b7a6d77f”, encryptedData: “6PBg8Z/X2GztXFZoI7wewNetxQXXZyaklhtNPyXo9XSBxStUBm…p8DQ997rNVrrudkY8oquEzt69rgiNVvbCY7Vsb+vAsmviJA==”, …}
只关注
rawData,需要和s-k链接起来
s-k是上一篇文章中
print(res)
[14/Mar/2020 22:36:51] "GET /wx-login?code=021sJwPp16fSOl0qanQp1vCFPp1sJwPa&userinfo=undefined HTTP/1.1" 301 0
{'session_key': 'rCJI1l3***********dQ==', 'openid': '*********123'}
可以看出返回的userinfo=undefined
下一章具体获取userinfo,添加到DJANGO的user模型拓展中