Verifone(2Checkout) Webhook响应MD5转SHA遇问题求助
核对哈希输入的完整性与规则匹配
别只换哈希算法就完事,Verifone对SHA系列的哈希生成规则大概率和MD5不一样。去翻官方指南,确认用来生成HMAC的原始字段、字段顺序、拼接分隔符(比如是用&还是|)完全符合要求——比如MD5可能只拼了交易ID和金额,SHA可能要求加上时间戳或者状态码,哪怕少一个字段都会导致哈希不匹配,触发错误。检查密钥的编码与一致性
先确认你用的HMAC密钥和Verifone后台配置的完全一样,大小写、特殊字符一个都不能错。另外,SHA算法对编码要求更严格,生成HMAC时要明确指定用UTF-8编码转换密钥和输入字符串,别用默认的平台编码,MD5可能兼容乱码,但SHA绝对不行。修正哈希输出的格式
Verifone一般要求SHA256/SHA512的输出是小写十六进制字符串,如果你代码里输出了大写或者Base64格式,肯定过不了校验。给你个修正后的代码示例:import com.google.common.hash.Hashing; import java.nio.charset.StandardCharsets; // 生成符合要求的SHA256 HMAC String rawInput = "按官方要求拼接的原始字符串"; String secretKey = "你的Verifone密钥"; String validHmac = Hashing.hmacSha256(secretKey.getBytes(StandardCharsets.UTF_8)) .hashString(rawInput, StandardCharsets.UTF_8) .toString() .toLowerCase();确认HTTP响应的格式合规
检查响应的Content-Type是不是符合要求(比如text/plain或者application/x-www-form-urlencoded),有些时候MD5时期随便设都能过,但SHA要求严格匹配。另外,响应体别只返回哈希值,看看官方指南是不是要求同时返回其他字段(比如响应码),缺字段也会触发重复发送。日志调试+官方校验对比
把你生成哈希的原始输入、密钥、最终哈希都打日志,然后用Verifone官方的SHA校验工具(如果有)手动算一遍,对比结果。如果手动算的和代码生成的不一样,那就是代码的输入或者编码有问题;如果一致,那就要查HTTP传输过程中有没有字符转码的问题,导致Verifone收到的哈希和你生成的不一样。
内容的提问来源于stack exchange,提问作者Hellamb

