

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用第 3 適用於 PHP 的 AWS SDK 版管理 Amazon SNS 中的訂閱
<a name="sns-examples-subscribing-unsubscribing-topics"></a>

使用 Amazon Simple Notification Service (Amazon SNS) 主題將通知傳送至 Amazon Simple Queue Service (Amazon SQS)、HTTP/HTTPS、電子郵件地址 AWS Server Migration Service (AWS SMS) 或 AWS Lambda。

訂閱會連接到主題，以管理對訂閱者的訊息傳送。進一步了解如何使用第 [3 適用於 PHP 的 AWS SDK 版在 Amazon SNS 中管理主題中](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) 傳送訊息給某主題的所有訂閱者。

如需使用 Amazon SNS 的詳細資訊，請參閱[使用 Amazon SNS 進行System-to-System傳訊](https://docs.aws.amazon.com/sns/latest/dg/sns-system-to-system-messaging.html)。

您可以在 GitHub 上 適用於 PHP 的 AWS SDK 取得 的所有範例程式碼。 [ GitHub](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)

## 憑證
<a name="examplecredentials"></a>

在執行範例程式碼之前，請先設定您的 AWS 登入資料，如中所述[AWS 使用第 3 適用於 PHP 的 AWS SDK 版向 驗證](credentials.md)。然後匯入 適用於 PHP 的 AWS SDK，如 中所述[安裝第 3 適用於 PHP 的 AWS SDK 版](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 主題，取決於傳遞的參數所使用的值。本主題的其他範例將示範做法。

在此範例中，端點是電子郵件地址。確認字符會傳送至該電子郵件。收到確認符記後，可於三天內驗證訂閱。

 **匯入** 

```
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。確認字符會傳送至該網址。收到確認符記後，可於三天內驗證訂閱。

 **匯入** 

```
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 函數的訂閱，請使用[訂閱](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)操作。

您可以使用 訂閱方法將數個不同的端點訂閱至 Amazon SNS 主題，取決於傳遞的參數所使用的值。本主題的其他範例將示範做法。

在此範例中，端點是 Lambda 函數。確認字符會傳送至此 Lambda 函數。收到確認符記後，可於三天內驗證訂閱。

 **匯入** 

```
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());
}
```

## 訂閱文字簡訊至主題
<a name="subscribe-a-text-sms-to-a-topic"></a>

如需傳送簡訊至多個電話號碼，各號碼都要訂閱主題。

若要為電話號碼起始訂閱，請使用 [Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) 操作。

您可以使用 訂閱方法將數個不同的端點訂閱至 Amazon SNS 主題，取決於傳遞的參數所使用的值。本主題的其他範例將示範做法。

在此範例中，端點是 E.164 格式的電話號碼，遵照國際電信通訊所採用的標準。

確認字符會傳送至該電話號碼。收到確認符記後，可於三天內驗證訂閱。

如需使用 Amazon SNS 傳送簡訊的替代方式，請參閱[使用第 3 版在 適用於 PHP 的 AWS SDK Amazon SNS 中傳送簡訊](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>

若要實際建立訂閱，端點擁有者必須使用最初建立訂閱時傳送的符記，確認其有意接收來自該主題的訊息，如前所述。確認符記的有效期為三天。三天之後，您可以透過建立新的訂閱重新傳送符記。

若要確認訂閱，請使用 [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>

若要列出指定區域中最多 100 個現有訂閱 AWS ，請使用 [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 主題的每個端點，請使用[發佈](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)操作。

建立包含發佈訊息參數的物件，包括訊息文字和 Amazon SNS 主題的 Amazon Resource Name (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());
}
```