PAYATHON 2026

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 所需的密文数据?

建议的排查步骤

  1. 确认运行环境、依赖版本和最小复现条件。
  2. 对照错误信息检查输入、配置和边界条件。
  3. 在隔离环境验证修复方案,再应用到生产环境。

原问题中的代码

@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

注意事项

保留完整日志和版本信息;涉及第三方接口时,以对应版本的官方文档为准。

备注:内容仅供参考。