Python GET 数据解密时报 Invalid data length 错误
支付阿杰
结论
这是演示模式生成的结构示例。要获得针对具体问题的可靠技术解答,请配置真实 AI 服务后重新生成。
问题分析
我正在为 Odoo 开发一个新的 payment_acquirer 模块。自上周以来,每当我尝试解密通过服务器接收到的数据时,都会遇到错误。
我将相同的数据复制到另一个 Python 文件中进行测试时,解密可以正常完成;但在 controller 中执行相同操作时,却会返回错误。
controller 中的代码如下:
@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 module 对数据进行加密和解密。下面的测试代码可以正常运行:
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)) )
我想弄清楚,为什么从 GET 请求中取得的数据在 controller 内无法解密,而复制 URL 中的数据并通过 urllib.unquote 处理后却能正常解密?我的数据处理方式有什么问题?
更新:
我认为问题可能与 character encoding 有关。比较实际取得的数据和预期数据时,它们显示出来似乎相同,但转换成十六进制后的内容并不一致:
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 "tuQB
, hex encoded text efbfbd227475efbfbd51420b
utf8 encode "tuQB
, hex encoded text b4227475d651420b
可以看到,实际数据中的部分字节被转换成了 UTF-8 replacement character,对应十六进制值 efbfbd,而预期数据应为 b4227475d651420b。应如何在 Odoo controller 中正确接收和处理原始 GET 参数字节,避免字符编码转换破坏 pyDes 所需的密文数据?
建议的排查步骤
- 确认运行环境、依赖版本和最小复现条件。
- 对照错误信息检查输入、配置和边界条件。
- 在隔离环境验证修复方案,再应用到生产环境。
原问题中的代码
@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
注意事项
保留完整日志和版本信息;涉及第三方接口时,以对应版本的官方文档为准。
备注:内容仅供参考。
