You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel 8中使用AWS SNS发送推送通知

Laravel 8 集成 AWS SNS 发送推送通知实现步骤

1. 安装AWS SDK依赖

通过Composer安装AWS官方的Laravel适配包:
composer require aws/aws-sdk-php-laravel:~3.0
如果需要自定义配置,可执行发布命令生成配置文件:
php artisan vendor:publish --provider="Aws\Laravel\AwsServiceProvider"
注意:AWS SDK要求PHP版本不低于7.2,和Laravel 8的版本要求匹配

2. 配置AWS凭证

在项目根目录的.env文件中添加以下配置:

AWS_ACCESS_KEY_ID=你的AWS访问密钥ID
AWS_SECRET_ACCESS_KEY=你的AWS访问密钥
AWS_DEFAULT_REGION=你的SNS实例所在区域,示例:ap-northeast-1
AWS_SNS_PLATFORM_APPLICATION_ARN=你的SNS平台应用ARN(安卓/苹果应用对应创建的ARN)

配置所用的IAM账号需要至少开通sns:Publish权限,避免权限不足导致发送失败。

3. 封装SNS推送服务

在app/Services目录下创建SnsService.php服务类:

<?php

namespace App\Services;

use Aws\Sns\SnsClient;
use Illuminate\Support\Facades\Log;

class SnsService
{
    protected $snsClient;
    protected $platformApplicationArn;

    public function __construct()
    {
        $this->snsClient = new SnsClient([
            'version' => 'latest',
            'region' => env('AWS_DEFAULT_REGION'),
            'credentials' => [
                'key' => env('AWS_ACCESS_KEY_ID'),
                'secret' => env('AWS_SECRET_ACCESS_KEY'),
            ],
        ]);
        $this->platformApplicationArn = env('AWS_SNS_PLATFORM_APPLICATION_ARN');
    }

    /**
     * 给单个设备发送推送
     * @param string $deviceToken 移动端设备token
     * @param string $title 推送标题
     * @param string $body 推送内容
     * @param array $extra 自定义扩展参数
     * @return bool|array
     */
    public function sendPushToDevice(string $deviceToken, string $title, string $body, array $extra = [])
    {
        try {
            // 创建设备终端ARN
            $endpointResult = $this->snsClient->createPlatformEndpoint([
                'PlatformApplicationArn' => $this->platformApplicationArn,
                'Token' => $deviceToken,
            ]);
            $endpointArn = $endpointResult['EndpointArn'];

            // 适配不同平台的推送payload格式
            $payload = [
                'default' => $body,
                'APNS' => json_encode([
                    'aps' => [
                        'alert' => [
                            'title' => $title,
                            'body' => $body,
                        ],
                        'sound' => 'default',
                        'badge' => 1,
                    ],
                    'extra' => $extra,
                ]),
                'GCM' => json_encode([
                    'notification' => [
                        'title' => $title,
                        'body' => $body,
                        'sound' => 'default',
                    ],
                    'data' => $extra,
                ]),
            ];

            // 发起推送请求
            $result = $this->snsClient->publish([
                'TargetArn' => $endpointArn,
                'MessageStructure' => 'json',
                'Message' => json_encode($payload),
            ]);

            return $result->toArray();
        } catch (\Exception $e) {
            Log::error('SNS推送发送失败: ' . $e->getMessage(), [
                'device_token' => $deviceToken,
                'trace' => $e->getTraceAsString()
            ]);
            return false;
        }
    }
}

4. 调用服务发送推送

你可以在控制器、任务队列等位置直接调用封装好的服务,示例控制器代码:

<?php

namespace App\Http\Controllers;

use App\Services\SnsService;
use Illuminate\Http\Request;

class PushNotificationController extends Controller
{
    public function send(Request $request, SnsService $snsService)
    {
        $validated = $request->validate([
            'device_token' => 'required|string',
            'title' => 'required|string|max:200',
            'body' => 'required|string|max:1000',
            'extra' => 'array|nullable',
        ]);

        $result = $snsService->sendPushToDevice(
            $validated['device_token'],
            $validated['title'],
            $validated['body'],
            $validated['extra'] ?? []
        );

        return $result 
            ? response()->json(['code' => 200, 'msg' => '推送发送成功', 'data' => $result])
            : response()->json(['code' => 500, 'msg' => '推送发送失败,请查看日志排查'], 500);
    }
}

5. 常见问题排查

  • 权限类错误优先检查IAM账号的SNS权限配置,以及区域、ARN是否填写正确
  • 推送无响应时优先检查设备token有效性,无效token会触发SNS异常
  • iOS推送需要注意SNS平台应用选择的是沙箱还是生产环境,需要和打包环境保持一致

内容的提问来源于stack exchange,提问作者Bhargav Rangani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:54:09