Sigorta
API Yolu
Sağlayıcı Tahsilatı

Sağlayıcı Tahsilatı

Sağlayıcınızla anlaşmanız primi sağlayıcının tahsil etmesini öngörüyorsa prim sizin ödemenize eklenmez. Prim, sizin ödemenizden ayrı olarak sağlayıcınız tarafından çekilir. Çekimi POST /api/v1/insurance/orders/{orderId}/pay ile başlatırsınız.

  • Önce sizin ödemeniz alınır. Siparişi bir Lunixi ödemesine bağladıysanız prim, o ödeme tahsil edildikten sonra çekilebilir. Sizin ödemeniz alınmadıysa sağlayıcıya ödeme gönderilmez.
  • Prim ayrı bir çekimdir. Alıcı iki ayrı çekim görür: sizin ödemeniz ve sağlayıcının prim çekimi. Primin çekilememesi sizin ödemenizi etkilemez.
  • Prim Lunixi ödemenizden geçmez. Prim ödeme kaydınıza ve payout'unuza girmez; sağlayıcıya doğrudan ödenir.
  • Poliçe, prim çekildikten sonra otomatik olarak istenir. issue-policy çağırmanız gerekmez.

Bu yol yalnızca API yolunda kullanılır. Checkout Form'da yalnızca primi sizin tahsil ettiğiniz ürünler sunulur.

Başlamadan önce

  • Panelde POS Merkezi > Sigorta sayfasında, bağlantınızdaki üründe Primi kim tahsil ediyor sorusunu Sağlayıcı tahsil eder olarak seçin: Sağlayıcı Bağlantısı › Bağlantıdaki ürünler. Liste yalnızca ürünün desteklediği biçimleri gösterir.
  • Bu ürünün teklif seçeneklerinde ve siparişlerinde premiumCollectedBy değeri PROVIDER'dır.
  • Sağlayıcının ürünü primi iki biçimden biriyle çeker:
BiçimpaymentInputSizin göndereceğiniz
KartlaCARDAlıcının kart bilgisi. Yalnızca PCI-DSS sertifikalı merchant'lar gönderebilir; bkz. Kart bilgisi.
Sağlayıcının ödeme sayfasındaHOSTEDKart göndermezsiniz. Alıcıyı nextAction ile yönlendirirsiniz; bkz. Alıcının adımı.

Akış

Sağlayıcı tahsilatı akışıSüreç: premiumCollectedBy değeri PROVIDER olan seçenekle teklif alıp siparişi oluşturursunuz, ödemenizi prim kalemi olmadan alırsınız, pay ucunu çağırırsınız; gerekirse alıcı çekimi sağlayıcının sayfasında tamamlar, ardından prim çekilir, poliçe otomatik istenir ve siparişi izlersiniz.TeklifpremiumCollectedBy: PROVIDERSiparişPOST …/ordersÖdemenizi alınprim kalemi yokPrimi çekinPOST …/{orderId}/paySağlayıcı sayfasınextAction · gerekirsePrim çekildipoliçe otomatik istenirSiparişi izleyinGET …/orders/{orderId}LEJANTADIMSİZİN ÖDEMENİZAYRI PRİM ÇEKİMİGEREKİRSESON
…, /api/v1/insurance yerine geçer. Prim ödemenizden geçmez; çekilemezse ödemeniz geçerli kalır. issue-policy çağırmazsınız.

Teklif alın ve sipariş oluşturun

Teklif ve sipariş adımları diğer akışlarla aynıdır: Teklif, Sipariş. Seçeneğin süresi dolmadan devam edin; prim çekimi seçeneğin geçerli olmasını ister.

Ödemenizi alın

  • Ödemeyi Lunixi ile alıyorsanız ödemeyi sigorta alanlı kalemlerle oluşturun ve siparişi bind-payment ile ödemeye bağlayın: Ödemeye bağlama. Sepette prim kalemi bulunmaz; prim ödemenize eklenmez. Ödeme ön provizyonsuz (doğrudan satış) olmalıdır.
  • Ödemeyi Lunixi dışında alıyorsanız siparişi bir ödemeye bağlamazsınız. confirm-payment bu siparişlerde kullanılmaz.

Primi çekin

Lunixi ödemeniz tahsil edildikten sonra (ya da kendi ödemenizi aldıktan sonra) /pay ucunu çağırın. Ürün kartla çekiyorsa alıcının kart bilgisini gövdede gönderin.

Sonucu işleyin

Yanıttaki providerPayment.status değerine göre devam edin: Sonuçlar. Sonuç ACTION_REQUIRED ise alıcıyı nextAction.redirectUrl adresine yönlendirin.

Poliçeyi izleyin

Prim çekildiğinde poliçe otomatik olarak istenir. Sonucu sipariş ucundan ya da webhook ile izleyin.

Prim çekimi: POST /api/v1/insurance/orders/{orderId}/pay

Kimlik doğrulama

Bu uç kart verisi taşıyabildiği için doğrudan ödeme uçlarıyla aynı kimlik kuralını uygular: Bearer erişim token'ı ve Ed25519 istek imzası birlikte (Step-Up). Diğer sigorta uçlarından farklı olarak Authorization başlığı zorunludur.

BaşlıkDeğer
AuthorizationBearer <erişim token'ı>
X-Key-Id, X-Date, X-Nonce, Digest, X-Signatureİmza başlıkları; kurallar Akışlar › Kimlik doğrulama ile aynıdır.
Idempotency-KeyZorunlu. 8-200 karakterlik, boşluksuz, yazdırılabilir ASCII.

Erişim token'ının alınması ve Step-Up kuralları: Kimlik Doğrulama. Token ile imza anahtarı aynı hesaba ve aynı ortama ait olmalıdır.

İstek

Yol parametresiAçıklama
orderIdSipariş kimliği (inso_…).
AlanTipZorunluAçıklama
cardnesneCARD üründe evetAlıcının kart bilgisi; alanları aşağıda. HOSTED üründe gönderilmez.
returnUrlstringHayırAlıcının sağlayıcının sayfasından sonra döneceği sizin sayfanız. Yalnızca https; kullanıcı bilgisi ve # parçası içermez; en fazla 2048 karakter. Bkz. Dönüş.
source lunixi-sign.sh
REQ_PATH="/api/v1/insurance/orders/<orderId>/pay"
BODY='{"card":{"cardNumber":"<kart numarası>","expireMonth":"<AA>","expireYear":"<YYYY>","cvcNumber":"<güvenlik kodu>","cardHolderName":"<kart sahibi>"},"returnUrl":"https://example.com/insurance/return"}'
lunixi_sign POST "$REQ_PATH" "$BODY"
 
curl -X POST "https://api-gateway.lunixi.com$REQ_PATH" \
  -H "Authorization: Bearer $LUNIXI_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: insurance-pay-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"

Ürün sağlayıcının ödeme sayfasında çekiyorsa (HOSTED) gövde yalnızca returnUrl taşır.

Kart bilgisi

🚫

Ham kart verisini yalnızca PCI-DSS sertifikalı merchant'lar gönderebilir. Kart numarasını ve güvenlik kodunu sunucunuzda almak, saklamak ya da iletmek sistemlerinizi PCI DSS kapsamına alır. Sertifikanız yoksa bu uca kart göndermeyin. Bkz. PCI DSS.

AlanTipAçıklama
card.cardNumberstringKart numarası; boşluksuz 12-19 hane.
card.expireMonthstringSon kullanma ayı; iki hane (01-12).
card.expireYearstringSon kullanma yılı; iki ya da dört hane.
card.cvcNumberstringGüvenlik kodu; 3 hane (AMEX'te 4).
card.cardHolderNamestringKartın üzerindeki ad ve soyad; en fazla 100 karakter.
  • Hesabınız PCI-DSS sertifikalı olarak tanımlı değilse kartlı üründe istek, kart işlenmeden 403 insurance.card.pci_required döner; sağlayıcıya istek gitmez.
  • Kart Lunixi'de saklanmaz. Yalnızca istek sırasında işlenir ve sağlayıcınıza iletilir. Güvenlik kodu hiçbir yerde tutulmaz.
  • Kart bilgisi yanıtlara, hata iletilerine, istek kayıtlarına ve webhook'lara girmez. Hata yanıtında yalnızca hangi alanın geçersiz olduğu döner.
  • Kart biçimi geçersizse (ör. kart numarası doğrulamadan geçmiyor ya da kartın süresi dolmuş) istek 422 insurance.card.invalid döner; geçersiz alan details.field alanındadır. Sağlayıcıya istek gitmez.

Yanıt

İstek tamamlandığında 200 döner. data iki nesne taşır:

AlanAçıklama
orderSiparişin güncel hâli: Sipariş nesnesi.
providerPaymentPrim çekimi denemesi; alanları aşağıda.

providerPayment:

AlanTipAçıklama
insurancePaymentIdstringÇekim denemesinin kimliği (inspay_…).
orderIdstringSiparişin kimliği (inso_…).
statusstringDenemenin sonucu; bkz. Sonuçlar.
paymentInputstringPrimin nasıl çekildiği: CARD ya da HOSTED.
amountintegerÇekilen prim, kuruş.
currencystringPara birimi, ISO 4217.
failureCodestring ya da nullDeneme başarısızsa Lunixi hata kodu, ör. insurance.payment.declined.
nextActionnesne ya da nullAlıcının atması gereken adım; bkz. Alıcının adımı.
createdAtstringDenemenin oluşturulma zamanı, ISO 8601.
updatedAtstringSon değişiklik zamanı, ISO 8601.

Yanıtta sağlayıcının referansları, ödeme sayfasının adresi ve hata kodları bulunmaz. Kart bilgisi yanıtta hiçbir biçimde yer almaz.

Sonuçlar

providerPayment.statusSiparişteNe yapmalı
SUCCEEDEDTahsilat COLLECTED, poliçe PENDINGPrim çekildi. Poliçe otomatik olarak istenir; sonucu insurance.policy.issued ile alırsınız.
ACTION_REQUIREDTahsilat ACTION_REQUIRED; order.nextAction doluAlıcıyı nextAction.redirectUrl adresine yönlendirin: Alıcının adımı.
FAILEDTahsilat FAILED, errorCode insurance.payment.declinedSağlayıcı çekimi reddetti. Sizin ödemeniz geçerli kalır. insurance.policy.failed gönderilir. Alıcı başka bir kartla denemek isterse yeni bir Idempotency-Key ile yeniden çağırın.
UNKNOWNTahsilat UNKNOWNÇekimin sonucu kesinleşmedi. Çekim tekrarlanmaz; sonuç doğrulanana kadar sipariş bu durumda kalır. Alıcıdan yeniden ödeme almayın ve yeni deneme başlatmayın.
PENDINGTahsilat PENDINGDeneme sürüyor. Bu değeri yalnızca aynı Idempotency-Key ile tekrarladığınız isteklerde görürsünüz; siparişi sipariş ucundan izleyin.
  • Bir siparişte aynı anda tek bir açık deneme bulunur. Açık (PENDING, ACTION_REQUIRED, UNKNOWN) ya da başarılı bir deneme varken yeni deneme başlatılamaz; aynı karta ikinci çekim yapılmaz.
  • İstek sağlayıcıya ulaşmadan düşerse (ör. sağlayıcıya ulaşılamıyor) para hareket etmez: hata yanıtı döner ve sipariş önceki tahsilat durumuna geri döner. İsteği bir süre sonra tekrarlayabilirsiniz.

Tekrar ve Idempotency-Key

  • Prim çekimi teklifin sağlayıcıya iletilmesini ve çekimi aynı istekte yapar. İstek bir dakikadan uzun sürebilir; istemcinizin zaman aşımını buna göre ayarlayın.
  • Zaman aşımı ya da 5xx sonrasında isteği aynı Idempotency-Key ve aynı gövdeyle tekrarlayın. Aynı anahtar aynı denemeyi döner; kart yeniden işlenmez ve ikinci çekim yapılmaz.
  • Yeni bir deneme (ör. reddedilen çekimden sonra başka bir kart) için yeni bir anahtar üretin.

Alıcının adımı (nextAction)

Sağlayıcı çekim için alıcının bir adım atmasını isterse (3D Secure doğrulaması ya da sağlayıcının ödeme sayfası) deneme ACTION_REQUIRED olur ve nextAction döner. Aynı nesne, adım beklendiği sürece siparişin nextAction alanında da bulunur.

AlanTipAçıklama
typestringREDIRECT
redirectUrlstringAlıcının tarayıcısını yönlendireceğiniz Lunixi adresi.
expiresAtstring ya da nullAdımın son anı, ISO 8601.
  • redirectUrl bir Lunixi adresidir (/api/v1/insurance/payments/{insurancePaymentId}/redirect). Lunixi alıcıyı buradan sağlayıcının sayfasına yönlendirir; sağlayıcının sayfa adresi size iletilmez.
  • Adresi yalnızca alıcının tarayıcısında açın. Dönüş işlendikten sonra ya da deneme artık alıcının adımını beklemiyorsa adres 404 insurance.payment.not_found döner.
  • Alıcı expiresAt anına kadar dönmezse sonuç sağlayıcıdan doğrulanır.

Dönüş

Alıcı sağlayıcının sayfasındaki adımı tamamladığında sağlayıcı Lunixi'ye döner. Ardından:

  • returnUrl gönderdiyseniz alıcı bu adrese yönlendirilir. Adrese şu sorgu parametreleri eklenir: insurancePaymentId, orderId, status.
  • returnUrl göndermediyseniz alıcıya sonuç JSON olarak gösterilir. Alıcıyı yönlendirdiğiniz her istekte returnUrl gönderin.

Dönüş tek başına ödeme kanıtı değildir. status sorgu parametresini yalnızca alıcıya ne göstereceğinizi seçmek için kullanın; primin çekildiğini ve poliçenin kesildiğini sipariş ucundan ya da webhook'tan doğrulayın.

Hatalar

HTTPcodeNe yapmalı
400VALIDATION_ERRORBiçimi düzeltin; Idempotency-Key eksikse de bu hata döner.
401Kimlik kodlarıBearer token'ı ve imza başlıklarını kontrol edin: Kimlik Doğrulama.
403AUTH_MERCHANT_MISMATCH, AUTH_ENVIRONMENT_MISMATCHToken ile imza anahtarı aynı hesaba ve aynı ortama ait olmalıdır.
403PRODUCT_NOT_ENABLEDSigorta ürünü hesabınızda ya da anahtarınızda açık değil.
403insurance.card.pci_requiredÜrün primi kartla çekiyor, ancak hesabınız PCI-DSS sertifikalı olarak tanımlı değil. Kart işlenmez ve sağlayıcıya istek gitmez.
404insurance.order.not_foundSipariş bulunamadı ya da başka bir hesaba ait.
409insurance.order.state_conflictdetails.reason alanına bakın; aşağıdaki tablo.
409insurance.quote.expiredSeçeneğin süresi doldu; yeni teklif alın ve yeni sipariş oluşturun.
412insurance.payment.merchant_payment_not_capturedSiparişe bağlı Lunixi ödemeniz henüz tahsil edilmedi. Ödeme tahsil edildikten sonra tekrar deneyin.
422insurance.payment.method_not_supportedBu sipariş için sağlayıcı tahsilatı kullanılamıyor; details.reason alanına bakın, aşağıdaki tablo.
422insurance.card.invalidKart bilgisi geçersiz; details.field alanını düzeltin.
422insurance.validation.invaliddetails.errors[] alanlarını düzeltin. Örneğin CARD üründe card gönderilmedi (field: card, reason: required) ya da returnUrl geçersiz (reason: https_required ya da invalid).
422insurance.reference.unknownSiparişteki bir referans kodu bu sağlayıcıda karşılanmıyor; sağlayıcıya istek gitmez.
422insurance.quote.declinedSağlayıcı teklifi aynı koşullarla kabul etmedi; yeni teklif alın.
503insurance.provider.unavailableSağlayıcıya ulaşılamadı; para hareket etmedi. Bir süre sonra tekrar deneyin.

Ortak kodlar: Akışlar › Yanıt ve hatalar.

Durum çakışması

reasonAnlamı
not_provider_collectionSiparişin primini siz tahsil ediyorsunuz (premiumCollectedBy: MERCHANT). Primi Prim ve Ödeme sayfasındaki gibi tahsil edin.
provider_payment_in_progressSiparişte açık bir deneme var: sürüyor, alıcının adımını bekliyor ya da sonucu kesinleşmedi.
premium_collectedPrim zaten çekildi.
offer_outcome_unknownTeklifin sağlayıcıya iletilmesinin sonucu kesinleşmedi; prim çekilmez. Sipariş incelenir.

Desteklenmeyen tahsilat

reasonAnlamı
card_path_not_enabledKartla sağlayıcı tahsilatı bu ortamda kullanıma açık değil.
card_not_acceptedÜrün primi sağlayıcının ödeme sayfasında çeker (HOSTED); card göndermeyin.
preauth_paymentSiparişe bağlı ödeme ön provizyonlu. Sağlayıcı tahsilatı yalnızca doğrudan satış ödemelerinde kullanılır.
provider_payment_not_supportedBu ürün ya da sağlayıcı primi sağlayıcı çekimiyle almıyor.

İptal ve iade

  • Poliçeyi cancel ucuyla iptal edebilirsiniz: İptal ve Prim İadesi › Poliçe iptali.
  • Prim sağlayıcıya ödendiği için prim iadesi Lunixi üzerinden yapılmaz; refund-premium bu siparişlerde 409 (reason: collected_by_provider) döner.
  • Kendi ödemenizden yaptığınız iadeler sigortaya bağlı değildir ve poliçeyi iptal etmez.

İlgili