

**终止支持通知：** AWS 将于 2026 年 10 月 30 日终止对亚马逊 Pinpoint 的支持。2026 年 10 月 30 日之后，您将不再能够访问 Amazon Pinpoint 控制台或 Amazon Pinpoint 资源（端点、分段、活动、旅程和分析）。有关更多信息，请参阅 [Amazon Pinpoint 终止支持](https://docs.aws.amazon.com/console/pinpoint/migration-guide)。**注意：** APIs 与短信相关、语音、移动推送、OTP 和电话号码验证不受此更改的影响，并受 AWS 最终用户消息的支持。

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

# 教程
<a name="tutorials"></a>

本部分中的教程旨在向新 Amazon Pinpoint 用户介绍如何完成几个重要任务。如果您是初次使用 Amazon Pinpoint，或者不熟悉某些功能，则这些教程是一个绝佳的切入点。

本指南中的教程包括面向开发人员或系统管理员的任务。这些教程介绍如何使用 Amazon Pinpoint API、AWS SDK 和 AWS CLI 来执行任务。

**Topics**
+ [将 Postman 用于 Amazon Pinpoint API](tutorials-using-postman.md)
+ [设置短信注册系统](tutorials-two-way-sms.md)

# 教程：将 Postman 用于 Amazon Pinpoint API
<a name="tutorials-using-postman"></a>

Postman 是一种在 easy-to-use图形环境 APIs 中进行测试的常用工具。您可以使用 Postman 向任何 REST API 发送 API 请求，并接收对请求的响应。使用 Postman 可以方便地测试和排查您对 Amazon Pinpoint API 进行的调用。本教程包含设置 Postman 和将 Postman 用于 Amazon Pinpoint API 的过程。

**注意**  
Postman 是由第三方公司开发的，而不是由 Amazon Web Services (AWS) 开发或支持的。要了解有关使用 Postman 的更多信息，或需要帮助以解决与 Postman 相关的问题，请参阅 Postman 网站上的[支持中心](https://support.postman.com/hc/en-us)。

## 关于本教程
<a name="tutorials-using-postman-about"></a>

此部分包含本教程的概述。

**目标受众**  
本教程适用于开发人员和系统实施者。虽然您不必非得熟悉 Amazon Pinpoint 或 Postman 才能完成本教程中的步骤，但您应熟悉管理 IAM 策略和修改 JSON 代码示例。

本教程中的过程旨在防止新用户使用可永久删除 Amazon Pinpoint 资源的 API 操作。高级用户可通过修改与其用户关联的策略来删除此限制。

**使用的功能**  
本教程包含以下 Amazon Pinpoint 功能的使用示例：
+ 通过使用 Postman 与 Amazon Pinpoint API 交互

**所需时间**  
完成本教程大约需要 15 分钟。

**区域限制**  
没有与使用此解决方案关联的区域限制。

**资源用量费用**  
创建 AWS 账户不收取任何费用。但是，通过实施此解决方案，如果您 AWS 使用 Postman 执行以下任一操作，则可能会产生使用成本：
+ 发送电子邮件、SMS、移动推送或语音消息
+ 创建和发送活动
+ 使用电话号码验证功能

有关与使用 Amazon Pinpoint 关联的费用的更多信息，请参阅 [Amazon Pinpoint 定价](https://aws.amazon.com/pinpoint/pricing/)。

# 将 Postman 与 Amazon Pinpoint 结合使用的先决条件
<a name="tutorials-using-postman-prerequisites"></a>

开始本教程之前，请完成以下先决条件：
+ 您必须具有 AWS 账户。要创建 AWS 账户，请前往 [https://console.aws.amazon.com/](https://console.aws.amazon.com/) 并选择**创建新的 AWS 账户**。
+ 确保用于登录 AWS 管理控制台 的账户能够创建新的 IAM 策略和角色。
+ 确保您创建了至少一个示例项目，该项目已开启电子邮件并具有经过验证的电子邮件身份。请参阅《Amazon Pinpoint 用户指南》中的[创建带有电子邮件支持的 Amazon Pinpoint 项目](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-email-setup-create.html)。**
+ 确保您具有 AWS 账户 ID。可以在控制台的右上角找到您的 AWS 账户 ID，或者，您可以使用命令行界面 (CLI) 查找。请参阅[查找您的 AWS 账户 ID](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindAccountId)。
+ 您必须在计算机上下载并安装 Postman。您可以从 [Postman 网站](https://www.getpostman.com)下载 Postman。
+ 在计算机上安装 Postman 后，您必须创建一个 Postman 账户。当您首次启动 Postman 应用程序时，系统会提示您登录或创建新账户。请按照 Postman 提供的说明登录您的账户，或者，如果您还没有此账户，则创建一个。

**下一步**：[创建 IAM 策略和角色](tutorials-using-postman-iam-user.md)

# 创建 IAM 策略和角色以用于 Amazon Pinpoint
<a name="tutorials-using-postman-iam-user"></a>

当您使用 Postman 测试 Amazon Pinpoint API 时，第一步是创建用户。在本部分，您将创建一个策略，以允许用户能够与所有 Amazon Pinpoint 资源交互。然后，您创建一个用户，并将该策略直接附加到该用户。

## 创建 IAM 策略
<a name="tutorials-using-postman-iam-user-create-policy"></a>

了解如何创建 IAM 策略。使用此策略的用户和角色能够与 Amazon Pinpoint API 中的所有资源交互。它还允许访问与 Amazon Pinpoint Email API 以及 Amazon Pinpoint SMS 和 Voice API.相关的资源。

**创建策略**

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **策略**，然后选择 **创建策略**。

1. 在**策略编辑器**中，选择 **JSON**。删除**策略编辑器**中当前的任何 JSON，使其为空。将以下 JSON 复制并粘贴到**策略编辑器**中，然后在**策略编辑器**中将的所有实例替换为您的 AWS 账户 ID。*123456789012*

   你的 AWS 账户 ID 可以在控制台的右上角找到，或者你可以使用 CLI，参见[查找你的 AWS 账户 ID](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindAccountId)。
**注意**  
为保护您的 Amazon Pinpoint 账户中的数据，此策略仅包含允许您读取、创建和修改资源的权限，不包含删除资源的权限。您可以在 IAM 控制台中使用可视化编辑器来修改此策略。有关更多信息，请参阅《IAM 用户指南》中的[管理 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)。您也可以使用 IAM API 中的[CreatePolicyVersion](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicyVersion.html)操作来更新此政策。  
另请注意，除了 `mobiletargeting` 服务外，此策略还包含允许您与 `ses` 和 `sms-voice` 服务交互的权限。`ses` 和 `sms-voice` 权限允许您分别与 Amazon Pinpoint Email API 以及 Amazon Pinpoint SMS 和 Voice API 进行交互。`mobiletargeting` 权限允许您与 Amazon Pinpoint API 交互。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "VisualEditor0",
               "Effect": "Allow",
               "Action": [
                   "mobiletargeting:Update*",
                   "mobiletargeting:Get*",
                   "mobiletargeting:Send*",
                   "mobiletargeting:Put*",
                   "mobiletargeting:Create*"
               ],
               "Resource": [
                   "arn:aws:mobiletargeting:*:123456789012:apps/*",
                   "arn:aws:mobiletargeting:*:123456789012:apps/*/campaigns/*",
                   "arn:aws:mobiletargeting:*:123456789012:apps/*/segments/*"
               ]
           },
           {
               "Sid": "VisualEditor1",
               "Effect": "Allow",
               "Action": [
                   "mobiletargeting:TagResource",
                   "mobiletargeting:PhoneNumberValidate",
                   "mobiletargeting:ListTagsForResource",
                   "mobiletargeting:CreateApp"
               ],
               "Resource": "arn:aws:mobiletargeting:*:123456789012:*"
           },
           {
               "Sid": "VisualEditor2",
               "Effect": "Allow",
               "Action": [
                   "ses:TagResource",
                   "ses:Send*",
                   "ses:Create*",
                   "ses:Get*",
                   "ses:List*",
                   "ses:Put*",
                   "ses:Update*",
                   "sms-voice:SendVoiceMessage",
                   "sms-voice:List*",
                   "sms-voice:Create*",
                   "sms-voice:Get*",
                   "sms-voice:Update*"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

   选择**下一步**。

1. 对于**策略名称**，输入策略的名称，如 **PostmanAccessPolicy**。选择**创建策略**。

1. （可选）您可以通过选择**添加标签**将标签添加到策略。

1. 选择**下一步：审核**。

## 创建 IAM 用户
<a name="tutorials-using-postman-iam-user-create-user"></a>

**警告**  
IAM 用户具有长期凭证，这会带来安全风险。为帮助减轻这种风险，我们建议仅向这些用户提供执行任务所需的权限，并在不再需要这些用户时将其移除。

创建策略后，您可以创建用户并将策略附加到该用户。当您创建用户时，IAM 会提供一组凭证，以允许 Postman 执行 Amazon Pinpoint API 操作。

**创建用户**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在 IAM 控制台的导航窗格中，选择**用户**，然后选择**创建用户**。

1. 在**用户详细信息**下，对于**用户名**，输入用于标识用户的名称，如 **PostmanUser**。然后选择**下一步**。

1. 在**设置权限**下，对于**权限选项**，选择**直接附加策略**。

1. 在**权限策略**下，选择您在[创建 IAM 策略](#tutorials-using-postman-iam-user-create-policy)中创建的策略（**PostmanAccessPolicy**）。然后选择**下一步**。

1. 在**审核和创建**页面上，您也可以添加有助于标识用户的标签。有关使用标签的更多信息，请参阅《IAM 用户指南》**中的[标记 IAM 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)。

1. 当您准备好创建用户时，请选择**创建用户**。

## 创建访问密钥
<a name="tutorials-using-postman-iam-user-create-key"></a>

**警告**  
此场景需要 IAM 用户具有编程访问权限和长期凭证，这会带来安全风险。为帮助减轻这种风险，我们建议仅向这些用户提供执行任务所需的权限，并在不再需要这些用户时将其移除。必要时可以更新访问密钥。有关更多信息，请参阅《IAM 用户指南》**中的[更新访问密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/id-credentials-access-keys-update.html)。

 IAM 提供了一组凭证，您可以使用这些凭证来允许 Postman 执行 Amazon Pinpoint API 操作。

**创建用户**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在 IAM 控制台的导航窗格中，选择**用户**。选择在[创建 IAM 用户](#tutorials-using-postman-iam-user-create-user)中创建的用户（**PostmanUser**），然后选择**安全凭证**选项卡。

1. 在**访问密钥**部分，选择**创建访问密钥**。

1. 在**访问密钥最佳实践和替代方案**页面上，选择**在 AWS之外运行的应用程序**。

   然后选择**下一步**。

1. （可选）您可以向策略中添加描述标签。

1. 选择**创建访问密钥**。

1. 在**检索访问密钥**页面上，复制**访问密钥**和**秘密访问密钥**列中显示的凭证。
**注意**  
在本教程的后面部分，您需要提供在此访问密钥 ID 和秘密访问密钥。这是您可以查看秘密访问密钥的唯一机会。建议您复制它并保存到安全的位置。

1. 保存两个密钥后，选择**完成**。

**下一步**：[设置 Postman](tutorials-using-postman-configuration.md)

# 设置 Postman 以与 Amazon Pinpoint 配合使用
<a name="tutorials-using-postman-configuration"></a>

现在，您已经创建了一个能够访问 Amazon Pinpoint API 的用户，接下来可以设置 Postman 了。在本部分，您将在 Postman 中创建一个或多个环境。接下来，您将导入一个集合，其中包含 Amazon Pinpoint API 中的每项操作的请求模板。

## 创建 Postman 工作区
<a name="tutorials-using-postman-configuration-create-workspace"></a>

在 Postman 中，*工作区* 是项目和环境的组织容器。在本节中，您将至少创建一个工作区以与 Amazon Pinpoint 配合使用。

**创建工作区**

在 Postman 中，选择更多操作，选择**文件**，然后选择**新建**。

1. 在**新建**窗口中，选择**工作区**。

1. 输入名称和摘要，并将可见性设置为个人。选择**创建工作区**。

## 创建 Postman 环境
<a name="tutorials-using-postman-configuration-create-environments"></a>

在 Postman 中，*环境* 是一组存储为键/值对的变量。您可以使用环境来更改通过 Postman 发出的请求的配置，而无需更改 API 请求本身。

在本部分，您将创建至少一个环境以与 Amazon Pinpoint 配合使用。您创建的每个环境都包含一组变量，这些变量特定于您在单个 AWS 区域中的账户。如果您使用本部分中的过程创建多个环境，则可通过从 Postman 的**环境**菜单中选择不同的环境，在不同区域之间轻松切换。

**创建环境**

1. 在 Postman 中，选择更多操作菜单，选择**文件**，然后选择**新建**。

1. 在**新建**窗口中，选择**环境**。

1. 在**管理环境**窗口中，对于**环境名称**，输入 **Amazon Pinpoint - *Region Name***。*Region Name*替换为以下值之一：
   + 美国东部（弗吉尼亚州北部）
   + 美国西部（俄勒冈州）
   + 亚太地区（孟买）
   + 亚太地区（悉尼）
   + 欧洲地区（法兰克福）
   + 欧洲地区（爱尔兰）
**注意**  
您至少只需要为单个环境创建一个环境 AWS 区域，并且该环境 AWS 区域 必须包含一个项目。如果您尚未在前面列出的项目中创建项目 AWS 区域，请参阅亚马逊 Pinp [oint 用户指南中的使用电子邮件支持创建亚马*逊 Pinpoin* t 项目](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-email-setup-create.html)。

1. 创建六个新变量：`endpoint`、`region`、`serviceName`、`accountId`、`accessKey` 和 `secretAccessKey`。使用下表确定要在每个变量的**初始值**和**当前值**列中输入哪个值。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/tutorials-using-postman-configuration.html)

   创建这些变量后，**管理环境**窗口类似于下图所示的示例。  
![\[\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/Postman_Tutorial_2.1_4.png)

   完成后，选择**保存**。
**重要**  
上图所示的访问密钥是虚构的。不要与他人共享您的 IAM 访问密钥。  
Postman 包含允许您共享和导出环境的功能。如果您使用这些功能，切勿与不应访问这些凭证的任何人分享您的访问密钥 ID 和秘密访问密钥。  
有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

1. （可选）对于您要创建的每个额外环境，请重复步骤 1-4。
**提示**  
在 Postman 中，您可以根据需要创建任意多个环境。您可以通过以下方式使用环境：  
为必须进行 Amazon Pinpoint API 测试的每个区域创建一个单独的环境。
创建与不同的 AWS 账户账户关联的环境。
创建使用与其他用户关联的凭证的环境。

1. 创建完环境后，请继续完成下一部分。

## 在 Postman 中创建 Amazon Pinpoint 集合
<a name="tutorials-using-postman-configuration-create-pinpoint-collection"></a>

在 Postman 中，*集合* 是一组 API 请求。集合中的请求通常由一个共同的目的联系在一起。在本部分，您将创建一个新集合，其中包含 Amazon Pinpoint API 中的每项操作的请求模板。

**创建 Amazon Pinpoint 集合**

1. 在 Postman 中，选择更多操作菜单，选择**文件**，然后选择**导入**。

1. 在 “**导入” 窗口中，选择 “**从链接**导入**”，然后输入以下 URL：[https://raw.githubusercontent.com/awsdocs/amazon-pinpoint-developer-guide/master/Amazon %20pinpoint.post](https://raw.githubusercontent.com/awsdocs/amazon-pinpoint-developer-guide/master/Amazon%20Pinpoint.postman_collection.json) man\$1Collection.json。

   选择**导入**。Postman 将导入 Amazon Pinpoint 集合，其中包含 120 个示例请求。

## 测试 Postman 配置
<a name="tutorials-using-postman-configuration-test-operation"></a>

导入 Amazon Pinpoint 集合后，建议您执行快速测试，以确认所有组件是否都配置正确。可以通过提交 `GetApps` 请求来测试您的配置。此请求将返回当前 AWS 区域内您的 Amazon Pinpoint 账户中存在的所有项目的列表。此请求不需要任何额外配置，因此这是一种测试配置的好办法。

**测试 Amazon Pinpoint 集合的配置**

1. 在左侧导航窗格中，选择**集合**，展开 **Amazon Pinpoint** 集合，然后展开**应用程序**文件夹。

1. 在请求列表中，选择**GetApps**。

1. 使用**环境**选择器选择您在[创建 Postman 环境](#tutorials-using-postman-configuration-create-environments)中创建的环境。

1. 选择**发送**。如果请求成功发送，则响应窗格显示 `200 OK` 状态。您将看到一个类似于下图中的示例的响应。  
![\[\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/Postman_Tutorial_2.3_3.png)
**注意**  
如果你没有在中创建任何项目， AWS 区域 那么 Amazon Pinpoint 就会返回。`{ "Item": [] }`

   此响应显示您在步骤 3 中选择的区域内的账户中存在的所有 Amazon Pinpoint 项目的列表。

### 问题排查
<a name="tutorials-using-postman-configuration-test-operation-troubleshooting"></a>

当您提交请求时，可能会看到错误。请查看以下列表，了解可能会遇到的几个常见错误，以及可以采取的解决问题的步骤。


| 错误消息 | 问题 | 解决方案 | 
| --- | --- | --- | 
|  无法得到任何响应 连接 https://%7B%7Bendpoint%7D%7 时出错D/v1/apps。  |  `{{endpoint}}` 变量当前没有值，在您选择环境时才设置值。  | 使用环境选择器选择一个环境。 | 
|  请求中包含的安全令牌无效。  |  Postman 未能找到您的访问密钥 ID 或秘密访问密钥的当前值。  |  选择环境选择器旁边的齿轮图标，然后选择当前环境。确认 `accessKey` 和 `secretAccessKey` 值显示在**初始值**和**当前值**列中，并且您正确输入了凭证。  | 
|  “消息”：“用户：arn: aws: iam:: 123456789012: user/ 无权执行：mobileTargeting：在资源上：arn: aws: mobileTargeting: us-west-2:123456789012PinpointPostmanUser: \$1” GetApps   |  与您的用户关联的 IAM 策略不包含相应权限。  |  确认您的用户具有在[创建 IAM 策略](tutorials-using-postman-iam-user.md#tutorials-using-postman-iam-user-create-policy)中所述的权限，并且您在[创建 Postman 工作区](#tutorials-using-postman-configuration-create-environments)中创建环境时提供了正确的凭证。  | 

**下一步**：[发送其他请求](tutorials-using-postman-sample-requests.md)

# 向 Amazon Pinpoint API 发送请求
<a name="tutorials-using-postman-sample-requests"></a>

当您完成配置和测试 Postman 后，可以开始向 Amazon Pinpoint API 发送其他请求。本部分包括开始发送请求之前需要了解的信息。它还包括两个示例请求，描述了如何使用 Amazon Pinpoint 集合。

**重要**  
当您完成本部分中的过程时，您就将请求提交给了 Amazon Pinpoint API。这些请求在您的 Amazon Pinpoint 账户中创建新的资源、修改现有资源、发送消息、更改 Amazon Pinpoint 项目配置并使用其他 Amazon Pinpoint 功能。执行这些请求时要小心。

## Amazon Pinpoint Postman 集合中的示例
<a name="tutorials-using-postman-sample-requests-about"></a>

对于 Amazon Pinpoint Postman 集合中的大多数操作，您必须先进行配置，然后才能使用它们。对于 `GET` 和 `DELETE` 操作，通常只需修改**预请求脚本**选项卡上设置的变量即可。

**注意**  
当您使用[创建 IAM 策略](tutorials-using-postman-iam-user.md#tutorials-using-postman-iam-user-create-policy)中显示的 IAM 策略时，您无法执行此集合中包含的任何 `DELETE` 请求。

例如，`GetCampaign` 操作要求您指定一个 `projectId` 和 `campaignId`。在**预请求脚本**选项卡上，这两个变量都存在，并填充了示例值。删除示例值，并将它们替换为您的 Amazon Pinpoint 项目和活动的相应值。

在这些变量中，最常用的是 `projectId` 变量。此变量的值应该是您的请求应用到的项目的唯一标识符。要获取项目的这些标识符的列表，您可以参考在本教程的前一步骤中发送的 `GetApps` 请求的响应。在该响应中，`Id` 字段提供了项目的唯一标识符。要详细了解 `GetApps` 操作和响应中每个字段的含义，请参阅《Amazon Pinpoint API 参考》中的**[应用程序](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps.html)。

**注意**  
在 Amazon Pinpoint 中，“项目”与“应用程序”同义。

对于 `POST` 和 `PUT` 操作，您还需要修改请求正文，以包含要发送到 API 的值。例如，当您提交 `CreateApp` 请求（一个 `POST` 请求）时，必须为创建的项目指定一个名称。您可以在**正文**选项卡上修改请求。在本示例中，将 `"Name"` 旁边的值替换为项目的名称。如果您要将标签添加到项目中，可以在 `tags` 对象中指定它们。或者，如果您不想添加标签，可以删除整个 `tags` 对象。

**注意**  
`UntagResource` 操作还要求您指定 URL 参数。您可以在**参数**选项卡上指定这些参数。将**值**列中的值替换为您要为指定资源删除的标签。

## 示例请求：通过使用 `CreateApp` 操作来创建项目
<a name="tutorials-using-postman-sample-requests-createapp"></a>

在 Amazon Pinpoint 中创建客户细分和活动之前，您必须先创建一个项目。在 Amazon Pinpoint 中，一个*项目* 由出于一个共同目的而联合的客户细分、活动、配置和数据组成。例如，您可以使用一个项目来包含与特定应用程序或者与特定品牌或营销计划相关的所有内容。当您向 Amazon Pinpoint 添加客户信息时，该信息与一个项目相关联。

**通过发送 CreateApp API 请求创建项目**

1. 在 “**环境**” 菜单上 AWS 区域 ，选择要在其中创建项目的。  
![\[\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/Postman_Tutorial_Environments.png)

    在本示例中，Postman 已进行配置，因此 **Environments (环境)** 菜单显示以下四个选项：
   + 美国东部（弗吉尼亚州北部）
   + 美国西部（俄勒冈州）
   + 欧洲地区（法兰克福）
   + 欧洲地区（爱尔兰）

1. 在**应用程序**文件夹中，选择**CreateApp**操作>。  
![\[\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/Postman_Tutorial_3.2_2.png)

   Amazon Pinpoint Postman 集合中的**应用程序**文件夹展开并显示以下请求：
   + `GetApp`
   + `GetApps`
   + `CreateApp`
   + `DeleteApp`

1. 在**正文**选项卡上，`"Name"` 的旁边，将占位符值 (`"string"`) 替换为活动的名称，例如 **"MySampleProject"**。

1. 删除活动名称后面的逗号，然后删除第 3 至 5 行上的整个 `tags` 对象。完成后，您的请求应类似于以下代码片段中所示的示例。

   ```
   {
       "Name": "MySampleProject"
   }
   ```

   Postman 配置为发送请求作为原始 JSON 负载。

1. 选择**发送**。如果活动成功创建，则响应窗格将显示 `201 Created` 状态。

   ```
   {
       "Name": "MySampleProject"
       "Id": "12345678901234567890123456789012",
       "Arn": "arn:aws:mobiletargeting:us-east-1:123456789012:apps/12345678901234567890123456789012",
       "tags": {}
   }
   ```

## 示例：通过使用 `SendMessages` 操作来发送电子邮件
<a name="tutorials-using-postman-sample-requests-sendmessages"></a>

使用 Amazon Pinpoint `SendMessages` API 发送事务性消息非常常见。通过使用 `SendMessages` API（而不是创建活动）来发送消息的一个优势是，您可以将消息发送到任何地址，如电子邮件地址、电话号码或设备令牌。消息发往的地址不必存在于您的 Amazon Pinpoint 账户中。我们来将这种方法与通过创建活动发送消息的方法进行比较。在 Amazon Pinpoint 中发送活动之前，您必须先将端点添加到您 的 Amazon Pinpoint 账户中，然后创建客户细分，创建活动，并执行活动。

本部分中的示例演示如何将事务性电子邮件直接发送到特定电子邮件地址。您可以修改此请求，以通过其他渠道（如短信、移动推送或语音）发送消息。

**通过提交 SendMessages 请求发送电子邮件**

1. 确认项目已启用电子邮件渠道，并配置了要用于发送和接收邮件的电子邮件地址或域。有关更多信息，请参阅《Amazon Pinpoint 用户指南》中的**[启用和禁用电子邮件渠道](pinpoint/latest/userguide/channels-email-setup.html)和[验证电子邮件身份](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-email-manage-verify.html)。
**注意**  
要完成本节中的过程，您必须验证电子邮件地址

1. 在 “**环境**” 菜单上 AWS 区域 ，选择要从中发送消息的。

   在本示例中，Postman 已进行配置，因此 **Environments (环境)** 菜单显示以下四个选项：
   + 美国东部（弗吉尼亚州北部）
   + 美国西部（俄勒冈州）
   + 欧洲地区（法兰克福）
   + 欧洲地区（爱尔兰）

1. 在 “**消息**” 文件夹中，选择**SendMessages**操作。  
![\[\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/Postman_Tutorial_3.3_3.png)

1. 在**预请求脚本**选项卡上，将 `projectId` 变量的值替换为您在本部分步骤 2 中选择的区域内已存在的项目的 ID。

1. 在**正文**选项卡上，删除请求编辑器中显示的示例请求。粘贴以下代码：

   ```
   {
       "MessageConfiguration":{
           "EmailMessage":{
               "FromAddress":"sender@example.com",
               "SimpleEmail":{
                   "Subject":{
                       "Data":"Sample Amazon Pinpoint message"
                   },
                   "HtmlPart":{
                       "Data":"<h1>Test message</h1><p>This is a sample message sent from <a href=\"https://aws.amazon.com/pinpoint\">Amazon Pinpoint</a> using the SendMessages API.</p>"
                   },
                   "TextPart":{
                       "Data":"This is a sample message sent from Amazon Pinpoint using the SendMessages API."
                   }
               }
           }
       },
       "Addresses":{
           "recipient@example.com": {
               "ChannelType": "EMAIL"
           }
       }
   }
   ```

1. 在前面的代码中，*sender@example.com*替换为经过验证的电子邮件地址。*recipient@example.com*替换为要将邮件发送到的经过验证的电子邮件地址。
**注意**  
如果您的账户仍在 Amazon Pinpoint 电子邮件沙盒中，则您只能将电子邮件发送到在您的 Amazon Pinpoint 账户中验证过的地址或域。有关将您的账户从沙盒移除的更多信息，请参阅《Amazon Pinpoint 用户指南》**中的[请求电子邮件的生产访问权限](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-email-setup-production-access.html)。

1. 选择**发送**。如果消息成功发送，则响应窗格显示 `200 OK` 状态。

   ```
   {
       "ApplicationId": "12345678901234567890123456789012",
       "RequestId": "<sampleValue>",
       "Result": {
           "recipient@example.com": {
               "DeliveryStatus": "SUCCESSFUL",
               "StatusCode": 200,
               "StatusMessage": "<sampleValue>",
               "MessageId": "<sampleValue>"
           }
       }
   }
   ```

# 在 Amazon Pinpoint 中设置短信注册系统
<a name="tutorials-two-way-sms"></a>

使用 Amazon Pinpoint 向客户发送时效性消息时可以使用短信（文本消息），这是一种非常不错的方式。许多人时刻把手机带在身边，短信消息往往比推送通知、电子邮件或电话更能吸引人们的注意力。

捕获客户手机号码的常用方法是使用基于 Web 的表单。验证完客户的电话号码并确认其订阅后，您可以开始向该客户发送营销性、事务性和信息性短信。

本教程介绍如何设置 Web 表单来捕获客户的联系信息。Web 表单向 Amazon Pinpoint 发送此信息。接下来，Amazon Pinpoint 会验证电话号码是否有效，并捕获与电话号码相关的其他元数据。之后，Amazon Pinpoint 会向客户发送一条消息，要求他们确认订阅。客户确认订阅后，Amazon Pinpoint 会选择让客户接收您的消息。

下面的架构示意图显示了此解决方案中的数据流。

![\[\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_Architecture.png)


## 关于双重选择加入
<a name="tutorials-two-way-sms-double-opt-in"></a>

本教程介绍如何在 Amazon Pinpoint 中设置使用双向短信消息的双重选择加入系统。

在短信双重选择加入系统中，客户通过在 Web 表单或您的应用程序中提交电话号码来向您提供其电话号码。当您收到客户的请求时，您将在 Amazon Pinpoint 中创建一个新的端点。新的端点应选择退出您的通信。接下来，您向该电话号码发送消息。在消息中，您要求接收者通过回复特定的字词（如“是”或“确认”）来确认其订阅。如果客户用您指定的字词响应该消息，则将端点的状态更改为选择加入。否则，如果客户不响应，或者用不同的字词响应，您可以将端点的状态保留为选择退出。

## 关于此解决方案
<a name="tutorials-two-way-sms-about"></a>

本部分包含有关您在本教程中构建的解决方案的信息。

**目标受众**  
本教程以开发人员和系统实施者为受众。虽然您不必非得熟悉 Amazon Pinpoint 才能完成本教程中的步骤，但是，您应该熟悉管理 IAM 策略、在 Node.js 中创建 Lambda 函数以及部署 Web 内容。

**使用的功能**  
本教程包含以下 Amazon Pinpoint 功能的使用示例：
+ 发送事务性短信
+ 使用电话号码验证获取有关电话号码的信息
+ 使用双向短信接收传入的短信
+ 创建动态客户细分
+ 创建活动
+ 使用以下方式与亚马逊 Pinpoint API 互动 AWS Lambda

**所需时间**  
完成本教程大概需要一小时的时间。实施此解决方案后，您可以执行其他步骤来细化解决方案，以适合您的独特使用案例。

**区域限制**  
本教程要求您通过使用 Amazon Pinpoint 控制台来租赁长代码。您可以使用 Amazon Pinpoint 控制台来租赁基于几个国家/地区的专用长代码。但是，只有基于加拿大的长代码可用于发送短信。（您可以使用基于其他国家和地区的长代码来发送语音消息。）

我们在本教程中开发代码示例时考虑到了这一限制。例如，代码示例假定接收者的电话号码始终有 10 位数，以及国家/地区代码 1。如果您在美国或加拿大以外的国家或地区实施了此解决方案，则必须相应地修改代码示例。

**资源用量费用**  
创建 AWS 账户不收取任何费用。但是，通过实施此解决方案，可能会产生以下费用：
+ **长代码租赁费用** – 为完成本教程，您需要租赁长代码。加拿大的长代码费用为每月 1.00 美元。
+ **电话号码验证使用费用** – 本教程中的解决方案使用 Amazon Pinpoint 的电话号码验证功能来验证您收到的每个号码是否有效以及格式是否正确，同时还会获取关于电话号码的其他信息。对于每个电话号码验证请求，您需要支付 0.006 美元。
+ **消息发送费用** – 本教程中的解决方案会发送出站短信。您需要为通过 Amazon Pinpoint 发送的每条消息付费。您为每条消息支付的费用取决于接收者所在的国家或地区。如果您向位于美国（不包括美国领地）的接收者发送消息，需为每条消息支付 0.00645 美元。如果您向位于加拿大的接收者发送消息，则需支付 0.00109–0.02 美元，具体取决于接收者的运营商和位置。
+ **消息接收费用** – 此解决方案还接收并处理传入的短信。您需要为发送到您的 Amazon Pinpoint 账户关联电话号码的每条传入消息付费。支付的费用取决于在哪里接收电话号码。如果您是在美国（不包括美国领地）接收号码，则需为每条传入消息支付 0.0075 美元。如果是在加拿大接收号码，则为每条传入消息支付 0.00155 美元。
+ **Lambda 使用费用** – 此解决方案使用两个与 Amazon Pinpoint API 交互的 Lambda 函数。当您调用 Lambda 函数时，系统将根据对函数发出的请求的数量、代码执行所需的时间以及函数使用的内存量来收取费用。本教程中的函数使用非常少的内存，并且通常运行 1-3 秒。此解决方案的部分或所有用量可能纳入 Lambda 免费使用套餐。有关更多信息，请参阅 [Lambda 定价](https://aws.amazon.com/lambda/pricing/)。
+ **API Gateway 使用费用** – 此解决方案中的 Web 表单调用由 API Gateway 管理的 API。对于每百万次调用 API Gateway，您需要支付 3.50 至 3.70 美元，具体取决于您在哪个地区 AWS 使用 Amazon Pinpoint。有关更多信息，请参阅 [API Gateway 定价](https://aws.amazon.com/api-gateway/pricing/)。
+ **Web 托管费用** – 此解决方案包含一个基于 Web 的表单，您必须在您的网站上托管该表单。托管此内容的费用取决于您的 Web 托管提供商。

**注意**  
此列表中显示的所有价格均以美元 (USD) 为单位。

**下一步**：[先决条件](tutorials-two-way-sms-prereqs.md)

# 在 Amazon Pinpoint 中设置短信的先决条件
<a name="tutorials-two-way-sms-prereqs"></a>

开始本教程之前，您必须先完成以下先决条件：
+ 您必须有一个 AWS 账户。要创建 AWS 账户，请前往 [https://console.aws.amazon.com/](https://console.aws.amazon.com/) 并选择**创建新的 AWS 账户**。
+ 您用于登录 AWS 管理控制台 的账户必须能够执行以下任务：
  + 创建新的 IAM 策略和角色
  + 创建新的 Amazon Pinpoint 项目
  + 创建新的 Lambda 函数
  + 在 API Gateway 中创建新的 API
+ 您必须有一种托管和发布网页的方法。尽管可以使用 AWS 服务来托管您的网页，但并不强求。
**提示**  
要了解有关使用 AWS 服务托管网页的更多信息，请参阅[托管静态网页](https://aws.amazon.com/getting-started/hands-on/host-static-website/)。

**下一步**：[设置 Amazon Pinpoint](tutorials-two-way-sms-part-1.md)

# 在 Amazon Pinpoint 中设置短信
<a name="tutorials-two-way-sms-part-1"></a>

您需要有一个 Amazon Pinpoint 项目，然后才能设置短信。请在此部分中执行以下操作：
+ 创建 Amazon Pinpoint 项目
+ 启用短信渠道并租用电话号码
+ 配置双向短信

开始操作之前，请查看[先决条件](tutorials-two-way-sms-prereqs.md)。

## 创建 Amazon Pinpoint 项目
<a name="tutorials-two-way-sms-part-1-create-project"></a>

首先，您需要创建一个 Amazon Pinpoint 项目。在 Amazon Pinpoint 中，一个*项目* 由出于一个共同目的而联合的客户细分、活动、配置和数据组成。例如，您可以使用一个项目来包含与特定应用程序或者与特定品牌或营销计划相关的所有内容。当您向 Amazon Pinpoint 添加客户信息时，该信息与一个项目相关联。

根据您之前是否已在 Amazon Pinpoint 中创建了项目，创建新项目所涉及的步骤将有所不同。

### 创建项目（对于 Amazon Pinpoint 新用户）
<a name="tutorials-two-way-sms-part-1-create-project-opt-1"></a>

这些步骤描述了如果您从未在当前 AWS 地区创建过项目，则创建新 Amazon Pinpoint 项目的过程。

**创建项目**

1. 登录 AWS 管理控制台 并打开亚马逊 Pinpoint 控制台，网址为。[https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)

1. 使用区域选择器选择要使用的 AWS 区域，如下图所示。如果您不确定，请选择位置离您最近的区域。  
![\[显示已选定美国东部（弗吉尼亚州北部）的区域下拉列表。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/Region_Selector.png)

1. 在**开始使用**下，对于**名称**，输入活动的名称（如 **SMSRegistration**），然后选择**创建项目**。

1. 在**配置功能**页面上，选择**跳过此步骤**。

1. 在导航窗格中，选择**所有项目**。

1. 在**所有项目**页面上，在您刚刚创建的项目旁边，复制**项目 ID** 列中显示的值。
**提示**  
在本教程中，您需要在几个不同的地方使用此 ID。将项目 ID 保存在一个方便的位置，以便稍后复制。

### 创建项目（对于 Amazon Pinpoint 现有用户）
<a name="tutorials-two-way-sms-part-1-create-project-opt-2"></a>

如果您已经在当前 AWS 地区创建了项目，则这些步骤描述了创建新 Amazon Pinpoint 项目的过程。

**创建项目**

1. 登录 AWS 管理控制台 并打开亚马逊 Pinpoint 控制台，网址为。[https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)

1. 使用区域选择器选择要使用的 AWS 区域，如下图所示。如果您不确定，请选择位置离您最近的区域。  
![\[显示已选定美国东部（弗吉尼亚州北部）的区域下拉列表。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/Region_Selector.png)

1. 在**所有项目**页面上，选择**创建项目**。

1. 在**创建项目**窗口上，对于**项目名称**，输入项目的名称（例如 **SMSRegistration**）。选择**创建**。

1. 在**配置功能**页面上，选择**跳过此步骤**。

1. 在导航窗格中，选择**所有项目**。

1. 在**所有项目**页面上，在您刚刚创建的项目旁边，复制**项目 ID** 列中显示的值。
**提示**  
在本教程中，您需要在几个不同的地方使用此 ID。将项目 ID 保存在一个方便的位置，以便稍后复制。

## 获取专用电话号码
<a name="tutorials-two-way-sms-part-1-set-up-channel"></a>

**注意**  
Amazon Pinpoint 已更新其用户指南文档。要获取有关如何创建、配置和管理您的短信和语音资源的最新信息，请参阅新的[《AWS 终端用户消息发送 SMS 服务用户指南》](https://docs.aws.amazon.com/sms-voice/latest/userguide/what-is-service.html)。

创建项目后，您可以开始在该项目中配置功能。在本节中，您将启用短信渠道，并获取专用的长代码，以便在发送短信时使用。

**注意**  
本节假设您在注册品牌和活动之后租赁的是美国 10DLC 电话号码、美国免费电话号码或加拿大长代码。如果您执行本部分中的过程，但选择美国或加拿大以外的国家/地区，您将无法使用该号码发送短信。要了解有关在美国或加拿大以外的国家/地区租赁支持短信的长代码的更多信息，请参阅《AWS 终端用户消息发送 SMS 服务用户指南》**中的[支持的国家/地区和区域（短信渠道）](https://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-by-country.html)。

要使用 Amazon Pinpoint 控制台启用短信渠道，请按照以下步骤操作：

**启用短信渠道**

1. 登录 AWS 管理控制台 并打开亚马逊 Pinpoint 控制台，网址为。[https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)

1. 在导航窗格中的 **Settings (设置)** 下，选择 **SMS and voice (SMS 和语音)**。

1. 选择 **SMS settings (SMS 设置)** 旁边的 **Edit (编辑)**。

1. 在**常规设置**下，选择**为此项目启用短信渠道**，然后选择**保存更改**。

要使用 AWS 最终用户消息 SMS 控制台请求电话号码，请执行以下步骤：

**申请电话号码（控制台）**

1. 打开 AWS 最终用户消息 SMS 控制台，网址为[https://console.aws.amazon.com/sms-voice/](https://console.aws.amazon.com/sms-voice/)。
**注意**  
请确保您申请的电话号码与您在创建 Amazon Pinpoint 项目时使用的电话号码相同 AWS 区域 。

1. 在导航窗格的**配置**下，选择**电话号码**，然后选择**申请发起方**。

1. 在**消息目标国家/地区**的**选择国家/地区**页面上，选择美国或加拿大。选择**下一步**。

1. 在**消息收发使用案例**部分，输入以下内容：
   + 在**号码功能**下，选择**短信**。
**重要**  
一旦购买了电话号码，就无法更改短信和语音的功能。
   + 对于**双向消息收发**，选择**是**。

1. 选择**下一步**。

1. 在**选择发起方类型**下，选择**长代码**或 **10DLC**。

   如果您选择 10DLC 并且已经有注册的市场活动，则可以从**关联到已注册市场活动**中选择该市场活动。

1. 选择**下一步**。

1. 在**查看和请求**中，您可以在提交请求之前对其进行验证和编辑。选择**请求**。

1. 根据您申请的电话号码类型，可能会出现**需要注册**窗口。您的电话号码已与此注册关联，在注册获得批准之前，您无法发送消息。有关注册要求的更多信息，请参阅[注册](https://docs.aws.amazon.com/sms-voice/latest/userguide/registrations.html)。

   1. 对于**注册表单名称**，请输入友好名称。

   1. 选择**开始注册**以完成电话号码注册，或者选择**稍后注册**。
**重要**  
在您的注册获得批准之前，您的电话号码无法发送消息。  
 无论注册状态如何，您仍然需要支付该电话号码的每月定期租赁费。有关注册要求的更多信息，请参阅[注册](https://docs.aws.amazon.com/sms-voice/latest/userguide/registrations.html)。

## 启用双向短信
<a name="tutorials-two-way-sms-part-1-enable-two-way"></a>

现在您已经有了一个专用电话号码，可以设置双向短信了。启用双向短信使您的客户能够回复您发送给他们的短信。在此解决方案中，您可以使用双向短信为您的客户提供一种方法，来确认他们想要订阅您的短信计划。

要使用 AWS 最终用户消息 SMS 控制台启用双向短信，请执行以下步骤：

**启用双向短信**

1. 打开 AWS 最终用户消息 SMS 控制台，网址为[https://console.aws.amazon.com/sms-voice/](https://console.aws.amazon.com/sms-voice/)。

1. 在导航窗格中的**配置**下，选择**电话号码**。

1. 在**电话号码**页面上，选择所需电话号码。

1. 在**双向短信**选项卡上，选择**编辑设置**按钮。

1. 在**编辑设置**页面上，选择**启用双向消息**。

1. 对于**目标类型**，选择 **Amazon SNS**。
   + **新的 Amazon SNS 主题** — AWS 最终用户消息短信会在您的账户中创建一个主题。该主题将自动创建，并具有所有必需的权限。有关 Amazon SNS 主题的更多信息，请参阅《Amazon SNS 开发人员指南》**中的[配置 Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-configuring.html)。
   + 对于**传入消息目的地**，输入主题名称，例如 **SMSRegistrationFormTopic**。

1. 对于**双向渠道角色**，请选择**使用 SNS 主题策略**。

1. 选择**保存更改**。

使用 AWS 最终用户消息 SMS 控制台向客户发送给您的电话号码中添加关键字以确认其订阅（例如**Yes**或**Confirm**）。

**添加关键字**

1. 打开 AWS 最终用户消息 SMS 控制台，网址为[https://console.aws.amazon.com/sms-voice/](https://console.aws.amazon.com/sms-voice/)。

1. 在导航窗格的**配置**下，选择**电话号码**。

1. 在**电话号码**页面上，选择要向其中添加关键字的电话号码。

1. 在**关键词**选项卡上，选择**添加关键字**按钮。

1. 在**自定义关键字**窗格中添加以下内容：
   + **关键字** - 要添加的新关键字（例如 **Yes** 或 **Confirm**）。
   + **回复消息** - 要发回给接收人的消息。
   + **关键字操作** – 收到关键字时要执行的操作。选择**自动回复**。

1. 选择**添加关键字**。

**下一步**：[创建 IAM 策略和角色](tutorials-two-way-sms-part-2.md)

# 创建 IAM 策略和角色以用于 Amazon Pinpoint 中的短信
<a name="tutorials-two-way-sms-part-2"></a>

在 Amazon Pinpoint 中实施短信注册解决方案的下一步是在 AWS Identity and Access Management (IAM) 中配置策略和角色。对于此解决方案，您需要创建一个策略，该策略提供对与 Amazon Pinpoint 相关的某些资源的访问权限。然后，创建一个角色并将策略附加到该角色。在本教程的后面部分，您将创建一个 AWS Lambda 函数，该函数使用此角色在 Amazon Pinpoint API 中调用某些操作。

## 创建 IAM 策略
<a name="tutorials-two-way-sms-part-2-create-policy"></a>

此部分将向您介绍如何创建 IAM 策略。使用此策略的用户和角色可以执行以下操作：
+ 使用电话号码验证功能
+ 查看、创建和更新 Amazon Pinpoint 端点
+ 向 Amazon Pinpoint 端点发送消息

在本教程中，您需要使 Lambda 能够执行这些任务。但是，为了提高安全性，此策略使用授予*最低权限*的原则。也就是说，它只授予完成此解决方案所需的权限，而不授予任何其他权限。此策略受以下几方面的限制：
+ 您只能用它来调用特定区域内的电话号码验证 API。
+ 您只能用它来查看、创建或更新与特定 Amazon Pinpoint 项目关联的端点。
+ 您只能用它将消息发送到与特定 Amazon Pinpoint 项目关联的端点。

**创建策略**

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **策略**，然后选择 **创建策略**。

1. 在 **JSON** 选项卡上，粘贴以下代码。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:CreateLogStream",
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup"
               ],
               "Resource": "arn:aws:logs:*:*:*"
           },
           {
               "Effect": "Allow",
               "Action": "mobiletargeting:SendMessages",
               "Resource": "arn:aws:mobiletargeting:us-east-1:111122223333:apps/projectId/*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "mobiletargeting:GetEndpoint",
                   "mobiletargeting:UpdateEndpoint",
                   "mobiletargeting:PutEvents"
               ],
               "Resource": "arn:aws:mobiletargeting:us-east-1:111122223333:apps/projectId/endpoints/*"
           },
           {
               "Effect": "Allow",
               "Action": "mobiletargeting:PhoneNumberValidate",
               "Resource": "arn:aws:mobiletargeting:us-east-1:111122223333:phone/number/validate"
           }
       ]
   }
   ```

------

   在上述示例中，执行以下操作：
   + *region*替换为您使用 Amazon Pinpoint 的 AWS 区域，例如`us-east-1`或。`eu-central-1`
**提示**  
有关提供 Amazon Pinpoint 的 AWS 地区的完整列表，请参阅中的[AWS 区域和终端节点](https://docs.aws.amazon.com/general/latest/gr/rande.html#pinpoint_region)。*AWS 一般参考*
   + *accountId*替换为 AWS 账户的唯一 ID。
   + *projectId*替换为您在本教程的创建 [Amazon Pinpoint 项目中创建的项目的](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)唯一 ID。
**注意**  
这些`logs`操作使 Lambda 能够将其输出记录在日志中。 CloudWatch 

1. 选择**下一步**。

1. 对于**策略名称**，输入策略的名称，如 **RegistrationFormPolicy**。选择**创建策略**。

## 创建一个 IAM 角色
<a name="tutorials-two-way-sms-part-2-create-role"></a>

**创建角色**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在 IAM 控制台的导航窗格中，选择**角色**，然后选择**创建角色**。

1. 在**可信实体类型**下选择 **AWS 服务**，然后对于**服务或用户案例**，从下拉列表中选择 **Lambda**。

1. 选择**下一步**。

1. 在**权限策略**下，选择或搜索您在上一部分中创建的策略，然后选择**下一步**。

1. 在**角色详细信息**下，对于**角色名称**，请为角色输入名称，例如 **SMSRegistrationForm**。选择**创建角色**。

**下一步**：[创建 Lambda 函数](tutorials-two-way-sms-part-3.md)

# 创建 Lambda 函数以用于 Amazon Pinpoint 短信收发
<a name="tutorials-two-way-sms-part-3"></a>

本节将向您介绍如何创建和配置两个 Lambda 函数以用于 Amazon Pinpoint 短信收发。稍后，您将设置 API Gateway 和 Amazon Pinpoint 以在发生特定事件时调用这些函数。这两个函数会在您指定的 Amazon Pinpoint 项目中创建和更新端点。第一个函数还使用电话号码验证功能。

## 创建可验证客户信息并可创建端点的函数
<a name="tutorials-two-way-sms-part-3-create-register-function"></a>

第一个函数从您的注册表单（从 Amazon API Gateway 接收）中获取输入。它使用这些信息，通过使用 Amazon Pinpoint 的[电话号码验证](https://docs.aws.amazon.com/pinpoint/latest/developerguide/validate-phone-numbers.html)特征来获取有关客户电话号码的信息。然后，该函数使用验证的数据在您指定的 Amazon Pinpoint 项目中创建一个新的端点。默认情况下，该函数创建的端点会选择不接收您的未来通信，但此状态可通过第二个函数进行更改。最后，此函数向客户发送一条消息，要求他们验证是否希望接收来自您的短信通信。

**创建 Lambda 函数**

1. 打开 AWS Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 选择**创建函数**。

1. 在**创建函数**下，选择**使用蓝图**。

1. 在搜索字段中，输入 **hello**，然后按 Enter。在结果列表中，选择 `hello-world` Node.js 函数，如下图所示。  
![\[显示已选定“使用蓝图”的“创建函数”页面。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step1.5.png)

1. 在**基本信息**中，执行以下操作：
   + 对于**名称**，输入函数的名称，如 **RegistrationForm**。
   + 对于**角色**，选择**选择现有角色**。
   + 对于**现有角色**，请选择您在创建 [IAM 角色中创建的**SMSRegistration表单**角色](tutorials-two-way-sms-part-2.md#tutorials-two-way-sms-part-2-create-role)。

   完成后，选择**创建函数**。

1. 对于**代码源**，删除代码编辑器中的示例函数，然后粘贴以下代码：

   ```
   import { PinpointClient, PhoneNumberValidateCommand, UpdateEndpointCommand, SendMessagesCommand } from "@aws-sdk/client-pinpoint"; // ES Modules import
   const pinClient = new PinpointClient({region: process.env.region});  
   
   // Make sure the SMS channel is enabled for the projectId that you specify.
   // See: https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-setup.html
   var projectId = process.env.projectId;
   
   // You need a dedicated long code in order to use two-way SMS. 
   // See: https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-voice-manage.html#channels-voice-manage-request-phone-numbers
   var originationNumber = process.env.originationNumber;
   
   // This message is spread across multiple lines for improved readability.
   var message = "ExampleCorp: Reply YES to confirm your subscription. 2 msgs per "
               + "month. No purchase req'd. Msg&data rates may apply. Terms: "
               + "example.com/terms-sms";
               
   var messageType = "TRANSACTIONAL";
   
   export const handler = async (event, context) => {
     console.log('Received event:', event);
     await validateNumber(event);
   };
   
   async function validateNumber (event) {
     var destinationNumber = event.destinationNumber;
     if (destinationNumber.length == 10) {
       destinationNumber = "+1" + destinationNumber;
     }
     var params = {
       NumberValidateRequest: {
         IsoCountryCode: 'US',
         PhoneNumber: destinationNumber
       }
     };
     try{
       const PhoneNumberValidateresponse = await pinClient.send( new  PhoneNumberValidateCommand(params));
       console.log(PhoneNumberValidateresponse);
        if (PhoneNumberValidateresponse['NumberValidateResponse']['PhoneTypeCode'] == 0) {
           await createEndpoint(PhoneNumberValidateresponse, event.firstName, event.lastName, event.source);
           
         } else {
           console.log("Received a phone number that isn't capable of receiving "
                      +"SMS messages. No endpoint created.");
         }
     }catch(err){
       console.log(err);
     }
   }
   
   async function createEndpoint(data, firstName, lastName, source) {
     var destinationNumber = data['NumberValidateResponse']['CleansedPhoneNumberE164'];
     var endpointId = data['NumberValidateResponse']['CleansedPhoneNumberE164'].substring(1);
     
     var params = {
       ApplicationId: projectId,
       // The Endpoint ID is equal to the cleansed phone number minus the leading
       // plus sign. This makes it easier to easily update the endpoint later.
       EndpointId: endpointId,
       EndpointRequest: {
         ChannelType: 'SMS',
         Address: destinationNumber,
         // OptOut is set to ALL (that is, endpoint is opted out of all messages)
         // because the recipient hasn't confirmed their subscription at this
         // point. When they confirm, a different Lambda function changes this 
         // value to NONE (not opted out).
         OptOut: 'ALL',
         Location: {
           PostalCode:data['NumberValidateResponse']['ZipCode'],
           City:data['NumberValidateResponse']['City'],
           Country:data['NumberValidateResponse']['CountryCodeIso2'],
         },
         Demographic: {
           Timezone:data['NumberValidateResponse']['Timezone']
         },
         Attributes: {
           Source: [
             source
           ]
         },
         User: {
           UserAttributes: {
             FirstName: [
               firstName
             ],
             LastName: [
               lastName
             ]
           }
         }
       }
     };
     try{
       const UpdateEndpointresponse = await pinClient.send(new UpdateEndpointCommand(params));
       console.log(UpdateEndpointresponse);
       await sendConfirmation(destinationNumber);
     }catch(err){
       console.log(err);
     }  
   }
   
   async function sendConfirmation(destinationNumber) {
     var params = {
       ApplicationId: projectId,
       MessageRequest: {
         Addresses: {
           [destinationNumber]: {
             ChannelType: 'SMS'
           }
         },
         MessageConfiguration: {
           SMSMessage: {
             Body: message,
             MessageType: messageType,
             OriginationNumber: originationNumber
           }
         }
       }
     };
     try{
       const SendMessagesCommandresponse = await pinClient.send(new SendMessagesCommand(params));
       console.log("Message sent! " 
             + SendMessagesCommandresponse['MessageResponse']['Result'][destinationNumber]['StatusMessage']);
     }catch(err){
       console.log(err);
     }
   }
   ```

1. 在**环境变量**的**配置**选项卡中，依次选择**编辑**、**添加环境变量**，然后执行以下操作：
   + 在第一行创建一个包含 **originationNumber** 键值的变量。接下来，将值设置为您在[步骤 1.2](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel) 中收到的专用长代码的电话号码。
**注意**  
请务必包含加号 (\$1) 和电话号码的国家/地区代码。请勿包含任何其他特殊字符，如连字符 (-)、句点 (.) 或圆括号。
   + 在第二行创建一个包含 **projectId** 键值的变量。接下来，将值设置为您在[步骤 1.1](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project) 中创建的项目的唯一 ID。
   + 在第三行创建一个包含 **region** 键值的变量。接下来，将值设置为您使用 Amazon Pinpoint 所在的区域，如 **us-east-1** 或 **us-west-2**。

   完成后，**Environment Variables (环境变量)** 部分应类似于下图中的示例。  
![\[originationNumber、projectId 和 region 的环境变量。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step1.7.png)

1. 在页面顶部，选择 **Save (保存)**。

### 测试此函数
<a name="tutorials-two-way-sms-part-3-create-register-function-test"></a>

创建函数后，您应对其进行测试，以确保其配置正确。此外还要确保您创建的 IAM 角色具有适当权限。

**测试此函数**

1. 选择**测试**选项卡。

1. 选择**创建新事件**，然后执行以下操作：
   + 对于**事件名称**，输入测试事件的名称，如 **MyPhoneNumber**。
   + 擦除代码编辑器中的示例代码。粘贴以下代码：

     ```
     {
       "destinationNumber": "+12065550142",
       "firstName": "Carlos",
       "lastName": "Salazar",
       "source": "Registration form test"
     }
     ```
   + 在上述代码示例中，将 `destinationNumber`、`firstName` 和 `lastName` 属性值替换为您想用于测试的值，例如您的个人联系详细信息。当您测试此函数时，它会向您在 `destinationNumber` 属性中指定的电话号码发送短信。请确保您指定的电话号码能够接收短信。
   + 选择**创建**。

1. 选择**测试**。

1. 在 **Execution result: succeeded (执行结果：成功)** 下，选择 **Details (详细信息)**。在 **Log output (日志输出)** 部分中，查看函数的输出。确保该函数运行未出现错误。

   检查与您指定的 `destinationNumber` 关联的设备，确保它收到测试消息。

1. 打开亚马逊 Pinpoint 控制台，网址为。[https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)

1. 在**所有项目**页面上，选择您在[创建 Amazon Pinpoint 项目](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)中创建的项目。

1. 在导航窗格中，选择**客户细分**。在**客户细分**页面上，选择**创建客户细分**。

1. 在 **Segment group 1 (分段组 1)** 的 **Add filters to refine your segment (添加筛选条件以细化分段)** 下，选择 **Filter by user (按用户筛选)**。

1. 在 **“选择用户属性”** 中，选择**FirstName**。然后，对于 **Choose values (选择值)**，选择您在测试事件中指定的名字。

   **客户细分估算**部分应显示有零个合格端点，以及总共一个端点，如下图所示。这是预期结果。当函数创建一个新的端点时，该端点将选择退出。Amazon Pinpoint 中的客户细分会自动排除已选择退出的端点。  
![\[显示零端点的客户细分组。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step8.9.png)

## 创建用于选择让客户接收您的通信的函数
<a name="tutorials-two-way-sms-part-3-create-optin-function"></a>

仅当客户回复第一个函数发送的消息时才会执行第二个函数。如果客户的回复包含[启用双向短信](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel)中指定的关键字，则该函数将更新其端点记录，选择让客户接收未来通信。Amazon Pinpoint 还会自动使用您在[启用双向短信](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel)中指定的消息进行回复。

如果客户没有响应，或者使用指定关键字以外的任何内容进行响应，则什么都不会发生。客户的端点虽然仍在 Amazon Pinpoint 中，但不能被客户细分当作目标。

**创建 Lambda 函数**

1. 打开 AWS Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 选择**创建函数**。

1. 在**创建函数**下，选择**蓝图**。

1. 在搜索字段中，输入 **hello**，然后按 Enter。在结果列表中，选择 `hello-world` Node.js 函数，如下图所示。选择 **Configure**（配置）。

1. 在 **Basic information**（基本信息）中，执行以下操作：
   + 对于**名称**，输入函数的名称，如 **RegistrationForm\$1OptIn**。
   + 对于**角色**，选择**选择现有角色**。
   + 对于**现有角色**，请选择您在创建 [IAM 角色中创建的 SMSRegistration表单角色](tutorials-two-way-sms-part-2.md#tutorials-two-way-sms-part-2-create-role)。

   完成后，选择**创建函数**。

1. 删除代码编辑器中的示例函数，然后粘贴以下代码：

   ```
   import { PinpointClient, UpdateEndpointCommand } from "@aws-sdk/client-pinpoint"; // ES Modules import
   
   // Create a new Pinpoint client instance with the region specified in the environment variables
   const pinClient = new PinpointClient({ region: process.env.region });
   
   // Get the Pinpoint project ID and the confirm keyword from environment variables
   const projectId = process.env.projectId;
   const confirmKeyword = process.env.confirmKeyword.toLowerCase();
   
   // This is the main handler function that is invoked when the Lambda function is triggered
   export const handler = async (event, context) => {
       console.log('Received event:', event);
   
       try {
           // Extract the timestamp, message, and origination number from the SNS event
           const timestamp = event.Records[0].Sns.Timestamp;
           const message = JSON.parse(event.Records[0].Sns.Message);
           const originationNumber = message.originationNumber;
           const response = message.messageBody.toLowerCase();
   
           // Check if the response message contains the confirm keyword
           if (response.includes(confirmKeyword)) {
               // If the confirm keyword is found, update the endpoint's opt-in status
               await updateEndpointOptIn(originationNumber, timestamp);
           }
       }catch (error) {
           console.error('An error occurred:', error);
           throw error; // Rethrow the error to handle it upstream
       }
   };
   
   // This function updates the opt-in status of a Pinpoint endpoint
   async function updateEndpointOptIn(originationNumber, timestamp) {
       // Extract the endpoint ID from the origination number
       const endpointId = originationNumber.substring(1);
   
        // Prepare the parameters for the UpdateEndpointCommand
       const params = {
           ApplicationId: projectId,
           EndpointId: endpointId,
           EndpointRequest: {
               Address: originationNumber,
               ChannelType: 'SMS',
               OptOut: 'NONE',
               Attributes: {
                   OptInTimestamp: [timestamp]
               },
           }
       };
   
       try {
           // Send the UpdateEndpointCommand to update the endpoint's opt-in status
           const updateEndpointResponse = await pinClient.send(new UpdateEndpointCommand(params));
           console.log(updateEndpointResponse);
           console.log(`Successfully changed the opt status of endpoint ID ${endpointId}`);
       } catch (error) {
           console.error('An error occurred while updating endpoint:', error);
           throw error; // Rethrow the error to handle it upstream
       }
   }
   ```

1. 在 **Environment variables (环境变量)** 下，执行以下操作：
   + 在第一行创建一个包含 **projectId** 键值的变量。接下来，将值设置为您在[创建 Amazon Pinpoint 项目](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)中创建的项目的唯一 ID。
   + 在第二行创建一个包含 **region** 键值的变量。接下来，将值设置为您使用 Amazon Pinpoint 所在的区域，如 **us-east-1** 或 **us-west-2**。
   + 在第三行创建一个包含 **confirmKeyword** 键值的变量。接下来，将值设置为您在[启用双向短信](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-set-up-channel)中创建的确认关键字。
**注意**  
关键字不区分大小写。此函数会将传入消息转换为小写字母。

   完成后，**Environment Variables (环境变量)** 部分应类似于下图中的示例。  
![\[projectId、region 和 confirmKeyword 的环境变量。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step2.7.png)

1. 在页面顶部，选择 **Save (保存)**。

### 测试此函数
<a name="tutorials-two-way-sms-part-3-create-optin-function-test"></a>

创建函数后，您应对其进行测试，以确保其配置正确。此外还要确保您创建的 IAM 角色具有适当权限。

**测试此函数**

1. 选择**测试**。

1. 在 **Configure test event (配置测试事件)** 窗口上，执行以下操作：

   1. 选择 **Create new test event**（新建测试事件）。

   1. 对于**事件名称**，输入测试事件的名称，如 **MyResponse**。

   1. 擦除代码编辑器中的示例代码。粘贴以下代码：

      ```
      {
        "Records":[
          {
            "Sns":{
              "Message":"{\"originationNumber\":\"+12065550142\",\"messageBody\":\"Yes\"}",
              "Timestamp":"2019-02-20T17:47:44.147Z"
            }
          }
        ]
      }
      ```

      在上述代码示例中，将 `originationNumber` 属性的值替换为您在测试之前的 Lambda 函数时使用的电话号码。将 `messageBody` 的值替换为您在[启用双向短信](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-enable-two-way)中指定的双向短信关键字。（可选）您可以将 `Timestamp` 的值替换为当前日期和时间。

   1. 选择**创建**。

1. 再次选择 **Test (测试)**。

1. 在 **Execution result: succeeded (执行结果：成功)** 下，选择 **Details (详细信息)**。在 **Log output (日志输出)** 部分中，查看函数的输出。确保该函数运行未出现错误。

1. 打开亚马逊 Pinpoint 控制台，网址为。[https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)

1. 在**所有项目**页面上，选择您在[创建 Amazon Pinpoint 项目](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)中创建的项目。

1. 在导航窗格中，选择**客户细分**。在**客户细分**页面上，选择**创建客户细分**。

1. 在 **Segment group 1 (分段组 1)** 的 **Add filters to refine your segment (添加筛选条件以细化分段)** 下，选择 **Filter by user (按用户筛选)**。

1. 在 **“选择用户属性”** 中，选择**FirstName**。然后，对于 **Choose values (选择值)**，选择您在测试事件中指定的名字。

   **客户细分估算**部分应显示有一个合格端点，以及总共一个端点。

**下一步**：[设置 Amazon API Gateway](tutorials-two-way-sms-part-4.md)

# 设置 Amazon API Gateway 以用于 Amazon Pinpoint 中的短信收发
<a name="tutorials-two-way-sms-part-4"></a>

在本节，您将在 Amazon Pinpoint 的短信注册过程中使用 Amazon API Gateway 创建新 API。您在此解决方案中部署的注册表将调用该 API。然后，API Gateway 会将注册表中捕获的信息传递给您在[创建 Lambda 函数](tutorials-two-way-sms-part-3.md)中创建的 Lambda 函数。

## 创建 API
<a name="tutorials-two-way-sms-part-4-create-api"></a>

首先，您必须在 API Gateway 中创建一个新的 API。以下过程演示如何创建新的 REST API。

**创建新的 API**

1. 打开 API Gateway 控制台，网址为[https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/)。

1. 选择**创建 API**。做出以下选择：
   + 在**选择协议**下，选择 **REST**。
   + 在**创建新 API** 下，选择**新建 API**。
   + 在**设置**下，对于**名称**，输入一个名称，如 **RegistrationForm**。对于**描述**，可以选择输入一些用于描述 API 用途的文本。对于**端点类型**，选择**区域性**。然后选择**创建 API**。

   这些设置的示例如下图所示。  
![\[协议设置为 REST，创建新 API 设置为新 API，API 名称设置为 RegistrationForm，端点类型设置为区域。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_APIGW_Step2.png)

## 创建资源
<a name="tutorials-two-way-sms-part-4-create-resource"></a>

现在，您已经创建了一个 API，可以开始向其添加资源。之后，向资源添加 POST 方法，并告知 API Gateway 将您从此方法中接收的数据传递到您的 Lambda 函数。

1. 在**操作**菜单上，选择**创建资源**。在**新建子资源**窗格中，对于**资源名称**，输入 **register**，如下图所示。选择**创建资源**。  
![\[资源名称设置为“register”的“新子资源”窗格。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_APIGW_Step3.png)

1. 在**操作**菜单上，选择**创建方法**。从出现的菜单中选择 **POST**，如下图所示。然后，选择**复选标记**按钮。  
![\[选中复选标记的“创建方法”窗格。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_APIGW_Step4.png)

1. 在 **/register - POST - 设置**窗格中，进行以下选择：
   + 对于**集成类型**，选择 **Lambda 函数**。
   + 选择**使用 Lambda 代理集成**。
   + 对于 **Lambda 区域**，请选择您在其中创建了 Lambda 函数的区域。
   + 对于 **Lambda 函数**，请选择您在创建 [Lambda RegisterEndpoint](tutorials-two-way-sms-part-3.md) 函数中创建的函数。

   这些设置的示例如下图所示。  
![\[选中“Lambda 函数”的 /register - POST - 设置窗格。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_APIGW_Step5.png)

   选择**保存**。在显示的窗口中，选择**确定** 以授予 API Gateway 执行您的 Lambda 函数的权限。

## 部署 API
<a name="tutorials-two-way-sms-part-4-deploy-api"></a>

该 API 现已准备就绪，可供使用。此时，您必须对其进行部署，以便创建可公开访问的端点。

1. 在**操作**菜单上，选择**部署 API**。在**部署 API** 窗口中，进行以下选择：
   + 对于**部署阶段**，选择**[新阶段]**。
   + 对于**阶段名称**，输入 **v1**。
   + 选择**部署**。

   这些选择的示例如下图所示。  
![\[“阶段名称”设置为“v1”的“部署 API”窗口\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_APIGW_Step6.png)

1. 在 **v1 阶段编辑器**窗格中，选择 **/register** 资源，然后选择 **POST** 方法。复制**调用 URL** 旁边显示的地址，如下图所示。  
![\[显示要复制的调用 URL 的 v1 阶段编辑器窗格\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_APIGW_Step7.png)

1. 在导航窗格中，选择**资源**。在资源列表中，选择 **/register** 资源。最后，在**操作**菜单上，选择**启用 CORS**，如下图所示。  
![\[显示已选定“启用 CORS”的“操作”下拉菜单\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_APIGW_Step8.png)

1. 在**启用 CORS** 窗格中，选择**启用 CORS 并替换现有 CORS 标头**。

**下一步**：[创建和部署 Web 表单](tutorials-two-way-sms-part-5.md)

# 创建和部署 Web 表单，以便在 Amazon Pinpoint 上使用短信收发
<a name="tutorials-two-way-sms-part-5"></a>

使用 Amazon Pinpoint 发送短信 AWS 服务的所有组件现已准备就绪。最后一步是创建和部署捕获客户数据的 Web 表单。

## 创建 JavaScript 表单处理程序
<a name="tutorials-two-way-sms-part-5-create-form-handler"></a>

在本节中，您将创建一个 JavaScript 函数来解析您在下一节中创建的 Web 表单的内容。解析内容后，此函数将数据发送到您在[设置 Amazon API Gateway](tutorials-two-way-sms-part-4.md) 中创建的 API。

**创建表单处理程序**

1. 在文本编辑器中，创建一个新文件。

1. 在编辑器中，粘贴以下代码。

   ```
   $(document).ready(function() {
   
     // Handle form submission.
     $("#submit").click(function(e) {
   
       var firstName = $("#firstName").val(),
           lastName = $("#lastName").val(),
           source = window.location.pathname,
           optTimestamp = undefined,
           utcSeconds = Date.now() / 1000,
           timestamp = new Date(0),
           phone = $("#areaCode").val()
                 + $("#phone1").val()
                 + $("#phone2").val();
   
       e.preventDefault();
   
       if (firstName == "") {
         $('#form-response').html('<div class="mt-3 alert alert-info" role="alert">Please enter your first name.</div>');
       } else if (lastName == "") {
         $('#form-response').html('<div class="mt-3 alert alert-info" role="alert">Please enter your last name.</div>');
       } else if (phone.match(/[^0-9]/gi)) {
         $('#form-response').html('<div class="mt-3 alert alert-info" role="alert">Your phone number contains invalid characters. Please check the phone number that you supplied.</div>');
       } else if (phone.length < 10) {
         $('#form-response').html('<div class="mt-3 alert alert-info" role="alert">Please enter your phone number.</div>');
       } else if (phone.length > 10) {
         $('#form-response').html('<div class="mt-3 alert alert-info" role="alert">Your phone number contains too many digits. Please check the phone number that you supplied.</div>');
       } else {
         $('#submit').prop('disabled', true);
         $('#submit').html('<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>  Saving your preferences</button>');
   
         timestamp.setUTCSeconds(utcSeconds);
   
         var data = JSON.stringify({
           'destinationNumber': phone,
           'firstName': firstName,
           'lastName': lastName,
           'source': source,
           'optTimestamp': timestamp.toString()
         });
   
         $.ajax({
           type: 'POST',
           url: 'https://example.execute-api.us-east-1.amazonaws.com/v1/register',
           contentType: 'application/json',
           data: data,
           success: function(res) {
             $('#form-response').html('<div class="mt-3 alert alert-success" role="alert"><p>Congratulations! You&apos;ve successfully registered for SMS Alerts from ExampleCorp.</p><p>We just sent you a message. Follow the instructions in the message to confirm your subscription. We won&apos;t send any additional messages until we receive your confirmation.</p><p>If you decide you don&apos;t want to receive any additional messages from us, just reply to one of our messages with the keyword STOP.</p></div>');
             $('#submit').prop('hidden', true);
             $('#unsubAll').prop('hidden', true);
             $('#submit').text('Preferences saved!');
           },
           error: function(jqxhr, status, exception) {
             $('#form-response').html('<div class="mt-3 alert alert-danger" role="alert">An error occurred. Please try again later.</div>');
             $('#submit').text('Save preferences');
             $('#submit').prop('disabled', false);
           }
         });
       }
     });
   });
   ```

1. 在前面的示例中，*https://example.execute-api.us-east-1.amazonaws.com/v1/register*替换为您在[部署 API](tutorials-two-way-sms-part-4.md#tutorials-two-way-sms-part-4-deploy-api) 中获得的调用网址。

1. 保存该文件。

## 创建表单文件
<a name="tutorials-two-way-sms-part-5-create-form"></a>

在本部分，您将创建一个 HTML 文件，其中包含客户注册您的短信计划时使用的表单。此文件使用您在上一节中创建的 JavaScript 表单处理程序将表单数据传输到您的 Lambda 函数。

**重要**  
当用户提交此表单时，它将触发一个 Lambda 函数，该函数会调用多个 Amazon Pinpoint API 操作。恶意用户可以对您的表单发起攻击，这可能会导致发出大量请求。如果您计划将此解决方案用于生产使用案例，应通过使用 [Google reCAPTCHA](https://www.google.com/recaptcha/about/) 之类的系统来确保其安全。

**创建表单**

1. 在文本编辑器中，创建一个新文件。

1. 在编辑器中，粘贴以下代码。

   ```
   <!doctype html>
   <html lang="en">
   
   <head>
     <!-- Meta tags required by Bootstrap -->
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
   
     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
     <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
     <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
     <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
   
     <script type="text/javascript" src="SMSFormHandler.js"></script>
     <title>SMS Registration Form</title>
   </head>
   
   <body>
     <div class="container">
       <div class="row justify-content-center mt-3">
         <div class="col-md-6">
           <h1>Register for SMS Alerts</h1>
           <p>Enter your phone number below to sign up for PromotionName messages from ExampleCorp.</p>
           <p>We don't share your contact information with anyone else. For more information, see our <a href="http://example.com/privacy">Privacy Policy</a>.</p>
           <p>ExampleCorp alerts are only available to recipients in the United States.</p>
         </div>
       </div>
       <div class="row justify-content-center">
         <div class="col-md-6">
           <form>
             <div class="form-group">
               <label for="firstName" class="font-weight-bold">First name</label>
               <input type="text" class="form-control" id="firstName" placeholder="Your first name" required>
             </div>
             <div class="form-group">
               <label for="lastName" class="font-weight-bold">Last name</label>
               <input type="text" class="form-control" id="lastName" placeholder="Your last name" required>
             </div>
             <label for="areaCode" class="font-weight-bold">Phone number</label>
             <div class="input-group">
               <span class="h3">(&nbsp;</span>
               <input type="tel" class="form-control" id="areaCode" placeholder="Area code" required>
               <span class="h3">&nbsp;)&nbsp;</span>
               <input type="tel" class="form-control" id="phone1" placeholder="555" required>
               <span class="h3">&nbsp;-&nbsp;</span>
               <input type="tel" class="form-control" id="phone2" placeholder="0199" required>
             </div>
             <div id="form-response"></div>
             <button id="submit" type="submit" class="btn btn-primary btn-block mt-3">Submit</button>
           </form>
         </div>
       </div>
       <div class="row mt-3">
         <div class="col-md-12 text-center">
           <small class="text-muted">Copyright © 2019, ExampleCorp or its affiliates.</small>
         </div>
       </div>
     </div>
   </body>
   
   </html>
   ```

1. 在前面的示例中，*SMSFormHandler.js*替换为您在上一节中创建的表单处理程序 JavaScript 文件的完整路径。

1. 保存该文件。

## 上传表单文件
<a name="tutorials-two-way-sms-part-5-upload-form"></a>

现在，您已经创建了 HTML 表单和 JavaScript 表单处理程序，最后一步是将这些文件发布到互联网。本部分假定您已经有一个 Web 托管提供商。如果您没有现有的托管服务提供商，则可以使用亚马逊 Route 53、亚马逊简单存储服务 (Amazon S3) 和亚马逊启动网站。 CloudFront有关更多信息，请参阅[托管静态网站](https://aws.amazon.com/getting-started/hands-on/host-static-website/)。

如果您使用另一个 Web 托管提供商，请参阅该提供商的文档，以了解有关发布网页的更多信息。

## 测试表单
<a name="tutorials-two-way-sms-part-5-test-form"></a>

发布表单后，您应提交一些测试事件，以确保该表单按预期工作。

**测试注册表单**

1. 在 Web 浏览器中，转至您上传注册表单的位置。如果您使用了 “[创建 JavaScript 表单处理程序”](#tutorials-two-way-sms-part-5-create-form) 中的代码示例，则会看到与下图中的示例类似的表单。  
![\[在步骤 5.1 中创建的客户申请表。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_Form_Step5.3.1.png)

1. 在**名字**、**姓氏**和**电话号码**字段中输入您的联系信息。
**注意**  
当您提交表单时，Amazon Pinpoint 会尝试向您指定的电话号码发送消息。由于有这种功能，您应该从头到尾使用真实的电话号码来测试该解决方案。  
如果您在[创建 Lambda 函数](tutorials-two-way-sms-part-3.md)中测试了 Lambda 函数，则您的 Amazon Pinpoint 项目已经包含至少一个端点。测试此表单时，您应该在表单上提交不同的电话号码，或者使用 [DeleteEndpoint](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-endpoints-endpoint-id.html#DeleteEndpoint)API 操作删除现有的终端节点。

1. 检查与您指定的电话号码关联的设备，以确保它收到消息。

1. 打开亚马逊 Pinpoint 控制台，网址为。[https://console.aws.amazon.com/pinpoint/](https://console.aws.amazon.com/pinpoint/)

1. 在**所有项目**页面上，选择您在[创建 Amazon Pinpoint 项目](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-create-project)中创建的项目。

1. 在导航窗格中，选择**客户细分**。在**客户细分**页面上，选择**创建客户细分**。

1. 在 **Segment group 1 (分段组 1)** 的 **Add filters to refine your segment (添加筛选条件以细化分段)** 下，选择 **Filter by user (按用户筛选)**。

1. 在 **“选择用户属性”** 中，选择**FirstName**。然后，对于**选择值**，选择您在提交表单时指定的名字。

   **客户细分估算**部分应显示有零个合格端点以及一个端点（在总计端点下），如以下示例所示。这是预期结果。当 Lambda 函数创建一个新的端点时，该端点默认情况下选择退出。  
![\[选择加入的端点为零的客户细分。\]](http://docs.aws.amazon.com/zh_cn/pinpoint/latest/userguide/images/SMS_Reg_Tutorial_LAM_Step8.9.png)

1. 在设备收到消息时，使用您在[启用双向短信](tutorials-two-way-sms-part-1.md#tutorials-two-way-sms-part-1-enable-two-way)中指定的双向短信关键字来回复该消息。Amazon Pinpoint 会立即发送回复消息。

1. 在 Amazon Pinpoint 控制台中，重复步骤 4 至 8。这次，当您创建一个客户细分时，将看到一个合格端点，以及总共一个端点。这是预期结果，因为端点现已选择接收消息。

# 后续步骤
<a name="tutorials-two-way-sms-next-steps"></a>

完成本教程后，您完成了以下操作：
+ 创建一个 Amazon Pinpoint 项目，配置短信渠道，并获得专用的长代码。
+ 创建一个 IAM 策略（该策略使用最低权限原则授予访问权限），并将该策略与角色关联。
+ 创建了两个 Lambda 函数，它们使用亚马逊 Pinpoint SendMessages API 中的 UpdateEndpoint、和操作。 PhoneNumberValidate
+ 使用 API Gateway 创建 REST API。
+ 创建和部署基于 Web 的表单，用于收集客户的联系信息。
+ 对解决方案进行测试，以确保其有效。

本部分讨论使用客户信息（通过使用此解决方案收集）可以采取的几种方式。还包括一些建议，告诉您可以采用哪些方法来自定义此解决方案以适合特定的使用案例。

## 创建客户细分
<a name="tutorials-two-way-sms-next-steps-create-segments"></a>

您通过此表单收集的所有客户详细信息都将作为端点进行存储。此解决方案会创建包含几个属性的端点，您可以用它们进行客户细分。

例如，此解决方案会捕获名为 `Source` 的端点属性。该属性包含指向表单托管位置的完整路径。创建客户细分时，可以按端点来筛选客户细分，然后通过选择 `Source` 属性进一步细化筛选。

根据 `Source` 属性创建客户细分在许多方面都很有用。首先，这可以让您快速对已注册从您那里接收短信的客户创建客户细分。此外，Amazon Pinpoint 中的客户细分工具可自动排除未选择接收消息的端点。

如果您决定在多个不同的位置托管注册表单，`Source` 属性也很有用。例如，您的营销材料可能引用托管在某个位置中的表单，而浏览您网站时发现该表单的客户可能看到的是托管在其他某个位置中的表单。当您执行此操作时，看到营销材料之后填写表单的客户的源属性不同于在网站上找到表单后进行填写的客户的源属性。您可以利用这种差异来创建不同的客户细分，然后向每个受众发送定制通信。

## 发送个性化活动消息
<a name="tutorials-two-way-sms-next-steps-send-campaigns"></a>

创建客户细分后，您可以开始向这些客户细分发送活动。创建活动消息时，您可以通过指定要在消息中包含的端点属性来对其进行个性化。例如，此解决方案中使用的 Web 表单要求客户输入其名字和姓氏。这些值存储在与端点关联的用户记录中。

例如，如果您使用 `GetEndpoint` API 操作来检索有关使用此解决方案创建的端点的信息，则会看到与以下示例类似的部分：

```
  ...
  "User": {
    "UserAttributes": {
      "FirstName": [
        "Carlos"
      ],
      "LastName": [
        "Salazar"
      ]
    }
  }
  ...
```

如果您想在活动消息中包含这些属性的值，则可以使用点表示法来引用属性。然后，用一对大括号将整个引用括起来。例如，要在活动消息中包含每个收件人的名字，请在消息中包含以下字符串：`{{User.UserAttributes.FirstName}}`。当 Amazon Pinpoint 发送消息时，它将该字符串替换为 `FirstName` 属性的值。

## 使用表单收集其他信息
<a name="tutorials-two-way-sms-next-steps-collect-additional"></a>

您可以修改此解决方案，以收集有关注册表单的其他信息。例如，您可以要求客户提供他们的地址，然后使用地址数据填充 `Endpoint` 资源中的 `Location.City`、`Location.Country`、`Location.Region` 和 `Location.PostalCode` 字段。收集注册表单上的地址信息可能会使端点包含更准确的信息。要作出此更改，您需要将相应字段添加到 Web 表单。您还必须修改表单的 JavaScript 代码以传递新值。最后，您必须修改创建端点的 Lambda 函数以处理新的传入信息。

您也可以修改表单，以便它通过其他渠道收集联系信息。例如，您不仅可以使用表单来收集客户的电话号码，还可以收集其电子邮件地址。要进行此更改，您需要修改 HTML 和 JavaScript Web 表单。您还必须修改创建端点的 Lambda 函数，以便创建两个单独的端点（一个作为电子邮件端点，另一个作为短信端点）。您还应修改 Lambda 函数，以便为 `User.UserId` 属性生成一个唯一值，然后将该值与这两个端点进行关联。

## 记录其他属性以用于审核
<a name="tutorials-two-way-sms-next-steps-auditing"></a>

此解决方案在创建和更新端点时会记录两个重要属性。首先，当第一个 Lambda 函数最初创建端点时，它会在 `Attributes.Source` 属性中记录表单自身的 URL。如果客户响应这条消息，则第二个 Lambda 函数会创建一个 `Attributes.OptInTimestamp` 属性。此属性包含客户对于接收您的消息表示同意的确切日期和时间。

如果移动运营商或监管机构要求您提供客户同意的证据，那么这两个字段很有用。您可以随时使用 [GetEndpoint](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-endpoints-endpoint-id.html#GetEndpoint)API 操作检索此信息。

您也可以修改 Lambda 函数以记录可能对审核有用的其他数据，如从中提交注册请求的 IP 地址。