Отправка Amazon SNS с моего PHP-сервера


У меня есть приложение как на платформах Android, так и на iOS. Оба они зарегистрированы в Amazon SNS. Это успешно сделано, потому что, если у меня есть токены устройства, я могу войти в панель управления приложениями в Amazon и отправлять SNS с их консоли.

Я хочу, чтобы это было автоматизировано. Я имею в виду, что у меня есть собственный сайт администратора PHP (и API) для приложений. Я хочу добавить еще одну страницу на сайт администратора, которая может запросить amazon SNS для отправки одной полезной нагрузки с устройством идентификатор, регистрационные ключи и текст сообщения, предоставленные вместе с запросом.

Первый вопрос - Возможно ли это? Я видел, что городской дирижабль позволяет это, так что обычно амазонка тоже это делает?

Второй вопрос - Что это за процесс? Так как я работаю над этим для одного из моих клиентов, и все документы мне недоступны. Мой клиент не может объяснить это amazon.

Когда я зарегистрирую свои приложения на amazon, не должны ли они предоставить мне некоторые ключи и секреты, которые я могу использовать для позвонить в их службу по http?

Author: Elnur Abdurrakhimov, 2014-02-04

3 answers

Да, это возможно. Загрузите PHP SDK Amazon Web Service (AWS) из здесь и следуйте инструкциям, чтобы использовать его в API вашего веб-сервера. Получите приложение платформы ARN для iOS и Android, идентификатор ключа доступа и секретный ключ с консоли Amazon. А затем попробуйте приведенный ниже код и следуйте инструкциям с комментариями:

<?php

require '<path to this file>/aws.phar';
use Aws\Sns\SnsClient;

if(isset($_POST['submit']))
{
    $push_message = $_POST['push_message'];

    if(!empty($push_message))
    {
        // Create a new Amazon SNS client
        $sns = SnsClient::factory(array(
            'key'    => '<access key>',
            'secret' => '<app secret>',
            'region' => '<region code>'
            ));

        // region code samples: us-east-1, ap-northeast-1, sa-east-1, ap-southeast-1, ap-southeast-2, us-west-2, us-gov-west-1, us-west-1, cn-north-1, eu-west-1

        $iOS_AppArn = "<iOS app's Application ARN>";
        $android_AppArn = "<android app's Application ARN>";

        // Get the application's endpoints
        $iOS_model = $sns->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $iOS_AppArn));
        $android_model = $sns->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $android_AppArn));

        // Display all of the endpoints for the iOS application
        foreach ($iOS_model['Endpoints'] as $endpoint)
        {
            $endpointArn = $endpoint['EndpointArn'];
            echo $endpointArn;
        }

        // Display all of the endpoints for the android application
        foreach ($android_model['Endpoints'] as $endpoint)
        {
            $endpointArn = $endpoint['EndpointArn'];
            echo $endpointArn;
        }

        // iOS: Send a message to each endpoint
        foreach ($iOS_model['Endpoints'] as $endpoint)
        {
            $endpointArn = $endpoint['EndpointArn'];

            try
            {
                $sns->publish(array('Message' => $push_message,
                    'TargetArn' => $endpointArn));

                echo "<strong>Success:</strong> ".$endpointArn."<br/>";
            }
            catch (Exception $e)
            {
                echo "<strong>Failed:</strong> ".$endpointArn."<br/><strong>Error:</strong> ".$e->getMessage()."<br/>";
            }
        }

        // android: Send a message to each endpoint
        foreach ($android_model['Endpoints'] as $endpoint)
        {
            $endpointArn = $endpoint['EndpointArn'];

            try
            {
                $sns->publish(array('Message' => $push_message,
                    'TargetArn' => $endpointArn));

                echo "<strong>Success:</strong> ".$endpointArn."<br/>";
            }
            catch (Exception $e)
            {
                echo "<strong>Failed:</strong> ".$endpointArn."<br/><strong>Error:</strong> ".$e->getMessage()."<br/>";
            }
        }
    }
}   
?>

Код протестирован и работает, не стесняйтесь изменять его по мере необходимости.

 26
Author: Shabib, 2016-01-27 16:21:33

Если вы хотите отправить звуковой сигнал и номер значка с пользовательской полезной нагрузкой, замените этот блок кода // iOS: Send a message to each endpoint foreach ($iOS_model['Endpoints'] as $endpoint)

С этим блоком кода

    foreach ($iOS_model['Endpoints'] as $endpoint)
{
    $endpointArn = $endpoint['EndpointArn'];

    try
    {
        $sns->publish(array(
        'TargetArn' => $endpointArn,
        'MessageStructure' => 'json',
        'Message' => json_encode(array(
            'default' => $title,
            'APNS_SANDBOX' => json_encode(array(
                'aps' => array(
                    'alert' => $title,
                    'sound' => 'default',
                    'badge' => 1
                    ),
                    // Your custom payload if needed
                    'whatever' => 'here',
                    'andwhatever' => 'here'
                    ))

            ))
    ));


        echo "1";//Success push
    }
    catch (Exception $e)
    {
        echo "2";//Failed push
    }
}
 4
Author: Alex McPherson, 2015-03-05 21:05:42

Я считаю, что самый простой способ отправить push-уведомление одному устройству или пользователю - это использовать этот код

                $snsClient = Aws\Sns\SnsClient::factory(array(
                    'credentials' => array(
                        'key'    => AMAZON_KEY,
                        'secret' => AMAZON_SECRET,
                    ),
                    'region'  => AMAZON_REIGON
                )); 


          //you should have variable that have user end single point .

           $result = $snsClient->publish(array(

                    'Message' => "push text message",
                    'TargetArn' => $user_end_point
                ));
 0
Author: albaiti, 2016-08-22 23:42:44