如何使⽤PHP发送Web推送通知
Web Push API 允许您向 Web 浏览器和 API 发送推送通知。虽然⼤部分逻辑发⽣在浏览器中,但您仍然需要⼀个服务器端组件来⽣成通知。以下是使⽤ PHP 实现 Web 推送后端的⽅法。
先决条件
出于本教程的⽬的,我们假设您熟悉在 PHP 中创建 HTTP API 的基础知识。您需要使⽤ Web 框架公开⼀些公共端点。这些将由您的浏览器内 JavaScript 调⽤以注册和注销设备。
本⽂不会涉及浏览器端代码或其⼯作⽅式。您需要组合⼀个服务⼯作者来响应传⼊的推送事件并向⽤户显⽰通知。
概括地说,Web Push 流程如下所⽰:
1. 在浏览器中注册了推送订阅。浏览器向您的 JavaScript 发出⼀个唯⼀的端点 URL。
2. 您的 JavaScript 将订阅数据发送到您的服务器并识别它适⽤的⽤户。
3. 当您的后端需要发送推送通知时,创建有效负载并将其发送到作为订阅数据的⼀部分报告的端点 URL。
4. ⽤户的浏览器将通过供应商的通知传递平台接收有效载荷。您的 JavaScript 服务⼯作者处理后续事件并使⽤浏览器的通知 API 来提
醒⽤户。
以下是如何实现步骤 1 到 3 的服务器端⽅⾯。
获取设置
我们将web-push通过 minishlink 使⽤ Packagist 包。这将与每个浏览器通知平台的交互抽象化,因此您不必⼿动区分端点类型。
使⽤ Composer 将包添加到您的项⽬中:
composer require minishlink/web-push
gmp要使⽤最新版本,您需要带有、mbstring、curl和openssl扩展名的 PHP 7.2 或更⾼版本。如果您必须使⽤较旧的 PHP 版本,请将包锁定到较早的版本以保持兼容性。
该库公开了⼀个核⼼WebPush类,其中包含允许您单独或批量发送通知的⽅法。订阅由类的实例表⽰Subscription。
提供 VAPID 密钥
对符合标准的 Web Push ⽣态系统的信任是通过使⽤VAPID 密钥来实现的。您的服务器需要⼀个 VAPID 密钥对,以便它可以对浏览器进⾏⾝份验证。公钥应通过 API 端点公开。
您可以使⽤包⽣成 VAPID 密钥集web-push:
use Minishlink\WebPush\VAPID;
$keyset = VAPID::createVapidKeys();
// public key - this needs to be accessible via an API endpoint
echo $keyset["publicKey"];
// private key - never expose this!
echo $keyset["privateKey"];
file_put_contents("vapid.json",json_encode($keyset));
为您的系统⽣成密钥并将它们存储到永久位置。添加⼀个 API 端点,以便您的客户端 JavaScript 可以检索公钥。这将⽤于设置浏览器的推送订阅。如果⽤户的设备已使⽤相应的 VAPID 私钥签名,则他们将接受传⼊的推送事件。
注册推送订阅
该序列的下⼀步是接收来⾃您的客户的推送订阅请求。⼀旦浏览器确认了新的推送订阅,您的 JavaScript 应该将订阅的端点 URL 和相关的⾝份验证密钥发送到您的服务器。将这些详细信息与⽤户 ID ⼀起存储,以便您稍后可以检索链接到该⽤户的所有推送注册设备。
我们省略了此步骤的代码⽰例,因为实现取决于您的数据存储层和您的 JavaScript 发送的值。通常,这将是PushSubscription对象的JSON 表⽰。您需要⼀组简单的数据库⽀持的 CRUD API 端点来创建订阅、替换现有订阅以及在⽤户取消订阅时请求删除。
准备订阅
⼀旦客户成功注册,您就可以开始使⽤web-push库发送通知。⾸先创建⼀个WebPush类的实例:
use Minishlink\WebPush\WebPush;
$webPush = new WebPush([
"VAPID"=>[
"subject"=>"example",
"publicKey"=>"VAPID_Public_Key_Here",
"privateKey"=>"VAPID_Private_Key_Here"
]
]);
WebPush每次发送通知时,您都可以重复使⽤⼀个实例。该库需要使⽤您之前⽣成的 VAPID 密钥集进⾏配置。密钥应编码为 Base64,但如果您使⽤库创建它们,则会为您处理。
VAPIDsubject⽤于识别您的服务器及其联系⽅式。您可以提供⽹站 URL 或mailto:电⼦邮件地址链接。
接下来,您需要检索您将发送到的推送订阅。使⽤您的数据访问系统查与您要发送到的⽤户关联的推送端点 URL。将每个订阅转换为⼀个Subscription实例:
use Minishlink\WebPush\Subscription;
// Get user's
// SELECT * FROM push_subscriptions WHERE user_id = 123456
$subscription = Subscription::create([
"endpoint"=>"le/...",
"contentEncoding"=>"aesgcm",
"authToken"=>"<auth token from JavaScript PushSubscription object>"
"keys"=>[
"auth"=>"<auth token from JavaScript PushSubscription object>",
"p256dh"=>"<p256dh token from JavaScript PushSubscription object>"
]
]
);
的auth属性PushSubscription重复两次,以应对浏览器服务使⽤的两个不同版本的规范。P256DH 属性是另⼀个公钥,在订阅设置时应提供。
该web-push库与 Chrome 和 Firefox 推送端点兼容。它还可以与任何其他符合当前标准的 Web 推送实现⼀起使⽤。
发送通知
现在结合您的WebPush和Subscription实例发送通知:
$result = $webPush ->sendOneNotification(
$subscription,
json_encode([
"message"=>"Demo notification",
"foo"=>"bar"
])
);
呼叫sendOneNotification()为单个通知提供即时交付。在这种情况下,有效负载是具有两个属性的 JSON 编码数组。这取决于您发送的数据和使⽤的格式——您的 JavaScript 客户端按原样接收数据并可以在必要时对其进⾏解释。
发送通知会返回⼀个结果类,让您检查操作是否成功:
if($result ->isSuccess()){
// all good
}
else{
// something went wrong
error_log($result ->getReason());
// provides raw HTTP response data
error_log($result ->getResponse());
}
如果发⽣错误,您可以采取措施重试或取消交付。
通知订阅也可能过期。调⽤isSubscriptionExpired()结果类的⽅法以确定这是否是失败的原因。在这种情况下,您可以从数据库中删除订阅,确保您不会向死端点发送任何其他内容。
批处理通知
通知可以通过⼀个⽅法调⽤批量发送:
$webPush ->queueNotification($subscription,["msg"=>"first"]);
$webPush ->queueNotification($subscription,["msg"=>"second"]);
foreach($webPush ->flush() as $i => $result){
php的工作流程echo("Notification $i was ".($result ->isSuccess()?"sent":"not sent"));
}
当您知道您将在短时间内发送⼤量通知时,这很有⽤。将所有有效负载排队并web-push以最佳⽅式交付它们。
flush()您可以通过将整数传递给⽅法来限制单个发送的通知数量:
$webPush ->flush(100);// send 100 messages
默认值为1000。
通知选项
sendOneNotification()并queueNotification()接受以下选项作为第三个数组参数:
TTL–
控制浏览器的通知平台在通知⽆法⽴即传递到⽤户设备时将保留多长时间。如果⽤户的设备处于离线状态,平台默认会在接下来的四个星期内尝试交付它。如果您要发送下周不相关的通知,请相应地调整 TTL,以便⽤户不会看到过时的内容。
urgency–接受normal,low或very-low作为值。⼀些平台可能会使⽤它来调整通知传递的频率。进⼊省电模式的设备可能会暂停发送⾮紧急通知。
batchSize– 这与上述论点具有相同的效果flush()。
您可以使⽤WebPush构造函数的第⼆个参数配置默认选项值:
$webPush = new WebPush(["VAPID"=>[...]],["TTL"=>3600]);
概括
该web-push库使使⽤ PHP 发送 Web 推送通知变得容易。您可以在各种浏览器平台上获得⼀个抽象层,⽀持批处理、错误处理和所有Web 推送功能。
Web Push 机制是⼀种不寻常的浏览器系统,因为它依赖于您⾃⼰提供的远程服务器端组件。这可能使它看起来不透明和技术性。在实践中,创建⼀个简单的 PHP 后端既快速⼜容易;前端实现通常是更耗时的⽅⾯,特别是如果您还没有使⽤服务⼯作者功能。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论