CreateRCSTemplate - 创建模板

更新时间:
复制 MD 格式

创建5G消息模板。

接口说明

前提条件

已通过 UpgradeToRCSSignature 接口将文本短信签名升级为 5G 消息签名。

使用说明

模板创建提交后需要审核,审核通过后才可用于消息发送。创建成功后返回的 TemplateCode,可作为 SendRCS 接口和 SendRCSReply 接口的入参发送消息。模板变量规则 TemplateRule 需与模板内容中的变量一一对应。

QPS 限制

本接口的单用户 QPS 限制为 50 次/秒。超过限制,API 调用将会被限流,这可能会影响您的业务,请合理调用。

调试

您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。

调试

授权信息

当前API暂无授权信息透出。

请求参数

名称

类型

必填

描述

示例值

TemplateType

integer

短信类型。取值:

  • 0:验证码。

  • 1:短信通知。

  • 2:推广短信。

0

RelatedSignNames

string

短信签名名称。

  • 文本模板:支持传入多个签名,多个签名用英文逗号分隔。

  • 富媒体模板:只支持单个签名

阿里云1,阿里云2

TemplateName

string

模板名称。

短信阈值告警模版

TemplateRule

string

模板变量规则,JSON 格式,需与模板内容中的变量一一对应。格式为{"变量名 1":"变量类型 1","变量名 2":"变量类型 2"}。变量类型取值:

  • ANY:任意文本变量。用于 Card.Title、Card.Description 或纯文本模板内容,可与常量或其他变量拼接。

  • MEDIA:素材编码变量。必须独占 MediaCode 字段的整个值,不允许拼接,值为素材编码 assetCode。

  • MENU_ANY:悬浮菜单全变量。必须独占 TemplateMenu 或卡片内 CardMenu 的整个值,例如 TemplateMenu 取值为${menu},不允许拼接,发送时传入完整菜单 JSON。

  • RCS_ANY:富媒体全变量。必须独占整个 TemplateContent,即 TemplateContent 取值为${Content},不允许拼接。

{"title":"ANY","mediaCode":"MEDIA","menu":"MENU_ANY"}

TemplateContent

string

模板内容。

  • 纯文本模板为字符串格式。

  • 富媒体模板为 JSON 格式或全变量模式${Content}。富媒体 JSON 结构包含 Cards 数组和 Layout 对象,具体说明请参见下方 TemplateContent 富媒体模板 JSON 结构。

尊敬的用户${username},您的账号${account}今日已达到发送量上限。

TemplateMenu

string

悬浮菜单,JSON 格式。必须以 suggestions 为根字段传入完整悬浮菜单 JSON,例如{"suggestions":[...]}。具体结构与字段约束参见请求参数补充说明中的 TemplateMenu 悬浮菜单语法说明。

  • 支持全变量模式,即 TemplateMenu 取值为${param_key},变量类型须为 MENU_ANY,且变量必须独占整个 TemplateMenu 的值,不允许拼接。

  • 卡片内嵌菜单 Cards[].CardMenu 同样支持 MENU_ANY 全变量。

{"suggestions":[{"action":{"dialerAction":{"dialPhoneNumber":{"phoneNumber":"+8617928222350"}},"displayText":"Call a phone number","postback":{"data":"set_by_chatbot_open_dialer"}}}]}

TemplateFormat

string

模板类型。取值:

  • PLAIN_TEXT:纯文本模板。

  • RICH_MEDIA:富媒体模板。

RICH_MEDIA

TemplateContent 富媒体模板 JSON 结构

当 TemplateFormat 为 RICH_MEDIA 时,TemplateContent 字段存储 JSON 结构,包含 Cards 数组和 Layout 对象。

悬浮菜单格式说明:卡片内嵌菜单 CardMenu 与外层悬浮菜单 TemplateMenu 均遵循同一悬浮菜单格式,即 GSMA RCS 标准的 suggestions 语法。必须以 suggestions 为根字段,值为 reply 或 action 数组,例如{"suggestions":[...]}。

{
  "Cards": [
    {
      "MediaCode": "ASSET_1721932656000a1b2c3",
      "Title": "卡片标题",
      "Description": "卡片描述信息",
      "CardMenu": {
        "suggestions": [
          {
            "reply": {
              "displayText": "查看详情",
              "postback": { "data": "uuid-1" }
            }
          }
        ]
      }
    }
  ],
  "Layout": {
    "CardOrientation": "VERTICAL"
  }
}

字段说明

字段类型必填说明
CardsArray卡片数组,最多 6 张卡片
Cards[].MediaCodeString素材编码 assetCode,可为常量或变量${mediaVar},通过 CreateRCSAsset 接口上传素材后获取
Cards[].TitleString卡片标题,不超过 150 Bytes,1 个中文字符占 3 Bytes
Cards[].DescriptionString卡片描述,不超过 1000 Bytes
Cards[].CardMenuObject卡片内嵌悬浮菜单,格式为{"suggestions":[...]},与外层悬浮菜单格式一致,suggestions 个数不超过 4 个。支持 MENU_ANY 全变量,值为${var}且需独占整个字段值
LayoutObject布局配置
Layout.CardOrientationString卡片方向。取值 VERTICAL 表示垂直单列,HORIZONTAL 表示水平轮播

注意:Card.Height、Layout.CardWidth、Layout.ImageAlignment 由系统自动填充默认值,无需传递。

当 TemplateFormat 为 PLAIN_TEXT 时,TemplateContent 为字符串格式,变量以${变量名}占位,例如尊敬的用户${username},您的账号${account}今日已达到发送量上限。纯文本模板内容不超过 200 字符。

模板变量类型与使用场景

变量类型使用位置约束是否允许拼接常量或其他变量是否需要白名单发送时传值内容
ANY纯文本模板的 TemplateContent,富媒体模板的 Card.Title、Card.Description允许不需要任意文本
MEDIA富媒体模板的 Card.MediaCode,必须独占整个值不允许不需要素材编码 assetCode
RCS_ANY富媒体模板的 TemplateContent,必须独占整个值,即 TemplateContent 取值为${var}不允许需要完整的富媒体 JSON 字符串
MENU_ANYTemplateMenu 或卡片内 CardMenu,必须独占整个值,即 TemplateMenu 取值为${var}不允许需要,与模板全变量共享白名单完整的悬浮菜单 JSON 字符串,含 suggestions 根字段,即{"suggestions":[...]}

约束说明

  • MEDIA、RCS_ANY、MENU_ANY 均为独占型变量,不允许与常量或其他变量拼接,否则创建模板报错 isv.INVALID_PARAMETERS,即变量类型使用不合法。

  • 悬浮菜单内部字段如 displayText 不支持卹独设置变量。如需动态菜单内容,请使用 MENU_ANY 全变量,在发送时传入完整菜单 JSON。

创建模板示例

以下示例均通过 CreateRCSTemplate 接口创建模板。创建成功后返回 TemplateCode,可用于后续通过 SendRCS 接口发送消息。

示例 1:单卡片模板,常量素材,无变量

适用场景:素材和文案固定不变,如产品公告、固定通知。

{
  "TemplateName": "产品推荐模板",
  "RelatedSignNames": "阿里云",
  "TemplateType": 1,
  "TemplateFormat": "RICH_MEDIA",
  "TemplateContent": "{\n  \"Cards\": [\n    {\n      \"MediaCode\": \"ASSET_1721932656000a1b2c3\",\n      \"Title\": \"阿里云产品推荐\",\n      \"Description\": \"云服务器 ECS 限时优惠,立即选购!\",\n      \"CardMenu\": {\n        \"suggestions\": [\n          {\n            \"reply\": {\n              \"displayText\": \"了解详情\",\n              \"postback\": {\"data\": \"uuid-detail\"}\n            }\n          },\n          {\n            \"action\": {\n              \"displayText\": \"立即购买\",\n              \"postback\": {\"data\": \"uuid-buy\"},\n              \"urlAction\": {\n                \"openUrl\": {\n                  \"url\": \"https://www.aliyun.com/product/ecs\",\n                  \"application\": \"browser\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    }\n  ],\n  \"Layout\": {\n    \"CardOrientation\": \"VERTICAL\"\n  }\n}",
  "TemplateRule": "{}",
  "TemplateMenu": "{\"suggestions\":[{\"reply\":{\"displayText\":\"返回首页\",\"postback\":{\"data\":\"uuid-home\"}}}]}"
}

示例 2:多卡片轮播模板,含 MEDIA 和 ANY 变量

适用场景:需要动态替换素材和文案,如商品推荐、活动轮播。

{
  "TemplateName": "商品轮播模板",
  "RelatedSignNames": "阿里云",
  "TemplateType": 1,
  "TemplateFormat": "RICH_MEDIA",
  "TemplateContent": "{\n  \"Cards\": [\n    {\n      \"MediaCode\": \"${mediaCode1}\",\n      \"Title\": \"${title1}\",\n      \"Description\": \"${desc1}\"\n    },\n    {\n      \"MediaCode\": \"${mediaCode2}\",\n      \"Title\": \"${title2}\",\n      \"Description\": \"${desc2}\"\n    }\n  ],\n  \"Layout\": {\n    \"CardOrientation\": \"HORIZONTAL\"\n  }\n}",
  "TemplateRule": "{\n  \"mediaCode1\": \"MEDIA\",\n  \"title1\": \"ANY\",\n  \"desc1\": \"ANY\",\n  \"mediaCode2\": \"MEDIA\",\n  \"title2\": \"ANY\",\n  \"desc2\": \"ANY\"\n}",
  "TemplateMenu": ""
}

变量类型说明:MEDIA 类型变量对应素材编码 assetCode,ANY 类型变量对应任意文本。

示例 3:全变量模板,RCS_ANY 模式

适用场景:模板结构完全由发送时决定,灵活度最高。需 PID 在白名单中。

{
  "TemplateName": "全变量富媒体模板",
  "RelatedSignNames": "阿里云",
  "TemplateType": 1,
  "TemplateFormat": "RICH_MEDIA",
  "TemplateContent": "${Content}",
  "TemplateRule": "{\n  \"Content\": \"RCS_ANY\"\n}",
  "TemplateMenu": ""
}

注意:RCS_ANY 变量不允许通过拼接常量或其他变量,必须独占整个 TemplateContent。

示例 4:悬浮菜单全变量模板,MENU_ANY 模式

适用场景:悬浮菜单内容如按钮文字、交互动作、按钮个数等需要在发送时动态指定,如千人千面的回复类交互。需 PID 在白名单中,与模板全变量共享白名单。

{
  "TemplateName": "菜单变量模板",
  "RelatedSignNames": "阿里云",
  "TemplateType": 1,
  "TemplateFormat": "RICH_MEDIA",
  "TemplateContent": "{\n  \"Cards\": [\n    {\n      \"MediaCode\": \"ASSET_1721932656000abc\",\n      \"Title\": \"活动通知\",\n      \"Description\": \"点击查看最新活动\"\n    }\n  ],\n  \"Layout\": {\n    \"CardOrientation\": \"VERTICAL\"\n  }\n}",
  "TemplateRule": "{\n  \"menu\": \"MENU_ANY\"\n}",
  "TemplateMenu": "${menu}"
}

注意

  • MENU_ANY 变量必须独占整个 TemplateMenu 或卡片内 CardMenu 的值,不允许拼接常量或其他变量。

  • 如果菜单内容固定、无需动态替换,直接在 TemplateMenu 中传入完整菜单 JSON 即可,参见示例 1,无需使用变量。

示例 5:卡片内嵌多种 Action 的模板

适用场景:卡片内需要多种交互方式,包括快捷回复、打开网页、拨打电话、获取位置。

{
  "TemplateName": "综合服务模板",
  "RelatedSignNames": "阿里云",
  "TemplateType": 1,
  "TemplateFormat": "RICH_MEDIA",
  "TemplateContent": "{\n  \"Cards\": [\n    {\n      \"MediaCode\": \"ASSET_1721932656000abc\",\n      \"Title\": \"服务中心\",\n      \"Description\": \"请选择您需要的服务\",\n      \"CardMenu\": {\n        \"suggestions\": [\n          {\n            \"reply\": {\n              \"displayText\": \"确认订购\",\n              \"postback\": {\"data\": \"uuid-confirm\"}\n            }\n          },\n          {\n            \"action\": {\n              \"displayText\": \"访问官网\",\n              \"postback\": {\"data\": \"uuid-visit\"},\n              \"urlAction\": {\n                \"openUrl\": {\n                  \"url\": \"https://www.aliyun.com\",\n                  \"application\": \"browser\"\n                }\n              }\n            }\n          },\n          {\n            \"action\": {\n              \"displayText\": \"拨打客服\",\n              \"postback\": {\"data\": \"uuid-call\"},\n              \"dialerAction\": {\n                \"dialPhoneNumber\": {\"phoneNumber\": \"+8610086\"}\n              }\n            }\n          },\n          {\n            \"action\": {\n              \"displayText\": \"发送位置\",\n              \"postback\": {\"data\": \"uuid-location\"},\n              \"mapAction\": {\n                \"requestLocationPush\": {}\n              }\n            }\n          }\n        ]\n      }\n    }\n  ],\n  \"Layout\": {\n    \"CardOrientation\": \"VERTICAL\"\n  }\n}",
  "TemplateRule": "{}",
  "TemplateMenu": ""
}

TemplateMenu 悬浮菜单语法说明

悬浮菜单是附加在消息下方的交互按钮组,用户可点击进行快捷回复或触发操作。以下 Action 类型同时适用于外层悬浮菜单 TemplateMenu 和卡片内嵌菜单 CardMenu.suggestions。

结构约束

根对象必须包含 suggestions 字段,缺少该字段属于格式不合规。其值为数组,每一项为 reply 或 action。格式遵循 GSMA RCS 标准的 chatbot suggestions 语法。

约束说明
根字段必须为 suggestions
元素类型每项为 reply 或 action 之一
数量限制外层悬浮菜单 1~10 个,卡片内嵌菜单不超过 4 个
displayText每个按钮最多 25 字符

reply 建议回复

用户点击后,向平台发送一条预设的回复消息。

字段类型必填说明
displayTextstring按钮显示文字,1~25 字符
postback.datastring回传给平台的业务数据,最长 2000 字符,需全局唯一,建议使用 UUID

action-urlAction 打开网页

字段类型必填说明
displayTextstring按钮显示文字,1~25 字符
postback.datastring回传给平台的业务数据
urlAction.openUrl.urlstring目标网址,支持 http、https 及 App Deep Link,如 weixin://
urlAction.openUrl.applicationstring取值 browser 表示系统浏览器,webview 表示应用内嵌浏览器

action-dialerAction 拨打电话

字段类型必填说明
displayTextstring按钮显示文字,1~25 字符
postback.datastring回传给平台的业务数据
dialerAction.dialPhoneNumber.phoneNumberstring电话号码,如+8613800138000 或 10086

action-mapAction 获取地理位置

用户点击后请求获取当前位置信息,用户授权后平台回调上行消息携带经纬度。

字段类型必填说明
displayTextstring按钮显示文字,1~25 字符
postback.datastring回传给平台的业务数据
mapAction.requestLocationPushobject传入空对象即可,表示请求获取位置

说明:requestLocationPush 与 showLocation 互斥,二者只能选其一。

action-mapAction showLocation 展示地图位置

在地图上展示指定位置。

{
  "action": {
    "displayText": "查看门店位置",
    "postback": { "data": "f7e5b2c4-1a8d-6c6e-dh90-5e6f7a8b9012" },
    "mapAction": {
      "showLocation": {
        "location": {
          "latitude": 30.274,
          "longitude": 120.155,
          "label": "阿里云西溪园区",
          "query": "杭州市余杭区文一西路 969 号"
        },
        "fallbackUrl": "https://maps.example.com/?lat=30.274&lng=120.155"
      }
    }
  }
}
字段类型必填说明
displayTextstring按钮显示文字,1~25 字符
postback.datastring回传给平台的业务数据
mapAction.showLocation.locationobject位置信息
location.latitudenumber条件必填纬度,与 query 二选一
location.longitudenumber条件必填经度,与 query 二选一
location.labelstring位置标签
location.querystring条件必填地址查询字符串,与 latitude 加 longitude 二选一
mapAction.showLocation.fallbackUrlstring备用 URL,当地图不可用时使用

说明:location 中 latitude 加 longitude 与 query 必须提供其中一种,不能同时为空。

悬浮菜单完整示例

{
  "suggestions": [
    {
      "reply": {
        "displayText": "查看套餐",
        "postback": { "data": "c5d6e7f8-a9b0-1234-c567-890123456789" }
      }
    },
    {
      "action": {
        "displayText": "拨打客服",
        "postback": { "data": "d6e7f8a9-b0c1-2345-d678-901234567890" },
        "dialerAction": {
          "dialPhoneNumber": { "phoneNumber": "10086" }
        }
      }
    },
    {
      "action": {
        "displayText": "访问官网",
        "postback": { "data": "e7f8a9b0-c1d2-3456-e789-012345678901" },
        "urlAction": {
          "openUrl": {
            "url": "https://www.example.com",
            "application": "browser"
          }
        }
      }
    }
  ]
}

用户点击菜单后的上行回执

用户点击悬浮菜单中的某一项时,客户端会向平台回传一条 response 消息,其中包含 reply 或 action 之一,字段内容与下行定义完全对应。平台根据 postback.data 的值执行对应业务逻辑。

{
  "response": {
    "reply": {
      "displayText": "查看套餐",
      "postback": { "data": "c5d6e7f8-a9b0-1234-c567-890123456789" }
    }
  }
}

返回参数

名称

类型

描述

示例值

object

AccessDeniedDetail

string

访问被拒绝时返回的详细信息。

None

RequestId

string

本次请求的 ID。

A90E4451-FED7-49D2-87C8-00700A8C4D0D

Message

string

状态码的描述。

OK

Data

object

返回数据,包含 TemplateCode(String)。

{ "TemplateCode": "RCS_SMS_10001052" }

Code

string

请求状态码。返回 OK 代表请求成功。

OK

Success

boolean

是否调用成功。

  • true:调用成功。

  • false:调用失败。

true

返回示例

创建成功后返回模板 Code,可用于后续通过 SendRCS 接口发送消息:

{
  "Code": "OK",
  "RequestId": "A90E4451-FED7-49D2-87C8-00700A8C4D0D",
  "Success": true,
  "Data": {
    "TemplateCode": "RCS_SMS_1721932656000xyz"
  }
}

示例

正常返回示例

JSON格式

{
  "AccessDeniedDetail": "None",
  "RequestId": "A90E4451-FED7-49D2-87C8-00700A8C4D0D",
  "Message": "OK",
  "Data": {
    "TemplateCode": "RCS_SMS_10001052"
  },
  "Code": "OK",
  "Success": true
}

错误码

访问错误中心查看更多错误码。

变更历史

更多信息,参考变更详情