Тинькофф Банк - уведомление в учетную систему по операциям с расчетным счетом

На вашем расчетном счете происходит различные операции - приходы, расходы. Удобно получать в систему уведомление о событии операции по счету. 

Например, вы можете отмечать факт прихода по такому-то платежу. 

Важно. Здесь мы никак не влияем на состояние расчетного счета в банке, а только получаем информацию о движениях по нему.

Как это настроить для Тинькоф Бизнес? 

Документация - https://developer.tinkoff.ru/docs/intro/webhook

Необходимо написать на почту openapi@tinkoff.ru (пишите с любой почты, которая привязана к компании или добавьте персонального менеджера в копию).

  • Какое событие подключаете (статус платежа, новая операция по счету),
  • Адреса метода API на вашей системе, например site.ru/api/action/mymethod
  • ИНН компании.

После одобрения заявки при новой операции будет вызываться ваш метод. 

Необходимо в /asapi реализовать метод входящего API (например, с кодом mymethod). 

Обработка может выглядеть примерно так: 

CREATE PROCEDURE [dbo].[api_tinkoff_mymethod]
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(256)
as
begin
     declare @ip nvarchar(max) = (select top 1 value2 from @parameters where lower([key])= 'userip')
  	declare @resp nvarchar(max) = isnull((select top 1 value2 from @parameters where lower([key])= 'inputstream'), '---')
  	exec [dbo].as_trace_warn 
    	@code='tinkoff_tran',
      	@header = 'tinkoff_tran',
      	@itemID  = 0,
      	@text  = @resp, 
      	@username = ''
    execute as_print @ip
     execute as_print @resp
   
    -- Уведомления банка приходят с IP 212.233.80.7 и 91.218.132.2
    if(@ip not in ('212.233.80.7' ,'91.218.132.2')) begin 
    	select '' Msg, 1 Result, 0 errorCode
        select 'BadIP' s1
        return 
    end     
    
    declare @inn nvarchar(max) = JSON_value(@resp, '$.counterParty.inn')
   	declare @name nvarchar(max) =  JSON_value(@resp, '$.counterParty.name')
   	declare @sum float = cast(JSON_value(@resp, '$.rubleAmount') as float) 
   
	declare @financeID int
 	declare @ctrID int = (select id from fin_contragents where inn = @inn)
 	if(@ctrID is not null) begin 
		set @financeID = (select id from fin_finances 
        					where fromID=@ctrID and statusID in (1,2,6) and abs([sum]-@sum)<1 )
	
		if(@financeID is not null) begin 
			exec [dbo].fin_setPayed @financeID = @financeID
		end 
 	end 
    
	-- SELECT 1 - вывод метаданных о результате операции метода API 
	select 'OK' Msg, 1 Result, 0 errorCode
	
	-- SELECT 2 -  вывод самих данных в API (в случае проблем проверьте что этот запрос приходит непустой)
	select 'OK' s1
    
    -- SELECT 3 Outer actions - отправка уведомлений
    if(@financeID is not null) begin 
    	select 'notification' type, 
        'Новый приход отмечен: '+isnull(cast(@sum as nvarchar), '0')+' руб. от  '+ isnull(@name, '---') text , 
        	'someuser' [to], 'common' typeCode, '' url, '' additional
    	from fin_finances where id = @financeID    
    end
end
	

Здесь  мы извлекаем из входящего JSON ИНН, название контрагента и сумму, находим в нашей базе незакрытую финансовую транзакцию этого контрагента с такой суммой и помечаем ее как проведенную. Также делаем уведомление некоему пользователю в системе. 

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.
Сайт использует Cookie. Правила конфиденциальности OK