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

C#验证QB通知签名时计算签名与接收签名不匹配问题求解

QuickBooks 通知签名验证失败解决方案
  • 修复HMACSHA256实例化逻辑:你当前使用无参构造函数创建HMACSHA256实例后再赋值密钥的写法存在问题,无参构造会默认生成随机密钥,后续赋值Key的操作无法正确重置HMAC计算上下文,正确写法是在构造时直接传入密钥,且无需手动调用Initialize()方法,修改后的代码段如下:
public static bool ValidateRequest(Dictionary<string, string> headers, string payload, string verifier)
{
    if (!headers.TryGetValue("intuit-signature", out string signature) || string.IsNullOrEmpty(signature))
    {
        return false;
    }
    try
    {
        byte[] secretKeyBArr = Encoding.UTF8.GetBytes(verifier);
        byte[] dataBytes = Encoding.UTF8.GetBytes(payload);
        using (HMACSHA256 hmacsha256 = new HMACSHA256(secretKeyBArr))
        {
            byte[] hmacBytes = hmacsha256.ComputeHash(dataBytes);
            string hash = Convert.ToBase64String(hmacBytes);
            // 使用序数比较避免文化差异导致的匹配错误,同时去除签名首尾可能存在的空白字符
            return hash.Equals(signature.Trim(), StringComparison.Ordinal);
        }
    }
    catch (Exception)
    {
        // 按需添加异常日志逻辑
        throw;
    }
}
  • 确认payload的原始性:不要使用经过Web框架自动解析、二次序列化后的payload内容,必须直接读取HTTP请求的原始Body字节流转换为字符串,避免JSON字段顺序变化、空格/换行被自动删减、特殊字符被转义等问题,导致计算输入和Intuit发送的原始内容不一致。
  • 校验参数正确性:确认你使用的verifier和Intuit后台配置的完全一致,注意区分沙箱环境和生产环境的密钥,不要混入多余的空格、换行符等不可见字符。
  • 确认编码格式:确保原始payload的编码为无BOM的UTF-8,避免编码不匹配导致字节数组计算错误。
  • 优化异常处理:原代码中的throw ex;会重置异常调用栈,不利于问题排查,直接写throw;即可;原代码末尾的return false;为不可达代码,可以直接删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 17:39:03