33 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Python
		
	
	
	
| import base64
 | |
| import json
 | |
| from Crypto.Cipher import AES
 | |
| from rest_framework.exceptions import APIException
 | |
| import logging
 | |
| logger = logging.getLogger('log')
 | |
| class WXBizDataCrypt:
 | |
|     def __init__(self, appId, sessionKey):
 | |
|         self.appId = appId
 | |
|         self.sessionKey = sessionKey
 | |
| 
 | |
|     def decrypt(self, encryptedData, iv):
 | |
|         # base64 decode
 | |
|         try:
 | |
|             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
 | |
|         except:
 | |
|             logger.error('腾讯sb-{}-{}-{}'.format(self.sessionKey,encryptedData, iv))
 | |
|             raise APIException('获取手机号失败,请稍后重试')
 | |
| 
 | |
|     def _unpad(self, s):
 | |
|         return s[:-ord(s[len(s)-1:])]
 |