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

# Ruby SDK Didit: KYC, AML и мониторинг транзакций

> Быстрый старт для официального Ruby SDK Didit: серверные API на net/http, проверка webhook для Rails и проверка токенов Authentication.

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

## Установка

```bash theme={null}
gem install didit-sdk
```

Гем доступен как [`didit-sdk` на RubyGems](https://rubygems.org/gems/didit-sdk). Его исходный код и журнал изменений находятся в [didit-protocol/sdk-ruby](https://github.com/didit-protocol/sdk-ruby) на GitHub.

Или добавьте `gem "didit-sdk"` в Gemfile и выполните `bundle install`. Подключите гем командой `require "didit"`.

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

`Didit::Client.new` читает `DIDIT_API_KEY` из окружения. Передайте именованные аргументы, чтобы переопределить его или задать идентификаторы организации и приложения, которые нужны вызовам, привязанным к приложению (кейсы, сети, регуляторные отчёты). Поля запроса передаются как именованные аргументы с именами из API. Ответы представляют собой объекты, у каждого поля есть метод чтения, а также доступ через `[:field]` и `to_h`.

```ruby theme={null}
require "didit"

didit = Didit::Client.new(
  api_key: ENV["DIDIT_API_KEY"],
  organization_id: ENV["DIDIT_ORGANIZATION_ID"],
  application_id: ENV["DIDIT_APPLICATION_ID"],
  timeout: 30,
  max_retries: 2
)

# Options for a single call.
decision = didit.with_options(timeout: 5, max_retries: 0).sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")
puts decision.status
```

## Создание сессии

Создайте [сессию верификации](https://docs.didit.me/ru/sessions-api/create-session.md) для сценария и отправьте пользователя по её URL.

```ruby theme={null}
require "didit"

didit = Didit::Client.new

session = didit.sessions.create(
  workflow_id: "11111111-2222-3333-4444-555555555555",
  vendor_data: "user-123",
  callback: "https://example.com/verification/done"
)
puts session.url
```

## Получение решения

Когда пользователь завершит процесс (или когда придёт webhook), [получите решение](https://docs.didit.me/ru/sessions-api/retrieve-session.md). Результат каждой функции представляет собой список с одной записью на каждый узел сценария.

```ruby theme={null}
require "didit"

didit = Didit::Client.new

decision = didit.sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")
puts decision.status
(decision.id_verifications || []).each do |verification|
  puts verification.status
end
```

## Проверка webhook

Передайте необработанное тело запроса ровно в том виде, в каком оно получено, и заголовки запроса. `verify` вызывает исключение `Didit::WebhookVerificationError` для любой некорректной или просроченной доставки и возвращает типизированное событие в остальных случаях.

```ruby theme={null}
require "didit"

WEBHOOK_SECRET = ENV.fetch("DIDIT_WEBHOOK_SECRET", "")

def handle_webhook(raw_body, headers)
  event = Didit::Webhooks.verify(raw_body, headers, WEBHOOK_SECRET)
  case event
  when Didit::Webhooks::StatusUpdatedEvent
    puts "#{event.session_id} #{event.status}"
  end
  200
rescue Didit::WebhookVerificationError => e
  puts "rejected: #{e.reason}"
  400
end
```

В Rails вызовите `handle_webhook(request.raw_post, request.headers)`. Пока вы выполняете ротацию секрета, передайте оба: `[new_secret, old_secret]`. Список событий и схему подписи см. в разделе [Webhooks](https://docs.didit.me/ru/integration/webhooks.md).

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

Отправьте платёж, вывод средств или криптоперевод в [мониторинг транзакций](https://docs.didit.me/ru/transaction-monitoring/overview.md). В ответе будут указаны статус и оценка риска.

```ruby theme={null}
require "didit"

didit = Didit::Client.new

transaction = didit.transactions.create(
  transaction_id: "txn-1001",
  transaction_category: "finance",
  transaction_details: { direction: "outbound", amount: 1500, currency: "EUR" },
  subject: { entity_type: "individual", vendor_data: "user-123", full_name: "Maria Garcia" }
)
puts "#{transaction.status} #{transaction.score}"
```

## Проверка токенов Authentication

`Didit::Authentication` проверяет токены доступа, которые подписывает ваш издатель [Authentication](https://docs.didit.me/ru/authentication/overview.md), на вашем бэкенде, без вызова Didit для каждого запроса. Также он обменивает коды, обновляет токены, проверяет и отзывает сессии и запускает дополнительные проверки.

> [!NOTE]
>
> Проверка токенов выполняет проверки из раздела [Проверка токена на вашем сервере](https://docs.didit.me/ru/authentication/tokens-and-jwks.md#проверка-токена-на-вашем-сервере) по издателю и ключам подписи вашего приложения.

```ruby theme={null}
require "didit"

# Your issuer URL, or Didit::Authentication.from_publishable_key("pk_live_...", client_id: ...).
AUTH = Didit::Authentication.new("https://your-app.auth.didit.me", client_id: "your-application-id")

def current_user(access_token)
  AUTH.verify_access_token(access_token).sub
rescue Didit::TokenVerificationError => e
  puts "rejected: #{e.reason}"
  nil
end
```

## Ошибки

```ruby theme={null}
require "didit"

didit = Didit::Client.new

begin
  didit.sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")
rescue Didit::NotFoundError
  puts "no such session"
rescue Didit::APIStatusError => e
  puts "#{e.status} #{e.request_id}"
end
```

## Списки и файлы

```ruby theme={null}
require "didit"

didit = Didit::Client.new

# Lists page through every result.
didit.sessions.list(status: "Approved").auto_paging_each do |session|
  puts session.session_id
end

# Uploads take a Pathname, an IO or Didit::FilePart. A String is sent as the file's bytes.
result = didit.id_verification.verify(
  front_image: Pathname("id-front.jpg"),
  back_image: Pathname("id-back.jpg")
)
puts result.to_h
```

Страницы серверных эндпоинтов в [справочнике API](https://docs.didit.me/ru/api-reference/overview.md) содержат пример на Ruby для своей операции, за исключением эндпоинтов и полей, которых пока нет в релизе 1.0.1. Они перечислены в [обзоре](https://docs.didit.me/ru/integration/server-sdks/overview.md).


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