Power Platform Cloud Flows中WhatsApp媒体类型Payload验证失败求助
解决WhatsApp Webhook媒体消息签名验证不匹配问题
针对你在Power Platform Cloud Flows中接收WhatsApp Webhook时,媒体类型消息签名验证失败的问题,核心原因通常是Payload的原始格式被篡改或Unicode转义处理不严格,以下是可行的解决步骤和修正代码:
核心问题分析
文本消息签名验证正常,媒体消息失败,大概率是这两个原因:
- Power Platform默认会对HTTP请求体进行JSON解析/格式化(比如添加缩进、换行),导致计算签名时用的不是WhatsApp发送的原始Payload。
- 当前代码未严格按照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
相关产品推荐
相关产品推荐

