Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.08.2017, 14:17
DreyQQ DreyQQ вне форума
Прохожий
 
Регистрация: 24.08.2017
Сообщения: 4
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию Работа с MD5 и GET запросами

Есть такое описание API сайта
Код:
Интеграция API

Все вызовы API осуществляются с помощью GET запросов.
Для каждого запроса должны передаваться обязательные параметры:
    
tr - уникальный идентификатор транзакции (максимум 40 символов).

    
key -  публичный ключ доступа (Access Key). Генерируется на странице настройки API.

    
sign -  подпись запроса. Являет собой MD5 хеш от строки: api_uri:secret_key.
        Где api_uri - уже готовый подзапрос операции вместе со всеми параметрами, включая tr и key, начиная с /api/...
        secret_key - секретный ключ (Secret Key). Генерируется на странице настройки API.
        Обратите внимание: конкатенация строки осуществляется через двоеточие.

    
Для данного примера запроса:
http://sample-api-domain.net/api/last-jackpots/?tr=555&key=gmi6etd371nub9otgdetpga2bb281ja7&start=19800530043055&end=20150922000000&page=1&psize=25&sign=7932b279113e7828df8e8cf86a9dbe53
api_uri будет:
/api/last-jackpots/?tr=555&key=gmi6etd371nub9otgdetpga2bb281ja7&start=19800530043055&end=20150922000000&page=1&psize=25
если secret_key к примеру взять - d1np2s6e99aqfjb8214699uf9na0n28p2gqc8qg6nca8o7fcliv4mhl87rf56m0h
то sign соответственно должен быть - 7932b279113e7828df8e8cf86a9dbe53

Результат ответа на запрос всегда в "application/json;charset=utf-8" формате и статусом 200. 

Каждый ответ всегда содержит как минимум два поля:
    
success - результат выполнения операции. Успешно - true, ошибка - false.

    
tr -  уникальный идентификатор транзакции который был передан в запросе.

    
В случае ошибки, в ответе дополнительно передаются:
    
code - код ошибки.

    
message - описание ошибки.

{ "success" : false, "tr" : "555", "code" : 6, "message" : "FAIL_TRANSACTION_KEY_NOT_UNIQUE" } 

При успешном завершении операции, в ответе дополнительно передаются зависящие от конкретного запроса данные.

Если запрос подразумевает постраничную навигацию - в теле ответа также будет присутствовать информация о ней. Например:
{... "_metadata" : { "totalCount" : 6, "page" : 1, "psize" : 10, "totalPages" : 1 } ...} 

Формат представления даты (периода) во входящих и исходящих параметрах - "yyyyMMddHHmmss". 

Важно! Если несколько раз вызывать одну и ту же операцию с одинаковым идентификатором транзакции - все резульататы кроме первого будут браться из кеша. Необходимо например, если вы вызвали операцию создания счета и по каким либо причинам (обрыв связи например) не получили ответ. Если повторно сделать вызов этой операции - счет повторно создан не будет, а вернется результат самой первой операции с тем же идентификатором транзакции. 

Список операций и их параметры с примерами успешных ответов:

Создание нового счета - /api/invoice/new
sum - начальная сумма на счету.
{ "success" : true, "tr" : "1", "invoice" : "30826184148184", "sum" : 2.99 } 

Проверка состояния счета - /api/invoice/check
invoice - номер счета.
{ "success" : true, "tr" : "2", "invoice" : "30826184148184", "sum" : 2.99 } 

Пополнить счет - /api/invoice/add
invoice - номер счета.
sum - сумма.
{ "success" : true, "tr" : "3", "invoice" : "30826184148184", "sum" : 10.99 } 

Закрыть счет - /api/invoice/close
invoice - номер счета.
{ "success" : true, "tr" : "4", "invoice" : "30826184148184", "sum" : 0 } 

Получить джекпот и бонус - /api/jp-bonus 
{ "success" : true, "tr" : "5", "jackpot" : 10367.95, "bonus" : 1551.92 } 

Общие данные о перечислениях по счету - /api/invoice/total
invoice - номер счета.
start - начальный период.
end - конечный период.
{ "success" : true, "tr" : "10", "invoice" : "40811858280039", "sum" : 0.00, "in" : 82.00, "out" : 63.37, "in-out" : 18.63, "ret" : 0.00 } 

Получить список субагентов - /api/subagents
parent - если parent пустой - возвращает весь список субагентов текущего пользователя API. Если parent задан - то его субагентов.
page - текущая страница. (Опционально. По умолчанию - 1)
psize - количество елементов на странице. (Опционально. По умолчанию - 10)
{ "success" : true, "tr" : "20", "_metadata" : { "totalCount" : 6, "page" : 1, "psize" : 10, "totalPages" : 1 }, "sub-agents" : [ { "parent" : "-", "login" : "teller1", "role" : "ROLE_TELLER", "credit" : 10000.00, "enabled" : true }, { "parent" : "-", "login" : "agent1", "role" : "ROLE_AGENT", "credit" : 541664.18, "enabled" : true }, { "parent" : "-", "login" : "teller2", "role" : "ROLE_TELLER", "credit" : 989590.00, "enabled" : true }, { "parent" : "-", "login" : "teller3", "role" : "ROLE_TELLER", "credit" : 10000.00, "enabled" : true }, { "parent" : "-", "login" : "teller4", "role" : "ROLE_TELLER", "credit" : 70356.76, "enabled" : true }, { "parent" : "-", "login" : "teller5", "role" : "ROLE_TELLER", "credit" : 100000.00, "enabled" : true } ] }
Возможные роли: ROLE_TELLER(кассир), ROLE_AGENT(агент) и ROLE_MANAGER(руководитель зала)


Сумарная финансовая информация по субагенту за определенный период - /api/report-user
Баланс, Депозит,	Выплата, Результат, Счета
login - логин субагента.
start - начальный период.
end - конечный период.
{ "success" : true, "tr" : "30", "credit" : 541664.18, "deposit" : 17000.00, "close" : 8663.80, "result" : 8336.20, "invoice" : 5986.10 } 

Сделать перевод субагенту или вернуть деньги от субагента - /api/transfer
Субагент с ролью ROLE_TELLER(кассир) не имеет права делать перевод.
login - логин субагента которому нужно сделать перевод.
sum - сумма перевода. Если сумма положительная - делаем перевод. Если отрицательная - возвращаем деньги от субагента
{ "success" : true, "tr" : "40", "credit" : 7684013.62 } 

Получить историю игр по счету - /api/invoice/games-history
invoice - номер счета.
page - текущая страница. (Опционально. По умолчанию - 1)
psize - количество елементов на странице. (Опционально. По умолчанию - 10)
{ "success" : true, "tr" : "50", "_metadata" : { "totalCount" : 1, "page" : 1, "psize" : 25, "totalPages" : 1 }, "game-history" : [ { "time" : "20140503154701", "name" : "no game", "event" : "login", "value" : 0.00, "credit" : 99406.40 } ] } 

Последние джекпоты - /api/last-jackpots
start - начальный период.
end - конечный период.
page - текущая страница. (Опционально. По умолчанию - 1)
psize - количество елементов на странице. (Опционально. По умолчанию - 10)
{ "success" : true, "tr" : "60", "_metadata" : { "totalCount" : 57233, "page" : 2, "psize" : 2, "totalPages" : 28617 }, "last-jackpots" : [ { "type" : 2, "date" : "20141105073936", "login" : "greengrey", "value" : 195.00, "bet" : 2000.00, "ip" : "95.54.253.237", "amount" : 0.00 }, { "type" : 2, "date" : "20141105073725", "login" : "greengrey", "value" : 183.00, "bet" : 2000.00, "ip" : "95.54.253.237", "amount" : 0.00 } ] }


Как правильно отправить любой из запросов на delphi и правильно обработать ответ?
С Delphi умею работать как новичёк, но очень сильно хочу для себя програмку написать.
Если можно то часть кода как этот запрос отправить, как получить и обработать ответ, и как шифровать строку в MD5 чтоб значение вставить в строку запроса?

Буду очень благодарен.
Ответить с цитированием
  #2  
Старый 24.08.2017, 19:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, как-то примерно так:
Код:
uses IdGlobal, IdHash, IdHashMessageDigest, IdHTTP, ActiveX;

// Взято с stackoverflow.com
function GetMD5(AStr : String) : String;
var
  h : TIdMessageDigest5;
begin
  h := TIdMessageDigest5.Create;
  Try
    Result := IdGlobal.IndyLowerCase(h.HashStringAsHex(AStr));
  Finally
    h.Free;
  End;
end;

// Генерация уникального номера транзакции. 
// Создаем новый GUID, потом вырезаем из него ненужный мусор.
function CreateTrNumber : String;
var
  g : TGUID;
  gs : String;
  I : Integer;
begin
  OleCheck(CoCreateGUID(g));
  gs := LowerCase(GUIDToString(g));
  Result := '';
  for I := 1 To Length(gs) Do
    If gs[i] in ['0'..'9','a'..'f'] Then Result := Result + gs[i];
end;

// Собственно, запрос на сервер
function GetURLAsString(AURL : String; ): String;
const
  cServer = 'http://sample-api-domain.net';
var
  HTTP: TIdHTTP;
begin
  HTTP := TIdHTTP.Create;
  try
    Result := lHTTP.Get(cServer + aURL);
  finally
    HTTP.Free;
  end;
end;

// Имплементация API
// Новый счет. 
// Принимает - публичный ключ, секретный ключ, сумма
// Возвращает - номер счета
function API_NewInvoice(APubKey, ASecKey, ASum : Double) : String;
const
  cNewInvoiceURL = '/api/invoice/new?tr=%s&key=%s&sum=%s';
var
  Url, Sign : String;
  Buf : String;
begin
  Url := Format(cNewInvoiceURL,[CreateTrNumber,APubKey,ASum]);
  Sign := GetMD5(Url+':'+ASecKey);
  Buf := GetURLAsString(Url+'&sign='+Sign);
  // Дальше парсаем полученный JSON. Примеров в инете полно.
  ...
  Result := ...
end;

Как разобрать полученный JSON - найдешь сам.
По хорошему, там надо класс сделать, в котором сразу инкапсулировать ключи и написать все методы. Я просто привет пример как вообще с этим работать...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter