Интеграция с Тбанк - получение списка транзакций по расчетному счету ЮЛ, ИП

Если у вас счет в Тбанк, то можно довольно быстро настроить загрузку данных о транзакциях по счету в свою учетную систему для дальнейшей обработки. 

Как это сделать: 

1. Получаем токен АПИ Банка - в кабинете Тбизнес - Все сервисы - Интеграции - Интеграция по АПИ - Получить токен.

2. Делаем тестовый запрос на /asapi на основе документации - https://developer.tbank.ru/docs/api/get-api-v-1-statement

3. Как удалось получить нормальный JSON отклик, то распарсиваем его через такой код: 

declare @s nvarchar(max) = '... здесь большой JSON по операциям ....'
select 
* FROM OPENJSON(@s, '$.operations')
WITH (
operationDate datetime '$.operationDate',
operationId nvarchar(512) '$.operationId',
accountNumber nvarchar(512) '$.accountNumber',
typeOfOperation nvarchar(512) '$.typeOfOperation',
category nvarchar(512) '$.category',
operationAmount decimal(18,2) '$.operationAmount',
description nvarchar(512) '$.description',
payPurpose nvarchar(512) '$.payPurpose',

payer_acct nvarchar(512) '$.payer.acct',
payer_inn nvarchar(512) '$.payer.inn',
payer_name nvarchar(512) '$.payer.name',

receiver_acct nvarchar(512) '$.receiver.acct',
receiver_inn nvarchar(512) '$.receiver.inn',
receiver_name nvarchar(512) '$.receiver.name',
rrn nvarchar(512) '$.rrn'
) t1

4. Создаем таблицу tbank_operations - таблица нужна чисто для хранения транзакций Тбанка и не является универсальной. 

CREATE TABLE [dbo].[tbank_operations](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[operationDate] [datetime] NULL,
	[operationId] [nvarchar](512) NULL,
	[accountNumber] [nvarchar](512) NULL,
	[typeOfOperation] [nvarchar](512) NULL,
	[category] [nvarchar](512) NULL,
	[operationAmount] [decimal](18, 2) NULL,
	[description] [nvarchar](512) NULL,
	[payPurpose] [nvarchar](512) NULL,
	[payer_acct] [nvarchar](512) NULL,
	[payer_inn] [nvarchar](512) NULL,
	[payer_name] [nvarchar](512) NULL,
	[receiver_acct] [nvarchar](512) NULL,
	[receiver_inn] [nvarchar](512) NULL,
	[receiver_name] [nvarchar](512) NULL,
	[rrn] [nvarchar](512) NULL,
 CONSTRAINT [PK_tbank_operations] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

5. Теперь создаем исходящий метод API, который будет запрашивать данные в Тбанк и сохранять их в таблице. Код - tblank_getOperations.

Request процедура: 

CREATE PROCEDURE [dbo].[api_tbank_getoperations_request]
	@parameters ExtendedDictionaryParameter READONLY,  
	@username nvarchar(32)  
AS
BEGIN
    -- детали https://developer.tbank.ru/docs/api/get-api-v-1-statement
    declare @token nvarchar(256) = dbo.as_setting('tbank.token', '')
    declare @accountNumber nvarchar(max) = '...наш расчетный счет'
 
    declare @fromDate nvarchar(max) = isnull((select value2 from @parameters where [Key] = 'fromDate'), '')   -- 2026-01-20
    declare @toDate nvarchar(max) = isnull((select value2 from @parameters where [Key] = 'toDate'), '')   -- 2026-01-20
	
    if(@fromDate='' or @token='') BEGIN
        select 0 Result, '' Msg
        RETURN
    end
   	-- SELECT 1  Msg, Result, Url (адрес, куда будет идти запрос)
	select '' Msg, 1 Result, 'https://business.tbank.ru/openapi/api/v1/statement?accountNumber='+ @accountNumber+
	    '&from='+@fromDate+'T00:00:00Z'+
	    iif(len(@toDate)>0, '&to='+@toDate+'T00:00:00Z', '')
	    Url 

	-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
	select 'Authorization' name, 'Bearer ' + @token value, 'header' [type]  
END

В response процедуре сохраняем в таблицу те, что еще не были (по operationId):

CREATE PROCEDURE [dbo].[api_tbank_getoperations_response]
	@response nvarchar(max),
	@parameters ExtendedDictionaryParameter READONLY,  	
	@username nvarchar(32)
AS
BEGIN

-- описание формата https://developer.tbank.ru/docs/api/get-api-v-1-statement
declare @s  nvarchar(max) = @response 
insert into  tbank_operations(operationDate,
operationId,
accountNumber,
typeOfOperation,
category,
operationAmount,
description,
payPurpose,
payer_acct,
payer_inn,
payer_name,
receiver_acct,
receiver_inn,
receiver_name,
rrn)
select operationDate,
operationId,
accountNumber,
typeOfOperation,
category,
operationAmount,
description,
payPurpose,
payer_acct,
payer_inn,
payer_name,
receiver_acct,
receiver_inn,
receiver_name,
rrn 

FROM OPENJSON(@s, '$.operations')
WITH (
operationDate datetime '$.operationDate',
operationId nvarchar(512) '$.operationId',
accountNumber nvarchar(512) '$.accountNumber',
typeOfOperation nvarchar(512) '$.typeOfOperation',
category nvarchar(512) '$.category',
operationAmount decimal(18,2) '$.operationAmount',
description nvarchar(512) '$.description',
payPurpose nvarchar(512) '$.payPurpose',

payer_acct nvarchar(512) '$.payer.acct',
payer_inn nvarchar(512) '$.payer.inn',
payer_name nvarchar(512) '$.payer.name',

receiver_acct nvarchar(512) '$.receiver.acct',
receiver_inn nvarchar(512) '$.receiver.inn',
receiver_name nvarchar(512) '$.receiver.name',
rrn nvarchar(512) '$.rrn'
) t1
where operationId not in (select o.operationId from tbank_operations o)


declare @cnt int = (select count(*) from tbank_operations)
	-- SELECT 1
	select '' Msg, 1 Result, cast(@cnt as nvarchar) + 'шт. в базе' Response

	-- SELECT 2 Внешние действия

END

6. Проверяем как работает метод через инструмент вызова внешнего действия на /asapi

Таким образом можно пополнить базу транзакциями за преждние периоды. 

7. В /syssp делаем периодическую задачу, которая раз в день (можно и чаще) будет вызывать метод АПИ для обновления данных в таблице за последние 1-2 дня. 

Код периодической задачи: 

CREATE PROCEDURE [dbo].[sync_tbank_updateOperations]
	@code nvarchar(128),
	@result bit output,
	@msg  nvarchar(max) output
AS
BEGIN	
	declare @fromDate nvarchar(max) = FORMAT(dateadd(day, -2, getdate()), 'yyyy-MM-dd')
	declare @toDate nvarchar(max) = FORMAT(dateadd(day, -1, getdate()), 'yyyy-MM-dd')
	
	select 'apirequest' type, 'tbank_getoperations' code, 
	    'fromDate' p1_name, @fromDate p1_value,'toDate' p2_name, @toDate p2_value
	
	set @result = 1
	set @msg = 'ok'
END

Таким образом в базе данных оседают данные по всем транзакциям. 

Отдельно можно настроить веб-хук для получения уведомления от Тбанк о новой транзакции. Либо можно просто вызывать обновление каждые 10 минут (тогда метод надо немного переделать в плане fromDate и toDate - чтобы передавалить также и часы, минуты). 

Далее эти данные можно вывести в таблице пользователю с фильтрами по дате, типу операции, по ИНН и т.д.

 

 

 

 

 

 

 

Страница-источник на сайте falconspace.ru