你想反馈一个 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 keyawait Taro.setStorage({key:"wechat_session",data: session})}let session = await Taro.getStorage('wechat_session')let { iv, encryptedData } = e.detaillet 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 keyawait Taro.setStorage({key:"wechat_session",data: session})}let session = await Taro.getStorage('wechat_session')let { iv, encryptedData } = e.detaillet login = await this.login(encryptedData, session.sessionKey, iv)if (login.err) {return this.tips('登陆失败','none')}return this.tips('登陆成功')}}