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

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

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

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

Далее пользователь переходит на сайт 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

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

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

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

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

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

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

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