Hogyan kösd be a push.onemin.hu Web Push szolgáltatást a mobilappodba / weboldaladba
és a backendedbe. Tesztpanel · Kezdőlap.
/api/send-et az adott usernek, amikor push kell.mobil/web ─► /subscribe?appId=&userId= (a böngésző feliratkozik)
│
▼
push.onemin.hu ◄── /api/send (a backended hívja)
│
▼
push provider (Google/Mozilla/Apple)
│
▼
user böngészője megkapja
Minden külön mobilappnak vagy weboldalnak külön appId-t és saját api kulcsot adsz. Ez egyszeri lépés.
curl -X POST https://push.onemin.hu/api/apps \
-H "Content-Type: application/json" \
-H "X-API-Key: $GLOBAL_API_KEY" \
-d '{
"appId": "catch",
"name": "Catch",
"apiKey": "catch-secret-api-key"
}'
GLOBAL_API_KEY a VPS .env-ben van. Tartsd titokban — minden app fölött jogot ad.
A per-app apiKey az, amit majd a saját backendedbe teszel.
Az appodban vagy a weboldaladon egy link / gomb erre vezet:
https://push.onemin.hu/subscribe?appId=catch&userId=123
A userId a te belső azonosítód a felhasználóra. Lehet szám, UUID, bármi.
A user megnyomja a „Feliratkozom" gombot → engedélyezi az értesítéseket → kész. A subscription elmentődik a DB-be.
curl -X POST https://push.onemin.hu/api/send \
-H "Content-Type: application/json" \
-H "X-API-Key: catch-secret-api-key" \
-d '{
"appId": "catch",
"userId": "123",
"title": "Új foglalás",
"body": "Valaki most foglalt nálad.",
"url": "https://app.example.com/bookings/123"
}'
A user böngészőjében megjelenik az értesítés. Ha rákattint, megnyílik az url.
A mobilapp csak megnyitja a subscribe URL-t a rendszerböngészőben. Nincs SDK, nincs natív kód a push-hoz.
// build.gradle: implementation "androidx.browser:browser:1.8.0"
val url = "https://push.onemin.hu/subscribe?appId=catch&userId=$userId"
val intent = androidx.browser.customtabs.CustomTabsIntent.Builder().build()
intent.launchUrl(context, android.net.Uri.parse(url))
import SafariServices
let url = URL(string: "https://push.onemin.hu/subscribe?appId=catch&userId=\(userId)")!
let vc = SFSafariViewController(url: url)
present(vc, animated: true)
import { Linking } from 'react-native';
Linking.openURL(
`https://push.onemin.hu/subscribe?appId=catch&userId=${userId}`
);
// pubspec.yaml: url_launcher: ^6.2.0
import 'package:url_launcher/url_launcher.dart';
await launchUrl(
Uri.parse('https://push.onemin.hu/subscribe?appId=catch&userId=$userId'),
mode: LaunchMode.externalApplication,
);
<a href="https://push.onemin.hu/subscribe?appId=catch&userId=123">
Értesítések bekapcsolása
</a>
Csak HTTPS POST. Bármelyik szerveroldali nyelvből egysoros.
curl -X POST https://push.onemin.hu/api/send \
-H "Content-Type: application/json" \
-H "X-API-Key: catch-secret-api-key" \
-d '{
"appId": "catch",
"userId": "123",
"title": "Új foglalás",
"body": "Valaki most foglalt nálad."
}'
async function sendPush(userId, title, body, url) {
const res = await fetch('https://push.onemin.hu/api/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.PUSH_API_KEY,
},
body: JSON.stringify({ appId: 'catch', userId, title, body, url }),
});
if (!res.ok) throw new Error('push hiba: ' + await res.text());
return res.json();
}
function sendPush($userId, $title, $body, $url = null) {
$payload = ['appId' => 'catch', 'userId' => $userId, 'title' => $title, 'body' => $body];
if ($url) $payload['url'] = $url;
$ch = curl_init('https://push.onemin.hu/api/send');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: ' . getenv('PUSH_API_KEY'),
],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$out = curl_exec($ch);
curl_close($ch);
return json_decode($out, true);
}
import os, requests
def send_push(user_id, title, body, url=None):
payload = {"appId": "catch", "userId": user_id, "title": title, "body": body}
if url: payload["url"] = url
r = requests.post(
"https://push.onemin.hu/api/send",
headers={"X-API-Key": os.environ["PUSH_API_KEY"]},
json=payload, timeout=10,
)
r.raise_for_status()
return r.json()
| Method | Path | Auth | Mire való |
|---|---|---|---|
| GET | /health | — | Élet-ellenőrzés. |
| GET | /subscribe?appId&userId | — | A user feliratkozó oldala. |
| GET | /test | — | Tesztpanel (subscribe + send egy felületen). |
| GET | /api/public-key | — | VAPID public key a böngészőnek. |
| POST | /api/subscriptions | — | A böngésző menti a subscription-jét. |
| DELETE | /api/subscriptions/:appId/:userId | — | A user összes subscription-je inaktívvá válik. |
| GET | /api/subscriptions/:appId/:userId | app key | Subscription lista. |
| POST | /api/send | app key | Push egy adott usernek. |
| POST | /api/broadcast | app key | Push az adott app összes feliratkozójának. |
| POST | /api/apps | global | Új app létrehozása / frissítése. |
Auth header: X-API-Key. Egy app api kulcsa nem tud más app nevében küldeni — az appId-t a szerver ellenőrzi.
| Mező | Típus | Kötelező? | Megjegyzés |
|---|---|---|---|
appId | string | igen | Egyeznie kell az api key appjával. |
userId | string | csak /api/send-nél | A te belső user azonosítód. |
title | string | igen | Az értesítés címe, félkövéren. |
body | string | igen | Az értesítés szövege. |
url | string | nem | Kattintáskor ide nyit. |
icon | URL | nem | Saját ikon URL. Default: /icon-192.png. |
badge | URL | nem | Android kis monokróm ikon. |
data | object | nem | Tetszőleges plusz adat (a service worker megkapja). |
Apple csak iOS / iPadOS 16.4-től engedi a Web Push-t, és csak akkor, ha a user kirakta az oldalt a kezdőképernyőre Safariból. A user lépései:
/api/send-nél: rossz X-API-Key vagy nem ahhoz az appId-hez tartozik.enabled = false-ra állítja./api/send válaszban: a user még nem iratkozott fel ezen az appId+userId párral. Próbáld a tesztpanelen.A notification_logs tábla minden küldési próbálkozást rögzít status_code + error mezőkkel — ott pontosan láthatod, mi történt.