通过 Amazon SNS 发送 SMS 并获取投递状态

通过 amazon sns 发送 sms 并获取投递状态

本文介绍了如何使用 Amazon SNS 服务通过 PHP SDK 发送 SMS 消息,并重点讲解了如何利用 CloudWatch API 获取 SMS 消息的投递状态,包括成功或失败的信息。通过监控 CloudWatch 日志,开发者可以实时追踪 SMS 消息的发送情况,从而更好地管理和优化短信服务。

Amazon Simple Notification Service (SNS) 是一种快速、灵活、完全托管的推送消息服务,可以用于发送 SMS 消息。然而,直接通过 SNS 获取 SMS 投递状态并非直接可行。本文将介绍如何利用 Amazon CloudWatch API 来间接获取 SMS 消息的投递状态。

使用 Amazon SNS 发送 SMS

首先,我们需要使用 Amazon PHP SDK 来发送 SMS 消息。以下是一个示例代码:

 'eu-west-1', // 替换为你的 AWS 区域    'version' => 'latest',    'credentials' => [        'key' => 'YOUR_AWS_ACCESS_KEY_ID', // 替换为你的 AWS Access Key ID        'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY' // 替换为你的 AWS Secret Access Key    ]]);$result = $sdk->publish([    'Message' => 'This is a test message.',    'PhoneNumber' => '+123456789', // 替换为你的目标电话号码,包含国家码    'MessageAttributes' => [        'AWS.SNS.SMS.SenderID' => [            'DataType' => 'String',            'StringValue' => 'MySenderID' // 可选,替换为你的自定义 Sender ID        ]    ]]);print_r( $result );?>

代码解释:

引入 SDK: require ‘vendor/autoload.php’; 引入 Composer 自动加载器,确保可以使用 AWS PHP SDK。创建 SNS 客户端: new AwsSnsSnsClient([…]) 创建一个 SNS 客户端实例,需要配置 AWS 区域、版本和凭证。publish() 方法: $sdk->publish([…]) 调用 publish() 方法发送 SMS 消息。Message: SMS 消息的内容。PhoneNumber: 接收 SMS 消息的电话号码,必须包含国家码。MessageAttributes: 可选参数,用于设置消息属性,例如 SenderID。

注意事项:

确保已安装 AWS PHP SDK。可以使用 Composer 安装:composer require aws/aws-sdk-php替换 YOUR_AWS_ACCESS_KEY_ID 和 YOUR_AWS_SECRET_ACCESS_KEY 为你的 AWS 凭证。替换 eu-west-1 为你的 AWS 区域。电话号码必须包含国家码,例如 +123456789。SenderID 是可选的,但建议设置,以便接收者可以识别消息来源。

获取 SMS 投递状态

虽然 SNS 本身不直接提供投递状态的回调 URL,但我们可以通过 CloudWatch Logs 来获取这些信息。

步骤:

启用 SNS 消息投递状态日志: 在 AWS 控制台中,进入 SNS 服务,选择你的 SNS 主题,找到 “Delivery status logging” 部分,启用 SMS 消息的日志记录。你需要指定一个 IAM 角色,该角色需要具有写入 CloudWatch Logs 的权限。

使用 CloudWatch API 获取日志事件: 使用 CloudWatch API (例如 GetLogEvents) 来读取日志组中的日志。

以下是一个使用 AWS PHP SDK 获取 CloudWatch Logs 的示例代码:

 'eu-west-1', // 替换为你的 AWS 区域    'version' => 'latest',    'credentials' => [        'key' => 'YOUR_AWS_ACCESS_KEY_ID', // 替换为你的 AWS Access Key ID        'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY' // 替换为你的 AWS Secret Access Key    ]]);$logGroupName = '/aws/sns/sms-deliveries'; // SNS SMS 投递状态日志组名称$logStreamName = 'YourLogStreamName'; // 替换为你的日志流名称,可以通过查询CloudWatch Logs找到$result = $client->getLogEvents([    'logGroupName' => $logGroupName,    'logStreamName' => $logStreamName,    'startFromHead' => true, // 从日志流的开头开始读取    'limit' => 10 // 读取的最大日志事件数量]);foreach ($result['events'] as $event) {    echo $event['message'] . "n";    // 解析日志消息,获取投递状态    // 例如,可以使用 json_decode() 解析 JSON 格式的日志消息}?>

代码解释:

创建 CloudWatch Logs 客户端: new AwsCloudWatchLogsCloudWatchLogsClient([…]) 创建一个 CloudWatch Logs 客户端实例,需要配置 AWS 区域、版本和凭证。getLogEvents() 方法: $client->getLogEvents([…]) 调用 getLogEvents() 方法获取日志事件。logGroupName: SNS SMS 投递状态日志组的名称,通常为 /aws/sns/sms-deliveries。logStreamName: 日志流的名称。你需要在 CloudWatch Logs 中找到对应的日志流名称。 日志流名称通常包含日期信息。startFromHead: 设置为 true 表示从日志流的开头开始读取。limit: 读取的最大日志事件数量。解析日志消息: 遍历 $result[‘events’],每个 $event[‘message’] 包含一个日志消息。你需要解析这些消息来获取投递状态。 SNS SMS 投递状态日志通常是 JSON 格式。

注意事项:

确保已安装 AWS PHP SDK。替换 YOUR_AWS_ACCESS_KEY_ID 和 YOUR_AWS_SECRET_ACCESS_KEY 为你的 AWS 凭证。替换 eu-west-1 为你的 AWS 区域。替换 YourLogStreamName 为你的日志流名称。你需要根据 SNS 的日志格式来解析日志消息,提取投递状态信息。

总结

通过以上步骤,你可以使用 Amazon SNS 发送 SMS 消息,并利用 CloudWatch API 获取 SMS 消息的投递状态。 虽然这种方法不如直接的回调 URL 方便,但它是目前获取 SNS SMS 投递状态的主要方式。 你需要定期查询 CloudWatch Logs,并解析日志消息,才能实时监控 SMS 消息的发送情况。 此外,需要注意 IAM 角色权限的配置,确保 SNS 可以写入 CloudWatch Logs,并且你的应用程序可以读取 CloudWatch Logs。

以上就是通过 Amazon SNS 发送 SMS 并获取投递状态的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1325350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月12日 11:55:25
下一篇 2025年12月12日 11:55:38

相关推荐

  • 如何解决PHP cURL请求中HTTP 400错误:正确设置HTTP头部的方法

    本文深入探讨php curl请求中常见的http 400错误,特别是当错误信息为“your browser sent an invalid request”时。核心问题通常出在http头部的设置方式上,尤其是将多个头部信息错误地拼接成一个长字符串。教程将详细解释`curlopt_httpheader…

    好文分享 2025年12月12日
    000
  • PHP批量数据处理_PHP数组批量处理与数据库批量操作

    掌握PHP批量处理需先拆分数组并批量操作数据库。使用array_chunk分批处理大数据,避免内存溢出;结合array_map高效转换数据格式;通过拼接多值INSERT语句或PDO预处理批量插入,提升性能;利用事务确保数据一致性;针对批量更新采用CASE WHEN或临时表+JOIN优化;合理设置me…

    2025年12月12日
    000
  • PHP cURL发送复杂JSON数据及变量的最佳实践

    本文旨在解决%ignore_a_1% curl在发送包含变量的复杂json数据时遇到的常见问题。核心在于避免手动拼接json字符串,而是通过构建php多维数组,并使用`json_encode()`将其转换为标准json格式,再通过`curlopt_postfields`发送。文章将提供详细的示例代码…

    2025年12月12日
    000
  • 解决Amazon Advertising API创建关键词时返回422错误

    本文档旨在帮助开发者解决在使用Amazon Advertising API创建关键词时遇到的422错误。该错误通常表示请求体中的数据格式不正确。本文将提供详细的解决方案,包括正确的请求数据格式和示例代码,以确保成功创建关键词。 在使用Amazon Advertising API创建关键词时,如果收到…

    2025年12月12日
    000
  • 在外部PHP页面中独立加载WordPress页脚:方法与注意事项

    本文详细介绍了如何在独立的php页面中仅加载wordpress的页脚部分,避免同时加载页眉的问题。通过引入wordpress核心文件并使用`get_footer()`函数,配合必要的`$wp_styles`初始化,实现页脚的独立渲染。文章还讨论了这种方法的潜在html结构问题,并提供了基于curl/…

    2025年12月12日
    000
  • 在非Laravel环境中使用动态UI:HTMX实践指南

    本文探讨了在不使用laravel框架的情况下,如何实现类似livewire的动态前端交互。针对livewire与laravel的紧密集成,我们介绍了htmx作为一种轻量级且框架无关的替代方案,它允许开发者直接通过html属性驱动现代浏览器功能,从而简化了纯php项目中的前后端通信,实现了类似ajax…

    2025年12月12日
    000
  • 使用 PHP PDO 安全高效连接 MySQL 数据库并执行数据查询

    本教程详细介绍了如何使用 PHP Data Objects (PDO) 扩展安全高效地连接 MySQL 数据库,并从指定数据表中查询所有数据。文章涵盖了 PDO 连接字符串的构建、错误处理机制、预处理语句的应用以及数据遍历的方法,旨在帮助开发者掌握 PHP 中数据库操作的最佳实践。 在现代 Web …

    2025年12月12日
    000
  • Laravel 中如何比较日期和日期时间?

    本文介绍了在 Laravel 项目中,当数据库存储的是日期时间格式,而用户搜索输入的是日期格式时,如何进行有效的数据查询。我们将探讨使用 Eloquent ORM 和 DB facade 的 `whereDate` 方法,来实现日期和日期时间字段的比较,并提供相应的代码示例和注意事项。 在 Lara…

    2025年12月12日
    000
  • Prettier PHP插件配置详解:理解与实践项目级格式化

    本文详细阐述了prettier php插件的配置方法。prettier通过`cosmiconfig`支持多种项目级配置文件,如`package.json`、`.prettierrc`系列文件或`prettier.config.js`。配置解析从文件所在目录向上查找,确保团队协作时代码格式化的一致性,…

    2025年12月12日
    000
  • WooCommerce 限制订单仅包含单个类型的商品:订阅商品或非订阅商品

    本文旨在解决 WooCommerce 商店中限制订单商品类型的需求,即订单中只能包含订阅商品或非订阅商品,不能同时包含两者。通过自定义 WooCommerce 的 `woocommerce_add_to_cart_validation` 过滤器,我们将实现以下功能:当购物车中已存在订阅商品时,阻止添…

    2025年12月12日
    000
  • 解决Svelte应用跨域访问PHP文件的CORS问题

    当svelte应用尝试从外部主机上的php文件获取数据失败时,即使对文本文件有效,这通常是由于浏览器强制执行的跨域资源共享(cors)策略所致。本教程将深入探讨cors机制,并提供详细的php服务器端配置方案,通过设置`access-control-allow-origin`等http响应头,使sv…

    2025年12月12日
    000
  • 使用PHP分割关联数组并按键分组:生成Chart.js所需的数据格式

    本文档旨在提供一种使用PHP分割关联数组,并根据特定键(例如日期和类型)将其分组的方法,最终生成适用于Chart.js图表的数据格式。我们将通过示例代码,详细讲解如何从原始数据中提取日期标签、收入数据和支出数据,并处理缺失数据的情况,确保生成的数据能够直接用于Chart.js进行可视化。 数据准备与…

    2025年12月12日
    000
  • PHP Symfony 中优化 if 循环的技巧

    本文旨在提供一种在 Symfony 框架中优化 `if` 循环的方法,特别是当需要根据请求参数动态添加角色时。通过使用 `ArrayObject` 和循环结构,可以有效地减少代码冗余,提高代码的可读性和可维护性,同时优化内存使用。 在 Symfony 应用中,经常需要根据请求参数动态地赋予用户不同的…

    2025年12月12日
    000
  • Svelte应用中PHP跨域请求的解决方案:CORS配置指南

    本文旨在解决svelte应用通过xmlhttprequest或fetch请求外部php文件时遇到的跨域问题。核心在于理解并配置服务器端的cors(跨域资源共享)策略。通过在php文件中设置特定的http响应头,可以允许来自不同源的web应用访问服务器资源,确保客户端与服务器之间的数据通信顺畅无阻。 …

    2025年12月12日 好文分享
    000
  • 如何使用 PHP 检查字符串是否包含特定单词

    本文旨在讲解如何使用 PHP 函数 str_contains() 来判断一个字符串(例如 URL)是否包含特定的子字符串,并根据判断结果返回相应的值。我们将通过示例代码演示如何正确使用该函数,并讨论常见的错误以及如何避免。 在 PHP 中,判断一个字符串是否包含另一个字符串是一个常见的任务。str_…

    2025年12月12日
    000
  • Laravel 中限制用户在购物车会话中添加来自不同店铺的商品

    本文旨在解决 Laravel 应用中,如何限制用户在购物车会话中添加来自不同店铺(`sponsor_id`)的商品。我们将探讨两种实现方案:一种是在添加商品时检查购物车中已存在的商品是否来自同一店铺;另一种是将商品按店铺 ID 分组存储在不同的购物车中。通过本文,你将学会如何根据业务需求选择合适的方…

    2025年12月12日
    000
  • PHP微服务架构怎么做_PHP微服务开发实践

    答案:构建PHP微服务需合理拆分服务、选用HTTP或消息队列通信、通过API网关统一入口、保障数据最终一致性,并以容器化部署与集中监控支撑运维,结合现代工具链可实现高效稳定的微服务体系。 构建PHP微服务架构需要从服务拆分、通信机制、数据管理到部署运维等多个方面综合考虑。虽然PHP常被用于传统单体应…

    2025年12月12日
    000
  • Laravel 中如何比较日期与日期时间类型数据?

    本文旨在解决在 Laravel 项目中,当数据库存储的是日期时间类型(DateTime),而用户仅输入日期(Date)进行搜索时,如何有效地进行数据比较和检索的问题。我们将介绍使用 Eloquent ORM 和 DB facade 的 `whereDate` 方法来实现精确的日期匹配,并提供相应的代…

    2025年12月12日
    000
  • Symfony EntityType 字段默认值设置指南:从会话数据到表单绑定

    本教程详细阐述如何在 symfony 表单中为 `entitytype` 字段设置默认选中值。核心方法是通过预填充表单的数据对象,并强调处理 doctrine 管理实体的重要性。文章还将探讨 `data` 选项的使用限制及 javascript 动态设置的场景,确保 `entitytype` 字段能…

    2025年12月12日
    000
  • PHP 数组按键值拆分与重组:生成图表数据的实用指南

    本文档旨在提供一种使用 PHP 将包含混合类型(例如收入和支出)的关联数组数据,按照日期进行拆分,并重组为适用于图表(如 Chart.js)的数据格式的有效方法。我们将通过示例代码详细讲解如何提取日期标签,并分别创建收入和支出数据点数组,同时处理缺失日期的数据填充问题。 在数据可视化领域,数据的预处…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信