Gửi Web Push API

Tạo khoá VAPID và gửi thông báo Web Push tới subscription của trình duyệt, mã hoá payload theo RFC 8291, có TTL, urgency và topic.

GETPOSThttps://apibox.io.vn/v1/web-push
Tiện ích lập trình▶ Dùng thử online

Gọi không tham số (hoặc action=generate_keys) để nhận một cặp khoá VAPID P-256 mới dạng base64url: public_key dùng làm applicationServerKey khi gọi pushManager.subscribe() trên trình duyệt, private_key giữ ở máy chủ của bạn. Khoá chỉ được tạo cho phản hồi này, không bao giờ được lưu hay ghi log.

action=send gửi thông báo tới một subscription (JSON PushSubscription lấy từ trình duyệt: endpoint + keys.p256dh + keys.auth) hoặc tối đa 50 subscriptions. payload (văn bản hoặc JSON, tối đa 4.078 byte) được mã hoá aes128gcm (RFC 8291) bằng WebCrypto ECDH, HKDF, AES-GCM, và yêu cầu được ký bằng JWT VAPID ES256 (RFC 8292) từ đối tượng vapid của bạn (subject = địa chỉ liên hệ mailto: hoặc https:, public_key, private_key). Đặt ttl (giây, mặc định 86400), urgency (very-low, low, normal, high) và topic (thay thế tin chưa giao có cùng topic).

Mỗi kết quả có mã HTTP status của dịch vụ push; gone: true (404 / 410) nghĩa là subscription đã hết hạn và nên xoá. action=encrypt trả về body đã mã hoá và header mà không gửi, để gỡ lỗi hoặc tự gửi. Không có gì được lưu: subscription và khoá chỉ tồn tại trong yêu cầu.

Tham số

TênVị tríKiểuBắt buộcMặc định
actionbody|querystringkhônggenerate_keysgenerate_keys (mặc định khi không có subscription), send hoặc encrypt (tạo yêu cầu nhưng không gửi).
subscriptionbodyobjectkhôngJSON PushSubscription: {"endpoint": "https://...", "keys": {"p256dh": "...", "auth": "..."}}.
subscriptionsbodyarraykhôngTối đa 50 subscription cho một lần gửi.
payloadbodystringkhôngNội dung tin hoặc đối tượng JSON (tối đa 4.078 byte); bỏ trống để gửi push không dữ liệu.
vapidbodyobjectkhông{"subject": "mailto:ban@example.com", "public_key": "...", "private_key": "..."}, bắt buộc với send.
ttlbody|querynumberkhông86400Số giây dịch vụ push giữ tin khi thiết bị offline (0-2.419.200).
urgencybody|querystringkhôngnormalvery-low, low, normal hoặc high.
topicbody|querystringkhôngTối đa 32 ký tự base64url; tin mới cùng topic thay thế tin chưa giao.

Ví dụ

curl -X POST "https://apibox.io.vn/v1/web-push" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"send","subscription":{"endpoint":"https://fcm.googleapis.com/fcm/send/abc","keys":{"p256dh":"BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4","auth":"BTBZMqHH6r4Tts7J_aSIgg"}},"payload":{"title":"Đơn hàng #1024","body":"Đã giao thành công"},"ttl":3600,"urgency":"high","vapid":{"subject":"mailto:ops@example.com","public_key":"BECWGWmqQ8K_C-FP8oHoC2GdtyNmQRTEHe8z3qsK5VDKHjkpMUG-RRrKyy-jczLPSqC1y15k6r_iPaGLt39VFOw","private_key":"(your private key)"}}'

Kết quả trả về

{
  "sent": 0,
  "failed": 1,
  "gone": 1,
  "ttl": 3600,
  "urgency": "high",
  "topic": null,
  "payload_bytes": 61,
  "results": [
    {
      "index": 0,
      "host": "fcm.googleapis.com",
      "ok": false,
      "status": 410,
      "gone": true,
      "retry_after": null,
      "message_id": null,
      "response": "push subscription has unsubscribed or expired.\n"
    }
  ]
}

Ứng dụng

  • Gửi thông báo đơn hàng, giao hàng từ backend PHP, Apps Script hoặc no-code
  • Tạo khoá VAPID cho PWA mới mà không cần cài thư viện web-push
  • Dọn subscription hết hạn nhờ cờ gone
  • Gỡ lỗi service worker bằng một tin push mã hoá chuẩn

Hỏi đáp

Có lưu khoá riêng VAPID hay subscription của tôi không?

Không. Khoá và subscription chỉ dùng trong yêu cầu, không ghi vào bộ nhớ hay log. Hãy gửi kèm trong mỗi lần gọi.

Dùng được với trình duyệt nào?

Mọi trình duyệt hỗ trợ Push API chuẩn có VAPID: Chrome / Edge (FCM), Firefox (Mozilla autopush), Safari 16+ (Apple), Opera, Samsung Internet. Endpoint trong subscription quyết định dịch vụ push.

Mã 410 nghĩa là gì?

Dịch vụ push báo subscription không còn tồn tại (người dùng huỷ đăng ký hoặc xoá dữ liệu trình duyệt). Kết quả có gone: true; hãy xoá subscription đó khỏi cơ sở dữ liệu.

API liên quan

Bắt đầu với 1.000 request miễn phí mỗi tháng. Nhận API key miễn phí →