Yalnız Sigorta Entegrasyonu
Ödemelerinizi Lunixi dışında alıyorsanız ya da yalnızca sigorta satmak istiyorsanız sigortayı tek başına, API ile entegre edersiniz. Bu entegrasyonda Lunixi'de ödeme oluşturmazsınız; Lunixi teklif, sipariş, poliçe, belge, iptal ve webhook altyapısını sağlar.
Bu sayfa entegrasyonun bütün adımlarını sırayla verir. Her adımın alanları ve kuralları bağlantı verilen uç sayfasındadır.
| Durumunuz | Kullanacağınız yol |
|---|---|
| Ödemeyi Lunixi dışında alıyorsunuz ya da yalnızca sigorta satıyorsunuz | Bu sayfa |
| Ödemeyi Lunixi'nin ödeme formuyla alıyorsunuz | Checkout Form yolu |
| Ödemeyi kendi formunuzdan Lunixi API'siyle alıyorsunuz | API yolu › Lunixi ödemesine bağlı akış |
Başlamadan önce
- Hesabınızda sigorta ürünü açık olmalıdır. Ödeme ürünü gerekmez; sigorta uçları yalnızca sigorta ürününü arar.
- API anahtarınızın sigorta ürününe erişimi olmalıdır. Anahtarınızda sigorta ürünü yoksa her istek
403 PRODUCT_NOT_ENABLEDdöner. - Sağlayıcınızı panelden bağlayın. Panelde POS Merkezi > Sigorta sayfasında anlaştığınız sağlayıcının bağlantısını ekleyin, sunacağınız ürünü açın ve Primi kim tahsil ediyor sorusunu anlaşmanıza göre yanıtlayın: Sağlayıcı Bağlantısı.
- Sigortayı açın ve sunacağınız tipi seçin. Panelin sol menüsündeki Sigorta ürününde, Genel ekranında Sigorta açık ayarını açın ve API — harici tahsilat kullanım modunu seçin; Sigorta Tipleri ekranında sunacağınız tipi açıp kaydedin. Sigorta kapalıysa, API modu seçili değilse ya da tip kapalıysa sigorta sunulmaz: Sigorta Menüsü › Genel.
- Webhook endpoint'inizi oluşturun. Sigorta olayları için
productCode: INSURANCE_SERVICEile bir endpoint oluşturun: Webhook Olayları › Abonelik. - Önce test edin. Test anahtarınızla ve Test ortamındaki bağlantınızla deneyin: Test Ortamı.
Akış
…, /api/v1/insurance yerine geçer. Dalı seçeneğin premiumCollectedBy değeri belirler; sonuç insurance.policy.issued webhook’u ya da sipariş ucu ile gelir.1. İstekleri imzalayın
Sigorta uçları API anahtarınızla imzalanmış istek kabul eder: X-Key-Id, X-Date, X-Nonce, gövdeli isteklerde Digest ve X-Signature. Bu sayfadaki örnekler aynı kabuk yardımcısını (lunixi_sign) kullanır: Akışlar › Kimlik doğrulama.
- Sipariş oluşturan ve siparişin durumunu değiştiren uçlar
Idempotency-Keybaşlığını zorunlu tutar: Akışlar › Idempotency-Key. - Primi sağlayıcı tahsil ediyorsa kullandığınız
/payucu, imzaya ek olarak Bearer erişim token'ı ister: Sağlayıcı Tahsilatı › Kimlik doğrulama.
2. Sunulan sigorta tiplerini öğrenin
Alıcıya hangi sigortayı sunabileceğinizi uygunluk ucu söyler. Uç salt okumadır; sağlayıcıya istek göndermez.
- Sigorta bir ürünü koruyorsa (bilet, cihaz, araç gibi) ürünü sepet kalemi olarak gönderin:
POST /api/v1/insurance/products, gövdedecurrencyvecontext.items. Lunixi'de ödeme oluşturmazsınız; kalemler yalnızca sigortanın neyi koruduğunu belirtir. Kalemin biçimi ve sigorta alanları: Sepet Kalemleri › Sigorta alanları. - Sigorta bir ürüne bağlı değilse (ferdi kaza gibi)
GET /api/v1/insurance/products?currency=TRYçağırın; yanıt sepet kalemi olmadan satılan tipleri döner.
paymentIntentId göndermeyin; bu alan Lunixi ödemesine bağlı akış içindir. Yanıt ve boş listenin anlamı: Uygunluk.
Tip alanlarında kullanılan kodları (ülke, il, ilçe, marka, model, meslek gibi) referans ucundan alın: Sigorta Tipleri ve Şemalar › Referans kodları.
3. Teklif alın
POST /api/v1/insurance/quotes ile alıcının ve sigortalanan şeyin bilgilerini gönderin.
- Sepet kaynağı olarak 2. adımda gönderdiğiniz
context.itemskalemlerini gönderin. Sepet kalemi olmadan satılan tiplerde necontext.itemsnepaymentIntentIdgönderin: Sepet Kalemi Olmadan Satış. - Poliçe için gereken alanları da teklif isteğinde gönderin. Poliçe teklifin bilgileriyle kesilir; sipariş ve poliçe isteklerinde alan gönderilmez.
- Yanıt bir ya da daha fazla seçenek döner. Alıcıya her seçeneğin sağlayıcısını, primini, teminat özetini ve şartnamesini gösterin; sigortayı önceden seçili getirmeyin.
- Seçeneğin
premiumCollectedBydeğeri 5. adımda hangi yolu izleyeceğinizi gösterir.
Alanlar, seçenek nesnesi ve geçerlilik süresi: Teklif. Tipin alanları: Sigorta Tipleri ve Şemalar.
4. Sipariş oluşturun
Alıcı bir seçeneği onaylayınca POST /api/v1/insurance/orders ile sipariş oluşturun. Gövdede seçeneğin quoteId'si ve alıcının onayı (consent) bulunur; Idempotency-Key zorunludur.
- Sipariş oluşturmak sağlayıcıya istek göndermez ve para hareketi yapmaz.
- Yeni siparişte
paymentModeNO_PAYMENT, tahsilatNOT_STARTED, poliçeNOT_REQUESTED'dir. - Siparişi bir Lunixi ödemesine bağlamayın;
bind-paymentbu entegrasyonda kullanılmaz.
Alanlar ve kurallar: Sipariş ve Ödeme Bağlama › Sipariş oluşturma.
5. Primi tahsil edin
Primi siz tahsil ediyorsanız (MERCHANT)
- Primi alın. Siparişin
premiumAmounttutarını vecurrencypara birimini kendi ödeme kanalınızdan tahsil edin. - Ödemeyi bildirin.
POST /api/v1/insurance/orders/{orderId}/confirm-paymentile ödemenin kimliğini, tutarını, para birimini ve zamanını bildirin. Tutar ve para birimi siparişin primiyle aynı olmalıdır; bildirimi seçeneğin süresi dolmadan yapın. Lunixi bildirimi bağlantınız üzerinden sağlayıcınıza iletir. YanıttapaymentModeEXTERNAL_PAYMENT, tahsilatCOLLECTEDolur: Lunixi dışında alınan primi bildirme. - Poliçeyi isteyin.
POST /api/v1/insurance/orders/{orderId}/issue-policygövdesiz çağrılır. Yanıtta poliçePENDINGolur; poliçe arka planda kesilir: Poliçe isteme.
Primi sağlayıcı tahsil ediyorsa (PROVIDER)
confirm-payment ve issue-policy kullanılmaz. Primi POST /api/v1/insurance/orders/{orderId}/pay ile sağlayıcıya çektirirsiniz; prim çekildiğinde poliçe otomatik olarak istenir.
- Sipariş bir Lunixi ödemesine bağlı olmadığı için
/paybir Lunixi ödemesinin tahsilatını beklemez. - Ürün primi kartla çekiyorsa (
CARD) alıcının kart bilgisini gövdede gönderirsiniz. Ham kart verisini yalnızca PCI-DSS sertifikalı merchant'lar gönderebilir. Kart Lunixi'de saklanmaz. - Ürün primi sağlayıcının ödeme sayfasında çekiyorsa (
HOSTED) kart göndermezsiniz; alıcıyı yanıttakinextAction.redirectUrladresine yönlendirir,returnUrlile kendi sayfanıza döndürürsünüz.
Kimlik, istek, sonuçlar ve hatalar: Sağlayıcı Tahsilatı.
6. Poliçeyi izleyin
Poliçenin sonucunu webhook ile alın; emin olamadığınızda siparişi GET /api/v1/insurance/orders/{orderId} ile okuyun.
| Olay | Ne yaparsınız |
|---|---|
insurance.policy.issued | Poliçe kesildi. Poliçe numaraları data.policies[].policyNumber alanındadır. |
insurance.policy.document_ready | Belge alınabilir; 7. adıma geçin. |
insurance.policy.failed | Poliçe kesin olarak kesilemedi ya da prim çekilemedi. Sebep data.errorCode alanındadır. |
insurance.refund.required | Prim tahsil edildi ama poliçe kesilemedi; primi iade edin (8. adım). |
Olayları x-lunixi-event-id ile tekilleştirin ve siparişin son durumunu olayın sırasından değil durum eksenlerinden çıkarın: Webhook Olayları. Durum eksenleri: Kavramlar ve Durumlar.
7. Belgeyi alın
Poliçe kesildiğinde belgesini GET /api/v1/insurance/policies/{policyId}/document ile PDF olarak alın. policyId siparişin policies[] dizisindedir; her sigortalanan kalem için ayrı poliçe ve belge vardır.
- Belge Lunixi'de saklanmaz; her istekte sağlayıcıdan alınır. Sağlayıcı o an veremezse
503 insurance.document.unavailabledöner; bir süre sonra tekrar deneyin. - Ürün sunuyorsa prim makbuzunu
/receipt, sertifikayı/certificateucundan alırsınız.
Ayrıntı: Poliçe Belgesi.
8. İptal ve iade
- İptal:
POST /api/v1/insurance/orders/{orderId}/cancelkesilmiş poliçeler için sağlayıcıda iptal talebi açar. Sonuç sonradan kesinleşir: yanıttaCANCEL_PENDING, sağlayıcı iptali kesinleştirinceinsurance.policy.cancelledgelir. İptal primi iade etmez. - Primi siz tahsil ettiyseniz: iadeyi kendi kanalınızdan yaparsınız ve
POST /api/v1/insurance/orders/{orderId}/refund-premiumileexternalRefundgöndererek bildirirsiniz. Lunixi'de para hareketi olmaz; iadeREFUNDEDolur veinsurance.refund.completedgelir. - Primi sağlayıcı tahsil ettiyse: prim iadesi Lunixi üzerinden yapılmaz;
refund-premiumbu siparişlerde409(reason: collected_by_provider) döner. İade sağlayıcınızın iptal sürecindedir.
Yürürlükteki poliçenin primini iade etmeden önce poliçeyi iptal edin. Kurallar: İptal ve Prim İadesi.
9. Mutabakat
Sağlayıcınızla mutabakat için bağlantı bazlı poliçe ve prim raporunu API'den alın: Mutabakat Raporu.
Diğer uçlar
| İhtiyaç | Sayfa |
|---|---|
| Teklif vermeyen tiplerde alıcının bilgilerini sağlayıcıya iletmek | Talep |
| Kesilmiş poliçe için hasar bildirmek | Hasar Kaydı |
| Siparişlerinizi listelemek | Sipariş ve Ödeme Bağlama › Listeleme |
| Bütün uçlar tek tabloda | Uç Referansı |
Uçtan uca örnek
Primi sizin tahsil ettiğiniz, iki biletli bir bilet iptal sigortası satışı. Değerler örnektir; açılı parantez içindeki değerlerin yerine kendi değerlerinizi, kişisel alanların yerine alıcınızın bilgilerini yazın. Her istekte gövdeyi boşluksuz JSON olarak gönderin.
Uygunluk
source lunixi-sign.sh
BODY='{"currency":"TRY","context":{"items":[{"id":"ticket-1","name":"İzmir-Ankara tren bileti","price":50000,"category1":"bilet","itemType":"VIRTUAL","insuranceCategory":"TICKET","insuranceTypes":["TICKET_CANCELLATION"]},{"id":"ticket-2","name":"İzmir-Ankara tren bileti","price":50000,"category1":"bilet","itemType":"VIRTUAL","insuranceCategory":"TICKET","insuranceTypes":["TICKET_CANCELLATION"]}]}}'
lunixi_sign POST "/api/v1/insurance/products" "$BODY"
curl -X POST "https://api-gateway.lunixi.com/api/v1/insurance/products" \
-H "Content-Type: application/json" \
-H "X-Key-Id: $LUNIXI_KEY_ID" \
-H "X-Date: $DATE" \
-H "X-Nonce: $NONCE" \
-H "Digest: $DIGEST" \
-H "X-Signature: $SIGNATURE" \
--data-raw "$BODY"data.products içinde TICKET_CANCELLATION ve basketItemIds dönerse sigortayı sunabilirsiniz.
Teklif
Gövde, aynı kalemlerle birlikte sigortalının ve biletlerin bilgilerini taşır. Tam istek: Teklif › Teklif alma.
BODY='<teklif isteği, boşluksuz JSON>'
lunixi_sign POST "/api/v1/insurance/quotes" "$BODY"
curl -X POST "https://api-gateway.lunixi.com/api/v1/insurance/quotes" \
-H "Content-Type: application/json" \
-H "X-Key-Id: $LUNIXI_KEY_ID" \
-H "X-Date: $DATE" \
-H "X-Nonce: $NONCE" \
-H "Digest: $DIGEST" \
-H "X-Signature: $SIGNATURE" \
--data-raw "$BODY"Alıcıya data.options[] seçeneklerini gösterin. Alıcının seçtiği seçeneğin quoteId, terms.version, terms.sha256 ve premiumCollectedBy değerlerini saklayın.
Sipariş
BODY='{"quoteId":"<quoteId>","merchantOrderId":"order-1001","consent":{"termsVersion":"<terms.version>","termsSha256":"<terms.sha256>","acceptedAt":"<alıcının onay anı, ISO 8601>"}}'
lunixi_sign POST "/api/v1/insurance/orders" "$BODY"
curl -X POST "https://api-gateway.lunixi.com/api/v1/insurance/orders" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: insurance-order-1001" \
-H "X-Key-Id: $LUNIXI_KEY_ID" \
-H "X-Date: $DATE" \
-H "X-Nonce: $NONCE" \
-H "Digest: $DIGEST" \
-H "X-Signature: $SIGNATURE" \
--data-raw "$BODY"Yanıttaki data.orderId ve data.premiumAmount değerlerini saklayın.
Ödeme bildirimi
Primi kendi kanalınızdan tahsil ettikten sonra bildirin. Tutar örnektir; paidAmount siparişin premiumAmount değeridir.
REQ_PATH="/api/v1/insurance/orders/<orderId>/confirm-payment"
BODY='{"payment":{"externalPaymentId":"pay-1001","paidAmount":3980,"paidCurrency":"TRY","paidAt":"<ödeme anı, ISO 8601>"}}'
lunixi_sign POST "$REQ_PATH" "$BODY"
curl -X POST "https://api-gateway.lunixi.com$REQ_PATH" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: insurance-confirm-1001" \
-H "X-Key-Id: $LUNIXI_KEY_ID" \
-H "X-Date: $DATE" \
-H "X-Nonce: $NONCE" \
-H "Digest: $DIGEST" \
-H "X-Signature: $SIGNATURE" \
--data-raw "$BODY"Poliçe isteği
REQ_PATH="/api/v1/insurance/orders/<orderId>/issue-policy"
lunixi_sign POST "$REQ_PATH"
curl -X POST "https://api-gateway.lunixi.com$REQ_PATH" \
-H "Idempotency-Key: insurance-issue-1001" \
-H "X-Key-Id: $LUNIXI_KEY_ID" \
-H "X-Date: $DATE" \
-H "X-Nonce: $NONCE" \
-H "X-Signature: $SIGNATURE"Sonuç ve belge
insurance.policy.issued ve insurance.policy.document_ready olaylarını bekleyin ya da siparişi okuyun. Ardından her poliçenin belgesini alın:
REQ_PATH="/api/v1/insurance/policies/<policyId>/document"
lunixi_sign GET "$REQ_PATH"
curl "https://api-gateway.lunixi.com$REQ_PATH" \
-H "X-Key-Id: $LUNIXI_KEY_ID" \
-H "X-Date: $DATE" \
-H "X-Nonce: $NONCE" \
-H "X-Signature: $SIGNATURE" \
-o police.pdfAlıcı sonradan vazgeçerse poliçeyi cancel ile iptal edin, insurance.policy.cancelled geldikten sonra primi kendi kanalınızdan iade edip refund-premium ile bildirin: İptal ve Prim İadesi.
Sık karşılaşılan hatalar
| HTTP | code | Ne yapmalı |
|---|---|---|
403 | PRODUCT_NOT_ENABLED | Sigorta ürünü hesabınızda ya da API anahtarınızda açık değil. |
409 | insurance.quote.expired | Seçeneğin süresi doldu; yeni teklif alın ve yeni sipariş oluşturun. |
409 | insurance.order.state_conflict | Sipariş bu işleme uygun değil; details.reason alanına bakın: Sipariş › Durum çakışması. |
412 | insurance.premium.not_captured | Poliçeyi istemeden önce ödemeyi confirm-payment ile bildirin. |
422 | insurance.validation.invalid | details.errors[] alanlarını düzeltin; ödeme bildiriminde tutar ve para birimi siparişin primiyle aynı olmalıdır. |
Bütün kodlar: Hata Kodları.
İlgili
- Uç Referansı: bütün sigorta uçları
- Kavramlar ve Durumlar: sipariş durum eksenleri
- Webhook Olayları:
insurance.*olayları - Test Ortamı: test bağlantısı ve test anahtarı