Делал интернет-магазин на Delphi, появилась задача провести интеграцию с банком Тинькофф. Эквайринг. Внимательно изучил API Тинькофф. С заказчиком решили остановиться на платежном виджете с типом нотификации Email.
Расскажу основные моменты. Оттолкнувшись от API написал такой код обработки параметров отправляемых через GET запрос
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<html> <head> <meta charset="utf-8"> <script src="https://securepay.tinkoff.ru/html/payForm/js/tinkoff.js"></script> <script type="text/javascript"> function makePayment(amount, orderId, description, name, email, phone) { var params = { //Код терминала (обязательный параметр), выдается банком. //TerminalKey: "*************DEMO", TerminalKey: "**************", //Сумма заказа в копейках (обязательный параметр) Amount: amount, //Номер заказа (если не передан, принудительно устанавливается timestamp) OrderId: orderId, //Описание заказа (не обязательный параметр) Description: description, //Дополнительные параметры платежа DATA: "Email=" + email + "|Phone=" + phone + "|Name=" + name, //Флаг открытия платежной формы во фрейме Frame: false }; doPay(params); } function GetParam(search, name){ name=name+"="; var gp=""; if (search!='') { if (search.indexOf (name, 0)!=-1){ var startpos=search.indexOf(name, 0)+name.length; var endpos=search.indexOf("&",startpos); if (endpos<startpos) {endpos=search.length;} var gp=p.substring(startpos,endpos); } else { gp=""; } } else { gp=""; } return gp; } var p=window.location.search; var myAmount=GetParam(p, "amount"); //if (myAmount=="") {myAmount="12345";} var myOrderId=GetParam(p, "orderId"); var myDescription=GetParam(p, "description"); var myName=GetParam(p, "name"); var myEmail=GetParam(p, "email"); var myPhone=GetParam(p, "phone"); makePayment(myAmount, myOrderId, myDescription, myName, myEmail, myPhone); </script> </html> |
Функция GetParam самописная на JS и призвана определить значение того или иного параметра GET запроса. После определения всех параметров вызывается функция API makePayment. Это самый простой вариант как мне видится.
Сохраняем все в файл tinkoff.html и размещаем рядом с сервером UniGUI.
В UniGUI мы делаем что-то в таком духе… при попытке заплатить банковской картой.
1 2 3 4 5 6 7 8 |
UniSession.AddJS( 'window.location="/tinkoff.html?amount='+(FTotalSumm*100).ToString+ '&orderId='+UniMainModule.OrdersID.ToString+ '&description=shop.bel-ozero.ru'+ '&name='+eName.Text+ '&email='+ //+eEmail.Text+ '&phone='+ePhone.Text+' &"' ); |
Далее по условиям банка нужно было пройти 3 теста, когда карта валидна, просрочена и отмену операции. Все 3 теста были пройдены успешно.
Способ №2
Все примерно тоже самое, только отправка параметров через POST запрос. Есть такой замечательный программист на форуме UniGUI с ником Delphi Developer. Очень душевный человек. Он подсказал мне другой способ. Выглядит он примерно так…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
procedure TMainForm.UniButton1Click(Sender: TObject); begin UniSession.AddJS( 'var f = document.createElement("form"); '+ 'f.action="http://localhost:8077/"; '+ // the second app url 'f.method="POST"; f.setAttribute("target", "view");'+ 'var i=document.createElement("input"); '+ // Param1 'i.type="hidden"; '+ 'i.name="param1"; '+ 'i.value="Test"; '+ 'f.appendChild(i); '+ {'var i=document.createElement("input"); '+ // Param2 'i.type="hidden"; '+ 'i.name="param2"; '+ 'i.value="Test"; '+ 'f.appendChild(i); '+} 'document.body.appendChild(f); '+ 'window.open("", "view"); f.submit(); ' ); end; |