Webhook log
Payment callbacks and platform events, with delivery status.
Events (last hour)
5
Delivered
4
Failing
1
Retries
3
payment.capture.failed is not being delivered
Three attempts, all HTTP 500 from our own endpoint. This is not the provider's fault - our handler is throwing. Until it is fixed, failed captures are not reaching the platform, which is why a session shows as delivered with no payment and lands in reconciliation instead.
| Time | Event | Endpoint | Status | Attempts | |
|---|---|---|---|---|---|
| 12:31:44 | payment.capture.failed | https://api.evcharge.lk/hooks/selcom | 500 | 3 | |
Request POST https://api.evcharge.lk/hooks/selcom
X-Signature: sha256=a3f1… (verified ✓)
{
"event": "payment.capture.failed",
"reference": "MIX9001TZ",
"amount": 20735,
"currency": "LKR",
"provider": "mixx",
"session_id": "se-206",
"occurred_at": "2026-07-15T12:31:44Z"
}Response HTTP 500 Internal Server Error
{
"error": "NullReferenceException",
"at": "PaymentCaptureHandler.onFailed",
"detail": "session.payment_intent was null"
}The handler assumes a payment intent exists. On a capture failure it does not - so the code that is supposed to record the failure fails itself. Every unbilled session traces back to this. Signatures are verified before the payload is parsed. An unsigned or mis-signed callback is dropped and logged - never processed, no matter what it claims. | |||||
| 12:31:02 | payment.captured | https://api.evcharge.lk/hooks/selcom | 200 | 1 | |
| 12:10:18 | payment.authorised | https://api.evcharge.lk/hooks/selcom | 200 | 1 | |
| 11:58:07 | payment.authorised | https://api.evcharge.lk/hooks/crdb | 200 | 2 | |
| 11:02:55 | payment.reversed | https://api.evcharge.lk/hooks/selcom | 200 | 1 | |
Endpoints
https://api.evcharge.lk/hooks/selcom
PayHere aggregator - eZ Cash, Mobitel, FriMi
https://api.evcharge.lk/hooks/crdb
Commercial Bank - card acquirer
https://api.evcharge.lk/hooks/ocpp
OCPP gateway events