> ## 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 и транзакций

> Быстрый старт с официальным Go SDK Didit: типизированные вызовы серверных API только на стандартной библиотеке, проверка webhook и токенов.

Официальный модуль Didit для Go. Для него нужен Go 1.22 или новее, и он использует только стандартную библиотеку. Общие для всех SDK свойства описаны на странице [обзора серверных SDK](https://docs.didit.me/ru/integration/server-sdks/overview.md).

## Установка

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

Модуль доступен по адресу [`github.com/didit-protocol/sdk-go` на pkg.go.dev](https://pkg.go.dev/github.com/didit-protocol/sdk-go). Исходный код и список изменений находятся в репозитории [didit-protocol/sdk-go](https://github.com/didit-protocol/sdk-go) на GitHub.

Пакет называется `didit`. Работа с webhook находится в `github.com/didit-protocol/sdk-go/webhook`, Authentication в `.../authentication`, а опции клиента в `.../option`.

Пример на каждой странице [справочника API](https://docs.didit.me/ru/api-reference/overview.md) представляет собой тело функции: он использует `context`, `fmt` и `log` из стандартной библиотеки и этого модуля.

## Настройка клиента

`didit.NewClient()` читает `DIDIT_API_KEY` из переменных окружения. Передайте опции, чтобы переопределить его, или задайте идентификаторы организации и приложения, которые нужны вызовам в контексте приложения (кейсы, сети, регуляторные отчёты). Любую опцию также можно использовать для отдельного вызова.

```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/ru/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/ru/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

Передайте необработанное тело запроса в виде байтов и заголовки запроса. `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`. События и схему подписи см. в разделе [Webhooks](https://docs.didit.me/ru/integration/webhooks.md).

## Скрининг транзакции

Отправьте платёж, вывод средств или криптоперевод на [мониторинг транзакций](https://docs.didit.me/ru/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/ru/authentication/overview.md), на вашем бэкенде, без вызова Didit для каждого запроса. Он также обменивает коды, обновляет токены, проверяет и отзывает сессии и выполняет step-up-проверки.

> [!NOTE]
>
> Проверка токена выполняет проверки из раздела [Проверка токена на вашем сервере](https://docs.didit.me/ru/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/ru/standalone-apis/address-validation.md)
* [Пакетное удаление транзакций](https://docs.didit.me/ru/management-api/transactions/delete.md)
* Сети Travel Rule: [получить сети](https://docs.didit.me/ru/management-api/travel-rule/get-networks.md), [запросить доступ к сети](https://docs.didit.me/ru/management-api/travel-rule/request-network.md), а также [получить](https://docs.didit.me/ru/management-api/travel-rule/get-network-questionnaire.md), [сохранить](https://docs.didit.me/ru/management-api/travel-rule/update-network-questionnaire.md) или [отправить](https://docs.didit.me/ru/management-api/travel-rule/submit-network-questionnaire.md) анкету сети
* Подтверждения кошельков Travel Rule: [получить список подтверждений кошельков в виде скриншотов](https://docs.didit.me/ru/management-api/travel-rule/list-wallet-proofs.md) и [одобрить или отклонить одно из них](https://docs.didit.me/ru/management-api/travel-rule/decide-wallet-proof.md)
* Google Wallet, которого пока нет ни в одном релизе 1.0.1: [запустить верификацию Google Wallet](https://docs.didit.me/ru/api-reference/digital-id-wallets/google-wallet.md) и [отправить ответ кошелька](https://docs.didit.me/ru/standalone-apis/digital-id-wallet-response.md)

Кроме того, он не может отправлять следующие новые поля запроса:

* `biometric_consent`, `tags` и `user_state` при [создании сессии](https://docs.didit.me/ru/sessions-api/create-session.md)
* `biometric_consent_mode` при [обновлении конфигурации webhook](https://docs.didit.me/ru/management-api/webhook/update-config.md)
* `beneficiary_vasp` при [обновлении перевода Travel Rule](https://docs.didit.me/ru/management-api/travel-rule/update-transfer.md)
* `confirm_delete`, который нужен для [удаления завершённого отчёта](https://docs.didit.me/ru/management-api/regulatory-reports/delete.md)
* 16 новых полей проверки по базам данных, которых нет ни в одном релизе 1.0.1

Пока в одном из следующих релизов Go их не добавят, вызывайте эти эндпоинты по HTTP, как показано в cURL-запросе на каждой странице. У каждой другой страницы серверного эндпоинта в [справочнике API](https://docs.didit.me/ru/api-reference/overview.md) есть пример на Go для его операции.


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