> ## 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.

# C# 및 .NET SDK: KYC, AML, 거래 모니터링

> Didit 공식 C# 및 .NET SDK 빠른 시작 가이드입니다. 서버 API용 비동기 타입 호출, 의존성 주입, webhook 검증, token 검증을 안내합니다.

C# 및 .NET용 공식 Didit 라이브러리입니다. .NET 8과 .NET Standard 2.0을 대상으로 하며, 모든 API 메서드는 `async`입니다. .NET Framework에서는 C# 11 이상을 사용하십시오. 모든 SDK가 공유하는 내용은 [서버 SDK 개요](https://docs.didit.me/ko/integration/server-sdks/overview.md)를 참조하십시오.

## 설치

```bash theme={null}
dotnet add package Didit
```

ASP.NET Core 의존성 주입을 사용하려면 `Didit.Extensions.DependencyInjection`도 추가하고 `services.AddDidit()`으로 클라이언트를 등록하십시오.

패키지는 NuGet의 [`Didit`](https://www.nuget.org/packages/Didit)과 [`Didit.Extensions.DependencyInjection`](https://www.nuget.org/packages/Didit.Extensions.DependencyInjection)입니다. 소스 코드와 변경 로그는 GitHub의 [didit-protocol/sdk-dotnet](https://github.com/didit-protocol/sdk-dotnet)에 있습니다.

## 클라이언트 구성

`new DiditClient()`는 환경 변수에서 `DIDIT_API_KEY`를 읽습니다. 이를 재정의하려면 `DiditClientOptions`를 전달하십시오. 케이스, 네트워크, 규제 보고서처럼 애플리케이션 범위의 호출에 필요한 조직 ID와 애플리케이션 ID도 여기서 설정할 수 있습니다. 클라이언트는 하나만 만들어 재사용하십시오.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient(new DiditClientOptions
{
    ApiKey = Environment.GetEnvironmentVariable("DIDIT_API_KEY"),
    OrganizationId = Environment.GetEnvironmentVariable("DIDIT_ORGANIZATION_ID"),
    ApplicationId = Environment.GetEnvironmentVariable("DIDIT_APPLICATION_ID"),
    Timeout = TimeSpan.FromSeconds(30),
    MaxRetries = 2,
});

// Options for a single call.
var decision = await client.Sessions.RetrieveDecisionAsync(
    "11111111-2222-3333-4444-555555555555",
    requestOptions: new RequestOptions { Timeout = TimeSpan.FromSeconds(5), MaxRetries = 0 });
Console.WriteLine(decision.Status);
```

필수 요청 속성은 `required`로 표시되어 있으므로 누락되면 컴파일되지 않습니다. 설정하지 않은 선택 속성은 전송되지 않습니다.

## 세션 생성

워크플로에 대한 [검증 세션](https://docs.didit.me/ko/sessions-api/create-session.md)을 생성하고, 사용자를 해당 URL로 안내하십시오.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

var session = await client.Sessions.CreateAsync(new SessionsCreateParams
{
    WorkflowId = "11111111-2222-3333-4444-555555555555",
    VendorData = "user-123",
    Callback = "https://example.com/verification/done",
});
Console.WriteLine(session.Url);
```

## 결정 읽기

사용자가 절차를 마치면(또는 webhook이 도착하면) [결정을 읽으십시오](https://docs.didit.me/ko/sessions-api/retrieve-session.md). 모든 기능 결과는 워크플로 노드마다 하나의 항목을 가진 목록입니다.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

var decision = await client.Sessions.RetrieveDecisionAsync("11111111-2222-3333-4444-555555555555");
Console.WriteLine(decision.Status);
foreach (var verification in decision.IdVerifications ?? Array.Empty<SessionDecisionIdVerifications>())
{
    Console.WriteLine(verification.Status);
}
```

## Webhook 검증

원시 본문을 받은 그대로 전달하고, 요청 헤더를 읽는 방법도 함께 전달하십시오. `DiditWebhooks.Verify`는 유효하지 않거나 오래된 전송에 대해 `WebhookVerificationException`을 던지며, 그 밖의 경우에는 타입이 지정된 이벤트를 반환합니다.

```csharp theme={null}
using System;
using Didit;

var secret = Environment.GetEnvironmentVariable("DIDIT_WEBHOOK_SECRET") ?? "";

int HandleWebhook(string rawBody, Func<string, string?> header)
{
    try
    {
        var evt = DiditWebhooks.Verify(rawBody, header, secret);
        if (evt is SessionStatusUpdatedEvent updated)
        {
            Console.WriteLine($"{updated.SessionId} {updated.Status}");
        }
        return 200;
    }
    catch (WebhookVerificationException error)
    {
        Console.WriteLine($"rejected: {error.Reason}");
        return 400;
    }
}
```

ASP.NET Core 최소 API에서는 `StreamReader`로 본문을 읽고 `name => request.Headers[name].FirstOrDefault()`를 전달하십시오. 시크릿을 교체하는 동안에는 두 값을 모두 전달하십시오: `new[] { newSecret, oldSecret }`. 이벤트와 서명 방식은 [Webhooks](https://docs.didit.me/ko/integration/webhooks.md)를 참조하십시오.

## 거래 스크리닝

결제, 출금 또는 암호화폐 송금을 [거래 모니터링](https://docs.didit.me/ko/transaction-monitoring/overview.md)에 제출하십시오. 응답에는 상태와 위험 점수가 포함됩니다.

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

var transaction = await client.Transactions.CreateAsync(new TransactionsCreateParams
{
    TransactionId = "txn-1001",
    TransactionCategory = "finance",
    TransactionDetails = new()
    {
        Direction = "outbound",
        Amount = 1500,
        Currency = "EUR",
    },
    Subject = new()
    {
        EntityType = "individual",
        VendorData = "user-123",
        FullName = "Maria Garcia",
    },
});
Console.WriteLine($"{transaction.Status} {transaction.Score}");
```

## Authentication 토큰 검증

`Authentication`은 [Authentication](https://docs.didit.me/ko/authentication/overview.md) 발급자가 서명한 액세스 토큰을 백엔드에서 검증하며, 요청마다 Didit을 호출하지 않습니다. 또한 코드를 교환하고, 토큰을 갱신하며, 세션을 확인 및 폐기하고, 추가 인증을 실행합니다.

> [!NOTE]
>
> 토큰 검증은 애플리케이션의 발급자와 서명 키를 기준으로 [서버에서 토큰 검증](https://docs.didit.me/ko/authentication/tokens-and-jwks.md#서버에서-토큰-검증)에 나열된 검사를 수행합니다.

```csharp theme={null}
using System;
using System.Threading.Tasks;
using Didit;

// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
var auth = Authentication.FromPublishableKey("pk_live_...");

async Task<string?> CurrentUserAsync(string accessToken)
{
    try
    {
        var claims = await auth.VerifyAccessTokenAsync(accessToken, audience: "your-application-id");
        return claims.Subject;
    }
    catch (TokenVerificationException error)
    {
        Console.WriteLine($"rejected: {error.Reason}");
        return null;
    }
}
```

## 오류

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

try
{
    await client.Sessions.RetrieveDecisionAsync("11111111-2222-3333-4444-555555555555");
}
catch (NotFoundException)
{
    Console.WriteLine("no such session");
}
catch (ApiStatusException error)
{
    Console.WriteLine($"{error.StatusCode} {error.RequestId}");
}
```

## 목록 및 파일

```csharp theme={null}
using System;
using Didit;

using var client = new DiditClient();

// Lists page through every result.
await foreach (var session in await client.Sessions.ListAsync(new SessionsListParams { Status = "Approved" }))
{
    Console.WriteLine(session.SessionId);
}

// Uploads take FileUpload.FromPath, FromBytes or FromStream.
var result = await client.IdVerification.VerifyAsync(new IdVerificationVerifyParams
{
    FrontImage = FileUpload.FromPath("id-front.jpg"),
    BackImage = FileUpload.FromPath("id-back.jpg"),
});
Console.WriteLine(result.IdVerification?.Status);
```

[API 레퍼런스](https://docs.didit.me/ko/api-reference/overview.md)의 서버 엔드포인트 페이지에는 각 작업에 대한 .NET 샘플이 있습니다. 단, 1.0.1 릴리스에 아직 포함되지 않은 엔드포인트와 필드는 예외이며, 이는 [개요](https://docs.didit.me/ko/integration/server-sdks/overview.md)에 명시되어 있습니다.


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