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

# Go SDK로 KYC, AML 및 거래 처리

> Didit 공식 Go SDK 빠른 시작 가이드입니다. 표준 라이브러리만으로 서버 API를 타입 지정 방식으로 호출하고, webhook 검증과 토큰 확인을 처리합니다.

Didit의 공식 Go 모듈입니다. Go 1.22 이상이 필요하며 표준 라이브러리만 사용합니다. 모든 SDK가 공유하는 내용은 [서버 SDK 개요](https://docs.didit.me/ko/integration/server-sdks/overview.md)를 참고하십시오.

## 설치

```bash theme={null}
go get github.com/didit-protocol/sdk-go
```

이 모듈은 [pkg.go.dev의 `github.com/didit-protocol/sdk-go`](https://pkg.go.dev/github.com/didit-protocol/sdk-go)에서 확인할 수 있습니다. 소스 코드와 변경 로그는 GitHub의 [didit-protocol/sdk-go](https://github.com/didit-protocol/sdk-go)에 있습니다.

패키지 이름은 `didit`입니다. 웹훅은 `github.com/didit-protocol/sdk-go/webhook`에, Authentication은 `.../authentication`에, 클라이언트 옵션은 `.../option`에 있습니다.

각 [API 레퍼런스](https://docs.didit.me/ko/api-reference/overview.md) 페이지의 샘플은 함수의 본문입니다. 표준 라이브러리의 `context`, `fmt`, `log`와 이 모듈을 사용합니다.

## 클라이언트 구성

`didit.NewClient()`는 환경 변수 `DIDIT_API_KEY`를 읽습니다. 이 값을 재정의하거나, 케이스, 네트워크, 규제 보고서처럼 애플리케이션 범위의 호출에 필요한 조직 ID와 애플리케이션 ID를 설정하려면 옵션을 전달하십시오. 모든 옵션은 개별 호출에도 사용할 수 있습니다.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/option"
)

func main() {
	client := didit.NewClient(
		option.WithAPIKey(os.Getenv("DIDIT_API_KEY")),
		option.WithOrganizationID(os.Getenv("DIDIT_ORGANIZATION_ID")),
		option.WithApplicationID(os.Getenv("DIDIT_APPLICATION_ID")),
		option.WithTimeout(30*time.Second),
		option.WithMaxRetries(2),
	)

	// Options for a single call.
	decision, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{}, option.WithTimeout(5*time.Second))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(decision.Status)
}
```

선택적 요청 필드는 `didit.Opt` 값입니다. `didit.String`, `didit.Int`, `didit.Bool`, `didit.Float` 또는 `didit.Some`으로 설정하고, 보내지 않으려면 생략하십시오.

## 세션 생성

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

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	session, err := client.Sessions.Create(context.Background(), didit.SessionsCreateParams{
		WorkflowID: "11111111-2222-3333-4444-555555555555",
		VendorData: didit.String("user-123"),
		Callback:   didit.String("https://example.com/verification/done"),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(session.URL)
}
```

## 결정 읽기

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

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	decision, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(decision.Status)
	for _, verification := range decision.IDVerifications {
		fmt.Println(verification.Status)
	}
}
```

## 웹훅 검증

원본 본문 바이트와 요청 헤더를 전달하십시오. `webhook.Verify`는 유효하지 않거나 유효 기간이 지난 전송에 대해 `*didit.WebhookVerificationError`를 반환하고, 그 밖의 경우에는 타입이 지정된 이벤트를 반환합니다.

```go theme={null}
package main

import (
	"errors"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/webhook"
)

func main() {
	secret := os.Getenv("DIDIT_WEBHOOK_SECRET")
	http.HandleFunc("POST /webhooks/didit", func(w http.ResponseWriter, r *http.Request) {
		body, err := io.ReadAll(http.MaxBytesReader(w, r.Body, 1<<20))
		if err != nil {
			http.Error(w, "bad body", http.StatusBadRequest)
			return
		}
		event, err := webhook.Verify(body, r.Header, secret)
		var invalid *didit.WebhookVerificationError
		if errors.As(err, &invalid) {
			http.Error(w, string(invalid.Reason), http.StatusBadRequest)
			return
		} else if err != nil {
			http.Error(w, "error", http.StatusInternalServerError)
			return
		}
		if e, ok := event.(*webhook.StatusUpdatedEvent); ok {
			fmt.Println(e.SessionID, e.Status)
		}
		w.WriteHeader(http.StatusOK)
	})
	log.Fatal(http.ListenAndServe(":8080", nil))
}
```

비밀 값을 교체하는 동안에는 `webhook.WithSecrets`로 이전 값을 추가하십시오. 이벤트와 서명 방식은 [웹훅](https://docs.didit.me/ko/integration/webhooks.md)을 참고하십시오.

## 거래 스크리닝

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

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	transaction, err := client.Transactions.Create(context.Background(), didit.TransactionsCreateParams{
		TransactionID:       "txn-1001",
		TransactionCategory: "finance",
		TransactionDetails: didit.TransactionsCreateParamsTransactionDetails{
			Direction: "outbound",
			Amount:    1500,
			Currency:  "EUR",
		},
		Subject: didit.TransactionsCreateParamsSubject{
			EntityType: didit.String("individual"),
			VendorData: "user-123",
			FullName:   "Maria Garcia",
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(transaction.Status, transaction.Score)
}
```

## Authentication 토큰 검증

`authentication` 패키지는 백엔드에서 [Authentication](https://docs.didit.me/ko/authentication/overview.md) 발급자가 서명한 액세스 토큰을 검증합니다. 요청마다 Didit을 호출하지 않아도 됩니다. 이 패키지는 또한 코드를 교환하고, 토큰을 갱신하고, 세션을 확인 및 취소하며, 단계 상향(step-up)을 실행합니다.

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

```go theme={null}
package main

import (
	"context"
	"errors"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/authentication"
)

func main() {
	// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
	auth, err := authentication.NewFromPublishableKey("pk_live_...", authentication.WithClientID("your-application-id"))
	if err != nil {
		log.Fatal(err)
	}

	claims, err := auth.VerifyAccessToken(context.Background(), "the bearer token")
	var invalid *didit.TokenVerificationError
	if errors.As(err, &invalid) {
		fmt.Println("rejected:", invalid.Reason)
		return
	} else if err != nil {
		log.Fatal(err)
	}
	fmt.Println(claims.Subject)
}
```

## 오류

```go theme={null}
package main

import (
	"context"
	"errors"
	"fmt"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	_, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{})
	var notFound *didit.NotFoundError
	var status *didit.APIStatusError
	switch {
	case errors.As(err, &notFound):
		fmt.Println("no such session")
	case errors.As(err, &status):
		fmt.Println(status.StatusCode, status.RequestID, status.Body)
	case err != nil:
		fmt.Println("no response:", err)
	}
}
```

## 목록 및 파일

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	ctx := context.Background()
	client := didit.NewClient()

	// Lists page through every result.
	iter := client.Sessions.ListAutoPaging(ctx, didit.SessionsListParams{Status: didit.String("Approved")})
	for iter.Next() {
		fmt.Println(iter.Current().SessionID)
	}
	if err := iter.Err(); err != nil {
		log.Fatal(err)
	}

	// Uploads take didit.FileFromPath, FileFromBytes or FileFromReader.
	result, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{
		FrontImage: didit.FileFromPath("id-front.jpg"),
		BackImage:  didit.Some(didit.FileFromPath("id-back.jpg")),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result.IDVerification.Status)
}
```

## Go SDK에 아직 없는 엔드포인트

Go 1.0.1은 아래 엔드포인트가 API에 추가되기 전에 생성되었으므로, 이들에 대한 메서드가 없고 해당 페이지에는 Go 샘플이 없습니다.

* [주소 검증](https://docs.didit.me/ko/standalone-apis/address-validation.md)
* [거래 일괄 삭제](https://docs.didit.me/ko/management-api/transactions/delete.md)
* Travel Rule 네트워크: [네트워크 목록 조회](https://docs.didit.me/ko/management-api/travel-rule/get-networks.md), [네트워크 접근 요청](https://docs.didit.me/ko/management-api/travel-rule/request-network.md), 그리고 네트워크 설문지 [조회](https://docs.didit.me/ko/management-api/travel-rule/get-network-questionnaire.md), [저장](https://docs.didit.me/ko/management-api/travel-rule/update-network-questionnaire.md) 또는 [제출](https://docs.didit.me/ko/management-api/travel-rule/submit-network-questionnaire.md)
* Travel Rule 지갑 증명: [스크린샷 지갑 증명 목록 조회](https://docs.didit.me/ko/management-api/travel-rule/list-wallet-proofs.md) 및 [하나를 승인하거나 거부](https://docs.didit.me/ko/management-api/travel-rule/decide-wallet-proof.md)
* 아직 어떤 1.0.1 릴리스에도 포함되지 않은 Google Wallet: [Google Wallet 인증 시작](https://docs.didit.me/ko/api-reference/digital-id-wallets/google-wallet.md) 및 [지갑 응답 제출](https://docs.didit.me/ko/standalone-apis/digital-id-wallet-response.md)

또한 다음의 신규 요청 필드는 전송할 수 없습니다.

* [세션을 생성](https://docs.didit.me/ko/sessions-api/create-session.md)할 때의 `biometric_consent`, `tags`, `user_state`
* [웹훅 구성을 업데이트](https://docs.didit.me/ko/management-api/webhook/update-config.md)할 때의 `biometric_consent_mode`
* [Travel Rule 전송을 업데이트](https://docs.didit.me/ko/management-api/travel-rule/update-transfer.md)할 때의 `beneficiary_vasp`
* [확정된 보고서를 삭제](https://docs.didit.me/ko/management-api/regulatory-reports/delete.md)할 때 필요한 `confirm_delete`
* 1.0.1 릴리스에 없는 데이터베이스 검증의 신규 필드 16개

이후 Go 릴리스에서 추가되기 전까지는 각 페이지의 cURL 요청이 보여 주는 대로 HTTP로 호출하십시오. [API 레퍼런스](https://docs.didit.me/ko/api-reference/overview.md)의 다른 모든 서버 엔드포인트 페이지에는 해당 작업의 Go 샘플이 있습니다.


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