4.1 KiB
4.1 KiB
Fase 1 — Step 3: Notifikasi MQTT Dasar (Static Payment)
Dokumen ini memandu implementasi notifikasi success payment ke device berbasis event transaksi paid.
1) Tujuan Step 3
- Memastikan setiap transaksi
paidmemicu notifikasi sukses ke device yang valid - Menyimpan status delivery dan retry agar operasional bisa dipantau
- Menyediakan endpoint admin untuk retry manual
2) Event Source
- Trigger dari Step 2: event internal
transaction.paid - Sumber wajib: event bus internal / service method call dari transaction service (untuk fase awal)
3) Mapping Notifikasi
- Input:
transaction_id,merchant_id,device_id,amount,currency,paid_at,reference - Output: payload MQTT
payment_successke topik:devices/{deviceId}/downlink/payment/success
- Hanya kirim jika device memiliki binding aktif (
device_bindings.active_flag = true)
4) Tabel dan Status
notifications
Kolom inti:
idtransaction_iddevice_iddelivery_channel=mqttpayload_type=payment_successdelivery_status:queued | sent | acknowledged | failed | retryingretry_countack_status:pending | received | not_supported | not_neededsent_atack_at
Status transisi:
- dibuat ->
queued - publish sukses ->
sent - no ack handler tersedia pada fase awal ->
acknowledgedotomatis ataufailedsesuai konfigurasi broker - publish gagal ->
retrying - retry 3x gagal ->
failed
5) Payload Kontrak MQTT (Step 3)
{
"message_type": "payment_success",
"event_id": "evt_123",
"transaction_id": "tx_123",
"merchant_name": "Toko Berkah",
"amount": 50000,
"currency": "IDR",
"paid_at": "2026-05-23T10:02:10Z",
"audio_text": "Pembayaran diterima lima puluh ribu rupiah",
"display_text": "Pembayaran diterima Rp50.000"
}
6) Alur Proses Notifikasi
- Step 2 publish event
transaction.paid - Notification Orchestrator menerima event
- Validasi
device_idada dan memiliki binding aktif - Buat record
notificationsdengan statusqueued - Publish ke
devices/{deviceId}/downlink/payment/success - Jika sukses, update
sentdansent_at - Jika gagal:
- hitung retry (exponential/linear simple backoff)
- update
retrying - lanjut retry maksimum 3x
- Jika 3x gagal tetap
failed - Return result ke endpoint retry bila dipanggil manual
7) Retry Policy Fase 1 (Sederhana)
- max_attempt = 3
- retry_interval_seconds = 15, 30, 60 (tetap untuk fase awal)
- retry_count disimpan di
notifications.retry_count - tiap percobaan harus idempotent via
event_iddantransaction_id
8) Endpoint Admin
POST /admin/transactions/{transactionId}/retry-notification- validasi transaksi status harus
paid - akan membuat attempt publish baru jika
delivery_statusbukanacknowledged - response:
transaction_idnotification_iddelivery_statusnext_retry_at
- validasi transaksi status harus
9) Endpoint Ops Monitoring Minimal
GET /admin/devices/{deviceId}/notifications- list notif by device +
delivery_status
- list notif by device +
GET /admin/transactions/{transactionId}- tampilkan link notification + timeline status
10) Idempotency dan De-Dupe
- kombinasi key notifikasi:
transaction_id + event_id
- jika event duplicate:
- tidak membuat record baru
- return existing notif status
- publish duplicate harus ditolak di orchestrator (guard).
11) Error Code (saran)
NOTIFICATION_DEVICE_UNAVAILABLENOTIFICATION_NO_ACTIVE_BINDINGNOTIFICATION_PUBLISH_FAILEDNOTIFICATION_RETRY_EXHAUSTED
12) Acceptance Criteria Step 3
- transaksi
paidmenghasilkan eventpayment_successke topik device - notification record terbentuk untuk setiap transaksi
paid - perangkat yang tidak terikat aktif tidak dipush (state
faileddengan reason) - retry berjalan saat publish gagal
- endpoint retry admin merubah status dari
failed/retryingmenjadisentatau tetapfailedsetelah limit
13) Catatan Implementasi Step 3 (Tanpa Design)
- gunakan QoS 1 untuk topic payment success
- hindari retained message untuk event sukses pembayaran
- logging harus menyertakan
transaction_id,device_id,event_id,request_id - payload audit (audio/display) boleh berupa default ID locale