使用Azure Notification Hub发送模板通知时出现PayloadErrors求助
以下是免费版环境下可快速排查的几个方向:
1. FCM V1模板结构错误(最可能触发PayloadErrors)
你使用CreateFcmV1TemplateRegistrationAsync注册FCM V1模板,但当前模板嵌套了多余的message节点,导致最终生成的FCM payload不符合官方规范。
FCM V1的请求体要求外层为message节点,内部包含通知或数据内容;而Azure Notification Hub在处理FCM V1模板时,会自动将模板填充后的内容作为message的值,不需要你手动在外层添加message。你的模板:
{"message":{"title":"$(title)", "description":"$(description)"}}
填充后会生成如下错误结构:
{ "message": { "message": { "title": "Test alert 2", "description": "Content of test alert" } } }
这种嵌套会被FCM直接拒绝,引发PayloadErrors。
修正方案:将模板改为FCM V1要求的message内部结构,比如通知类型模板:
{"notification":{"title":"$(title)", "body":"$(description)"}}
或数据类型模板:
{"data":{"title":"$(title)", "description":"$(description)"}}
2. 设备令牌格式不合法
CreateFcmV1TemplateRegistrationAsync的第一个参数必须是合规的FCM V1设备令牌(160字符,由字母、数字、-和_组成)。你传入的command.InstallationId如果是随机生成的非格式字符串,Notification Hub向FCM发送请求时会被拒绝,进而触发PayloadErrors。
如果仅用于测试模板逻辑,可以生成一个符合格式的占位令牌,比如:
dQw4w9WgXcQ-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_dQw4w9WgXcQ-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
3. 标签匹配验证
确认注册时使用的标签$"{districtId}_{template.Key}"与发送时指定的标签$"{districtId}_{type}"完全一致(大小写敏感)。虽然标签不匹配不会触发PayloadErrors(只会导致无消息分发),但可以通过Azure门户的「通知发送历史」确认是否有匹配的注册数,排除干扰。
4. 参数与模板占位符一致性
检查模板中的占位符(如$(title)、$(description))和发送时parameters中的键是否完全一致(大小写敏感)。当前你的参数包含对应键,这部分无需调整,但后续修改模板时需注意。
内容的提问来源于stack exchange,提问作者peper1998

