Я искал по сети и ничего не дал ясного ответа, чтобы подтвердить запрос на подписку от амазонки SNS. Я уже отправляю подписку с консоли amazon на свой сайт, но что дальше? Я использую amazon EC2 как мой сервер с PHP.
Как я могу подтвердить запрос на подписку HTTP от amazon SNS
Ответ 1
Прежде чем вы даже настроите подписку на конечную точку HTTP/HTTPS через консоль управления AWS, вам необходимо убедиться, что конечная точка HTTP или HTTPS вашего веб-сайта PHP имеет возможность обрабатывать запросы HTTP POST, которые генерирует Amazon SNS. Существует несколько типов сообщений SNS: SubscriptionConfirmation, уведомление и UnsubscribeConfirmation. Вашему PHP-коду нужно получить заголовок x-amz-sns-message-type из запроса и обработать его на основе типа сообщения. Для сообщения SubscriptionConfirmation ваше приложение PHP должно обрабатывать тело сообщения POST, которое является документом JSON. Чтобы подписаться на эту тему, ваш PHP-код должен посетить "SubscriberURL", указанный в теле JSON. При желании вы должны проверить подпись, чтобы убедиться в подлинности сообщения, прежде чем подписываться на тему.
Более подробную информацию о документации AWS вы можете найти: http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.html
Ответ 2
Spring подписка на SNS с аннотацией
Spring Облако AWS поддерживает автоматическое подтверждение подписчика, вам просто нужно поместить эту аннотацию "@NotificationSubscriptionMapping"
@Controller
@RequestMapping("/topicName")
public class NotificationTestController {
@NotificationSubscriptionMapping
public void handleSubscriptionMessage(NotificationStatus status) throws IOException {
//We subscribe to start receive the message
status.confirmSubscription();
}
@NotificationMessageMapping
public void handleNotificationMessage(@NotificationSubject String subject, @NotificationMessage String message) {
// ...
}
@NotificationUnsubscribeConfirmationMapping
public void handleUnsubscribeMessage(NotificationStatus status) {
//e.g. the client has been unsubscribed and we want to "re-subscribe"
status.confirmSubscription();
}
}
http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sns_support
Ответ 3
Конечная точка, которую вы указали, получит данные от службы проверки конечных точек SNS AWS. То же конечная точка будет использоваться для проверки конечной точки и получения уведомлений от aws,
Просто выгрузите вход, отправленный AWS SNS в один текстовый файл, например,
$json_write_to_text = json_decode(file_get_contents("php://input"));
Вы найдете все данные, отправленные AWS SNS, но просто найдите SubscriptionUrl
(который будет определен для конечной точки, имеющей действительный токен). Откройте это в браузере, у вас будет статус SubscriptionConfirmation. Что он
Enjoy.
Ответ 4
Я решил это, используя бэкэнд NodeJS. Допустим, у вас есть API, подобный этому в HapiJS (ну, не важно, что у вас может быть другая технология).
{
method: 'POST',
path: '/hello',
handler: ( request, reply ) => {
reply( Hello.print(request.payload) );
},
config: {
tags: ['api']
}
}
Просто передайте полезную нагрузку, которую вы получаете, в свою бизнес-логику.
В бизнес-логическом процессе это выглядит как
'use strict';
const request = require('request');
exports.print = (payload) => {
payload = JSON.parse(payload);
if(payload.Type === 'SubscriptionConfirmation'){
return new Promise((resolve, reject) => {
const url = payload.SubscribeURL;
request(url, (error, response) => {
if (!error && response.statusCode == 200) {
console.log('Yess! We have accepted the confirmation from AWS');
return resolve();
}
else
return reject();
});
});
}
Я использую модуль запроса из NPM для автоматического принятия таких запросов.
Другой способ - распечатать содержимое payload
, а затем щелкнуть по URL-адресу, указанному в payload.SubscribeURL
.
Как только AWS примет его, вы проверите подтверждение на странице Подписки, где Subscription ARN
будет изменено с Pending Confirmation
на сложное имя-cum-SHA с именем вашей темы.