python开发微信小程序解密获取的手机号

1、在子应用内创建utils.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)).decode())

    	if decrypted['watermark']['appid'] != self.appId:
        	raise Exception('Invalid Buffer')

    	return decrypted

	def _unpad(self, s):
    	return s[:-ord(s[len(s)-1:])]

2、views.py

from .utils import WXBizDataCrypt

class MobileView(APIView):
	'''解密手机号'''

	def get(self, request):

    	# 获取加密手机号
    	encryptedData = request.GET.get('encryptedData')
    	
    	# 处理加密的手机号
    	encryptedData = encryptedData + '=='

    	# 获取加密向量
    	vinum = request.GET.get('vinum')
    	
    	# 处理加密向量
    	iv = vinum + '=='

    	# 获取openid
    	openid = request.GET.get('openid')

    	# appid
    	appId = APPID

		# 获取sessinkey
    	redis_conn = get_redis_connection('session_key')
    	sessionKey = redis_conn.get('session_key_%s' % openid)
    	# sessionkey =  request.data.get('session_key')

    	# 解密手机号
    	pc = WXBizDataCrypt(appId, sessionKey)
    	mobile_obj = pc.decrypt(encryptedData, vinum)
    	mobile = mobile_obj['phoneNumber']
    	# print(mobile)
    	data = {
			'mobile':mobile
		}
    	return Response(data=data, status=status.HTTP_200_OK)

你可能感兴趣的:(Django)