如何在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
相关产品推荐
相关产品推荐

