aws / aws-php-sns-message-validator
PHP 的 Amazon SNS 消息验证
Requires
- php: >=7.2.5
- ext-openssl: *
- psr/http-message: ^1.0 || ^2.0
Requires (Dev)
- guzzlehttp/psr7: ^1.9.1 || ^2.4.5
- phpunit/phpunit: ^5.6.3 || ^8.5 || ^9.5
- squizlabs/php_codesniffer: ^2.3
- yoast/phpunit-polyfills: ^1.0
README
PHP 的 Amazon SNS 消息验证库 允许您验证传入的 HTTP(S) POST 消息是否为有效的 Amazon SNS 通知。此库是独立的,不依赖于 AWS SDK for PHP 或 Guzzle;但是,它需要 PHP 5.4+ 以及已安装 OpenSSL PHP 扩展。
跳转到
基本用法
要验证消息,您可以使用 Message::fromRawPostData
从 POST 数据中实例化一个 Message
对象。这将从 php://input
流 读取原始 POST 数据,解码 JSON 数据,并验证消息的类型和结构。
接下来,您必须创建一个 MessageValidator
实例,然后使用 isValid()
或 validate()
方法之一来验证消息。消息验证器会检查 SigningCertURL
、SignatureVersion
和 Signature
以确保它们有效且与消息数据一致。
<?php require 'vendor/autoload.php'; use Aws\Sns\Message; use Aws\Sns\MessageValidator; $message = Message::fromRawPostData(); // Validate the message $validator = new MessageValidator(); if ($validator->isValid($message)) { // do something with the message }
安装
您可以通过 Composer 安装 SNS 消息验证器。
composer require aws/aws-php-sns-message-validator
获取帮助
请使用以下社区资源获取帮助。我们使用 GitHub 问题跟踪错误和功能请求,并且有有限的带宽来处理它们。
- 在 StackOverflow 上提出问题,并使用
aws-php-sdk
标签。 - 加入 AWS SDK for PHP gitter
- 通过 AWS Support 提交支持工单
- 如果您发现了一个可能存在的错误,请 创建一个问题
关于 Amazon SNS
Amazon Simple Notification Service (Amazon SNS) 是一种快速、全托管的推送消息服务。Amazon SNS 可以将消息发送到电子邮件、移动设备(例如,SMS;iOS、Android 和 FireOS 推送通知)、Amazon SQS 队列,以及当然——HTTP/HTTPS 端点。
使用 Amazon SNS,您可以设置主题以将自定义消息发布到已订阅的端点。然而,SNS 消息被许多其他 AWS 服务用于异步通信有关您的 AWS 资源的信息。一些例子包括
- 配置 Amazon Glacier 在检索作业完成时通知您。
- 配置 AWS CloudTrail 在新日志文件已写入时通知您。
- 配置 Amazon Elastic Transcoder 在转码作业状态更改时(例如,从“正在处理”到“完成”)通知您。
尽管您当然可以将电子邮件地址订阅到这些服务事件的通知以接收 SNS 消息,但您的收件箱会很快被填满。然而,能够订阅一个 HTTP/HTTPS 端点以接收消息却有很大的力量。这允许您为应用程序编写 webhooks 以轻松响应各种事件。
处理消息
确认主题订阅
为了处理 SubscriptionConfirmation
消息,您必须使用传入消息中的 SubscribeURL
值。
use Aws\Sns\Message; use Aws\Sns\MessageValidator; use Aws\Sns\Exception\InvalidSnsMessageException; // Instantiate the Message and Validator $message = Message::fromRawPostData(); $validator = new MessageValidator(); // Validate the message and log errors if invalid. try { $validator->validate($message); } catch (InvalidSnsMessageException $e) { // Pretend we're not here if the message is invalid. http_response_code(404); error_log('SNS Message Validation Error: ' . $e->getMessage()); die(); } // Check the type of the message and handle the subscription. if ($message['Type'] === 'SubscriptionConfirmation') { // Confirm the subscription by sending a GET request to the SubscribeURL file_get_contents($message['SubscribeURL']); }
接收通知
要接收通知,请使用前面示例中的相同代码,但检查 Notification
消息类型。
if ($message['Type'] === 'Notification') { // Do whatever you want with the message body and data. echo $message['MessageId'] . ': ' . $message['Message'] . "\n"; }
消息正文将是一个字符串,并包含已发布到 SNS 主题的所有数据。
取消订阅
取消订阅的操作与订阅类似,只是消息类型将是 UnsubscribeConfirmation
。
if ($message['Type'] === 'UnsubscribeConfirmation') { // Unsubscribed in error? You can resubscribe by visiting the endpoint // provided as the message's SubscribeURL field. file_get_contents($message['SubscribeURL']); }
本地测试
在 Web 应用程序中使用 webhooks 的一大挑战是测试与服务集成的过程。使用如 ngrok 和 PHP 内置的 Web 服务器 等工具,测试 SNS 通知的集成可以相对简单。我们的一篇博客文章 在本地测试 Amazon SNS 的 Webhooks 展示了测试的一个好方法。
注意:博客文章中的代码示例针对 SDK 版本的 2 中的消息验证器,但可以很容易地适应使用这个版本。
特别感谢
特别感谢 Julian Vidal,他帮助创建了 版本 2 的 AWS SDK for PHP 的初始实现。
贡献
我们努力为 AWS 服务提供高质量和有用的 SDK,我们非常重视社区反馈和贡献。在提交任何问题或拉取请求之前,请先查看我们的 贡献指南,以确保我们拥有所有必要的信息来有效响应您的错误报告或贡献。