如何在 AWS SNS 上设置发件人号码(使用 PHP v3 SDK)

How to set the from number on AWS SNS (Using PHP v3 SDK)

设置

我已经下载 aws.zip file for AWS V3 SDK for PHP 并将其解压缩到我的项目文件夹中,并将它的自动加载器连接到我的自动加载器中。我还完成了创建 AWS 帐户的所有步骤,以及设置 SNS,包括获取要使用的 phone 号码。所有示例工作都显示在完整性检查中。

有一个你应该知道的小黑角。您需要在 ~/.aws/ 目录中创建一个 credentials 文件。如果您从 php-fpm 上下文中使用它,该主目录可能是您的 /var/www/ 目录,因此您应该将您的凭证文件放在 /var/www/.aws/.

可以在此处找到有关配置文件的更多信息...AWS Command Line Interface - Configuration and credential file settings

完整性检查

遵循 AWS SNS Documentation - Publish to a Text Message (SMS Message) 中的示例。

测试-AWS-SNS.php

require 'vendor/autoload.php';

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

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

$message = 'This message is sent from a Amazon SNS code sample.';
$phone = '+1AAALLL####';

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

(注意:+1AAALLL####实际上指向我的手机phone号码,但我显然不会把它放在这里。)

问题

问题是没有关于如何从我在 AWS 的 SNS 长代码列表中拥有的号码之一发送文本消息的文档。它总是来自列表中的第一个 phone 号码,我找不到任何关于如何将号码更改为另一个号码的文档。在这里提供一些帮助会很棒。

之前的研究

显然,我已经遍历了整个文档并搜索了 Stack Overflow。 This one is pretty close, as it sets a SenderID。他们的文档 mentions how to do it as an optional number 9 next to the sender ID from above 但我知道这是可能的,因为他们在 Oct 23, 2020 - Amazon SNS now supports selecting the origination number when sending SMS messages 上添加了该功能——他们只是没有放置任何代码示例。

欧比旺克诺比帮帮我,你是我唯一的希望。

因此,在多次环顾四周并在上面的文本框中输入内容并回避问题之后,解决此问题的方法是同时使用几个不同的答案。之前关于设置 SenderID 的研究中提到的 Stack Overflow 线程对于至少将原始信息输入 AWS SDK 非常有帮助。

$params = array(
    'credentials' => array(
        'key' => 'iam_key',
        'secret' => 'iam_secret',
    ),
    'region' => 'ap-south-1', // < your aws from SNS Topic region
    'version' => 'latest',
    'http' => ['verify'=>false]
);
$sns = \Aws\Sns\SnsClient::factory($params);

$msgattributes = [
        'AWS.SNS.SMS.SenderID' => [
            'DataType' => 'String',
            'StringValue' => 'Klassroom',
        ],
        'AWS.SNS.SMS.SMSType' => [
            'DataType' => 'String',
            'StringValue' => 'Transactional',
        ]
    ];

$payload = array(
        'Message' => "HK test",
        "PhoneNumber" => "1234567890",
        'MessageAttributes' => $msgattributes
    );

$result = $sns->publish($payload);

如果您滚动到 SMS Publish To Phone 文档,您会看到上面使用的字符串 AWS.SNS.SMS.SenderID 和下一个项目是 ... AWS.MM.SMS.OriginationNumber ... 所以也许有用吗?

它正在运行!正在运行!

require 'vendor/autoload.php';

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

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

$msgAttributes = [
    'AWS.MM.SMS.OriginationNumber' => [
        'DataType' => 'String',
        'StringValue' => '+1XXXYYYZZZZ',
    ]
];

$message = 'This message is sent from a Amazon SNS code sample.';
$phone = '+1AAALLL####';

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

注意:显然,+1XXXYYYZZZZ是我已经建立的长代码列表中的一个号码,就像之前一样,+1AAALLL####是我的phone号码或phone号码我要向其发送短信的人。