跳到内容

从 v1 迁移

本指南将每个旧版 /create*Message 字段映射到其 Messaging API v2 中的对应字段。在移植现有集成时,请以此为参考。

高层级差异

Anchor link to
方面v1v2
每个渠道的端点每个渠道使用单独的方法(/createMessage/createEmailMessage/createSMSMessage/createKakaoMessage 等)单一端点 — POST /messaging/v2/notify
认证请求体中的 auth 字段Authorization: Token <API_TOKEN> 标头
目标选择混合:在同个请求中使用 filter + conditions + devices + users明确拆分:NotifySegment vs NotifyTransactional
内容扁平化的 content + 同级的平台块嵌套的 payload.content.localized_content.{locale}.{platform}
响应MessageCode[]message_code + 可选的 unknown_identifiers

/createMessage

Anchor link to

v1 中的 notifications[*] 条目会成为单独的 Notify 请求(每个请求一条消息)。如果一个 v1 调用有多个条目,则为每个条目发出一个 Notify 请求。

目标选择决策。 如果 v1 条目使用 devicesusers(显式列表),则将其映射到 transactional。否则,将其映射到 segment

请求级字段

Anchor link to
  • applicationsegment.applicationtransactional.application(应用代码格式相同)。
  • applications_group:v2 不支持。请使用多个针对单个应用的请求。
  • auth:已移至 Authorization 标头,不再位于请求体中。
  • transactionIdtransaction_id,这是一个与 segment / transactional 并列的请求级字段。其去重行为与 v1 相同:在 5 分钟内使用相同值重复调用将返回原始的 message_code 而不是重新发送,匹配仅基于键,而非负载。请参阅 transaction_id
  • send_date ("YYYY-MM-DD HH:mm""now") → schedule.at (RFC 3339 UTC 时间戳)。要重现 v1 的 "now",请将 schedule.at 设置为当前时间。任何过去的时间戳都会立即发送。
  • ignore_user_timezoneschedule.follow_user_timezone注意:逻辑相反ignore_user_timezone: true 变为 follow_user_timezone: false
  • timezone:不支持。v2 的 at 始终使用 UTC。请在客户端进行转换。

目标选择

Anchor link to
  • filter (segment 名称) → segment.code
  • conditions ([[tag, op, value], ...]) → segment.expression。重写为 seglang 表达式。在 seglang 中,* 是逻辑与 (AND),特定于应用的标签引用为 Tag("<application-code>", "<tag>", <op>, <value>)。例如:[["Country","EQ","BR"],["Language","EQ","pt"]] 加上 conditions_operator: ANDTag("XXXXX-XXXXX", "Country", EQ, "br") * Tag("XXXXX-XXXXX", "Language", EQ, "pt")
  • conditions_operator (AND / OR):已并入 segment.expression
  • devices (hwids 或 push tokens) → transactional.hwids.listtransactional.push_tokens.list。v2 将两者分开:hwids 放入 hwids,原始 push tokens 放入 push_tokens
  • userstransactional.users.list
  • platforms (数字代码 [1, 3, …]) → segment.platformstransactional.platforms (字符串枚举 ["IOS", "ANDROID", …])。请参阅 Platform enum
  • content (字符串) → payload.content.localized_content.default.{platform}.body。在 v2 中,内容始终是按区域设置和平台划分的。将纯 v1 字符串放在特殊的 "default" 键下(作为备用翻译,请参阅 区域设置选择)。
  • content ({locale: text}) → payload.content.localized_content.{locale}.{platform}.body。将正文复制到每个目标平台块中。
  • presetpayload.preset
  • datapayload.custom_data
  • rich_mediapayload.open_action.rich_media.code
  • linkpayload.open_action.link.url
  • minimize_link (02) → payload.open_action.link.shortener (NONEBITLY)。
  • inbox_imagepayload.content.localized_content.{locale}.{platform}.inbox.image_url(每个平台块都有自己的 inbox)。
  • inbox_datepayload.content.localized_content.{locale}.{platform}.inbox.expiration_date
  • inbox_days:不支持。请在客户端将其转换为绝对的 expiration_date

投放控制

Anchor link to
  • dynamic_content / dynamic_content_placeholdersdynamic_content_placeholders on segment or transactional
  • campaigncampaign on segment or transactional
  • capping_daysfrequency_capping.days
  • capping_countfrequency_capping.count
  • send_rate (int) → send_rate.value with send_rate.bucket: "1s"
  • message_type ("marketing" / "transactional") → message_type (MESSAGE_TYPE_MARKETING / MESSAGE_TYPE_TRANSACTIONAL)。

v2 不支持的功能

Anchor link to
  • template_bindings:v2 中不提供 Liquid 模板绑定。如果您依赖此功能,请继续使用 v1。

平台特定块

Anchor link to

v1 在每个 notifications[*] 条目的顶层接受平台特定的参数(iosandroidsafarichrome 等)。在 v2 中,它们被移到区域设置内部:

// v1
"notifications": [{
"content": "Hello",
"ios": { "title": "Hi", "sound": "default.caf" },
"android": { "header": "Hi", "led": "#ff0000" }
}]
// v2
"payload": {
"content": {
"localized_content": {
"en": {
"ios": { "title": "Hi", "body": "Hello", "sound": "default.caf" },
"android": { "title": "Hi", "body": "Hello", "led_color": "#ff0000" }
}
}
}
}

平台块内的字段名称在某些地方有所不同。有关确切的 v2 名称,请参阅 负载参考

示例:迁移前后对比

Anchor link to

v1 /createMessage (向一个 segment 推送):

{
"request": {
"application": "XXXXX-XXXXX",
"auth": "YOUR_API_TOKEN",
"notifications": [{
"send_date": "2026-05-01 12:00",
"content": "Hello!",
"platforms": [1, 3],
"filter": "active_users",
"campaign": "YYYYY-YYYYY",
"capping_days": 7,
"capping_count": 3,
"message_type": "marketing"
}]
}
}

v2 /messaging/v2/notify:

{
"segment": {
"application": "XXXXX-XXXXX",
"platforms": ["IOS", "ANDROID"],
"code": "active_users",
"payload": {
"content": {
"localized_content": {
"en": {
"ios": { "body": "Hello!" },
"android": { "body": "Hello!" }
}
}
}
},
"schedule": { "at": "2026-05-01T12:00:00Z" },
"frequency_capping": { "days": 7, "count": 3 },
"campaign": "YYYYY-YYYYY",
"message_type": "MESSAGE_TYPE_MARKETING"
}
}

/createTargetedMessage

Anchor link to

/createTargetedMessage 在大多数情况下映射到 transactional,或者如果您纯粹将其用作跨应用的 devices_filter 而没有显式标识符,则映射到 segment

  • devices_filtersegment.expression (seglang) 或 segment.filter_expression (结构化)。
  • contentpayload.content.localized_content.{locale}.{platform}.body
  • 所有其他字段,与上面的 /createMessage 相同。

/createEmailMessage

Anchor link to

迁移到带有 platforms: ["EMAIL"]email_payload 块的 Notify。完整参考:电子邮件负载参考

  • subjectemail_payload.subject (以区域设置为键的映射。将单区域设置的值包装在 {"en": "..."} 中)。
  • content (HTML) → email_payload.body
  • email_templateemail_payload.email_template
  • from / from_nameemail_payload.from ({ "name": "...", "email": "..." })。
  • reply_to / reply_to_nameemail_payload.reply_to
  • list_unsubscribeemail_payload.list_unsubscribe
  • attachmentsemail_payload.attachments ([{ "name": "...", "content": "<base64>" }])。
  • 目标选择、调度、营销活动等,与 /createMessage 相同。

/createSMSMessage

Anchor link to

迁移到带有 platforms: ["SMS"]Notify。短信正文通过应用配置的短信提供商发送。将内容放在任何已填充的平台块的 payload.content.localized_content.{locale}.{platform}.body 中。

特定于短信提供商的选项(发件人 ID 等)继续来自应用的短信配置,而不是请求体。

/createSMSMessage 没有对应的彩信 (MMS) 功能。要发送彩信(主题 + 图片附件),请使用 sms.subjectsms.file_urls — 请参阅 MMS

/createKakaoMessage

Anchor link to

迁移到带有 platforms: ["KAKAO"]Notify,使用 payload.content.localized_content.{locale}.kakao

  • template_idkakao.template
  • contentkakao.content
  • variableskakao.content_variables (JSON 字符串化)。

/createWhatsAppMessage

Anchor link to

迁移到带有 platforms: ["WHATS_APP"]Notify,使用 payload.content.localized_content.{locale}.whatsapp

  • content (自由格式文本) → whatsapp.content。仅在 24 小时客户服务窗口内由 Meta 发送。
  • content_idwhatsapp.content_id。预先批准的 Meta 模板的名称。
  • languagewhatsapp.language。Meta 模板的区域设置(例如 "en_US")。独立于外部 LocalizedContent 的区域设置键。
  • content_variables (v1 中的对象) → whatsapp.content_variables (JSON 字符串化的对象)。例如,v1 的 {"1": "John"} 变为 v2 的 "{\"1\":\"John\"}"
  • button_url_variables (对象) → whatsapp.button_url_variables (JSON 字符串化)。
  • header_variables (对象) → whatsapp.header_variables (JSON 字符串化)。
  • presetpayload.preset (负载级别的通用预设)。
  • 目标选择:在 v1 中进入 devices 的 WhatsApp 电话号码(例如 "whatsapp:+1234567890")必须通过 /registerDevice 注册到一个用户。在 v2 中,使用 transactional.users.list (或通过 transactional.hwids.list 使用 hwid) 来定位该用户。
  • use_auto_registration:不支持。请在发送前注册 WhatsApp 号码。

/createLineMessage

Anchor link to

迁移到带有 platforms: ["LINE"]Notify,使用 payload.content.localized_content.{locale}.line

  • content (纯文本) → line.content
  • preset (LINE 预设代码) → line.template。v2 字段存储一个代码,该代码引用在 Pushwoosh 控制面板中配置的 LINE 模板。
  • 内联 template (v1 的图片、轮播或 flex 消息结构):v2 不直接支持。请在控制面板中将富媒体消息预先配置为 LINE 预设,并通过 line.template 引用它。
  • 目标选择:v1 的 devices 列表(通过 SDK / /registerDevice 注册的 LINE 用户 ID)在 v2 中变为 transactional.users.list (或通过 transactional.hwids.list 使用 hwid)。

响应差异

Anchor link to

v1 /createMessage 返回:

{
"status_code": 200,
"status_message": "OK",
"response": { "Messages": ["XXXXX-XXXXX-AAAAA"] }
}

v2 Notify 返回:

{
"result": {
"message_code": "XXXXX-XXXXX-AAAAA",
"unknown_identifiers": []
}
}

非 200 响应遵循标准的 gRPC-Gateway 错误封装格式({ "code": ..., "message": ..., "details": [...] }),而非 v1 的 status_code / status_message 对。