你想反馈一个 Bug 还是 提一个需求?
如果是 Bug:
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)
print('cipher is',str(self._unpad(cipher.decrypt(encryptedData))))
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:])]
json.loads 时报错:
也不能 decode('utf-8')
有时候成功,有时候就出现上述问题,而且频率还蛮高的,请官方尽快给出解答
async getPhoneNumber(e) {
console.info('')
if (e.detail) {
Taro.showLoading()
let sessionKeyExpire = await this.checkSession()
if (!sessionKeyExpire) {
let loginRes = await this.wxlogin()
// 如果微信登陆出错,返回并提示
if (loginRes.err) {
return this.tips('登陆失败,再试一次', 'none')
}
let session = await this.code2session(loginRes.data)
if (session.err) {
return this.tips('会话失败,再试一次', 'none')
}
// 保存session key
await Taro.setStorage({
key:"wechat_session",
data: session
})
}
let session = await Taro.getStorage('wechat_session')
let { iv, encryptedData } = e.detail
let login = await this.login(encryptedData, session.sessionKey, iv)
if (login.err) {
return this.tips('登陆失败','none')
}
return this.tips('登陆成功')
}
}
我也遇到类似问题。
最终的原因是:有时候sessionKey 和 encryptedData + iv不一致时,会导致解码出现上面的错误。
解决办法:确保(从code获取到的)sessionKey和 encryptedData + iv 是一致的,即是在sessionKey失效之前,以此获取到的sessionKey和encryptedData + iv,然后调用解密,就可以正常解密得到结果了。
async getPhoneNumber(e) {
console.info('')
if (e.detail) {
Taro.showLoading()
let sessionKeyExpire = await this.checkSession()
if (!sessionKeyExpire) {
let loginRes = await this.wxlogin()
// 如果微信登陆出错,返回并提示
if (loginRes.err) {
return this.tips('登陆失败,再试一次', 'none')
}
let session = await this.code2session(loginRes.data)
if (session.err) {
return this.tips('会话失败,再试一次', 'none')
}
// 保存session key
await Taro.setStorage({
key:"wechat_session",
data: session
})
}
let session = await Taro.getStorage('wechat_session')
let { iv, encryptedData } = e.detail
let login = await this.login(encryptedData, session.sessionKey, iv)
if (login.err) {
return this.tips('登陆失败','none')
}
return this.tips('登陆成功')
}
}