Entegrasyonlar
Java

Java SDK

com.lunixi:lunixi-java-sdk, Lunixi'nin Java istemcisidir. İstek imzalama, token alışverişi, yanıt zarfının okunması ve imleçli sayfalama SDK'dadır.

Java17 ve üzeri
Çalışma zamanı bağımlılığıyok
LisansMIT

Kapsam

Bileşenİşlevi
LunixiConfigDeğişmez, kurulurken doğrulanan yapılandırma
auth.Ed25519KeyPair · Ed25519SignerAnahtar çifti üretme, istek imzalama
auth.TokenManager · TokenStoreİmzalı token alışverişi ve token önbelleği
http.HttpTransport · JdkHttpTransportDeğiştirilebilir HTTP taşıyıcısı
fraud.FraudClientFraud kararı, karar kayıtları ve olay alımı
webhook.WebhookVerifierGelen webhook'ların fail-closed doğrulanması
exception.*Tipli hata ailesi

Java SDK'sı bu sürümde fraud yüzeyini ve webhook doğrulamayı içerir. Ödeme ve diğer ürünler için SDK'sız REST akışını kullanabilirsiniz; istek katmanı aynıdır.

Kurulum

Gradle:

implementation 'com.lunixi:lunixi-java-sdk:0.1.0'

Maven:

<dependency>
  <groupId>com.lunixi</groupId>
  <artifactId>lunixi-java-sdk</artifactId>
  <version>0.1.0</version>
</dependency>

SDK'nın çalışma zamanı bağımlılığı yoktur: imza, HMAC, HTTP ve JSON JDK ile karşılanır, sınıf yolunuzdaki kütüphanelerle sürüm çatışması çıkmaz.

Anahtar çifti

Ed25519KeyPair keyPair = Ed25519KeyPair.generate();
// keyPair.publicKeyPem()  → panele yükleyin
// keyPair.privateKeyPem() → sır yöneticinizde saklayın

Özel anahtarı kaynak koda yazmayın ve loglara düşürmeyin.

İstemciyi oluşturma

LunixiClient client = LunixiClient.create(LunixiConfig.builder()
        .baseUrl("https://api-gateway.lunixi.com")
        .keyId(System.getenv("LUNIXI_KEY_ID"))
        .privateKey(System.getenv("LUNIXI_PRIVATE_KEY"))
        .environment(LunixiConfig.Environment.TEST)
        .build());

İstemciyi bir kez kurup saklayın. Değişmezdir, iş parçacıkları arasında paylaşılabilir ve token önbelleğini taşır. Builder ayrıca timeout(Duration), maxRetries(int), transport(HttpTransport) ve tokenStore(TokenStore) alır.

Fraud kararı

FraudDecision decision = client.fraud().evaluate(EvaluateRequest.create()
        .standaloneIntegrationMode()
        .channel(FraudTaxonomy.Channel.STANDALONE_API)
        .productContext(FraudTaxonomy.ProductContext.DIRECT_API)
        .transactionRef("order-2026-0001")
        .payment(Map.of("amount", 25000, "currency", "TRY"))
        .customer(Map.of("email", email, "country", "TR"))
        .device(Map.of("ipAddress", ipAddress)));
 
if (decision.isBlock()) {
    // işlemi reddedin
} else if (decision.isForce3d()) {
    // 3D Secure ile yeniden deneyin
}

Lunixi üzerinden alınan bir ödemede karar yetkilendirme sırasında zaten üretilir; ikinci kez sormak yerine kaydından okuyun:

Optional<FraudDecision> recorded = client.fraud().decisions().latestForPayment(paymentId);

evaluate, kendi olaylarınızı (kayıt, giriş, para çekme, kendi sağlayıcınızla yetkilendirdiğiniz bir ödeme) taramak içindir. → Fraud

Karar kayıtları

for (FraudDecision record : client.fraud().decisions()
        .iterate(DecisionLogFilter.create().limit(100))) {
    // sayfalar imleç izlenerek çekilir
}

İmleç opaktır: çözmeyin, üretmeyin, değiştirmeyin; bir sonraki istekte aynen geri gönderin.

Olay alımı

client.fraud().events().record(Map.of(
        "eventId", "evt-0001",
        "eventType", "card_payment",
        "subjectType", "customer",
        "occurredAt", "2026-10-11T08:00:00Z"));
 
FraudEventBatchResult batch = client.fraud().events().recordBatch(events);
if (!batch.failures().isEmpty()) {
    // reddedilen olayları düzeltip aynı eventId ile yeniden gönderin
}

Bir parti en çok 500 olay taşır; daha büyük parti ağa çıkmadan reddedilir. Parti kısmen başarılı olabilir: uç 200 döner, reddedilen olaylar failures() listesindedir. Aynı eventId ile yeniden gönderim güvenlidir.

Webhook doğrulama

WebhookEvent event = new WebhookVerifier().verify(rawBody, headers, endpointSecret);

rawBody gövdenin ham hâli olmalıdır; JSON'u ayrıştırıp yeniden seri hâle getirirseniz baytlar değişir ve teslimat doğrulanamaz. Doğrulama fail-closed çalışır, her uyuşmazlıkta istisna fırlatır. Fraud olay tipleri FraudEvents sabitlerindedir.

Hatalar

SınıfDurum
ValidationException400 / 422 — gövde reddedildi
AuthenticationExceptionToken alınamadı (imza, anahtar, IP)
RateLimitException429 — retryAfter()
ServiceUnavailableException503 — retryAfter()
LunixiApiExceptionDiğer hata yanıtları ve taşıma hataları
ConfigurationExceptionYerel doğrulama; ağa çıkılmadan önce
SignatureExceptionAnahtar okunamadı ya da imzalanamadı
WebhookVerificationExceptionWebhook doğrulanamadı

Dallanmayı code() üzerinden yapın; mesaj metni değişebilir.

Yeniden deneme

  • 401: token yenilenir ve istek bir kez yeniden gönderilir.
  • Taşıma hatası ya da 5xx: yalnız okuma veya idempotency anahtarı taşıyan çağrılar yeniden denenir.
  • Diğer 4xx: yeniden denenmez.

İlgili