Отправка SMS с помощью услуг Amazon AWS PHP

У меня возникли проблемы с копированием документации для Amazon AWS PHP-sdk.

В принципе, мне просто нужно отправить стандартное текстовое сообщение на номер. Я знаю, что это возможно, потому что amazon позволяет отправлять сообщения через консоль напрямую через этот экран:

SMS-сообщения Amazon Console

В нем говорится об использовании метода "publish", но, просматривая эту документацию, на самом деле не было ответов. # Опубликовать ссылку для документации

Любая помощь или руководство приветствуются. В настоящее время я ищу решение, которое использует V2 для sdk.

Спасибо заранее.

Ответ 1

Нет, где есть документ, показывающий его для использования с PHP. Читая Java и С# SDK, я написал версию PHP, которая работает.

Обновлено 20 декабря 18

Аргументы, переданные методу publish теперь имеют новый формат. Исправлена!

Как отправить SMS через AWS с помощью PHP

Сначала установите aws/aws-sdk-php. Использование композитора:

composer require aws/aws-sdk-php

Создайте php файл с:

require './vendor/autoload.php';
error_reporting(E_ALL);
ini_set("display_errors", 1);

$params = array(
    'credentials' => array(
        'key' => 'YOUR_KEY_HERE',
        'secret' => 'YOUR_SECRET_HERE',
    ),
    'region' => 'us-east-1', // < your aws from SNS Topic region
    'version' => 'latest'
);
$sns = new \Aws\Sns\SnsClient($params);

$args = array(
    "MessageAttributes" => [
                'AWS.SNS.SMS.SenderID' => [
                    'DataType' => 'String',
                    'StringValue' => 'YOUR_SENDER_ID'
                ],
                'AWS.SNS.SMS.SMSType' => [
                    'DataType' => 'String',
                    'StringValue' => 'Transactional'
                ]
            ],
    "Message" => "Hello World! Visit www.tiagogouvea.com.br!",
    "PhoneNumber" => "FULL_PHONE_NUMBER"
);


$result = $sns->publish($args);
echo "<pre>";
var_dump($result);
echo "</pre>";

В результате должен быть один массив с множеством данных, включая MessageId.

Ответ 2

Если вы используете версию AWS SDK до 3.0, вы все равно создаете тему и подписываетесь с типом SMS. Но начиная с 3.0, вы можете отправить SMS прямо на номер.

    $client = SnsClient::factory(array(
    'region' => 'us-east-1',
    'version' => 'latest',
    'credentials' => array(
        'key'    => 'key',
        'secret' => 'secret')
    ));

    $message = 'Your verification code is 4';
     $payload = [
    'TopicArn' => 'arn:aws:sns:XXXXX',
        'Message'          => $message,
        'MessageStructure' => 'string',
        'MessageAttribute' => [
            'AWS.SNS.SMS.SenderID' => [
                'DataType'    => 'String',
                'StringValue' => 'Sender',
            ],
            'AWS.SNS.SMS.SMSType'  => [
                'DataType'    => 'String',
                'StringValue' => 'Transactional',
            ]
        ]
    ];
    $result = $client->subscribe(array(
        'TopicArn' => 'arn:aws:sns:XXXXX',
        'Protocol' => 'sms',
        'Endpoint' => 'XXXXXXXXXXX',
    ));
 $subarn = $result['SubscriptionArn'];
 $result = $client->publish($payload);
 $result = $client->unsubscribe(array(
    'SubscriptionArn' => $subarn,
 ));

Ответ 3

Каким-то образом ответ Тиаго не сработал для меня. Итак, я взглянул на API публикации из AWS-SDK. Похоже, что нет никаких параметров SMSType & SenderID в методе публикации. Проверьте здесь -

https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sns-2010-03-31.html#publish

Поэтому, если вы хотите переопределить эти параметры, следующий вариант кода Tiago должен работать нормально:

require './vendor/autoload.php';
error_reporting(E_ALL);
ini_set("display_errors", 1);

$params = array(
    'credentials' => array(
        'key' => 'YOUR_KEY_HERE',
        'secret' => 'YOUR_SECRET_HERE',
    ),
    'region' => 'us-east-1', // < your aws from SNS Topic region
    'version' => 'latest'
);
$sns = new \Aws\Sns\SnsClient($params);

$args = array(
    "MessageAttributes" => [
                'AWS.SNS.SMS.SenderID' => [
                    'DataType' => 'String',
                    'StringValue' => 'YOUR_SENDER_ID'
                ],
                'AWS.SNS.SMS.SMSType' => [
                    'DataType' => 'String',
                    'StringValue' => 'Transactional'
                ]
            ],
    "Message" => "Hello World! Visit www.tiagogouvea.com.br!",
    "PhoneNumber" => "FULL_PHONE_NUMBER"
);

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

Ответ 4

Надеюсь, что эта помощь для людей, которые все еще используют PHP AWS SDK v2

Тот же вопрос: fooobar.com/questions/6491151/...

Вам нужно будет добавить новый параметр в исходный код.

// update file: aws-sdk-php/src/Aws/Sdk/Resources/sns-2010-03-31.php

'Publish' => array(
    'parameters' => array(
        'PhoneNumber' => array( // new parameter
            'type' => 'string',
            'location' => 'aws.query',
        ),
    ),
),

// You just need to publish it and include the 'PhoneNumber' parameter
$snsClientResult = $snsClient->publish([
    'Message' => 'YOUR_MESSAGE',
    'PhoneNumber' => 'PHONE_NUMBER',
    'MessageStructure' => 'SMS',
    'MessageAttributes' => [
        'AWS.SNS.SMS.SenderID' => [
            'DataType' => 'String',
            'StringValue' => 'SENDER_ID',
        ],
        'AWS.SNS.SMS.SMSType' => [
            'DataType' => 'String',
            'StringValue' => 'Promotional', // Transactional
        ]
    ]
]);

// Get the response
$snsClientResult['MessageId']

Ответ 5

Чтобы использовать действие "Опубликовать" для отправки сообщения на конечную точку мобильного устройства, например приложение на устройстве Kindle или мобильном телефоне, вы должны указать EndpointArn.

$result = $client->publish(array(
    'TopicArn' => 'string',
    'TargetArn' => 'string',
    // Message is required
    'Message' => 'string',
    'Subject' => 'string',
    'MessageStructure' => 'string',
    'MessageAttributes' => array(
        // Associative array of custom 'String' key names
        'String' => array(
            // DataType is required
            'DataType' => 'string',
            'StringValue' => 'string',
            'BinaryValue' => 'string',
        ),
        // ... repeated
    ),
));