View a markdown version of this page

接收入站 RCS 消息 - AWS 最终用户消息 SMS

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

接收入站 RCS 消息

AWS 最终用户消息支持双向 RCS 消息,允许您接收来自客户的短信。入站 RCS 消息遵循与 SMS 双向消息相同的模式:传入的消息将传送到您配置的 Amazon SNS 主题,然后您使用 Lambda 函数或其他 SNS 订阅者对其进行处理。

重要

要使用入站 RCS 消息,您必须在 AWS RCS 代理上设置双向消息 SNS 主题。创建代理时,默认情况下双向消息传递处于禁用状态。启用它并配置 SNS 主题后,入站消息将传送到该主题。所有入站 RCS 消息均按标准费率向客户收费。

本节介绍双向 RCS 消息的工作原理、如何为您的 AWS RCS 代理启用双向 RCS 消息、入站消息有效负载格式以及如何管理关键词。有关管理 AWS RCS 代理的信息,请参阅管理 RCS 代理。有关发送 RCS 消息的信息,请参阅发送 RCS 消息

双向 RCS 消息传递的工作原理

当客户向您的 AWS RCS 代理发送短信时, AWS 最终用户消息会收到该消息并将其发布到您指定的 Amazon SNS 主题中。然后,您可以使用任何 SNS 订阅者来处理消息,例如 Lambda 函数、Amazon SQS 队列或终端节点。 HTTP/HTTPS

双向 RCS 消息流的工作原理如下:

  1. 客户通过其支持 RCS 的设备向您的 AWS RCS 代理发送短信。

  2. AWS 最终用户消息接收入站消息,并根据您配置的关键字对其进行评估。如果消息与关键字匹配,则服务会发送配置的自动响应(如果有)。

  3. AWS 最终用户消息将消息负载作为 JSON 对象发布到您在 AWS RCS 代理上为双向消息传送配置的 Amazon SNS 主题。

  4. 您的 SNS 订阅者(例如 Lambda 函数)会收到消息有效负载,并根据您的应用程序逻辑对其进行处理。

AWS 最终用户消息中的 RCS 目前支持入站短信。如果客户向您的 AWS RCS 代理发送媒体消息(例如图像或视频),则该消息将以 “已忽略” 状态记录下来。您的应用程序不会通过 SNS 主题接收媒体消息。

配置您的双向消息收发目的地

要在应用程序中接收和处理入站 RCS 消息,您必须启用双向消息并在 AWS RCS 代理上配置目的地。默认情况下,双向消息传递处于禁用状态。启用后,您可以指定一个 Amazon SNS 主题,其中 AWS 最终用户消息传递入站消息。您可以使用 AWS 最终用户消息控制台或 API 配置目的地。

Console
使用控制台配置双向消息收发目的地
  1. 打开 “ AWS 最终用户消息” 控制台。

  2. 在导航窗格中,选择 RCS 代理

  3. 选择要配置的 AWS RCS 代理。

  4. 选择 “双向消息” 选项卡。

  5. 选择编辑设置

  6. 将 “启用双向消息” 切换为 “开”。

  7. 对于 SNS 主题,请选择现有的 Amazon SNS 主题或创建一个新主题。这是发布入站消息的主题。

  8. 选择保存

AWS CLI

要使用 API 配置双向消息收发目的地,请使用以下参数调用 UpdateRcsAgent API:

  • two-way-enabled— 设置为true以启用双向消息。

  • two-way-channel-arn— 发布入站消息的 Amazon SNS 主题的 ARN。

  • two-way-channel-role— 授予 AWS 最终用户消息向 SNS 主题发布消息的权限的 IAM 角色的 ARN。

以下示例使用 AWS CLI 配置双向消息传送目标:

aws pinpoint-sms-voice-v2 update-rcs-agent \ --rcs-agent-id rcs-a1b2c3d4 \ --two-way-enabled \ --two-way-channel-arn arn:aws:sns:us-east-1:123456789012:MyRCSInboundTopic \ --two-way-channel-role arn:aws:iam::123456789012:role/SMSVoiceSNSPublishRole

SNS 主题权限

您为双向 RCS 消息配置的 Amazon SNS 主题必须允许 AWS 最终用户消息向其发布消息。您可以通过两个选项来授予访问权限。

选项 1:使用 IAM 角色

创建一个 IAM 角色, AWS 最终用户消息可以代入该角色向你的 SNS 主题发布消息。该角色既需要信任策略,也需要权限策略。

以下是 IAM 角色的信任策略accountId替换为您的唯一 ID AWS 账户。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "SMSVoice", "Effect": "Allow", "Principal": { "Service": "sms-voice.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "accountId" } } } ] }

以下是 IAM 角色的权限策略SMSVoiceAllowSNSPublishSid 允许发布到亚马逊 SNS 主题,对于加密的亚马逊 SNS 主题,SMSVoiceAllowEncryptedSNSTopicsSid 是可选的。进行以下更改:

  • partition替换为您在其中使用 “ AWS 最终用户消息” 的 AWS 分区。

  • region替换为您 AWS 区域 在中使用 AWS 最终用户消息的。

  • accountId替换为您的唯一 ID AWS 账户。

  • snsTopicName替换为接收入站消息的 Amazon SNS 主题的名称。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "SMSVoiceAllowSNSPublish", "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:partition:sns:region:accountId:snsTopicName", "Condition": { "StringEquals": { "aws:ResourceAccount": "accountId" } } }, { "Sid": "SMSVoiceAllowEncryptedSNSTopics", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:sns:topicArn": "arn:partition:sns:region:accountId:snsTopicName", "aws:CalledViaLast": "sns.amazonaws.com" } } } ] }

选项 2:使用 SNS 主题策略

或者,直接在 SNS 主题中添加允许 AWS 最终用户消息发布消息的政策声明。snsTopicArn替换为您的 SNS 主题的 ARN。

{ "Effect": "Allow", "Principal": { "Service": "sms-voice.amazonaws.com" }, "Action": "sns:Publish", "Resource": "snsTopicArn" }

入站消息有效负载格式

当您的 AWS RCS 代理收到入站短信时, AWS 最终用户消息将向配置的 Amazon SNS 主题发布一个 JSON 有效负载。RCS 入站消息有效负载使用与 SMS 双向消息相同的格式:

{ "originationNumber": "+14255550182", "destinationNumber": "+12125550101", "messageKeyword": "JOIN", "messageBody": "EXAMPLE", "inboundMessageId": "cae173d2-66b9-564c-8309-21f858e9fb84", "previousPublishedMessageId": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" }

入站消息负载包含以下字段:

入站 RCS 消息负载字段
字段 说明

originationNumber

发送入站消息的电话号码(客户的电话号码)。

destinationNumber

收到消息的 AWS RCS 代理的标识符。

messageKeyword

与入站邮件匹配的注册关键字(如果有)。关键字是根据邮件正文的开头进行评估的。

messageBody

入站消息的文本内容。

inboundMessageId

入站邮件的唯一标识符。

previousPublishedMessageId

客户正在回复的出站消息的唯一标识符(如果入站消息是对前一封出站消息的回复)。

支持的消息类型

AWS 最终用户消息中的 RCS 目前支持接收入站短信。当客户向您的 AWS RCS 代理发送短信时,该消息将传送到您配置的 Amazon SNS 主题进行处理。

如果客户向您的 AWS RCS 代理发送媒体消息(例如图像、视频或文件),则 AWS 最终用户消息将该消息记录为已忽略状态。媒体消息不会发送到您的 SNS 主题,也不会由您的应用程序处理。不会向发件人返回任何错误。

RCS 的关键字管理

当客户向您的 AWS RCS 代理发送特定单词或短语时,关键字允许您配置自动响应。当入站邮件与配置的关键字匹配时,“ AWS 最终用户消息” 会将关联的自动回复消息发送回客户。

对于 RCS,关键字在 AWS RCS 代理上配置,并应用于所有关联的 RCS for Business IDs (测试代理和国家/地区启动代理)。每个 AWS RCS 代理最多可以配置 30 个关键词。

要管理您的 AWS RCS 代理的关键词,请使用 AWS 最终用户消息控制台或 API。有关关键字管理的一般信息,请参见AWS 最终用户消息 SMS 中的关键字

注意

在 AWS RCS 代理上配置的关键字适用于所有关联的注册。您不能单独为测试代理和国家/地区启动代理设置不同的关键字。

使用 Lambda 处理入站消息

处理入站 RCS 消息的常见模式是将 Lambda 函数订阅配置为双向消息传递的 Amazon SNS 主题。Lambda 函数接收入站消息有效负载,并可以实现您的应用程序逻辑,例如响应客户查询、处理命令或将消息路由到其他系统。

以下 Python 示例显示了一个 Lambda 函数,该函数处理入站 RCS 消息并使用 API 发送响应:SendTextMessage

import json import boto3 sms_client = boto3.client('pinpoint-sms-voice-v2') def lambda_handler(event, context): # Parse the SNS message for record in event['Records']: sns_message = json.loads(record['Sns']['Message']) origination_number = sns_message['originationNumber'] message_body = sns_message['messageBody'] keyword = sns_message.get('messageKeyword', '') print(f"Received message from {origination_number}: {message_body}") # Process the message and determine a response if keyword.upper() == 'HELP': response_text = 'Available commands: HELP, STATUS, STOP' elif keyword.upper() == 'STATUS': response_text = 'Your account is active. No action needed.' else: response_text = ( f'Thanks for your message. ' f'Reply HELP for available commands.' ) # Send a response back to the customer try: response = sms_client.send_text_message( DestinationPhoneNumber=origination_number, OriginationIdentity='pool-a1b2c3d4e5f6g7h8i', MessageBody=response_text, MessageType='TRANSACTIONAL' ) print(f"Response sent. Message ID: {response['MessageId']}") except Exception as e: print(f"Failed to send response: {str(e)}") return {'statusCode': 200}

在此示例中,Lambda 函数:

  1. 解析 SNS 事件中的入站消息负载。

  2. 检查该messageKeyword字段以确定客户的意图。

  3. 通过 SendTextMessage API 使用基于池的发送(推荐)发送响应。池会自动处理频道选择。

注意

在向入站消息发送回复时,如果客户的设备不再支持 RCS,请使用基于池的发送来确保自动回退短信。有关发送模式的详细信息,请参阅发送 RCS 消息

入站 RCS 消息传递的最佳实践

在实现双向 RCS 消息传递时,请遵循以下最佳实践:

  • 实现错误处理-您的 Lambda 函数或 SNS 订阅者应优雅地处理错误。如果您的函数无法处理消息,请在 SNS 订阅上配置死信队列 (DLQ),以捕获未处理的消息以供日后重试。

  • 发送后备响应-当您的应用程序收到无法处理的消息时,请发送有用的回复响应,而不是让客户不予回复。例如,使用可用命令进行回应,或将客户引导至其他支持渠道。

  • 使用基于池的发送进行响应-向入站消息发送回复时,使用基于池的发送来确保自动回退短信。这样可以确保即使客户的设备不再支持 RCS,您的回复也能送达客户。

  • 监控邮件处理-使用 Amazon CloudWatch 指标监控您的入站邮件量和处理成功率。为异常模式设置警报,例如入站消息突然增加或处理失败率高。有关 RCS 指标的详细信息,请参阅RCS CloudWatch 指标和监控

  • 始终如一地处理关键字响应 — 确保关键字自动响应和应用程序的编程响应不会发生冲突。如果您为特定关键字配置关键字自动响应,则您的 Lambda 函数仍会收到消息。在设计函数时,要避免为已经配置了自动回复的关键词发送重复的回复。