Интернет-эквайринг Тинькоф Банк

Через Тинькоф Банк вы можете организовать оплату картами на сайте. 

Как это выглядит для пользователя 

Форма на сайте или просто кнопка, по которой пользователь переходит к оплате

Далее пользователь переходит на сайт tinkoff или открывается модальное фрейм-окно, где и происходит оплата: 

Как реализовать прием оплаты на своем сайте через Тинькоф Банк

1. Подаем заявку на Тинькоф и заводим магазин в кабинете Тинькоф. Инструкция по порядку подключения

2. В настройках тестового терминала в кабинете тинькофф прописываем путь к API уведомления  (галочка По протоколу HTTP и поле под ней)

Инструкция по настройке терминала - https://www.tinkoff.ru/business/help/business-payments/internet-acquiring/how-use/terminal/

https://falconspace.ru/api/action/tinkoffnotify - пример метода API 

3. Копируем виджет на страницу. Код можно взять здесь https://www.tinkoff.ru/kassa/develop/widget/install/

По ссылке можно посмотреть значение параметров. Ключевые: 

  • frame = true - делает отображение окна оплаты в модальном окне во фрейме
  • terminalKey - определяет к какому терминалу относится форма. 
  • amount - сумма к оплате
  • order - номер заказа в нашей системе, по которому мы потом в API методе можем понять, за что именно прошла оплата. 

Пример кода: 

<style>.payform-tinkoff-row{display:block;margin:1%;width:160px;}</style>
<script src="https://securepay.tinkoff.ru/html/payForm/js/tinkoff_v2.js"></script>
<form name="payform-tinkoff" onsubmit="pay(this); return false;">
  <input class="payform-tinkoff-row" type="hidden" name="terminalkey" value="1694009981995DEMO">
  <input class="payform-tinkoff-row" type="hidden" name="frame" value="false">
  <input class="payform-tinkoff-row" type="hidden" name="language" value="ru"> 
    <input class="payform-tinkoff-row" type="text" placeholder="Сумма заказа" name="amount" value="100" required="">
    <input class="payform-tinkoff-row" type="text" placeholder="Номер заказа" name="order" value="126">
    <input class="payform-tinkoff-row" type="text" placeholder="Описание заказа" name="description" value="desc3">
    <input class="payform-tinkoff-row" type="text" placeholder="ФИО плательщика" name="name" value="fio3">
    <input class="payform-tinkoff-row" type="text" placeholder="E-mail" name="email" value="hecrus@mail.ru">
    <input class="payform-tinkoff-row" type="text" placeholder="Контактный телефон" name="phone" value="">
    <input class="payform-tinkoff-row" type="submit" value="Оплатить">
</form>

В terminalKey указаваем название тестового терминала магазина (можно это оформить через /settings, чтобы потом не нужно было менять в странице). 

4. В /settings указываем настройку пароля от терминала tinkoffTerminalPassword  (пароль указан на вкладке Терминалы в ЛК Тинькоф).

5. Создаем API метод для приема уведомлений от тинькоф, что платеж прошел (настройки Без токен = ДА, тип вывода = Text). 

CREATE PROCEDURE [dbo].[api_tinkoff_notify]
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(256)
as
begin
	declare @terminalPassword varchar(128) = dbo.as_setting('tinkoffTerminalPassword', '') 
	/*
    InputStream={"TerminalKey":"XXXXXXXX","OrderId":"125","Success":true,"Status":"CONFIRMED",
	"PaymentId":3212171195,"ErrorCode":"0","Amount":30000,"CardId":345001666,"Pan":"430000******0777",
	"ExpDate":"1122","Token":"8b0e583f997dc9b083bfff2719244566b4ecfa2eb518a1dfc0d622f2ed66c9bf"}
    */
    declare @resp varchar(max) = (select top 1 value2 from @parameters where lower([key])= 'inputstream')
    
    declare @t table (TerminalKey varchar(max),
	OrderId int,
	Success bit,
	Status varchar(max),
    PaymentId varchar(max),
	ErrorCode int,
	Amount int,
	CardId int,
	Pan varchar(max),
	ExpDate varchar(max),
	Token varchar(max))

insert into @t
SELECT top 1 *
FROM OPENJSON(@resp)  WITH (
	TerminalKey varchar(max),
	OrderId int,
	Success bit,
	Status varchar(max),
	PaymentId varchar(max),
	ErrorCode int,
	Amount int,
	CardId int,
	Pan varchar(max),
	ExpDate varchar(max),
	Token varchar(max)
)
declare @val varchar(max) = '', @token varchar(max) = '', @genToken varchar(max) = '', @status varchar(max), @success bit

--пример: [["Amount": "9855"],["CardId": "322264"],["ErrorCode": "0"],["ExpDate": "1122"],["OrderId": "201709"],["Pan": "430000******0777"],["Password": "xxxxxxxxx"],["PaymentId": "8742591"],["RebillId": "101709"],["Status": "AUTHORIZED"],["Success": "true"],["TerminalKey": "xxxxxxxx"]]
select @val =  -- в порядке сортировки Key
	cast(Amount as varchar) + 
    cast(CardId as varchar) + 
    cast(ErrorCode as varchar) + 
    ExpDate + 
    cast(OrderId as varchar) + 
    Pan + 
    @terminalPassword + 
    PaymentId+ 
	Status + 
    iif(Success=1, 'true', 'false') + 
    cast(TerminalKey as varchar), 
    @token = Token, 
    @status = Status, 
    @success = Success
	from @t 
    
    SELECT @genToken = CONVERT(VARCHAR(100),HASHBYTES('SHA2_256',@val),2); -- SHA-256 
    
    declare @temp varchar(max) = 'Real token: '+ @token + ', gen token: '+ @genToken + ', val: ' + @val
    execute as_print  @temp
    
    if(lower(@token) <> lower(@genToken))begin 
    	select 'Wrong token' Msg, 0 Result, 0 errorCode
        execute as_print 'TINKOFF INVALID TOKEN'
        return
    end 
    if(@success=1 and lower(@status) = 'confirmed')begin 
    	-- выполняем фиксацию факта Платеж подтвержен (пополнение баланса, смена статуса фин операции и т.д.) .... 
        execute as_print 'TINKOFF Payments is confirmed'        
    end     
    
	/*
    вывести в trace начальный полный JSON
    declare @s nvarchar(max) = ''    
    select @s = @s + ',' +  isnull([key], 'nokey') + '='+ isnull(value2, '--') from @parameters 
	execute as_print @s
    */
	-- SELECT 1 - вывод метаданных о результате операции метода API 
	select '' Msg, 1 Result, 0 errorCode
	
	-- SELECT 2 -  вывод самих данных в API (в случае проблем проверьте что этот запрос приходит непустой)
	--select 1 x1
end
	

Нюансы: 

1. Входной JSON идет в теле запроса (в поле InputStream). Далее мы его разбираем на элемент и помещаем в таблицу @t

2.  Чтобы убедиться, что это запрос идет от Тинькоф мы проверяем поле token - на основе пароля и комбинации входящих параметров. 

Проверка токена описана здесь - https://www.tinkoff.ru/kassa/dev/payments/#tag/Notifikacii-Merchanta-ob-operaciyah/Notifikacii-po-HTTP(s)/Proverka-tokenov

Если кратко, то формирование токена выглядит так: добавить в параметры Password и исключить Token, взять параметры в алфавитном порядке, сделать конкатенацию в строку значений параметров и извлечь SHA-256 хеш от полученной строки. ВАЖНО! Строки должны быть в varchar(max), а не nvarchar(max)  - иначе хеш будет другой!

3. Если параметры success=1 и status=confirmed (и при этом верный токен) - то мы выполняем бизнес операции по фиксации факта прихода на счет. 

4. Поле Amount приходит в виде int в копейках (т.е. вместо 800 руб приходи 80000). 

Тестирование платежей 

На странице Терминала в ЛК Тинькоф можно сделать тестовые оплаты. 

Вводим данные теста в свою форму, получаем ожидаемый результат. 

После выполнения теста нажимаем Проверить. Если все ок, то будет стоять бедж Пройден у теста. 

Полезные ссылки: 

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

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

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK