![]() ![]() |
|
|
Home
Динамическая библиотека Unitransfer.DLLВ данном разделе описывается реализация информационного обмена между IM-клиентом и сервером платежной системы «Delta Key» через динамическую библиотеку. 1. Основные принципы информационного обмена.Реализация сервиса ICQMoney основана на упрощенном варианте DKCP-протокола. Обмен данными происходит по протоколу HTTPS путем отправки запросов клиентским приложением на скрипты сервера. Для удобства работы с сервисом Департаментом IT-технологий системы «Delta Key» реализована DLL-библиотека, которая инкапсулирует в себе транспортную часть по обмену данными с сервером. Для использования библиотеки внешними разработчиками в среде программирования Delphi предоставляется также модуль, содержащий описание интерфейса для доступа к функциям класса динамической библиотеки. Интерфейс содержит в себе описание нескольких классов и структур данных, которые можно разделить на три группы:
К содержанию 2. Описание интерфейсов.Вся работа с DLL реализуется через объект типа IApi , поэтому при входе в программу пользователя или при первом обращении к серверу этот объект должен быть создан.
Для этого в секции uses необходимо подключить модуль uApiInterface , и объявить доступную глобально переменную типа IApi ,
к примеру, в секции public главной формы приложения. Глобальность переменной необходима для использования одного объекта во всех формах,
однако при желании разработчика данная рекомендация может быть проигнорирована. Создание объекта интерфейса IApi происходит с помощью функции, экспортируемой из DLL функции CreateApiInterface .
В эту функцию необходимо передать два параметра: код программы разработчика (program_code ) и путь к файлу сохранения истории Информатора-OnLine (history_path ).
function CreateApiInterface(program_code: Integer; history_path: WideString): IApi; stdcall; external 'ICQMoney';
Рассмотрим пример подключения модуля и создания объекта:
К содержанию 2.1. Описание интерфейса IApi.Общие сведенияДанный интерфейс предоставляет доступ к основным свойствам и функциям DLL. Все обращения к серверу и DLL необходимо производить через объект этого интерфейса.
Свойства property CMD: ICMD read GetCMD; Позволяет получить доступ к объекту ICMD (см. описание данного интерфейса). property Face: IFace read GetFace; Позволяет получить доступ к объекту IFace (см. описание данного интерфейса). property UserConnected: Boolean read GetUserConnected; Позволяет проверить состояние авторизации пользователя в системе ICQMoney. Следует отметить, что проверка данного свойства не обязательна при вызове функций, отправляющих запрос на сервер Delta Key, так как при необходимости пользователю автоматически будет предложено пройти авторизацию. Методы Кроме того, что интерфейс IApi реализует доступ к другим объектам DLL, он также реализует собственный набор сервисов,
работа с которыми происходит путем обращения к методам данного интерфейса. На одну из функций следует обратить особое внимание: SetUin . Для того, чтобы пользователь мог авторизоваться на сервере Delta Key и пользоваться сервисами ICQMoney,
сразу после создания объекта и коннекта к серверу ICQ следует вызвать эту функцию и передать ей в качестве параметра UIN пользователя. procedure SetUin(Uin: WideString); stdcall; К содержанию Настройка параметровprocedure SetUin(Uin: WideString); stdcall; Для того, чтобы пользователь мог авторизоваться на сервере Delta Key и пользоваться сервисами ICQMoney, сразу после создания объекта и коннекта к серверу ICQ следует вызвать эту функцию и передать ей в качестве параметра UIN пользователя. procedure SetProxyParams(basicAuthentication: Boolean=False; ProxyServer: WideString=''; ProxyPort: Integer=0; ProxyUsername: WideString=''; ProxyPassword: WideString=''); stdcall; Данная процедура устанавливает параметры прокси-сервера для подключения к сети Internet. В эту функцию передаются адрес прокси-сервера, порт, при необходимости – логин и пароль пользователя для авторизации на сервере прокси. procedure SetReturnError(return_error: Boolean=False); stdcall; Функция устанавливает флаг необходимости возвращать неуспешный результат запроса к серверу вместо генерации исключения. К содержанию Информатор-OnLineИнформатор-OnLine позволяет отслеживать новые события пользователя, такие как поступление средств, выставленных счетов, сообщений с сервера и от других пользователей. ![]() Для того, чтобы в приложении реализовать работу с Информатором, разработчику предлагается запрашивать список новых сообщений через определенные промежутки времени, для чего идеальным является позиционирование на главной форме приложения объекта типа TTimer . function CheckNewMessages(var balance: double): Boolean; stdcall; Данная функция проверяет наличие новых сообщений для пользователя на сервере. В параметре balance возвращается текущий баланс счета пользователя.
Рекомендуется вызывать функцию через определенные промежутки времени (рекомендуемая частота – один вызов в 1-10 минут), и/или после проведения
финансовых операций пользователем (например, перевод пользователю; в этом случае таким образом можно обновить состояние баланса счета с сервера). function GetMessages(fromServer: Boolean=True): TInforArray; stdcall; Получает сообщения с сервера (Информатор On-Line). Параметр fromServer определяет, необходимо ли запрашивать данные с сервера, или получить их из
локального файла. Получение данных с локального сервера целесообразно, если перед ней была вызвана функция CheckNewMessages , которая получила
последние данные с сервера, и записала их в локальный файл. Возвращает структуру TInforArray (см. описание). function SetMessageRead(num: Int64): Boolean; stdcall; Функция SetMessageRead устанавливает флаг прочтения сообщения (после установки данного флага сообщение может считаться прочтенным и быть выделено
менее ярко, чем новые сообщения). Не производит запрос к серверу, работает с локальным файлом. В качестве параметра num передается уникальный номер сообщения.
В случае успеха возвращает True . function SetMessageReadAll: Boolean; stdcall; Функция SetMessageReadAll помечает все сообщения как прочтенные. Не производит запрос к серверу, работает с локальным файлом. В случае успеха возвращает True .function DelMessage(num: Int64): Boolean; stdcall; Удаляет все сообщения из локального файла. В качестве параметра num передается уникальный номер сообщения. В случае успеха возвращает True .function DelMessages(): Boolean; stdcall; Удаляет все сообщения из локального файла. В случае успеха возвращает True .В приведенном ниже примере показана реализация работы приложения с Информатором-OnLine.
К содержанию Дополнительные функции интерфейса IApiФункции, описанные ниже, могут быть использованы по усмотрению разработчика и используются в приводимых примерах. function RandomPwd(PWLen: integer): WideString; stdcall; Генерирует случайную последовательность символов заданной в параметре PWLen длины. Может использоваться для генерации кода
протекции при переводе средств другому пользователю. function SplitString(Source, Divider: WideString; const DeletingSymbol: WideString=''; TrimSpaces: Boolean=False): TStringArr; stdcall; Разбивает строку ( Source ) на части и заносит их в массив строк. При этом разделителем является строка, переданная в параметре Divider .
Например, строка 'one,two,three' при разделителе «запятая» будет занесена в массив из трех элементов. function SplitInteger(Source, Divider: WideString): TIntegerArr; stdcall; То же, что и функция SplitString , только разбивает строку, содержащую в себе целые числа (например, '1,2,3' ), и возвращает массив целых чисел. function InArray(arr: TStringArr; str: WideString): Boolean; overload; stdcall; Проверяет, является ли параметр str идентичным одному из элементов массива arr .function InArray(arr: TIntegerArr; int: Integer): Boolean; overload; stdcall; То же, что и функция InArray , с той лишь разницей, что работает с целочисленным массивом. function md5(Const data: WideString): WideString; stdcall; Возвращает хэш строки data , вычисленный по алгоритму md5. function DateToMysqlformat(dt: TDate): WideString; stdcall; Форматирует дату dt в формат MySQL (ГГГГ-ММ-ДД). Может быть использована при передаче параметра в запросе к серверу Delta Key. function DateTimeToMysqlformat(dt: TDate; tm: TTime): WideString; stdcall; Форматирует дату и время ( dt и tm ) в формат MySQL (ГГГГ-ММ-ДД чч:мм:сс). Может быть использована при передаче параметра в запросе к серверу Delta Key. function DateFromMysqlformat(dt: WideString): TDate; stdcall; Преобразует строковый параметр dt в дату. Параметр dt должен быть представлен строкой в формате ГГГГ-ММ-ДД. function DateTimeFromMysqlformat(dt: WideString): WideString; stdcall; Преобразует строковый параметр dt в строку, соответствующую формату ДД.ММ.ГГГГ чч:мм:сс.
Параметр dt должен быть представлен строкой в формате ГГГГ-ММ-ДД чч:мм:сс. function PADR(Src: WideString; Lg: Integer): WideString; stdcall; Дополняет строку Src пробелами справа до заданной в параметре Lg длины.procedure StrToClipbrd(StrValue: WideString); stdcall; Копирует строку в буфер обмена. К содержанию Описание вспомогательных структур, используемых в интерфейсе IApiTInformRecord = record num, subj, subj_param: WideString; corr, id_corr, dt, read: WideString; title, messages: WideString; end; Представляет информацию об одном сообщении с сервера, и содержит следующие данные:
TInforArray = array of TInformRecord; Массив переменных типа TInformRecord . Данная структура возвращается при вызове функции получения сообщений сервера (GetMessages ),
и содержит в себе полный список всех сообщений сервера в Информаторе-OnLine. TStringArr = array of WideString; Массив строк, используется в функциях SplitString , InArray и других.TIntegerArr = array of Integer; Массив целых чисел, используется в функциях SplitInteger , InArray и других.Также в интерфейсе IApi содержатся свойства типа ICMD , IFace , которые описаны ниже в отдельных параграфах.
Через эти свойства происходит обращение к объектам указанных типов. К содержанию 2.2. Интерфейс IResultCMDВ результате каждого запроса на сервер (и в качестве результата выполнения большинства функций интерфейса ICMD ) согласно спецификациям протокола DKCP
возвращается структура данных IResultCMD . Описывается эта структура следующим образом:
Таким образом в результате каждой операции возвращаются следующие данные:
Успешно выполненная операция всегда имеет статус равный двум, и результат равный нулю. Все остальные комбинации статусов и результатов следует считать ошибкой. При этом в большинстве случаев статус равен двум, что говорит о том, что сервер закончил обработку запроса пользователя (не важно – успехом или ошибкой), а уже результат показывает пользователю успех операции. Например, пользователь пытается выставить счет незарегистрированному в системе пользователю, в этом случае сервер вернет status=2, result=3005, result_text=’Пользователь не зарегистрирован в ICQMoney’ . Большинство операций (команд) можно подвести под две категории: команды, которые получают какие-либо сведения (статистику, список карт, счетов, информацию о пользователе и т.д.) и команды, которые изменяют данные на сервере (проведение платежей, заказ карт, установка информации о пользователе, активация электронных чеков и т.д.). Операции первой категории возвращают пользователю какую-либо информацию, которая может содержаться либо в табличной части, либо в свойстве Answer .
При выполнении операций второй категории обычно необходимо знать только о результате выполнения операции, для чего достаточно лишь проанализировать свойства
status и result , а пользователю можно показать result_text . Остановимся подробнее на операциях получения информации. Рассмотрим следующий пример: Перед совершением операции перевода средств пользователь хочет знать, какая комиссия будет удержана в результате операции. Для того, чтобы получить эту информацию на сервер отправляется команда получения комиссии с помощью вызова функции GetCmdComiss (функция будет подробно описана в соответствующем разделе),
которая в результирующей структуре в свойстве Answer будет иметь данные:(('pay_minlimit', '0.01'), ('pay_plusmoney', '0.00'), ('min_sum', '0.09'), ('max_sum', '1000000.00'), ('shop_plusmoney', '0.00'), ('shop_maxlimit', '1000000.00'),
('pay_persent', '0.75'), ('shop_persent', '0.00'), ('rate2', '2.793'), ('rate1', '72.75'), ('shop_minlimit', '0.00'), ('pay_maxlimit', '1000000.00')) Свойство Answer описано как массив элементов типа TResultAnswer , и каждый из этих элементов определяет один из параметров комиссии.
В приведенном примере минимальный лимит комиссии с плательщика составляет 0.01, минимальная сумма платежа – 0.09, процент с плательщика – 0.75 и т.д. Для более удобной работы с массивом интерфейс IResultCMD имеет функцию GetAnswerValue , которая по имени переменной находит ее название:function GetAnswerValue(Const AName: WideString):WideString; stdcall; Например, для отображения значения комиссии с плательщика может быть использован следующий код:
Табличная часть, сохраненная в свойстве Fields , возвращается тогда, когда возвращаемые параметры не могут быть представлены в виде массива
с элементами Параметр=Значение . Структура IResultFields содержит в себе следующие поля:
Примером такой операции может стать выборка финансовой статистики. Например, при выборке статистики параметр Fields может содержать следующее значение:((('1240', '09.10.2007 00:27:32', '-', 'Перевод другому пользователю', '1.00', 'UNI', 'В обработке', '0'),
('1239', '08.10.2007 19:11:40', 'Приход', 'Перевод другому пользователю', '1.00', 'UNI', 'Операция успешно завершена', '1')),
('transact', 'date', 'typelocal', 'code_text', 'sum', 'curr', 'result', 'done'),
('Транзакция', 'Дата', 'Пр./расх.', 'Операция', 'Сумма', 'Валюта', 'Результат', 'Завершена'), 2, 8) Данные значения можно представить еще и так:
Более понятным же для понимания является следующая таблица:
Отображение результата очень удобно производить в компонент TStringGrid , для этого достаточно в цикле пройтись по массиву Fields , например, следующим образом:
Для удобной навигации по структуре интерфейс IResultCMD содержит три функции: GetFieldValue , GetFieldRName , FindFieldValue . Функция GetFieldValue позволяет получить значение ячейки таблицы по заголовку столбца и номеру строки:function GetFieldValue(Const AField: WideString; Row: Integer=0): WideString; stdcall; Здесь параметр AField – название столбца, Row – номер строки. Например, приведенный выше код для отображения только успешных операций может быть дополнен так:
Следующая функция – GetFieldRName – позволяет получить русскоязычный заголовок столбца:function GetFieldRName(Const AField: WideString): WideString; stdcall; В качестве единственного параметра ( AField ) в нее передается заголовок столбца. Например, следующий код выведет результат в грид с заголовками:
И последняя функция – FindFieldValue – описывается следующим образом:function FindFieldValue(Const ASearchField, AResultField, ASearchValue: WideString): WideString; stdcall; Эта функция позволяет найти значение одной ячейки по известному значению другой. Например, зная номер транзакции из результирующего запроса можно получить сумму следующим образом:
Приведенный пример показывает сумму и валюту платежа выбранной транзакции. См. также описание функции ShowResInGrid интерфейса IFace , которая позволяет полностью отобразить табличную часть в компоненте TStringGrid . К содержанию 2.3. Интерфейс ICMDИнтерфейс ICMD предоставляет доступ к командам, посылаемым на сервер. Описывается интерфейс следующим образом:
Большинство функций возвращают в качестве параметра объект типа IResultCMD . В одном из следующих параграфов будет подробно описано использование данного интерфейса. К содержанию Прямая отправка данных на сервер по протоколу DKCPВсе методы интерфейса можно разделить на две группы: первая группа, которая содержит функцию SendCMD , которая позволяет напрямую отправить
запрос на сервер Delta Key, по соответствующему описанию команды в протоколе DKCP-ICQMoney. Все остальные функции скрывают за своей реализацией обращение
к серверу через отправку одной команды и получение ответа. По сути, любая команда может быть отправлена через функцию SendCMD , однако использование,
к примеру, функций ActiveCard или PayId позволяет избежать изучения тонкостей протокола DKCP и следить за изменениями в реализации прототокла,
а также избежать ошибок при форматировании отправляемых на сервер данных. Например, есть необходимость отправки на сервер команды перевода средств другому пользователю системы. Данную операцию можно реализовать двумя разными способами: Способ первый. Отправка данных через функцию SendCMD .
Способ второй. Использование функции PayId .
Из приведенных примеров видно, что использование функции PayId хотя и приводит к аналогичным результатам, однако требует гораздо меньшего кода,
а также позволяет избежать ошибок с отправкой несоответствующих типов данных и некорректно отформатированных параметров на сервер. Однако в некоторых случаях может быть использовано и прямое обращение к функции SendCMD . Через данную функцию можно отправить абсолютно любую команду,
описанную в протоколе DKCP-ICQMoney. Это может быть полезно в случае, когда некоторые новые команды уже реализованы разработчиками в протоколе,
однако нет возможности либо необходимости обновлять клиентскую библиотеку. В этом случае можно воспользоваться прямой отправкой запроса на сервер платежной системы. Именно поэтому начнем рассмотрение с функции SendCMD . Описание функции выглядит следующим образом: function SendCMD(Form: TMultipartForm; const cmd_name: WideString; errorBreak: Boolean=true; PersentLast: Word=100; PersentFirst: Word=0): IResultCMD; Передаваемые параметры:
К содержанию Получение курса конвертации валютПолучение курса конвертации валют может быть реализовано одной из двух функций: GetRate и GetCmdComiss .
Вызов функции GetCmdComiss целесообразен при одновременном вычислении курса конвертации и получении ставок комиссии на операцию
(описание функции GetCmdComiss см. ниже). function GetRate(curr_from, curr_to: Word; summ: double=-1): double; stdcall; Функция GetRate используется для получения сведений о том, какой курс конвертации установлен на текущий момент в системе.
Использование данной функции особенно актуально в свете того факта, что в системе ICQMoney используется валюта «юнит», и пользователям зачастую просто
необходимо знать курс данной валюты к одной из международных валют – рубль, доллар, евро и любые другие международные валюты. Функция возвращает число с плавающей точкой, характеризующее отношение валюты, из которой конвертируется, в валюту, в которую конвертируется. При использовании данной функции необходимо учесть, что у любой валюты системы есть два курса – курс покупки и курс продажи. Таким образом, зная курс отношения доллара к юниту зачастую практически невозможно вычислить обратный курс – юнита к доллару, поэтому необходимо правильно передавать валюты в параметрах. Параметры curr_from , curr_to представляют из себя числа до трех цифр, определяющих международный код валюты.
Для того, чтобы получить сопоставление названия валют к их числовым кодам, можно послать на сервер команду getlist_curr , которая вернет структуру,
содержащую в себе как название валюты, так и ее числовой код. Например, валюта «Российский рубль» имеет числовой код 810, «Доллар США» - 840, «Юнит» - 999 и др. Следует также отметить, что платежная система Дельта Кей является мультивалютной, и позволяет пользователям создавать счета в любой валюте, однако сервис ICQMoney предусматривает операции только с одной валютой – юнитом. К содержанию Получение ставок комиссии по операцииПолучение ставок комиссионных удержаний системы с отдельной операции производится с помощью функции GetCmdComiss . С помощью нее можно не только
вычислить сумму комиссии с плательщика и получателя по операции, но и дополнительно получить курс конвертации из одной валюты в двум другим.function GetCmdComiss(cmd_name: PChar; subj_param: Integer=-1;
curr_from: Word=999; curr_to1: Word=810; curr_to2: Word=840): IResultCMD; Функция GetCmdComiss позволяет получить комиссию, которая будет удержана в результате выполнения операции. Также функция может вернуть курсы валют,
объединив таким образом свой функционал с функцией GetRate (причем функция способна вернуть курс конвертации сразу к двум валютам).Передаваемые параметры:
Возвращаемое значение. В ответ на выполнение операции возвращается структура типа IResultCMD , все значимые данные будут содержаться в поле
Answer (см. описание интерфейса IResultCMD и структур TResultAnswer , TResultAnswers ):
Структура Answer типа IResultAnswers все параметры содержит в виде строковых значений, поэтому для использования результатов функции
параметры должны быть преобразованы в строки. Разделителем целой и дробной части следует считать точку.Ниже приведен пример использования функции. Листинг 2.2 – I. Модуль для отображения параметров комиссии с операции.
Сама форма, используемая в данном примере, выглядит следующим образом: ![]() А вызываться может форма таким вот образом: ![]() Здесь на событие нажатия кнопки конвертации написан следующий код:
Реализация и представление данных о конвертации может быть и другим, например, представленным на самой форме отправки денег, все зависит от желания разработчика и задуманной концепции приложения. К содержанию Авторизация пользователя на сервере платежной системы Delta KeyОперация авторизации может производится по одной из схем: авторизация на сервере после соединения с сервером ICQ, либо авторизация при первом обращении к серверу Delta Key. function Authorize: double; Функция выдает пользователю окно с просьбой ввести логин и пароль. Перед вызовом функции можно убедиться в отсутствии авторизации пользователя с помощью проверки свойства UserConnected объекта типа IApi . Вызов данной функции не обязателен перед отправкой какого-либо запроса на сервер, так как в случае отсутствия авторизации пользователю автоматически будет предложено авторизоваться путем ввода логина и пароля, однако при желании разработчик может включить авторизацию на сервере Delta Key после соединения пользователя с сервером ICQ. Перед вызовом функции обязательно необходимо вызвать функцию SetUin интерфейса IApi .К содержанию Перевод средств другому пользователю системыДанная операция является одной из самых распространенных и позволяет пользователю передать средства со своего счета на счет другого пользователя. При этом если пользователь, которому передаются средства, не зарегистрирован в системе ICQMoney, то система все равно вернет положительный результат. В этом случае если в течении десяти дней получатель средств зарегистрируется в системе, на его счету окажутся переданные ему средства, в противном случае средства будут возвращены пользователю на счет через 10 дней. function PayId(user: Widestring; sum: double; comment: PChar; protect: Boolean=False;
protect_code: PChar=nil; protect_day: Byte=3): IResultCMD; stdcall; Функция принимает следующие параметры:
Возвращает строку – результат выполнения запроса на сервер. В случае неуспешного запроса генерируется исключительная ситуация и пользователю выдается текст ошибки сервера. Пример вызова:
В случае, если перевод другому пользователю совершается с протекцией сделки, то при получении информации о приходе средств получатель должен ввести код протекции для завершении операции. Такое подтверждение операции выполняется с помощью функции EndPayProtect :function EndPayProtect(transact_num: Int64; protect_code: WideString): IResultCMD; stdcall; Данная функция проверяет, является ли введенный код протекции верным, и в случае успеха завершает операцию. Необходимо отметить, что в случае перевода без протекциями система производит одновременное списывание средств со счета плательщика и зачисление их получателю. В случае использования протекции средства с плательщика списываются в момент отправки средств, а получателю зачисляются в момент подтверждения сделки кодом протекции. ![]() Для получения параметров см. раздел «Финансовая статистика», а в приведенном ниже примере будет показано завершение операции с протекцией сделки:
К содержанию Моментальная оплатаМоментальная оплата (платеж оператору) позволяет производить платежи в адрес операторов сотовой связи, оплачивать услуги доступа в Интернет, коммунальные платежи, совершать благотворительные взносы и др. Для реализации моментальной оплаты имеются несколько функций, позволяющих оперировать данным сервисом. function GetTreeMomental(): IResultCMD; stdcall; Функция GetTreeMomental позволяет загрузить дерево операторов. Список операторов называется деревом потому, что все они разбиты на группы,
и одна группа теоретически может быть вложена в другую. Возвращаемая структура IResultCMD будет содержать таблицу следующего формата:
Например, возвращенная таблица может быть следующего вида:
Приведенную выше структуру можно расшифровать таким образом. Имеются две группы (Сотовая связь и Финансовые сервисы). В группе сотовая связь (код 100002) находятся платежные формы «Мегафон Москва», «Киевстар», «Матрикс Мобайл», а в группе финансовые сервисы – «Yandex.Money», «Star Trek ОСМП» и «WebMoney». ![]() Следует отметить, что порядок следования строк может быть любым, и его не следует учитывать при построении дерева. В приведенном ниже листинге будет расписан пример рекурсивного обхода данной структуры для построения дерева операторов. После построения дерева пользователь сможет легко перемещаться по списку операторов, однако при выборе какого-то отдельного оператора для совершения платежа необходимо запросить определенные параметры, которые зависят от платежной формы. Например, если выбран сотовый оператор «Билайн GSM», то необходимо запросить пополняемый номер телефона, если выбрана форма «WebMoney» - то номер кошелька, а для платежа в адрес оператора E-port запрашивается номер карты и контрольный код. На каждую платежную форму запрашиваются разные данные и в разном количестве. Например, для платежа в какую-либо благотворительную организацию параметры могут вообще не запрашиваться, а для оплаты коммунальных услуг оператор может запросить данные о номере квитанции, периоде оплаты (месяц, год), адресе оплачиваемой квартиры и даже фамилии квартиросъемщика. Таким образом, разработчику следует учесть, что ограничений на количество заполняемых полей – нет. Разработчику программного модуля следует также учесть, что не все параметры, запрашиваемые для совершения платежа, являются обязательными, о чем будет сказано ниже. Для получения списка полей для совершения платежа в адрес оператора используется функция GetFormFields: function GetFormFields(Payform: Integer): IResultCMD; stdcall; Функция в табличной части результирующей структуры возвращает все поля формы в следующем виде:
Для некоторых операторов значение одного из полей может быть выбрано из списка; в этом случае значения полей type_num_val и
type_text_val будут содержать строки с кодами значений и текстовыми их представлениями соответственно. Например, при оплате на Дальсвязь пользователь
по своему усмотрению может выбрать тип платежа – Дальсвязь, Аудиотеле, Ростелеком, Ростелеком (ИСС), МТТ (ИСС) или МТТ .
В этом случае полученная структура будет такой:
Данную таблицу можно расшифровать следующим образом: первое поле – номер телефона, имеет код 11, является обязательным к заполнению, должно содержать в себе 10 цифр, при этом в начале может быть незначащая восьмерка. Второе поле – тип платежа, является списком выбора, и должно выбираться из списка. При этом при отправке данных на сервер при вводе в качестве номера телефона 9376665554 и выборе параметра «Ростелеком», вместо слова «Ростелеком» должен быть передан его код – 2. ![]() После заполнения пользователем полей данные необходимо отправить на сервер. Отправка данных выполняется с помощью функции PayMomental. function PayMomental(Form: TMultipartForm; payform: Integer; sum: double): IResultCMD; stdcall; Так как количество передваемых параметров функции не известно, первым параметром передается объект типа TMultipartForm . Об этом объекте было подробно
написано в параграфе Прямая отправка данных на сервер по протоколу DKCP. Этот объект должен содержать все поля, требуемые платежной
формой. Также в функцию передается номер платежной формы (параметр payform ) и сумма (параметр sum ) в виде десятичной дроби с двумя
знаками после запятой. В приведенном ниже листинге функция btnPayClick реализует вызов вышеописанной функции. Результатом выполнения PayMomental является структура ответа сервера. В случае, если сервер откажется принять данные, будет сгенерирована исключительная
ситуация, а пользователю будет показан текст ошибки, возвращенный сервером. Следует отметить, что успешное принятие сервером платежа не всегда означает успех финансовой операции. Дело в том, что когда сервер дает успех при моментальной оплате, он ставит платеж в очередь на обработку. Сама очередь продвигается очень быстро, и максимальное время, которое сервер может затратить на обработку платежа составляет одну минуту. В штатном же режиме обработка платежа совершается в течение 3-5 секунд. Однако если у оператора технические проблемы либо профилактические работы, то обработка платежа может затянуться на более продолжительный период. Также возможны ситуации, когда оператор отказывается принять платеж, например, в случае, если плательщик ошибся номером телефона или счета (и т.п.). В этом случае в результате выполнения операции транзакция будет помечена как отказанная, а деньги за платеж – возвращены плательщику. Из вышесказанного следует сделать вывод, что плательщику крайне удобно не выходя из окна моментальной оплаты получить статус проведенного платежа. Операция получения статуса платежа выполняется с помощью функции GetResultFinoperation :function GetResultFinoperation(transact: Int64): IResultCMD; stdcall; В качестве единственного параметра функция принимает номер транзакции. Таким образом, разработчику достаточно запомнить номер последней транзакции (или нескольких транзакций), возвращенному в результате выполнения функции PayMomental , чтобы предоставить возможность пользователю получить результат обработки
платежа. ![]() В приведенном ниже листинге имеется пример реализации модуля моментальной оплаты.
К содержанию Финансовая статистикаДля получения сведений о проведенных операциях пользователю предоставляется финансовая статистика. Здесь будут показаны все движения по счету пользователя, в том числе поступления на счет, оплата выставленного счета, моментальная оплата, перевод другому пользователю и многое другое. ![]() Для выборки списка финансовых операций реализовано две функции: GetlistFinoperation и GetlistFinoperationLight . Пример использования
первой функции был представлен в параграфе Моментальная оплата. Однако рекомендованной является функция
GetlistFinoperationLight, так как загружает меньше данных и более оптимизирована на пользователей, не являющимися дилерами или другими
привилегированными группами пользователей системы.function GetlistFinoperationLight(date_start: TDate=-1; date_end: TDate=-1; typelocal: Shortint=-1; code: WideString='-1';
transact: WideString='-1'; sum: WideString='-1'; done: WideString='None'; param: WideString='-1'): IResultCMD; stdcall; Данная функция принимает несколько параметров:
Кроме получения списка транзакций пользователь может запросить подробности отдельной операции, где данные по ней будут предоставлены более подробно. Для этого используется функции GetparamsFinoperation или GetparamsFinoperationLight . Как и для функций получения списка операций,
рекомендованной является использование облегченной функции GetparamsFinoperationLight : function GetparamsFinoperationLight(transact: Int64): IResultCMD; stdcall; В качестве единственного параметра эта функция принимает номер транзакции, по которой необходимо вернуть подробности операции. ![]() В приведенном ниже листинге представлена реализация модулей финансовой статистики и параметров операции.
Параметры операции:
К содержанию Получение сведений о балансе счетаБаланс счета пользователя сервиса ICQMoney может быть получен отдельной командой, а также возвращается при проверке новых сообщений в Информаторе-OnLine. Информатор-OnLine рассмотрен в отдельной главе, а получение баланса с помощью отдельной функции выглядит следующим образом: function GetBalance(): double; stdcall;
Также все операции возвращают в параметре Answer в строке syskeyt_balance баланс счета пользователя. К содержанию Ввод средств (пополнение счета)Сервис ICQMoney и платежная система Delta Key поддерживают следующие возможности ввода средств:
В этой главе будут рассмотрены все это возможности кроме электронных чеков, так как они полностью рассматриваются в главе Электронные чеки. Пополнение счета через банк Одним из самых удобных способов пополнения счета для физических лиц и, в особенности, для организаций, представителей системы, партнеров, является ввод средств через банк. Вся операция пополнения производится в несколько этапов: 1. Выбор страны и банка, на которые удобнее всего совершить платеж; 2. Выставление счета на оплату; распечатав этот счет, пользователь может оплатить его в любом банке; 3. Собственно перевод средств по банку; как только средства поступят на банковский счет системы, они автоматически будут зачислены пользователю. Программное обеспечение должно позволять пользователю автоматизировать первые два шага. В демо-реализации сервиса пополнение счета выглядит следующим образом: ![]() Пользователю после выбора страны и банка предоставляется список банковских реквизитов в таком виде, чтобы он мог их скопировать. После ввода суммы, на которую он желает пополнить счет и выписки счета на оплату, становится доступной функция печати счета на оплату: ![]() Реализация получения банковских реквизитов выполняется с использованием функции GetListBank, которая возвращает список всех банков, через которые возможно пополнение счета: function GetListBank(country: Smallint=-1): IResultCMD; stdcall; В качестве единственного необязательного параметра функции может быть передан трехзначный международный код страны для автоматического немедленного отбора только тех банков, которые в данной стране находятся. Это может быть полезно в том случае, если у пользователя каким-либо образом указана в настройках страна его местонахождения. При передаче значения по умолчанию (-1) сервер вернет полный список всех банков в различных странах мира, через которые можно пополнить счет. Список банков возвращается в табличной части результирующей структуры, и состоит из пяти полей и неограниченного количества строк (каждая строка – отдельный банк):
Пример вызова:
После того, как пользователь выбрал банк пополнения, ему необходимо предоставить его банковские реквизиты. Данная операция выполняется путем вызова функции GetBankRequisite , в которую необходимо передать код банка. function GetBankRequisite(bank_code: Integer): IResultCMD; stdcall; Эта функция также возвращает табличную часть в результирующей структуре, содержащую следующие поля:
Пример вызова:
После того, как пользователь ознакомится с банковскими реквизитами, он может сформировать квитанцию для пополнения ICQ-кошелька через банк. Оформление квитанции выполняется с помощью функции CreateBankOrder :function CreateBankOrder(bank_code: Integer; sum: Real): IResultCMD; stdcall; Данная функция принимает два обязательных параметра:
Приведенный ниже листинг демонстрирует пример оформления квитанции:
Операция печати квитанции не требует обращения к серверу, так как функция CreateBankOrder возвращает все необходимые для печати параметры:
Полный текст примера см. в модуле uInBank . Пополнение счета картой оплаты Платежная система Delta Key, так же как и ее сервис ICQMoney позволяет пополнить счет пользователя картой пополнения, распространяемой как на материальном носителе (пластик), так и в электронном виде. Каждая карта пополнения содержит серию, номер и ключ пополнения. Введя все эти данные, пользователь пополняет свой счет. Автоматизация пополнения картой оплаты достигается вызовом функции ActiveCard :function ActiveCard(serial, number: Integer; code: Int64): IResultCMD; stdcall; В эту функцию соответственно передаются параметры serial (серия карты), number (номер карты) и code (ключ пополнения).
Функция возвращает строку – результат выполнения операции, в случае ошибки генерируется исключительная ситуация, а пользователю выдается текст ошибки.
Все передаваемые в функцию параметры – целые числа, поэтому рекомендуется ограничить возможность ввода серии, номера и ключа активации только целыми числами.
Максимальное количество цифр серии – 4, номера – 7, ключа активации – 12. Необходимо также отметить, что количество попыток активации карты ограничено, и платежная система предусматривает набор блокировок, вызываемых при слишком большом количестве неуспешных попыток активации, о чем пользователь извещается при получении ошибки сервера. Рассмотрим пример реализации операции: ![]()
Полный текст примера см. в модуле uFillCard . Пополнение счета через терминал оплаты Счет пользователя также может быть пополнен через терминал моментальной оплаты. Так как пополнение счета через терминал не требует выставления счета или ввода пользователем каких-либо данных, то вся операция сводится к показу инструкции, и может быть реализована следующим образом:
В приведенном примере пользователю будет выдано следующее сообщение: ![]() Здесь для удобства пользователь может сразу перейти на страницу сайта со списком точек пополнения – геолокатор, ссылка же на эту страницу получается с помощью функции GetGeoURL интерфейса IApi .Пополнение счета переводом из других платежных систем Счет в системе ICQMoney может быть пополнен также со счета в другой платежной системе. Прямой перевод поддерживается из нескольких самых популярных систем, с других систем пополнение счета возможно через обменный пункт валюты. Список систем, из которых можно пополнить счет в системе ICQMoney:
Операция пополнения осуществляется путем отправки пользователя на Web-страницу, через которую он может попасть в мерчант выбранной платежной системы для проведения платежа, поэтому для всех пунктов вызывается по одной функции, которая открывает окно браузера с нужным адресом, например:
Для других платежных систем функции вызова следующие:
Пополнение счета из обменного пункта валют происходит аналогичным образом:
К содержанию Вывод средствВ системе реализованы следующие возможности вывода средств со своего счета:
В этой главе будет рассмотрен вывод средств на банковский расчетный счет и в различные платежные системы. Работа с картами рассматривается в отдельной главе Пластиковые карты. Вывод средств на банковский счет Для вывода средств на банковский расчетный счет используется подача заявки на вывод, которая после обработки оператором помечается как успешная, а деньги поступают на банковский счет пользователя, указанный в заявке. При этом сумма заявки списывается с пользователя в момент подачи заявки, а в случае отклонения оператором средства вновь возвращаются на счет. ![]() Для просмотра списка стран, в которые возможен вывод средств через банк, используется функция GetlistOutbankCountries :function GetlistOutbankCountries: IResultCMD; stdcall; Эта функция в своей табличной части возвращает список стран, и может быть использована следующим образом:
После выбора страны пользователь должен заполнить свои банковские реквизиты, причем список запрашиваемых реквизитов зависит от выбранной страны. Таким образом разработчику необходимо после выборы страны послать на сервер запрос для выборки реквизитов для заполнения. Сделать это можно с помощью функции GetlistOutbankRequisite , в которую в качестве параметра передается код выбранной пользователем страны:function GetlistOutbankRequisite(country: Smallint): IResultCMD; stdcall; Пример использования:
Для создания заказа выплаты используется функция OrderBankout , описанная следующим образом:function OrderBankout(Form: TMultipartForm; country, curr: Smallint; sum: double; full_statement: WideString): IResultCMD; stdcall; Параметры, передаваемые функции OrderBankout :
Рассмотрим пример, в котором формируется и заполняется объект Form и осуществляется вызов функции OrderBankout .
Для ознакомления с полным текстом примера смотрите модуль uOutBank . Вывод средств в другую платежную систему Вывод средств в различные платежные системы осуществляется похожими методоми, поэтому они все будут рассмотрены в рамках одного параграфа. Поддержка вывода осуществлена для следующих платежных систем:
![]() Операция вывода средств в E-gold осуществляется через отправку пользователя в обменный пункт с помощью функции FromExchanger , не требующей
никаких дополнительных параметров:procedure FromExchanger; stdcall; Рассмотрим вывод средств в остальные платежные системы. Для каждой из них предусмотрена отдельная функция, осуществляющая операцию:
Все функции кроме OutEPort запрашивают по два параметра, первый из которых является номером счета, кошелька, телефона или емейлом,
а второй – сумма в виде дробного числа с двумя знаками после запятой. Возвращаемое значение – структура типа IResultCMD , в случае
ошибки будет сгенерирована исключительная ситуация, а пользователю показан текст ошибки сервера. Функция OutEPort запрашивает два параметра –
номер карты и контрольный код, так как именно эти параметры предусмотрены этой системой для пополнения. В приведенном ниже листинге приведен код модуля uOut, в котором все операции совершаются с помощью одной формы.
После создания формы перед ее показом пользователю вызывающий модуль заполняет список глобальных переменных формы fmOut , например:
К содержанию Электронные чекиICQMoney позволяет любому пользователю выпустить любое количество и на любую сумму электронные чеки, являющиеся удобным средством расчета в Интернете. С помощью этой технологии можно пополнить счет другого пользователя просто продиктовав ему серию, номер и код активации электронного чека. При создании электронного чека его номинал списывается со счета пользователя, а при активации эта же сумма (за минусом комиссии) зачисляется на счет пользователю, активировавшему электронный чек. В ICQMoney реализованы две функции для работы с электронными чеками:
Более полная версия DKCP-протокола позволяет также проверить действительность электронного чека и узнать её номинал без активации (без кода пополнения), просмотреть список выписанных электронных чеков, аннулировать электронный чек. Данные функции доступны пользователям на сайте и могут также быть реализованы в ICQMoney. Создание электронных чеков происходит при вызове функции CreateEcheck :function CreateEcheck(nominal: double; count: Integer): IResultCMD; stdcall; С помощью этой функции может быть создано более одного электронного чека, и их количество передается в параметре count . Так как электронные чеки могут быть разных номиналов,
т.е. выписаны на любые суммы, то в функцию также необходимо передать параметр nominal . В результате вызова функции будут возвращены все серии, номера и коды активации выписанных электронных чеков, и все эти данные должны быть показаны пользователю. Именно по этим данным пользователь сможет активировать электронный чек на свой счет или передать данные для активации другому пользователю системы. Данные для активации возвращаются в результирующей структуре в дополнительном параметре all_echeck , при этом все параметры разделяются точкой с запятой (;). Для
более удобного показа данные могут быть предварительно отформатированы как в приведенном ниже примере. ![]() Пример вызова функции:
В результате выполнения этого после создания кода будет выдано следующее окно: ![]() При этом важно, чтобы полученную информацию пользователь мог скопировать и/или сохранить в файл. Активация электронного чека выполняется с помощью функции ActiveEcheck :function ActiveEcheck(serial: WideString; number, code: Int64): IResultCMD; stdcall; В качестве параметров в эту функцию передаются серия, номер и код активации электронного чека. Все эти параметры пользователь вводит самостоятельно. ![]() Пример кода, реализующего активацию электронного чека:
После выполнения активации средства автоматически будут зачислены на счет пользователя. К содержанию Пластиковые картыПластиковые карты предоставляют удобный способ вывода средств из системы. Для организации этого сервиса пользователь должен заказать карту, сразу оплатив ее со своего счета в системе, получить по почте, активировать, после чего в случае необходимости может заказать вывод средств на нее в любое удобное время. Вывод средств с этой пластиковой карты возможен в любом банкомате, в любой точке мира. Количество карт у пользователя не ограничено. Полный список операций, возможный с пластиковыми картами:
Рассмотрим данные операции более подробно. Получение списка возможных типов карт для заказа Для данного действия предусмотрена функция GetTypesMCard :function GetTypesMCard(): IResultCMD; stdcall; Вызов функции не предполагает передачи ей каких-то дополнительных параметров. Значение возвращается по запросу к серверу в структуре типа IResultCMD , в табличной части которой имеются следующие поля:
При заказе карты пользоваетелю необходимо выдать список возможных карт, например, в комбобоксе, а при выборе какой-то карты ее параметры должны быть показаны отдельно: ![]() Пример кода, реализующего приведенную форму:
Заказ карты После получения списка карт пользователю остается только нажать кнопку «Заказать», и в случае успешного ответа сервера цена карты будет списана с пользовательского счета, а заказ поступит на рассмотрение оператору. Операция выполняется с помощью функции OrderMCard :function OrderMCard(mcard_type: Smallint): IResultCMD; stdcall; Параметр mcard_type определяет код типа карты, выбранной пользователем. Пример использования данной функции:
Получение списка имеющихся карт Вне зависимости от того, в каком статусе находится карта, – активирована она или заказ на нее только что оформлен – все они отображаются в списке имеющихся у пользователя карт. Для получения такого списка используется функция GetListMCard :function GetListMCard(): IResultCMD; stdcall; Сам список возвращается в табличной части результирующей структуры указанной функции:
![]() В зависимости от статуса, активации и блокировки разрешены различные операции с картой. Например, если карта не активирована, на нее не может быть выполнен заказ вывода средств, заблокированная карта не может быть блокирована повторно и т.д. В системе предусмотрены следующие статусы карт:
В приведенном ниже примере рассматривается получение списка карт, и разрешение/запрет на выполнение некоторых операций:
Переименование собственной карты Операция переименования производится для более удобной ориентации пользователя в списке его карт, и выполняется с помощью функции RenameMCard :function RenameMCard(order_num: Integer; new_name: WideString): IResultCMD; stdcall; Переименование может быть выполнено вне зависимости от статуса карты. В результате выполнения функции будет возвращена строка результата, при этом если результат неуспешный, то будет сгенерирована исключительная ситуация, а пользователю показан текст ошибки сервера. Параметр order_num определяет номер заказа, а new_name – новое имя карты. Пример вызова операции:
Активация карты Операция активации служит как средство усиления безопасности при работе пользователя с картами. На карту не могут выводиться средства до тех пор, пока пользователь не подтвердит наличие у него этой карты. Для этого ему нужно ввести CVC полученной карты, который прилагается к карте, полученной по почте. При трех неуспешных попытках активации карта блокируется и может быть разблокирована только в случае выяснения ситуации с уполномоченными сотрудниками платежной системы. Активация пластиковой карты выполняется с помощью функции ActiveMCard :function ActiveMCard(order_num: Integer; cvc: WideString): IResultCMD; stdcall; В функцию необходимо передать номер заказа ( order_num ) и CVC карты. Пример реализации операции активации:
После активации карта автоматически переходит в статус 11 («Активна»). Блокировка карты В случае утери, кражи или других обстоятельств пользователь может заблокировать карту для предотвращения несанкционированного ее использования сторонними лицами. Операция блокировки выполняется с помощью функции BlockMCard :function BlockMCard(order_num: Integer): IResultCMD; stdcall; В качестве единственного параметра в функцию передается номер заказа карты. Пример вызова функции:
Заказ вывода средств на карту Для заказа вывода средств на карту пользователь должен выбрать имеющуюся у него активную пластиковую карту и указать сумму вывода. Так как валюты карты и счета пользователя могут быть разные, сервер автоматически выполнит конвертацию валют. Инициализация вывода средств происходит путем вызова функции PayMCard :function PayMCard(mcard_num: Int64; sum: double): IResultCMD; stdcall; В качестве параметров в функцию передается номер карты ( mcard_num ) и сумма вывода в валюте счета пользователя (sum ). ![]() Пример реализации вывоза данной операции:
Получение информации о заказах на вывод Заказ на вывод средств может обрабатываться достаточно продолжительное время, в течение которого пользователю просто необходимо получать информацию о состоянии обработки его заказа. Для реализации данной концепции используется функция GetListMCardRequest :function GetListMCardRequest(): IResultCMD; stdcall; Функция не требует передачи каких-либо параметров, и в табличной части результирующей структуры выдает информацию о состоянии обработки заказанных выводов средств. ![]() В приведенном ниже примере реализована также подстветка каждого заказа в зависимости от состояния его обработки (принцип светофора: зеленые – успех, желтые – в обработке, красные – отказ в обработке).
К содержанию Платежные требования (счета к оплате)Платежные требования (выставленные счета) как один из сервисов ICQMoney позволяют одному пользователю затребовать (попросить) средства у другого пользователя системы. Пользователь, который получит данный счет на оплату, сможет оплатить этот счет, отказаться от оплаты, либо отложить решение. Сообщение о получении выставленного счета отображается в Информаторе-OnLine. Функция CreatePayrequest позволяет пользователю выставить счет на оплату другому пользователю. function CreatePayrequest(user: WideString; sum: double; description: PChar; system_num: Integer): IResultCMD; stdcall; Параметры, передаваемые функции:
Возвращает строку – результат выполнения запроса на сервер. В случае неуспешного запроса генерируется исключительная ситуация и пользователю выдается текст ошибки сервера. ![]() Пример вызова:
После выставления счета пользователь может посмотреть список всех счетов, которые он выставил, с помощью функции GetlistOutPayrequest :function GetlistOutPayrequest(date_start, date_end: TDate; status: Shortint=-1): IResultCMD; stdcall; В эту функцию необходимо передать диапазон дат, в течение которого были выставлены счета ( date_start , date_end ), а также статус,
в котором они в настоящий момент находятся (status ). Передача в параметр статуса значения по-умолчанию (-1 ) запрещает отбор по статусу. Функция в табличной части результирующей структуры возвращает следующие данные:
![]() Пример реализации получения списка выставленных самим пользователем счетов (а также подстветка счетов в зависимости от их статуса оплаты):
О выставлении счета получатель уведомляется с помощью Информатора-OnLine, и получает возможность оплаты или отказа от оплаты платежного требования. Получить параметры счета на оплату можно, вызвав функцию GetparamsPayrequest и передав в нее номер выставленного счета. function GetparamsPayrequest(payrequest_num: Integer): IResultCMD; stdcall; В табличной части результирующей структуры возвращаются все параметры счета на оплату:
Оплата платежного требования осуществляется с помощью вызова функции PayPayrequest :function PayPayrequest(payrequest_num: Integer): IResultCMD; stdcall; В качестве единственного параметра в нее передается номер полученного платежного требования. Отказ от оплаты требования происходит с помощью вызова функции RefusePayrequest , которая также в качестве параметра принимает номер полученного
платежного требования:function RefusePayrequest(payrequest_num: Integer): IResultCMD; stdcall; ![]() Пример реализации кода получения параметров счета, оплаты и отказа от оплаты:
К содержанию БезопасностьICQMoney поддерживает достаточно обширный список настроек безопасности, от самых простых, обязательных для всех пользователей – смена логина, пароля и платежного пароля, до таких как одноразовые ключи, доступ по IP и пр. Полный список возможных операций для усиления безопасности пользователя:
В целях безопасности в DLL Uni Transfer отсутствуют последние функции безопасности, и пользователь имеет возможность только сменить логин и пароль для доступа к сервису. Смена платежного пароля и настройка других мер безопасности осуществляется в Интернет-кабинете пользователя. Смена логина Для операции смены логина используется функция ChangeLogin :function ChangeLogin(newLogin, newLoginConfirm: WideString): IResultCMD; stdcall; В качестве параметров в эту функцию передается новый логин ( newLogin ) и подтверждение нового логина (newLoginConfirm ). ![]() Пример реализации:
Смена пароля Для операции смены пароля используется функция ChangePassword :function ChangePassword(newPassword, newPasswordConfirm: WideString): IResultCMD; stdcall; В качестве параметров в эту функцию передается новый логин ( newPassword ) и подтверждение нового логина (newPasswordConfirm ). ![]() Пример реализации:
К содержанию ТарифыСистема предоставляет пользователю возможность выбрать наиболее удобный для него тариф. По-умолчанию, пользователю автоматически устанавливается тариф «Базовый», в любое время он может его сменить. В базовом тарифе при каждой внутрисистемной операции с пользователя удерживается процент системной комиссии порядка 0,4-0,75%, в других тарифах комиссия может быть уменьшена либо вообще отсутствовать, зато ежемесячно взимается абонентская плата. Получение списка тарифов Для получения списка тарифов используется функция интерфейса ICMD :function GetlistTariff(): IResultCMD; stdcall; Функция не требует передачи дополнительных параметров. В табличной части возвращается список имеющихся тарифов. Пример вызова:
Получение параметров тарифа Для получение параметров выбранного пользователем тарифа используется функция: function GetparamsTariff(num_tariff: Integer): IResultCMD; stdcall; В функцию передается номер тарифа (список номеров вместе с названиями возвращается функцией GetlistTariff ). Пример реализации: ![]()
Применение тарифа к своему счету Для того, чтобы установить тариф активным, необходимо вызвать функцию ChangeKeytTariff , и передать в нее код тарифа. function ChangeKeytTariff(num_tariff: Integer): IResultCMD; stdcall; Пример реализации:
К содержанию 3. Финансовая модель партнерстваПартнеры-разработчики ПО взаимодействуют с системой по принципам партнерской программы. Для учета средств, начисляемых по партнерской программе, необходим индивидуальный код программы, получить который можно, вступив в группу партнеров-разработчиков ПО системы. О передаче кода программы в подключаемый модуль см. раздел Описание интерфейсов. По вопросам и предложениям относительно сервиса ICQMoney, а также по вопросам данной спецификации обращайтесь в департамент IT-Технологий нашей системы: Контакты К содержанию Вернуться назад |
© 2005-2013. «Delta Key» Все права защищены. |
Правовые нормы | Раскрытие информации | Контактная информация | Дизайн — Алексей Попов © 2023 |