Webhook API Entegrasyonu
Webhook'lar, bir olay meydana geldiğinde veya gelirken belirtilen URL'e istek atmak için kullanılır. InsurUp'da iki çeşit event vardır.
- Async: event'ler bir olay gerçekleştiğinde atılır ve belirtilen API'ın sonucunu yapılan işleme etki etmez.
- Sync: event'ler bir olay gerçekleşmeden önce atılır ve belirtilen API'ın sonucuna göre yapılan işleme etki edebilir. Ödeme validasyonu güzel bir örnektir.
Webhook event'leri, belirli bir URL'ye HTTP POST isteği göndererek tetiklenir. Bu istek, bir JSON nesnesi içerir. JSON nesnesi, event'e ait detayları içerir.
Header'lar
x-webhook-event: Tetiklenen event'in ismidir.x-webhook-id: Acente panelindeki oluşturulan webhook'un tekil numarasıdır.x-webhook-delivery: Tekil gönderim numarasıdır.x-webhook-signature: Bu header eğersecretalanı doluysa gönderilir. Belirtilensecretile payload SHA-256 ile şifrelenir.
Event'ler
proposal_premium.received async
Bir teklif primi InsurUp'a iletildiği zaman tetiklenir.
Örnek Payload
{
"$event": "proposal_premium.received",
"proposalId": "673afd15f11de64fe1f2bjdb",
"productId": 40235,
"premiums": [
{
"installmentNumber": 1,
"netPremium": 1243,
"grossPremium": 1243,
"commission": 0,
"exchangeRate": 1,
"paymentType": "All",
"currency": "TurkishLira",
"insuranceCompanyProposalNumber": "142534209",
"proposalProductId": "67452b1a022dec6666bf06d8"
},
{
"installmentNumber": 2,
"netPremium": 1243,
"grossPremium": 1243,
"commission": 0,
"exchangeRate": 1,
"paymentType": "All",
"currency": "TurkishLira",
"insuranceCompanyProposalNumber": "142534209",
"proposalProductId": "67452b1a022dec6666bf06d8"
},
{
"installmentNumber": 3,
"netPremium": 1243,
"grossPremium": 1243,
"commission": 0,
"exchangeRate": 1,
"paymentType": "All",
"currency": "TurkishLira",
"insuranceCompanyProposalNumber": "142534209",
"proposalProductId": "67452b1a022dec6666bf06d8"
}
],
"insuredCustomer": {
"$type": "individual",
"identityNumber": "12345678910",
"birthDate": "1994-01-01",
"fullName": "Müşteri ismi",
"phoneNumber": {
"number": "5432222222",
"countryCode": 90,
"areaCode": "543",
"numberWithoutAreaCode": "2222222"
},
"email": {
"value": "customer@insurup.com"
},
"city": {
"value": "34",
"text": "İSTANBUL"
},
"district": {
"value": "1823",
"text": "KÜÇÜKÇEKMECE"
}
},
"event": 1,
"tempProposalDocumentUrl": null,
"tempPreInfoDocumentUrl": null
}
Örnek Sigortalı Tüzel Müşteri Payload
"insuredCustomer": {
"$type": "company",
"title": "Şirket ismi",
"taxNumber": "6130782524",
"phoneNumber": {
"number": "5432222222",
"countryCode": 90,
"areaCode": "543",
"numberWithoutAreaCode": "2222222"
},
"email": {
"value": "customer@insurup.com"
},
"city": {
"value": "34",
"text": "İSTANBUL"
},
"district": {
"value": "1823",
"text": "KÜÇÜKÇEKMECE"
}
},
proposal_premium.purchasing sync
Bir teklif primini satın alınmadan önce tetiklenir. Bu event'i satın alma validasyonu olarak kullanabilirsiniz.
Örnek Payload
{
"proposalId": "673afd15f11de64fe1f2bjdb",
"productId": 40235,
"installmentNumber": 1,
"paymentType": "CreditCard"
}
proposal_premium.purchase_failed async
Bir teklif primini satın alma isteği başarısız olunca tetiklenir.
Örnek Payload
{
"proposalId": "673afd15f11de64fe1f2bjdb",
"productId": 40235,
"installmentNumber": 1,
"paymentType": "CreditCard",
"failureReason": "X sigorta şirketi bilinmeyen bir nedenden dolayı poliçeleştirme isteğini reddetti"
}
proposal_premium.purchased async
Bir teklif primini satın alma isteği başarılı olunca tetiklenir.
Örnek Payload
{
"proposalId": "673afd15f11de64fe1f2bjdb",
"policyId": "673b4cb4524a0a5187ddbeae",
"productId": 40235,
"installmentNumber": 1,
"paymentType": "CreditCard",
"policyStartDate": "2024-11-20",
"policyEndDate": "2025-11-20",
"tempDocumentUrl": null
}
policy.created async
Dosya poliçe transfer, online poliçe transfer, proje üzerinden poliçe oluşturma durumlarında tetiklenir.
Örnek Payload
{
"$event": "policy.created",
"proposalId": "67c93f2fdb57fa44cf64db6a",
"policyId": "67c94017db57fa44cf64db94",
"productId": 1595,
"installmentNumber": 1,
"paymentType": "CreditCard",
"startDate": "2025-03-06",
"endDate": "2026-03-06",
"renewalNumber": 0,
"productBranch": "Dask",
"insurerCustomerId": "256e55a5-e1c5-483e-97df-4156d352fb63",
"insuredCustomerId": "256e55a5-e1c5-483e-97df-4156d352fb63",
"fromPolicyTransfer": false,
"event": 1000
}
policy.updated async
Dosya poliçe transfer, online poliçe transfer, proje üzerinden poliçe oluşturma durumlarında tetiklenir.
Örnek Payload
{
"$event": "policy.updated",
"policyId": "67c930b9db57fa44cf64daf6",
"installmentNumber": 1,
"paymentType": "CreditCard",
"endorsementNumber": 1,
"isCancel": false,
"event": 1001
}
Signature Validasyonu
Webhook'larınızın güvenliğini sağlamak için, gelen isteklerin gerçekten sizin tarafınızdan gönderildiğini doğrulamak amacıyla imza doğrulaması yapmanız önemlidir. Aşağıda, imza doğrulaması için çeşitli dillerde örnek kodlar bulunmaktadır.
Python
import hmac
import hashlib
def validate_signature(secret, payload, signature):
computed_signature = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()
return hmac.compare_digest(computed_signature, signature)
Javascript
const crypto = require('crypto');
function validateSignature(secret, payload, signature) {
const computedSignature = crypto
.createHmac('sha256', secret)
.update(payload, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(Buffer.from(computedSignature, 'hex'), Buffer.from(signature, 'hex'));
}
C#
bool ValidateSignature(string secret, string payload, string signature)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret))
var computedHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payload));
var computedSignature = BitConverter.ToString(computedHash).Replace("-", "").ToLower();
return computedSignature == signature.ToLower();
}
PHP
function validate_signature($secret, $payload, $signature) {
$computed_signature = hash_hmac('sha256', $payload, $secret);
return hash_equals($computed_signature, $signature);
Java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class SignatureValidator {
public static boolean validateSignature(String secret, String payload, String signature) throws Exception {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
String computedSignature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(payload.getBytes()));
return computedSignature.equals(signature);
}
}