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

Power Platform Cloud Flows中WhatsApp媒体类型Payload验证失败求助

解决WhatsApp Webhook媒体消息签名验证不匹配问题

针对你在Power Platform Cloud Flows中接收WhatsApp Webhook时,媒体类型消息签名验证失败的问题,核心原因通常是Payload的原始格式被篡改或Unicode转义处理不严格,以下是可行的解决步骤和修正代码:

核心问题分析

文本消息签名验证正常,媒体消息失败,大概率是这两个原因:

  1. Power Platform默认会对HTTP请求体进行JSON解析/格式化(比如添加缩进、换行),导致计算签名时用的不是WhatsApp发送的原始Payload。
  2. 当前代码未严格按照WhatsApp要求处理Unicode转义,媒体消息Payload中包含更多非ASCII字符或特殊转义场景,导致哈希计算不一致。

解决步骤

1. 在Cloud Flows中获取原始未修改的Payload

不要直接使用解析后的JSON对象,而是获取触发器返回的原始请求体内容:

  • 使用表达式 base64ToString(triggerBody()['$content']) 提取原始的、无格式化的JSON字符串,作为签名计算的输入。

2. 修正签名计算代码

需要严格实现WhatsApp要求的Unicode转义规则,再计算HMAC-SHA256哈希:

public static string CalculateSignature(string appSecret, string rawPayload)
{
    // 先对原始Payload执行严格的Unicode转义(符合WhatsApp要求)
    string escapedPayload = EscapeUnicode(rawPayload);
    
    byte[] payloadBytes = Encoding.UTF8.GetBytes(escapedPayload);
    byte[] secretBytes = Encoding.UTF8.GetBytes(appSecret);
    
    using (var hmac = new HMACSHA256(secretBytes))
    {
        byte[] hashArray = hmac.ComputeHash(payloadBytes);
        return BitConverter.ToString(hashArray).Replace("-", string.Empty).ToLower();
    }
}

// 实现严格的Unicode转义和JSON特殊字符转义
private static string EscapeUnicode(string input)
{
    StringBuilder sb = new StringBuilder();
    foreach (char c in input)
    {
        if (c > 127)
        {
            // 将非ASCII字符转为\uXXXX格式(小写十六进制)
            sb.AppendFormat("\\u{0:x4}", (int)c);
        }
        else
        {
            // 处理JSON标准特殊字符的转义
            switch (c)
            {
                case '\\':
                    sb.Append("\\\\");
                    break;
                case '"':
                    sb.Append("\\\"");
                    break;
                case '\n':
                    sb.Append("\\n");
                    break;
                case '\r':
                    sb.Append("\\r");
                    break;
                case '\t':
                    sb.Append("\\t");
                    break;
                default:
                    sb.Append(c);
                    break;
            }
        }
    }
    return sb.ToString();
}

3. 签名对比的注意事项

从HTTP请求头中获取X-Hub-Signature-256的值时,需要去掉前缀sha256=,再和计算出的签名做全小写对比。

内容的提问来源于stack exchange,提问作者V.M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:05:58