> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# حزمة Java وKotlin SDK لـ KYC وفحص AML والمعاملات

> دليل البدء السريع لحزمة Didit الرسمية لـ Java وKotlin: بنّاءات مُنمَّطة، واستدعاءات متزامنة وغير متزامنة، والتحقق من webhook والرموز.

المكتبة الرسمية لـDidit الخاصة بـJava وKotlin. تتطلب Java 11 أو إصدارًا أحدث، ولا تعتمد إلا على `java.net.http` وJackson وتعليقات JSpecify التوضيحية الخاصة بإمكان كون القيمة فارغة. يحتوي كل أسلوب على صيغة `...Async` تُعيد قيمة من النوع `CompletableFuture`. راجع [نظرة عامة على SDKs للخادم](https://docs.didit.me/ar/integration/server-sdks/overview.md) للاطلاع على ما تشترك فيه جميع حزم SDK.

## التثبيت

```kotlin Gradle theme={null}
implementation("me.didit:didit-java:1.0.1")
```

```xml Maven theme={null}
<dependency>
  <groupId>me.didit</groupId>
  <artifactId>didit-java</artifactId>
  <version>1.0.1</version>
</dependency>
```

تتوفر الحزمة [`me.didit:didit-java` على Maven Central](https://central.sonatype.com/artifact/me.didit/didit-java). وتتوفر شيفرتها المصدرية وسجل تغييراتها في [didit-protocol/sdk-java](https://github.com/didit-protocol/sdk-java) على GitHub.

## تهيئة العميل

`new Didit()` يقرأ `DIDIT_API_KEY` من متغيرات البيئة. استخدم أداة البناء لتجاوزه، أو لتعيين معرّفات المؤسسة والتطبيق اللازمة للاستدعاءات المرتبطة بالتطبيق (الحالات والشبكات والتقارير التنظيمية).

```java theme={null}
import java.time.Duration;
import me.didit.Didit;
import me.didit.core.RequestOptions;
import me.didit.types.SessionsRetrieveDecisionParams;

Didit client = Didit.builder()
        .apiKey(System.getenv("DIDIT_API_KEY"))
        .organizationId(System.getenv("DIDIT_ORGANIZATION_ID"))
        .applicationId(System.getenv("DIDIT_APPLICATION_ID"))
        .timeout(Duration.ofSeconds(30))
        .maxRetries(2)
        .build();

// Options for a single call.
var decision = client.sessions().retrieveDecision("11111111-2222-3333-4444-555555555555",
        SessionsRetrieveDecisionParams.builder().build(),
        RequestOptions.builder().timeout(Duration.ofSeconds(5)).build());
System.out.println(decision.status().orElse(null));
```

أنواع الطلبات عبارة عن أدوات بناء، وتتحقق `build()` من الحقول المطلوبة. حقول الاستجابة الاختيارية هي قيم من النوع `Optional`؛ وفي Kotlin، اقرأها باستخدام `.getOrNull()`. الأمثلة الواردة في هذه الصفحة وفي كل صفحة من [مرجع API](https://docs.didit.me/ar/api-reference/overview.md) هي جسم الدالة، مع الاستيرادات اللازمة أعلاها.

## إنشاء جلسة

أنشئ [جلسة تحقق](https://docs.didit.me/ar/sessions-api/create-session.md) لسير عمل، وأرسل المستخدم إلى عنوان URL الخاص بها.

```java theme={null}
import me.didit.Didit;
import me.didit.types.SessionsCreateParams;

Didit client = new Didit();

var session = client.sessions().create(SessionsCreateParams.builder()
        .workflowId("11111111-2222-3333-4444-555555555555")
        .vendorData("user-123")
        .callback("https://example.com/verification/done")
        .build());
System.out.println(session.url());
```

## قراءة القرار

عند انتهاء المستخدم (أو عند وصول webhook)، [اقرأ القرار](https://docs.didit.me/ar/sessions-api/retrieve-session.md). كل نتيجة ميزة هي قائمة تحتوي على إدخال واحد لكل عقدة في سير العمل.

```java theme={null}
import java.util.List;
import me.didit.Didit;

Didit client = new Didit();

var decision = client.sessions().retrieveDecision("11111111-2222-3333-4444-555555555555");
decision.status().ifPresent(status -> System.out.println(status));
for (var verification : decision.idVerifications().orElse(List.of())) {
    System.out.println(verification.status().orElse(null));
}
```

## التحقق من webhook

مرّر الجسم الخام كما تم استلامه، مع رؤوس الطلب. تُطلق `Webhooks.verify` الاستثناء `WebhookVerificationException` لأي حالة لا تمثل عملية تسليم صالحة وحديثة، وتعيد حدثًا مُحدد النوع في الحالات الأخرى.

```java theme={null}
import java.util.Map;
import me.didit.errors.WebhookVerificationException;
import me.didit.webhooks.SessionStatusUpdatedEvent;
import me.didit.webhooks.WebhookEvent;
import me.didit.webhooks.Webhooks;

public class DiditWebhookHandler {
    private final String secret = System.getenv("DIDIT_WEBHOOK_SECRET");

    public int handle(byte[] rawBody, Map<String, String> headers) {
        WebhookEvent event;
        try {
            event = Webhooks.verify(rawBody, headers, secret);
        } catch (WebhookVerificationException e) {
            System.out.println("rejected: " + e.reason());
            return 400;
        }
        if (event instanceof SessionStatusUpdatedEvent) {
            SessionStatusUpdatedEvent updated = (SessionStatusUpdatedEvent) event;
            System.out.println(updated.sessionId().orElse("") + " " + updated.status().orElse(""));
        }
        return 200;
    }
}
```

في Spring Boot، خذ الجسم على هيئة `@RequestBody byte[] body` والرؤوس على هيئة `@RequestHeader Map<String, String> headers`. لقبول سرّين أثناء تدوير أحدهما، مرّر `VerifyOptions`. راجع [webhook](https://docs.didit.me/ar/integration/webhooks.md) للاطلاع على الأحداث ومخطط التوقيع.

## فحص معاملة

أرسل دفعة أو سحبًا أو تحويلًا بالعملات المشفرة إلى [مراقبة المعاملات](https://docs.didit.me/ar/transaction-monitoring/overview.md)؛ تتضمن الاستجابة حالتها ودرجة المخاطر الخاصة بها.

```java theme={null}
import me.didit.Didit;
import me.didit.types.TransactionsCreateParams;

Didit client = new Didit();

var transaction = client.transactions().create(TransactionsCreateParams.builder()
        .transactionId("txn-1001")
        .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
        .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                .amount(1500.0)
                .currency("EUR")
                .build())
        .subject(TransactionsCreateParams.Subject.builder()
                .entityType("individual")
                .vendorData("user-123")
                .fullName("Maria Garcia")
                .build())
        .build());
System.out.println(transaction.status().orElse(null) + " " + transaction.score().orElse(null));
```

## التحقق من رموز Authentication

تتحقق `Authentication` من رموز الوصول التي يوقّعها المُصدِر الخاص بك في [Authentication](https://docs.didit.me/ar/authentication/overview.md)، وذلك في الخادم الخلفي دون استدعاء Didit لكل طلب. كما تستبدل الرموز، وتجدد الرموز، وتتحقق من الجلسات وتلغيها، وتشغّل الترقية إلى مستوى مصادقة أعلى.

> [!NOTE]
>
> يُجري التحقق من الرمز الفحوصات الواردة في [التحقق من رمز على الخادم الخاص بك](https://docs.didit.me/ar/authentication/tokens-and-jwks.md#التحقق-من-رمز-على-الخادم-لديك)، وذلك مقابل المُصدِر ومفاتيح التوقيع الخاصة بتطبيقك.

```java theme={null}
import me.didit.authentication.AccessTokenClaims;
import me.didit.authentication.Authentication;
import me.didit.errors.TokenVerificationException;

public class CurrentUser {
    // The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
    private final Authentication auth = Authentication.builder()
            .publishableKey("pk_live_...")
            .clientId("your-application-id")
            .build();

    public String subject(String accessToken) {
        try {
            AccessTokenClaims claims = auth.verifyAccessToken(accessToken);
            return claims.subject();
        } catch (TokenVerificationException e) {
            System.out.println("rejected: " + e.reason());
            return null;
        }
    }
}
```

## الأخطاء

كل استثناء يرث من `DiditException`، وهو استثناء غير مفحوص.

```java theme={null}
import me.didit.Didit;
import me.didit.errors.ApiStatusException;
import me.didit.errors.NotFoundException;

Didit client = new Didit();

try {
    client.sessions().retrieveDecision("11111111-2222-3333-4444-555555555555");
} catch (NotFoundException e) {
    System.out.println("no such session");
} catch (ApiStatusException e) {
    System.out.println(e.statusCode() + " " + e.requestId().orElse(""));
}
```

## القوائم والملفات

```java theme={null}
import java.nio.file.Path;
import me.didit.Didit;
import me.didit.types.IdVerificationVerifyParams;
import me.didit.types.SessionsListParams;

Didit client = new Didit();

// Lists page through every result.
for (var session : client.sessions().list(SessionsListParams.builder().status("Approved").build())) {
    System.out.println(session);
}

// Uploads take a Path or a FileUpload (bytes or a stream).
var result = client.idVerification().verify(IdVerificationVerifyParams.builder()
        .frontImage(Path.of("id-front.jpg"))
        .backImage(Path.of("id-back.jpg"))
        .build());
System.out.println(result);
```

تتضمن صفحات endpoint الخادم في [مرجع API](https://docs.didit.me/ar/api-reference/overview.md) مثالًا بلغة Java لعمليتها، باستثناء endpoints والحقول التي لم تُدرج بعد في أي إصدار 1.0.1، وهي مذكورة في [النظرة العامة](https://docs.didit.me/ar/integration/server-sdks/overview.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.