

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

# 接收入站 RCS 消息
<a name="rcs-inbound"></a>

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

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

本节介绍双向 RCS 消息的工作原理、如何为您的 AWS RCS 代理启用双向 RCS 消息、入站消息有效负载格式以及如何管理关键词。有关管理 AWS RCS 代理的信息，请参阅[管理 RCS 代理](rcs-agents.md)。有关发送 RCS 消息的信息，请参阅[发送 RCS 消息](rcs-send-message.md)。

**Topics**
+ [双向 RCS 消息传递的工作原理](#rcs-inbound-how-it-works)
+ [配置您的双向消息收发目的地](#rcs-inbound-enable)
+ [入站消息有效负载格式](#rcs-inbound-payload)
+ [支持的消息类型](#rcs-inbound-text-only)
+ [RCS 的关键字管理](#rcs-inbound-keywords)
+ [使用 Lambda 处理入站消息](#rcs-inbound-lambda)
+ [入站 RCS 消息传递的最佳实践](#rcs-inbound-best-practices)

## 双向 RCS 消息传递的工作原理
<a name="rcs-inbound-how-it-works"></a>

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

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

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

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

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

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

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

## 配置您的双向消息收发目的地
<a name="rcs-inbound-enable"></a>

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

------
#### [ Console ]

**使用控制台配置双向消息收发目的地**

1. 打开 “ AWS 最终用户消息” 控制台。

1. 在导航窗格中，选择 **RCS 代理**。

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

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

1. 选择**编辑设置**。

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

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

1. 选择**保存**。

------
#### [ 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 主题权限
<a name="rcs-inbound-sns-permissions"></a>

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

#### 选项 1：使用 IAM 角色
<a name="rcs-inbound-sns-permissions-iam-role"></a>

创建一个 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 角色的**权限策略**。`SMSVoiceAllowSNSPublish`Sid 允许发布到亚马逊 SNS 主题，对于加密的亚马逊 SNS 主题，`SMSVoiceAllowEncryptedSNSTopics`Sid 是可选的。进行以下更改：
+ *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 主题策略
<a name="rcs-inbound-sns-permissions-topic-policy"></a>

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

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

## 入站消息有效负载格式
<a name="rcs-inbound-payload"></a>

当您的 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` | 客户正在回复的出站消息的唯一标识符（如果入站消息是对前一封出站消息的回复）。 | 

## 支持的消息类型
<a name="rcs-inbound-text-only"></a>

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

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

## RCS 的关键字管理
<a name="rcs-inbound-keywords"></a>

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

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

要管理您的 AWS RCS 代理的关键词，请使用 AWS 最终用户消息控制台或 API。有关关键字管理的一般信息，请参见[AWS 最终用户消息 SMS 中的关键字](keywords.md)。

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

## 使用 Lambda 处理入站消息
<a name="rcs-inbound-lambda"></a>

处理入站 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 事件中的入站消息负载。

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

1. 通过 `SendTextMessage` API 使用基于池的发送（推荐）发送响应。池会自动处理频道选择。

**注意**  
在向入站消息发送回复时，如果客户的设备不再支持 RCS，请使用基于池的发送来确保自动回退短信。有关发送模式的详细信息，请参阅[发送 RCS 消息](rcs-send-message.md)。

## 入站 RCS 消息传递的最佳实践
<a name="rcs-inbound-best-practices"></a>

在实现双向 RCS 消息传递时，请遵循以下最佳实践：
+ **实现错误处理**-您的 Lambda 函数或 SNS 订阅者应优雅地处理错误。如果您的函数无法处理消息，请在 SNS 订阅上配置死信队列 (DLQ)，以捕获未处理的消息以供日后重试。
+ **发送后备响应**-当您的应用程序收到无法处理的消息时，请发送有用的回复响应，而不是让客户不予回复。例如，使用可用命令进行回应，或将客户引导至其他支持渠道。
+ **使用基于池的发送进行响应**-向入站消息发送回复时，使用基于池的发送来确保自动回退短信。这样可以确保即使客户的设备不再支持 RCS，您的回复也能送达客户。
+ **监控邮件处理**-使用 Amazon CloudWatch 指标监控您的入站邮件量和处理成功率。为异常模式设置警报，例如入站消息突然增加或处理失败率高。有关 RCS 指标的详细信息，请参阅[RCS CloudWatch 指标和监控](rcs-monitoring.md)。
+ **始终如一地处理关键字响**应 — 确保关键字自动响应和应用程序的编程响应不会发生冲突。如果您为特定关键字配置关键字自动响应，则您的 Lambda 函数仍会收到消息。在设计函数时，要避免为已经配置了自动回复的关键词发送重复的回复。