Delphi. UniShop. Интеграция с банком Тинькофф

Делал интернет-магазин на Delphi, появилась задача провести интеграцию с банком Тинькофф. Эквайринг. Внимательно изучил API Тинькофф. С заказчиком решили остановиться на платежном виджете с типом нотификации Email.

Расскажу основные моменты. Оттолкнувшись от API написал такой код обработки параметров отправляемых через GET запрос Continue reading

Delphi. RestServer. Как получить произвольный tjsonobject в качестве ответа сервера?

Всем привет, продолжаем говорить про RestServer, построенный на одном из лучших языков программирования Delphi.

Встала такая задача – получать баланс с сервиса SMSC.ru

Стандартный ответ сервера выглядит примерно так…

Причем 200,OK это результат функции, которая отработала на сервере по запросу. И этот результат типа string. Заказчик же попросил сделать что-то в духе…

Прочитав мануал MarcoCantu, на 39-40 страницах, раздел  RETURNING JSON O BJECTS AND VALUES, я пришел к выводу, что результатом функции должен быть JSON Object, немного поэкспериментировав, у меня получилось следующее

Ok, это уже интересно, правда? Выходит мы можем обмениваться любыми объектами таким образом. Вот часть кода моей программы, которая запрашивает баланс Continue reading

Delphi. RestServer. Делаем красивый URL

Всем доброго дня! Любви, здоровья, удачи. Ну и вообще разберитесь в себе при случае))) Продолжаю писать REST сервер, понадобилось делать красивые URL для API REST сервера, что-то в таком духе

Красиво? Мне тоже нравится. Так хотел заказчик, а он ну прямо опытный человек очень в программировании!

Что у нас на входе?

Если собрать типичный REST сервер из мастера Delphi и запустить его. Пусть ну самый простой вариант. Standalone exe шник. Выглядит он так…

Ок, я тут немного подшаманил для своего проекта. Добавил ожидание СМС в секундах. Но суть простая – стандартная форма не сильно отличается. Если галки не снимали, по дефолту должно быть 2 метода в модуле TServerMethodsUnit Continue reading

Борьба со спамерством на Linux сервере

 Заразили мой блог спамерским вирусом

Боролся несколько часов). Вроде как нагрузка на сервер упала. Очень помогла статья с блога. Привожу здесь копипаст, чтобы не потерять. Источник.

Здравствуйте. Если вас интересует, как заблокировать доступ по IP к сайту нежелательным личностям, спамерам и прочим, то вам надо создать или отредактировать файл .htaccess и воспользоваться командой Order Allow,Deny либо Order Deny,Allow. Между ними есть разница:

  • Order Allow,Deny
    Сначала обработаются разрешающие правила Allow, потом запрещающие Deny, а всё, что не попадает под них, будет запрещено
  • Order Deny,Allow
    Сначала будут обработаны запрещающие правила Deny, потом разрешающие Allow, а все, что не попадут под них, будут разрешены по умолчанию

Обратите внимание на синтаксис, никаких лишних пробелов, иначе можно вызвать ошибку 500 Internal Server Error

Если это касается всего сайта, файл создаётся в корне, если нужно закрыть лишь определённую его часть, например, админку, файл .htaccess должен располагаться непосредственно в этом разделе.
Ну, и конечно же, ваш сервер (бекенд или рабочий) должен быть Apache. Если ваш рабочий сервер NGINX + php-fpm, то править придётся конфигурационный файл nginx.

Забанить спамера по IP диапазону

1
2
Order Deny,Allow
Deny from 192.168.1.1

Это был пример того, как забанить IP (192.168.1.1) спамера, не закрывая доступа всем остальным. Ещё можно пропустить последний октет IP-адреса, Deny from 192.168.1 , тогда будут забанены все пропущенные IP адреса. Однако, вы же понимаете, статичный IP блокировать глупо, он, скорее всего, динамический, поэтому мы берём IP и отправляемся определять подсеть с диапазоном IP, откуда он пришёл. Для этого воспользуемся любым Whois-сервисом, например, этим, ищем строку CIDR или, если её нет, NetRange

Определяем подсеть IP

Определяем подсеть IP

Нам повезло, CIDR (Classless Inter-Domain Routing, Бесклассовая адресация) присутствует, а именно в таком формате лучше всего записывать диапазон IP в htaccess

1
2
Order Deny,Allow
Deny from 192.168.0.0/16

Если CIDR отстуствует, рекомендую воспользоваться калькулятором IP-диапазона в CIDR и данными из NetRange, чтобы получить CIDR.

Delphi. FastReport. Отправка отчета на почту в HTML формате

Заказчик захотел получать красивые отчеты на почту.

Решил использовать FastReport и придерживаться следующего алгоритма

Генерировать отчет в HTML файл

Загрузить  в строку

Отправить на почту

Код (Очень черновой вариант, но чтобы было)

 

Также кусок кода из примера UniGUI для FastReport

 

UniGUI.DBGrid.RowsFetching. Пост-подсказка

Запутался немного в “фетчингах” UniGUI и FireDAC. Вижу, что в UniDBGrid выводятся не все записи, хотя если отправлять данные в обычный DBGrid, то всё будет в порядке.

Немного поизучал свойства UniDBGrid и увидел галочку FetchALL. Теперь записи отображаются все и целиком.

 

Delphi. MySQL. Считаем сумму заказа через Delphi и MySQL

Есть таблицы. Далее будут эволюционировать по мере написания поста.

39

Требуется посчитать сумму заказа. Самый простой способ, сделать это через MySQL

Вариант посложнее, через Delphi. Continue reading

Delphi. UniGUI. Знаки вопроса. Кодировка (charset) на VPS и локаль

2 дня убил на то, чтобы понять, почему на VPS, при загрузке туда приложения UniGUI и базы MySQL при Insert и Update пишутся знаки вопросов вместо русского текста.

Решение. Выставить локаль Wndows Server 2012 на русскую. А также все, что возможно выставить в UTF-8.

Что было сделано до локали?

-Все, что возможно, было выставлено в utf-8 в MySQL.

-При подключении TFDConnection, параметр UTF-8 также был добавлен.

Но обо всем по порядку. Обсуждение темы находится на официальном форуме UniGUI.

Приведу описание проблемы и ее решение Continue reading

MySQL. 2 способа пересечения множеств и объединения таблиц

Есть следующая структура

36

Нужно составить вот такую таблицу

37

Часть данных у нас в одной таблице, часть данных в другой. Как получить это за один запрос?

1 способ (спасибо Денису Зубову из Самары)

2 способ

На выходе получим

38

Но есть одна проблема – поля с одинаковыми названиями, тогда делаем так…

либо так…