> ## 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の検証とトークンの確認にも対応しています。

GoのためのDidit公式モジュールです。Go 1.22以降が必要で、標準ライブラリのみを使用します。すべてのSDKに共通する内容は、[サーバーSDKの概要](https://docs.didit.me/ja/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`です。Webhookは`github.com/didit-protocol/sdk-go/webhook`に、Authenticationは`.../authentication`に、クライアントオプションは`.../option`にあります。

各[APIリファレンス](https://docs.didit.me/ja/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/ja/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)
}
```

## 判定を読み取る

ユーザーによる操作が完了したとき(またはWebhookが届いたとき)に、[判定を読み取ります](https://docs.didit.me/ja/sessions-api/retrieve-session.md)。各機能の結果はスライスで、ワークフローのノードごとに1つのエントリがあります。

```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を検証する

生のボディのバイト列とリクエストヘッダーを渡します。`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`で追加します。イベントと署名方式については[Webhook](https://docs.didit.me/ja/integration/webhooks.md)を参照してください。

## 取引をスクリーニングする

支払い、出金、暗号資産の送金を[トランザクションモニタリング](https://docs.didit.me/ja/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/ja/authentication/overview.md)の発行者が署名したアクセストークンを、リクエストごとにDiditを呼び出すことなくバックエンドで検証します。また、コードの交換、トークンの更新、セッションの確認と取り消し、ステップアップの実行も行います。

> [!NOTE]
>
> トークン検証では、アプリケーションの発行者と署名鍵に対して、[サーバーでトークンを検証する](https://docs.didit.me/ja/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/ja/standalone-apis/address-validation.md)
* [取引を一括削除する](https://docs.didit.me/ja/management-api/transactions/delete.md)
* トラベルルールのネットワーク: [ネットワークを取得する](https://docs.didit.me/ja/management-api/travel-rule/get-networks.md)、[ネットワークへのアクセスをリクエストする](https://docs.didit.me/ja/management-api/travel-rule/request-network.md)、ネットワークのアンケートを[取得する](https://docs.didit.me/ja/management-api/travel-rule/get-network-questionnaire.md)、[保存する](https://docs.didit.me/ja/management-api/travel-rule/update-network-questionnaire.md)、[提出する](https://docs.didit.me/ja/management-api/travel-rule/submit-network-questionnaire.md)
* トラベルルールのウォレット証明: [スクリーンショットによるウォレット証明を一覧表示する](https://docs.didit.me/ja/management-api/travel-rule/list-wallet-proofs.md)、[承認または拒否する](https://docs.didit.me/ja/management-api/travel-rule/decide-wallet-proof.md)
* Google Wallet(1.0.1のどのリリースにもまだ含まれていません): [Google Wallet認証を開始する](https://docs.didit.me/ja/api-reference/digital-id-wallets/google-wallet.md)、[ウォレットのレスポンスを送信する](https://docs.didit.me/ja/standalone-apis/digital-id-wallet-response.md)

また、以下の新しいリクエストフィールドも送信できません。

* [セッションを作成する](https://docs.didit.me/ja/sessions-api/create-session.md)際の`biometric_consent`、`tags`、`user_state`
* [Webhook設定を更新する](https://docs.didit.me/ja/management-api/webhook/update-config.md)際の`biometric_consent_mode`
* [トラベルルールの送金を更新する](https://docs.didit.me/ja/management-api/travel-rule/update-transfer.md)際の`beneficiary_vasp`
* [確定済みレポートの削除](https://docs.didit.me/ja/management-api/regulatory-reports/delete.md)に必要な`confirm_delete`
* 1.0.1のどのリリースにもない、データベース検証の新しい16個のフィールド

今後のGoリリースでこれらが追加されるまでは、各ページのcURLリクエストに示されているとおりにHTTP経由で呼び出してください。[APIリファレンス](https://docs.didit.me/ja/api-reference/overview.md)のその他のサーバーエンドポイントのページには、すべてその操作のGoサンプルがあります。


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