我正在为Odoo开发一个新的payment_acquirer
模块,从上周开始,当我尝试解密通过服务器收到的数据时,我总是收到错误。
当我将数据复制到另一个python文件中进行测试时,它似乎与相同的数据完美配合,但是当我在控制器中执行此操作时,它会返回错误。
这是我控制器内的代码:
@http.route('/payment/ariarynet/result', type='http', auth="none", methods=['POST', 'GET'], csrf=False)
def ariarynet_result(self, **post):
""" Handle Ariary.net response and redirect to form_validate"""
_logger.info('Beginning Ariary.net form_feedback with post data %s', pprint.pformat(post)) # debug
key = bytes("477c3551da64136491eff1cb6ab27be35093b2512eb78f2c8d"[:24])
params = dict(post)
raw = b"%s"%post.get('idpanier')
decode = raw.encode('utf8')
idpanier = main.Utils().decrypt(key,decode) #it return an error
执行时,我有以下错误:
raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n.")
ValueError: Invalid data length, data must be a multiple of 8 bytes
我正在使用pyDes模块来加密和解密数据。
这是正在运行的测试:
def test_bytes(self):
key = bytes("477c3551da64136491eff1cb6ab27be35093b2512eb78f2c8d"[:24])
expect = "12177"
raw = "%8E%16%B8n%A6%1F%2Fj" #this is the data that I copied from the url
text = urllib.unquote(raw)
byteArray = bytes(text)
print Utils().decrypt(key, text)
self.assertEqual(expect,Utils().decrypt(key, text), "%s est diférent de %s" % (expect, Utils().decrypt(key, text)) )
我真的需要你的帮助来弄清楚我做错了什么。
更新
我认为问题与字符编码有关,因为当我试图比较我得到的数据时,我不会得到同样的东西:
param = post.get('idpanier')
text = (param.encode('utf8'))
print "utf8 encode %s, hex encoded text %s" % (text, text.encode('hex'))
print "utf8 encode %s, hex encoded text %s" % ("b4227475d651420b".decode('hex'), "b4227475d651420b") #excpected behavior
这是输出:
utf8 encode �"tu�QB
, hex encoded text efbfbd227475efbfbd51420b
utf8 encode �"tu�QB
, hex encoded text b4227475d651420b
答案 0 :(得分:0)
我发现的解决方案:我没有使用post.get()重新获取参数,而是设法直接通过传入的URL获取实际参数数据,其中参数编码尚未更改。
query = parse_qs("http://url?%s"%request.httprequest.query_string) #append the query string to a dummy url to get a well formed url
param = query.get('idpanier')
之后,一切正常。