

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

# 使用 适用于 PHP 的 AWS SDK 版本 3 在 Amazon SNS 中管理订阅
<a name="sns-examples-subscribing-unsubscribing-topics"></a>

使用亚马逊简单通知服务 (Amazon SNS) Simple Notification 主题向亚马逊简单队列服务 (Amazon SQS)、HTTP/HTTPS、电子邮件地址、() 或发送通知。 AWS Server Migration Service AWS SMS AWS Lambda

订阅将附加到某个主题，该主题管理将消息发送给订阅者。要详细了解如何在 [Amazon SNS 中使用 适用于 PHP 的 AWS SDK 版本 3 创建主题](sns-examples-managing-topics.md)。

以下示例演示如何：
+ 使用 [Subscribe](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#subscribe) 订阅到现有主题。
+ 使用验证订阅[ConfirmSubscription](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#confirmsubscription)。
+ 使用列出现有订阅[ListSubscriptionsByTopic](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#listsubscriptionsbytopic)。
+ 使用 [Unsubscribe](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#unsubscribe) 删除订阅。
+ 使用 [publish](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#publish) 将消息发送给某一主题的所有订阅者。

有关使用亚马逊 SNS 的更多信息，请参阅[使用亚马逊 SNS 发送消息](https://docs.aws.amazon.com/sns/latest/dg/sns-system-to-system-messaging.html)。 System-to-System

的所有示例代码都可以在[此 适用于 PHP 的 AWS SDK 处找到 GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)。

## 凭据
<a name="examplecredentials"></a>

在运行示例代码之前，请配置您的 AWS 证书，如中所述[AWS 使用 适用于 PHP 的 AWS SDK 版本 3 进行身份验证](credentials.md)。然后导入 适用于 PHP 的 AWS SDK，如中所述[安装 适用于 PHP 的 AWS SDK 版本 3](getting-started_installation.md)。

## 针对主题订阅电子邮件地址
<a name="subscribe-an-email-address-to-a-topic"></a>

要建立电子邮件地址订阅，请使用 [Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) 操作。

您可以使用订阅方法，根据在所传递参数中使用的值，将多种不同的端点订阅到某个 Amazon SNS 主题。本主题中的其他示例演示了这一点。

在本示例中，端点是电子邮件地址。将向该电子邮件发送确认令牌。在收到电子邮件的 3 天内，使用此确认令牌验证订阅。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$protocol = 'email';
$endpoint = 'sample@example.com';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->subscribe([
        'Protocol' => $protocol,
        'Endpoint' => $endpoint,
        'ReturnSubscriptionArn' => true,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## 将应用程序端点订阅到主题
<a name="subscribe-an-application-endpoint-to-a-topic"></a>

要建立 Web 应用程序订阅，请使用 [Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) 操作。

您可以使用订阅方法，根据在所传递参数中使用的值，将多种不同的端点订阅到某个 Amazon SNS 主题。本主题中的其他示例演示了这一点。

在此示例中，端点是 URL。将会向此 Web 地址发送确认令牌。在收到电子邮件的 3 天内，使用此确认令牌验证订阅。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$protocol = 'https';
$endpoint = 'https://';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->subscribe([
        'Protocol' => $protocol,
        'Endpoint' => $endpoint,
        'ReturnSubscriptionArn' => true,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## 向主题订阅 Lambda 函数
<a name="subscribe-a-lam-function-to-a-topic"></a>

要建立 Lambda 函数订阅，请使用 [Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) 操作。

您可以使用订阅方法，根据在所传递参数中使用的值，将多种不同的端点订阅到某个 Amazon SNS 主题。本主题中的其他示例演示了这一点。

在此示例中，端点是 Lambda 函数。将会向此 Lambda 函数发送确认令牌。在收到电子邮件的 3 天内，使用此确认令牌验证订阅。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$protocol = 'lambda';
$endpoint = 'arn:aws:lambda:us-east-1:123456789023:function:messageStore';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->subscribe([
        'Protocol' => $protocol,
        'Endpoint' => $endpoint,
        'ReturnSubscriptionArn' => true,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## 将文本 SMS 订阅到主题
<a name="subscribe-a-text-sms-to-a-topic"></a>

要同时将 SMS 消息发送到多个电话号码，请将各个号码订阅到主题。

要建立电话号码订阅，请使用 [Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) 操作。

您可以使用订阅方法，根据在所传递参数中使用的值，将多种不同的端点订阅到某个 Amazon SNS 主题。本主题中的其他示例演示了这一点。

在此示例中，端点是 E.164 格式的电话号码，这是国际电信的标准。

将会向此电话号码发送确认令牌。在收到电子邮件的 3 天内，使用此确认令牌验证订阅。

有关使用 Amazon SNS 发送 SMS 消息的替代方法，请参阅[在使用 适用于 PHP 的 AWS SDK 版本 3 的 Amazon SNS 中发送 SMS 消息](sns-examples-sending-sms.md)。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$protocol = 'sms';
$endpoint = '+1XXX5550100';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->subscribe([
        'Protocol' => $protocol,
        'Endpoint' => $endpoint,
        'ReturnSubscriptionArn' => true,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## 确认订阅到主题
<a name="confirm-subscription-to-a-topic"></a>

要实际创建订阅，端点所有者必须使用在最初建立订阅时发送的令牌，确认接收来自该主题的消息的意图，如前所述。确认令牌有效期为 3 天。3 天之后，您可以通过创建新订阅来重新发送令牌。

要确认订阅，请使用[ConfirmSubscription](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html)操作。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$subscription_token = 'arn:aws:sns:us-east-1:111122223333:MyTopic:123456-abcd-12ab-1234-12ba3dc1234a';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->confirmSubscription([
        'Token' => $subscription_token,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## 列出对主题的订阅
<a name="list-subscriptions-to-a-topic"></a>

要列出给定 AWS 区域中最多 100 个现有订阅，请使用[ListSubscriptions](https://docs.aws.amazon.com/sns/latest/api/API_ListSubscriptions.html)操作。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

try {
    $result = $SnSclient->listSubscriptions();
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## 取消订阅主题
<a name="unsubscribe-from-a-topic"></a>

要删除订阅到某个主题的端点，请使用 [Unsubscribe](https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html) 操作。

如果订阅需要身份验证才能删除，则只有订阅的所有者或主题的所有者可以取消订阅，并且需要 AWS 签名。如果取消订阅调用无需身份验证，并且请求者不是订阅所有者，则会将一条最终取消消息传送到端点。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$subscription = 'arn:aws:sns:us-east-1:111122223333:MySubscription';

try {
    $result = $SnSclient->unsubscribe([
        'SubscriptionArn' => $subscription,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```

## 向 Amazon SNS 主题发布消息
<a name="publish-a-message-to-an-sns-topic"></a>

要将消息发送到订阅到某个 Amazon SNS 主题的各个端点，请使用 [Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) 操作。

创建包含用于发布消息的参数的对象，包括消息文本以及 Amazon SNS 主题的 Amazon 资源名称 (ARN)。

 **导入** 

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;
```

 **示例代码** 

```
$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);

$message = 'This message is sent from a Amazon SNS code sample.';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->publish([
        'Message' => $message,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```