You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用PSD2接口时SHA256哈希与JS结果不一致求解决

解决Python对接PSD2哈希流程与JS结果不一致的问题

我正在对接PSD2的API端点,要求的核心处理逻辑是基于原始消息生成SHA256哈希,再对哈希结果做Base64编码。用对方提供的示例参数验证时,JS校验工具返回的预期输出是:pfHPQFso5E7SlQfg9kSVhZuod4k9KnFFEtFs472L5WI=,但我的Python代码得到的结果却和JS页面把输入类型设为text时的结果一致,完全不符合预期。

我的原代码

import base64
import hashlib
# get_input返回输入的base64字节数据
result = base64.b64encode(hashlib.sha256(get_input()).digest())

示例输入内容(Base64编码的JSON)

ewogICJpbnN0cnVjdGVkQW1vdW50IiA6IHsKICAgICJjdXJyZW5jeSIgOiAiRVVSIiwKICAgICJhbW91bnQiIDogIjE2LjAwIgogIH0sCiAgImRlYnRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNTE0MDAwMDAwMTA1MDAwMDAwMDAwMSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvck5hbWUiIDogIkNyZWQuIE5hbWUiLAogICJjcmVkaXRvckFjY291bnQiIDogewogICAgImliYW4iIDogIkVTNjYyMTAwMDQxODQwMTIzNDU2Nzg5MSIsCiAgICAiY3VycmVuY3kiIDogIkVVUiIKICB9LAogICJjcmVkaXRvckFkZHJlc3MiIDogewogICAgInN0cmVldCIgOiAiRWplbXBsbyBkZSBjYWxsZSIsCiAgICAiYnVpbGRpbmdOdW1iZXIiIDogIjE1IiwKICAgICJjaXR5IiA6ICJDb3Jkb2JhIiwKICAgICJwb3N0YWxDb2RlIiA6ICIxNDEwMCIsCiAgICAiY291bnRyeSIgOiAiRVMiCiAgfSwKICAicmVtaXR0YW5jZUluZm9ybWF0aW9uVW5zdHJ1Y3R1cmVkIiA6ICJQYWdvIiwKICAiY2hhcmdlQmVhcmVyIiA6ICJDUkVEIgp9

问题原因

问题出在输入的处理逻辑上:

  • 我的原代码直接对Base64编码后的字节做哈希,相当于把Base64字符串本身当成了消息内容,这和JS工具设置为text时的逻辑一致,但PSD2要求的是基于原始消息的字节(即Base64解码后的内容)计算哈希。
  • JS工具返回预期结果时,是先将Base64输入解码为原始JSON字节,再执行哈希和Base64编码的流程。

解决方案

调整代码,先将Base64输入解码为原始消息字节,再进行哈希计算,最后对哈希结果做Base64编码:

import base64
import hashlib

# 1. 先将Base64编码的输入解码为原始消息字节
raw_message = base64.b64decode(get_input())
# 2. 生成SHA256哈希
hash_bytes = hashlib.sha256(raw_message).digest()
# 3. 对哈希结果做Base64编码,并转换为字符串(去掉字节前缀b'')
result = base64.b64encode(hash_bytes).decode()
print(result)

验证结果

运行这段代码后,就能得到预期的输出:pfHPQFso5E7SlQfg9kSVhZuod4k9KnFFEtFs472L5WI=


内容的提问来源于stack exchange,提问作者NoiK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:50:39