Правильная ссылка на эту статью: |
WM-API
Библиотека для работы с XML-интерфейсами WebMoney для .Net платформы (WM-API)¶
Данная статья предназначена для разработчиков, желающих использовать интерфейсы WebMoney Transfer в Microsoft .Net приложениях.
Цель статьи: предоставить краткую информацию о библиотеке WebMoney.XmlInterfaces (кодовое название WM-API), достаточную для использования библиотеки в своих проектах.
Библиотека WebMoney.XmlInterfaces создана для упрощения работы с XML-интерфейсами системы WMTransfer. Она написана на управляемом (Managed) языке C# и распространяется с открытым кодом по лицензии MIT. Для своей работы библиотека использует модуль генерации цифровой подписи WMSignerFX.
Начиная с версии 1.1.2 библиотеку можно подключить с помощью менеджера пакетов NuGet (пакет WebMoney.XmlInterfaces в официальном источнике пакетов api.nuget.org). При этом все зависимые библиотеки подключаются автоматически.
Последняя версия библиотеки 2.0.0-rc от 9 декабря 2021.
Содержание
- Базовые сведения об архитектуре библиотеки
- Инициализация библиотеки в коде программы.
- Инициализация библиотеки с помощью файла конфигурации.
- Общий сценарий использования библиотеки.
- Порядок логирования исключительных ситуаций.
- Примеры использования.
- Список изменений.
Базовые сведения об архитектуре библиотеки¶
Список библиотек¶
Название библиотеки | Назначение |
WebMoney.Cryptography.dll | Служит для формирования цифровой подписи ключами WebMoney Keeper Winpro. Подключается автоматически с помощью NuGet (пакет WebMoney.Cryptography 3.3.0). См. WMSignerFX. |
WebMoney.XmlInterfaces.dll | Основная библиотека с классами запросов и ответов. |
log4net.dll | Используется для логирования исключительных ситуаций. Подключается автоматически с помощью NuGet (пакет log4net 2.0.5) |
Специальные типы¶
Для представления основных сущностей системы, библиотека вводит специальные типы (пространство имен BasicObjects).
Наиболее общие типы
Название типа | Расшифровка | Примечание |
Amount | Сумма | Неявно приводимо к системному типу decimal. Тип decimal явно приводим к Amount (с сохранением 2-х знаков после запятой). |
BankAccount | Банковский счет | Может содержать только цифры. |
BankCard | Платежная карта | Может содержать только цифры. Дополнительных проверок в версии 1.0 не выполняется. |
Currency | Валюта | В версии 1.0 может принимать значения: USD, EUR, RUR, UAH. |
PaymentSystem | Платежная система | Для использования с интерфейсом X19. В версии 1.0 может принимать значения: PayPal, MoneyBookers, MoneyYandex. |
Percent | Процент | Используется для интерфейсов wm.exhanger.ru |
Phone | Номер телефона | Для использования с интерфейсом X19. Телефон можно задавать в одном из 2-х форматов: +000000000000 и 000000000000. |
Rate | Курс обмена | Неявно приводимо к системному типу decimal. Тип decimal неявно приводим к Amount. При преобразовании в строку сохраняется 4 знака после запятой. |
Ниже приведена диаграмма классов (ClassDiagram) данных типов:
Типы, связанные исключительно с системой WebMoney
Название типа | Расшифровка | Примечание |
ConfirmationFlag | Подтверждение | Используется с интерфейсом X2 |
ContractType | Тип контракта | Тип контракта в Arbitrage (для интерфейса X17). Может принимать значения: Public (для соглашения), Private (для закрытого контракта). |
Description | Короткая строка (до 256 символов) | Неявно приводимо к System.String. Тип System.String явно приводим к Info (с сохранением 255 первых символов). Использование: примечание к операции, адрес доставки товара, код протекции сделки. |
ExchangeType | Направление обмена | Для использования с интерфейсом X19. |
InvoiceState | Состояние счета | Является перечислением, может принимать значения: NotPaid (не оплачен), PaidProtection (оплачен с протекцией), Paid (оплачен без протекции), Refusal (отказ от счета). |
Message | Длинная строка (до 1024) | Для интерфейса X6. |
PartnerAvailability | Платежные разрешения | Для использования с интерфейсом X8. Может иметь значения: InvoiceForbidden, MessageForbidden, TransferForbidden (допустимо несколько значений одновременно). |
PassportAppointment | Должность | Для интерфейса X11. Принимает одно из значений: PrivatePerson, Director, Accountant, Representative, PrivateEntrepreneur |
PassportDegree | Тип аттестата | Для интерфейса X11. Принимает одно из значений: Alias, Formal, Initial, Personal, Merchant, Capitaller, Developer, Registrar, Guarantor, Service1, Service2, Operator |
PassportStatus | Статус | Для интерфейса X11. Принимает одно из значений: PrivatePerson (физ. лицо), Entity (юр. лицо). |
PaymerType | Тип чека | Для интерфейса X18. Может иметь одно из значений: Paymer, Note, Check. |
Purse | Кошелек | Структура данных, состоит из PurseType (тип кошелька Z, E, G, D, C, X, K, L, H) и ulong (номер кошелька). |
TransferType | Тип перевода | Может принимать значения: Normal (обычная), Protection (с протекцией сделки), ProtectionCancel (с протекций, отмененная). |
WmCurrency | Тип титульных знаков WM | В версии 1.0 определены такие типы: Z, E, G, D, C, X, K, L, H |
WmDate | Дата | Неявно приводимо к System.DateTime. Тип System.DateTime явно приводим к WMDate (с потерей времени суток). При приведении учитывается часовой пояс. |
WmDateTime | Дата и время | Полностью приводимо к System.DateTime. При приведении учитывается часовой пояс. |
WmId | WebMoney идентификатор | Неявно приводимо к ulong. Тип ulong явно приводим к WmId (максимальное значение 999999999999). |
Ниже приведена диаграмма классов (ClassDiagram) данных типов:
Все эти типы можно сериализовать и десериализовать.
Запросы и ответы¶
Для каждого запроса и ответа интерфейса, создан специальный тип, инкапсулирующий данные соответствующего запроса/ответа:
№ | Назначение интерфейса | Класс запроса | Класс ответа |
X1 | Выписка счета | OriginalInvoice | RecentInvoice |
X2 | Перевод средств | OriginalTransfer | RecentTransfer |
X3 | История операций | TransferFilter | TransferRegister |
X4 | История выписанных счетов | OutgoingInvoiceFilter | OutgoingInvoiceRegister |
X5 | Завершение операции с протекцией | ProtectionFinisher | ProtectionReport |
X6 | Отправка сообщения | OriginalMessage | RecentMessage |
X7 | Проверка АСП | SignatureInspector | SignatureInference |
X8 | Поиск по идентификатору или кошельку | WmIdFinder | WmIdReport |
X9 | Баланс на кошельках | PurseInfoFilter | PurseInfoRegister |
X10 | Список счетов на оплату | IncomingInvoiceFilter | IncomingInvoiceRegister |
X11 | Информация из аттестата | PassportFinder | Passport |
X13 | Возврат платежа с протекцией | ProtectionRejector | ProtectionReport |
X14 | Бескомиссионный возврат средств | TransferRejector | MoneybackReport |
X15.1 | Список моих доверенностей | OutgoingTrustFilter | TrustRegister |
X15.2 | Список доверяющих мне | IncomingTrustFilter | TrustRegister |
X15.3 | Создание или изменение доверенности | OriginalTrust | TrustRegister |
X16 | Создание кошелька | OriginalPurse | RecentPurse |
X17.1 | Создание контракта | OriginalContract | RecentContract |
X17.2 | Информация об акцептантах | AcceptorFilter | AcceptorRegister |
X18 | Детали операции через merchant | MerchantOperationObtainer | MerchantOperation |
X19 | Проверка владельца | ClientInspector | ClientEvidence |
X20.1 | Запрос на экспресс-оплату | ExpressPaymentRequest | ExpressPaymentResponse |
X20.2 | Завершение экспресс-оплаты | ExpressPaymentConfirmation | ExpressPaymentReport |
X21.1 | Запрос на установку доверия по SMS/USSD | ExpressTrustRequest | ExpressTrustResponse |
X21.2 | Подтверждение установки доверия по SMS/USSD | ExpressTrustConfirmation | ExpressTrustReport |
X22 | Получение ссылки для оплаты через Merchant WebMoney | OriginalMerchantPayment | MerchantPaymentToken |
Типы ответов для входящих/исходящих счетов и для переводов, наследуются от одного базового класса Operation. Для наглядности приведена диаграмма классов:
Специальные типы исключений¶
Для всех исключительных ситуаций бизнес-процесса, генерируемых сервером WebMoney, определены специальные типы. В общем случае таким типом является WmException (номер ошибки записан в свойстве ErrorNumber). Для некоторых интерфейсов этот тип расширен.
Тип исключения | № интерфейса |
WmException | Базовый тип для всех типов бизнес-исключений. Используется для всех интерфейсов, кроме приведенных ниже в таблице. |
ClientInspectorException | X19. Проверка владельца |
ExpressPaymentException | X20. Экспресс-оплата |
ExpressTrustException | X21. Доверенность по SMS/USSD |
MerchantOperationObtainerException | X18. Детали операции Merchant |
OriginalInvoiceException | X1. Выписка счета |
OriginalMerchantPaymentException | X22. Получение ссылки для оплаты через Merchant |
OriginalMessageException | X6. Отправка сообщения |
OriginalPurseException | X16. Создание кошелька |
OriginalTransferException | X2. Перевод средств |
OutgoingInvoiceFilterException | X4. История выписанных счетов |
TransferFilterException | X3. История операций |
TransferRejectorException | X14. Бескомиссионный возврат средств |
Расшифровать ошибку по ее номеру, можно вызвав метод TranslateDescription с указанием необходимого языка (по умолчанию английский).
Для исключений ExpressPaymentException и ExpressTrustException добавлен метод GetClientMessage, позволяющий получить текст ошибки для отображения клиенту (при вызове можно указать язык, по умолчанию английский).
Для MerchantOperationObtainerException добавлено свойство ExtendedInfo с подробными данными ошибки оплаты а так же метод TranslateExtendedErrorNumber для расшифровки кода ошибки оплаты (при вызове можно указать язык, по умолчанию английский).
Типы исключений можно сериализовать/десериализовать. Ниже приведена диаграмма классов (ClassDiagram) данных типов:
Инициализация библиотеки в коде¶
Перед использованием библиотеки, ее необходимо инициализировать. Сделать это можно двумя путями: (1) прямо в коде программы, (2) в конфигурационном файле приложения.
Пример конфигурации в коде программы ключом Keeper WinPro:
var masterWmId = (WmId) 123456789012; // альтернативно можно записать WmId.Parse("123456789012") KeeperKey keeperKey = new KeeperKey("Здесь вписать XML-ключ, полученный из файла .kwm с помощью программы Key Extractor"); var initializer = new Initializer(masterWmId, keeperKey); initializer.Apply(); // Только для глобального конфигурирования (подходит для однопоточных приложений). Как правило следует устанавливать initializer для каждого запроса отдельно.
Здесь primaryWmId — объект типа WmId, хранящий идентификатор владельца приватного ключа, а keeperKey — объект класса KeeperKey из сборки WebMoney.Cryptography.dll (см. WMSignerFX).
Пример конфигурации в коде программы ключом Keeper WebPro:
var initializer = new Initializer(certificate); initializer.Apply(); // Только для глобального конфигурирования (подходит для однопоточных приложений). Как правило следует устанавливать initializer для каждого запроса отдельно.
Здесь certificate — объект стандартного класса .Net X509Certificate.
Если вызвать метод Apply, конфигурация будет применена глобально (это можно выполнить 1 раз перед началом вызова интерфейсов). В некоторых случаях это может привести к проблемам (в многопоточных приложениях), по этому предусмотрена возможность не использовать глобальных статических свойств. Для этого у каждого запроса есть свойство Initializer, которое нужно установить перед отправкой запроса.
Инициализация библиотеки с помощью файла конфигурации¶
Второй способ инициализации библиотеки: задание параметров в файле конфигурации.
Для аутентификации ключом WM Keeper WinPro, требуется указать:
- Управляющий WMID.
- Строковое представление ключа WM Keeper, полученное с помощью утилиты Key Extractor.
- Данные для генерации номера запроса: дата отсчета и период обновления в миллисекундах.
Для аутентификации ключом WM Keeper WebPro, требуется указать:
- Расположение X.509-ключа WM Keeper WebPro: название хранилища и тип хранилища. Альтернативный вариант: указать Base-64 представление сертификата и закрытого ключа, полученное с помощью утилиты Key Extractor.
- Отпечаток (Thumbprint) сертификата закрытого ключа WMKeeper WebPro. Если указано Base-64 представление сертификата и закрытого ключа, то отпечаток сертификата указывать не нужно.
Примечание: для использования библиотеки с ключом WM Keeper WebPro, код должен иметь полномочия FullTrust.
Пример конфигурационного файла для аутентификации ключом WM Keeper WinPro:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="webMoneyConfiguration"> <section name="applicationInterfaces" type="WebMoney.XmlInterfaces.Configuration.ConfigurationHandler, WebMoney.XmlInterfaces" /> </sectionGroup> </configSections> <webMoneyConfiguration> <applicationInterfaces> <authorizationMode>Classic</authorizationMode> <keeperClassic> <wmId>712300479010</wmId> <wmKey><RSAKeyValue><Modulus>ccqACxc2qzE3t+zJntCBGrw/qZTmrmJEPhmkVGUwhc+ZhDiIr4qwAvhnNwIme9r5YjWEdi7wm/XDnsp096aNjlkI</Modulus><D>FW1RaQMqZ6zHl6+wx+16uDB4zAmRr9sbBP7xVxzIg4vuIG4/w5b5XzFNv2sfSsmu+I3roO7E7qYmoeIn8otCeHgD</D></RSAKeyValue></wmKey> </keeperClassic> <requestNumber> <startTime>01.01.2009 00:00:00</startTime> <period>1000</period> </requestNumber> </applicationInterfaces> </webMoneyConfiguration> </configuration>
Здесь wmKey — значение приватного ключа в XML-формате, полученное с помощью программы
Key Extractor. Обратите внимание! К значению ключа применен XML-Encoding (замена символов '<' и '>').
Пример конфигурационного файла для аутентификации ключом WM Keeper WebPro, с указанием хранилища:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="webMoneyConfiguration"> <section name="applicationInterfaces" type="WebMoney.XmlInterfaces.Configuration.ConfigurationHandler, WebMoney.XmlInterfaces" /> </sectionGroup> </configSections> <webMoneyConfiguration> <applicationInterfaces> <authorizationMode>Light</authorizationMode> <keeperLight> <containerInfo> <storeName>My</storeName> <storeLocation>CurrentUser</storeLocation> <thumbprint>65d4308da7fe18fe2788acee2ec48f453b4461d1</thumbprint> </containerInfo> </keeperLight> <requestNumber> <startTime>01.01.2009 00:00:00</startTime> <period>1000</period> </requestNumber> </applicationInterfaces> </webMoneyConfiguration> </configuration>
Пример конфигурационного файла для аутентификации ключом WM Keeper WebPro, с указанием Base-64 представления закрытого ключа и сертификата:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="webMoneyConfiguration"> <section name="applicationInterfaces" type="WebMoney.XmlInterfaces.Configuration.ConfigurationHandler, WebMoney.XmlInterfaces" /> </sectionGroup> </configSections> <webMoneyConfiguration> <applicationInterfaces> <authorizationMode>Light</authorizationMode> <keeperLight> <rawData>MIIE+gIBAzCCBLoGCSqGSIb3DQEHAaCCBKsEggSnMIIEozCCBJ8GCSqGSIb3DQEHBqCCBJAwggSMAgEAMIIEhQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIR0XXduV1U7YCAgfQgIIEWLbDls7e99zCoPINitqYT1xaz4GQsU/5UwaBXc6Ux+dTdAB2ZVLdWRJ7XDDisQx0I4TIbm/OEPTHSRHcqasLn9/nqEps0qikST4PVVoHeFgYFWP7LZkmhrZnbNNhU+yDe4IGdZgDq+owLn2ZnnxFKQwJhk3yUC6cLoPGK/b+2FeiObAa1rKk3+xMcBy+AdGvSOLpY0hpHEWI3vRJ12mpWzQdhcc+eyrxYArBWa0tUEkFjqQPZk8+yaOfn+mB20pPuVgSJAOVACYA46nB2IY0UiQDVAiC2+SOKdUqQEK5XDDTIInHyG/y4wHAR1B1RORS4IPEdKySaaae5Mi8/8FXYb6kGI57XjdOMXR8gSgohinTLiKXbvL02FgwHHPKnIh7N2k+siwxND/eKVgQ6fElbm3XLTsjhraWICbr2zJBmE6pI/w9M1UGnNNrG8b4THmr0HIguw7V3D0kZI9BbG51+RiHb58pFkiSdGSt9PFYUwoix/wNmuzs9LM9itrVCV6HqWkxi82bIynsaPU8SDCz7BAbYlO+F35JROQR07FypMCl4LXdsLdWPeW7htZnvB7iUExs+WfMITrbSFvL+DatJ5euFuJu9mNpmM/rYuidGHgXmHN1bteMDXq1PWnfeOnnGJoXEp2zRBHk3ETwQtdKxYMzqfFNuCxrnx3mH9PBV/DWUwMAnZgb2autq+EJrLEXxpJPqWIcJNKwzx49Lx1gvqB6vv4I1u3VK+nFWOcv59m4KCbRPy7t1JbGVKCXXPstmhm2jq1byT3G3a/EKmG56BdyrzUZ2d7b6IgnSA+0E8X56UIYVgAr7rg3ciZYCFNupLwz0eqlOuDzehLnXzS+17TyEPF+sqKqJP16PwFCQaGlDd5kycvOk1i0tnM0EvHON1maZjfB/C4Wqzp+bqPjezfRiNo1VS6e8vryWb4DIy7Xgfe/C8Xxf4DzDlq+hyWcux+ewDj7qqZvc5geysjV6iYCK3JZ/IB2FNhYW+J2Os/WbK8jUFvfTO/Ha0IyO8rcQJwwliacky5LOo8Ib9Dero19S78sz39GfPmS918HLktl8fMR7ZqLnCVnvOgo0cg7IgoqfDOrBm3WGt7WQYGBaam00apf3YDtIuLsVgQT/8ZKv3WotAiyI/8vk8uc7pjC9cZdzL+aEo/e0PkETYei76QxQDJbGxp2jzTuy980AN3Mv/gZF7rYkVxVKNWOwv56npRyAyHd45th+2o2H/TIaaSOq2gwlGSQ58kO09viU1NlccNJApD4G3DaKnTm1n1e3QwiZkwQm9VyJ4IVWGYarR/0HcTXewV3a5hG4k+zhfZdrydT8UN2ViHm+vMD2Fggtz8EuXZKu6kwtt+LmsRW/6BwcL8hNAPyQp4QrUzK41O0cBuEuv2mgqspDcjNNpNJpjpRC/5Qgrzz2siwCfUyquie8A3xPqCZ2KhKVU1suGVpeGdg2ikkM6K+5SMM3WiErX3ER8uY/8vrMDcwHzAHBgUrDgMCGgQUqXXnEeizaXIhJeucy/eUUMITrakEFIfBnx2/Q82NU4rCl21Ny863Lnha</rawData> </keeperLight> <requestNumber> <startTime>01.01.2009 00:00:00</startTime> <period>1000</period> </requestNumber> </applicationInterfaces> </webMoneyConfiguration> </configuration>
Примечание: для ASP.Net-приложений, файл конфигурации имеет название "Web.config" и располагается в корневой директории сайта. Для Win32-приложений, файл конфигурации называется также, как исполняемый файл приложения, с добавлением расширения ".config" (пример: MyApplication.exe.config) и располагается в одной папке с исполняемым файлом.
Начиная с версии 1.0, чтобы использовать параметры из конфигурационного файла, перед обращением к интерфейсам следует это явно указать (один раз перед первым вызовом интерфейса):
Initializer initializer = new Configurator(); initializer.Apply(); // // Только для глобального конфигурирования (подходит для однопоточных приложений). Как правило следует устанавливать initializer для каждого запроса отдельно.
Класс Configurator расположен в сборке WebMoney.XmlInterfaces.Configuration.dll.
Использование библиотеки¶
После инициализации библиотеки ее можно использовать. Использование с ключами WM Keeper WinPro и WM Keeper WebPro абсолютно идентично.
Быстрый старт¶
1 Создайте консольное приложение.
2 Подключите библиотеку с помощью менеджера пакетов NuGet, указав название пакета WebMoney.XmlInterfaces. Альтернативно можно скачать библиотеки по ссылкам в конце статьи.
3 Скопируйте этот код или скачайте SampleApp из репозитория:
using System; using WebMoney.XmlInterfaces.BasicObjects; using WebMoney.XmlInterfaces.Configuration; namespace WebMoney.XmlInterfaces.SampleApp { class Program { static void Main(string[] args) { Initializer initializer; // Option 1: initialization from code initializer = new Initializer(WmId.Parse("227583964705"), new KeeperKey( "<RSAKeyValue><Modulus>uTofMnUSbGMU+BRUBEiKk/PETBivydURnJu/r1NfX/GJicQlGEwBgcl293acLLFe1wfnL3ULZPyuDkOQDC1fvokH</Modulus><D>kyWOQCP0jRYxERtJo2LgW8bBB9GPTrofkRTcUSoR1nUxXTlkXssyHJHqTXKj+D9vnxlIdPnYjAzIxVdyqWerFZcB</D></RSAKeyValue>")); // Option 2: initialization from App.config //initializer = new Configurator(); // initializer.Apply(); // Use this if you need a global configuration (for desktop single-threaded applications). DateTime fromTime = new DateTime(2016, 07, 1, 0, 0, 0); var transferFilter = new TransferFilter(Purse.Parse("Z415434285082"), fromTime, fromTime.AddMonths(1)); transferFilter.Initializer = initializer; // Request initialization. var transferRegister = transferFilter.Submit(); foreach (var transfer in transferRegister.TransferList) { Console.WriteLine(transfer.Amount); Console.WriteLine(transfer.Description); } } } }
4 Запустите приложение. На экране будет отображена история переводов по тестовому кошельку Z415434285082.
5 Теперь замените WMID, ключ и кошелек на свой собственный. Получить XML-представление ключа WinPro можно с помощью программы Key_Extractor. Альтернативно можно использовать ключ WebPro (см. выше раздел инициализация библиотеки).
Ниже вы найдете примеры вызова других интерфейсов.
Обнатите внимание, что отправка запроса (вызов метода Submit) может привести к возникновению бизнес-исключения, наследника WmException.
Логирование исключительных ситуаций¶
Для логирования используется популярная библиотека log4net. Чтобы включить логирование, вам необходимо сконфигурировать эту библиотеку (см. официальный сайт log4net для детальной информации). Бизнес-исключения (наследники WmException) имеют уровень Debug. Остальные исключения имеют уровень Error.
Примеры использования¶
Ниже приведены примеры работы с библиотекой на языке C#. Эти же примеры можно увидеть в приложении WebMoney.XmlInterfaces.Sandbox, которое размещено в репозитории.
Общие тестовые данные (используются многими примерами одновременно).
// Тестовые данные var primaryWmId = WmId.Parse("111111111111"); // парсинг строки var secondaryWmId = (WmId) 222222222222; // тип ulong явно приводим к WMID var primaryPurse = Purse.Parse("Z111111111111"); // кошелек с деньгами var secondaryPurse = new Purse(WmCurrency.R, 222222222222); // альтернативная запись var amount = (Amount)0.01M; // можно использовать парсинг строки: Amount.Parse("0.01"); // Номер заказа в системе магазина. По нему можно искать операцию. Не уникальный. uint orderId = 1; // Номер перевода. Используется для предотвращения дублирования платежа или сообщения. int transferId = 1;
X1. Выписка счета
var originalInvoice = new OriginalInvoice(orderId, primaryWmId, secondaryPurse, amount); originalInvoice.Description = (Description)("Проверка выписки счета"); originalInvoice.Address = (Description)"Адрес магазина"; originalInvoice.Expiration = 3; // срок оплаты дней (по умолчанию 180 дней) originalInvoice.Period = 1; // срок протекции, если разрешена оплата с протекцией try { var recentInvoice = originalInvoice.Submit(); Console.WriteLine("Успешно. Номер счета: " + recentInvoice.Id); } catch (WmException wmException) { Console.WriteLine("Ошибка: " + wmException.Message); }
Примечание. При вызове метода Submit может возникнуть бизнес-исключение WmException. Это касается всех интерфейсов. Так-же может возникнуть исключение WebException (нужно вызывать метод Submit повторно).
X2. Перевод средств
var originalTransfer = new OriginalTransfer(2, new Purse(WmCurrency.Z, 1), Purse.Parse("Z123456789012"), Amount.Parse(1)); originalTransfer.Description = (Description) "Тестовый перевод"; originalTransfer.InvoiceId = recentInvoice.Id; // если перевод по счету var recentTransfer = originalTransfer.Submit();
X3. История операций
var transferFilter = new TransferFilter(primaryPurse, DateTime.Now.AddMinutes(-5), DateTime.Now); var transferRegister = transferFilter.Submit(); foreach (var transfer in transferRegister.TransferList) { Console.WriteLine(transfer.Id + " " + transfer.Amount); }
X4. История выписанных счетов (поиск по номеру счета)
var outgoingInvoiceFilter = new OutgoingInvoiceFilter(primaryPurse, DateTime.Now.AddMinutes(-5), DateTime.Now); //outgoingInvoiceFilter.InvoiceId = recentInvoice.Id; поиск по номеру счета var outgoingInvoiceRegister = outgoingInvoiceFilter.Submit(); foreach (var outgoingInvoice in outgoingInvoiceRegister.OutgoingInvoiceList) { Console.WriteLine(outgoingInvoice.Id + " " + outgoingInvoice.InvoiceState); }
X5. Завершение операции с протекцией
var protectionFinisher = new ProtectionFinisher(recentTransfer.Id, code); var protectionReport = protectionFinisher.Submit();
X6. Отправка сообщения
var subject = (Description)"Проверка"; var content = (Message)"Текст сообщения (не более 1024 символов)."; var originalMessage = new OriginalMessage(secondaryWmId, subject, content); var recentMessage = originalMessage.Submit();
X7. Проверка подписи
var signer = new Signer(); signer.Initialize( "<RSAKeyValue><Modulus>ccqACxc2qzE3t+zJntCBGrw/qZTmrmJEPhmkVGUwhc+ZhDiIr4qwAvhnNwIme9r5YjWEdi7wm/XDnsp096aNjlkI</Modulus><D>FW1RaQMqZ6zHl6+wx+16uDB4zAmRr9sbBP7xVxzIg4vuIG4/w5b5XzFNv2sfSsmu+I3roO7E7qYmoeIn8otCeHgD</D></RSAKeyValue>"); string message1 = "Сообщение1"; string message2 = "Сообщение2"; string signature = signer.Sign(message1); var signatureInspector1 = new SignatureInspector(WmId.Parse("712300479010"), (Message)message1, (Description)signature); var signatureEvidence1 = signatureInspector1.Submit(); var signatureInspector2 = new SignatureInspector(WmId.Parse("712300479010"), (Message)message2, (Description)signature); var signatureEvidence2 = signatureInspector2.Submit(); if (!signatureEvidence1.VerificationResult) Console.WriteLine("!signatureEvidence1.VerificationResult"); if (signatureEvidence2.VerificationResult) Console.WriteLine("signatureEvidence2.VerificationResult");
X8. Поиск по идентификатору или кошельку
var wmIdFinder = new WmIdFinder(WmId.Parse("712300479010")); var wmIdReport = wmIdFinder.Submit(); Console.WriteLine(wmIdReport.Success);
X9. Баланс на кошельках
var purseInfoFilter = new PurseInfoFilter(primaryWmId); var purseInfoRegister = purseInfoFilter.Submit(); foreach (var purseInfo in purseInfoRegister.PurseInfoList) { Console.WriteLine(purseInfo.Purse + " " + purseInfo.Amount); }
X10. Список счетов на оплату
var incomingInvoiceFilter = new IncomingInvoiceFilter(primaryWmId, DateTime.Now.AddDays(-1), DateTime.Now); var incomingInvoiceRegister = incomingInvoiceFilter.Submit(); foreach (var incomingInvoice in incomingInvoiceRegister.IncomingInvoiceList) { Console.WriteLine(incomingInvoice.TargetWmId + " " incomingInvoice.InvoiceState); }
X11. Информация из аттестата
var passportFinder = new PassportFinder(secondaryWmId); var passport = passportFinder.Submit(); Console.WriteLine(passport.PassportDegreeToLocalString()); // тип аттестата на английском или русском языке, в зависимости от текущей культуры
X13. Возврат платежа с протекцией
var protectionRejector = new ProtectionRejector(transferId); var protectionReport = protectionRejector.Submit();
X14. Бескомиссионный возврат средств
var transferRejector = new TransferRejector(transferId, amount); var moneybackReport = transferRejector.Submit();
X15.1 Список моих доверенностей
var outgoingTrustFilter = new OutgoingTrustFilter(primaryWmId); var trustRegister = outgoingTrustFilter.Submit(); foreach (var trust in trustRegister.TrustList) { Console.WriteLine(trust.Master + " " + trust.TransferAllowed); }
X15.2 Список доверяющих мне
var incomingTrustFilter = new IncomingTrustFilter(primaryWmId); var trustRegister = incomingTrustFilter.Submit(); foreach (var trust in trustRegister.TrustList) { Console.WriteLine(trust.Purse + " " + trust.DayAmount); }
X15.3 Создание или изменение доверенности
var originalTrust = new OriginalTrust(secondaryWmId, primaryPurse); originalTrust.InvoiceAllowed = true; var trustRegister = originalTrust.Submit();
X16. Создание кошелька
var originalPurse = new OriginalPurse(_primaryWmId, WmCurrency.G, (Description)"Temp"); var recentPurse = originalPurse.Submit();
X17.1 Создание контракта
var originalContract = new OriginalContract((Description)"Тестовый контракт", ContractType.Private, "Контракт создан в целях тестирования библиотеки WM-API."); originalContract.AcceptorList = new List<WmId>(); originalContract.AcceptorList.Add(primaryWmId); originalContract.AcceptorList.Add(secondaryWmId);
X17.2 Информация об акцептантах
var acceptorFilter = new AcceptorFilter(recentContract.ContractId); var acceptorRegister = acceptorFilter.Submit(); foreach (var acceptor in acceptorRegister.AcceptorList) { if (null != acceptor.AcceptTime) // если не подписан, то дата установлена в null Console.WriteLine(acceptor.WmId); }
X18. Детали операции через merchant
var merchantOperationFilter = new MerchantOperationFilter(primaryPurse, 200000); var merchantOperation = merchantOperationFilter.Submit();
X19. Проверка данных WMID
var amount = Amount.Parse("0.01"); // Ввод/вывод WM наличными в одном из обменных пунктов var clientInspector = new ClientInspector(WmCurrency.U, amount, secondaryWmId, (Description)"AA000001", (Description)"Пупкин", (Description)"Василий"); //clientInspector.Output = false; var clientEvidence = clientInspector.Submit(); // Ввод/вывод WM наличными через системы денежных переводов var clientInspector = new ClientInspector(WmCurrency.U, amount, secondaryWmId, (Description)"Петров", (Description)"Иван"); //clientInspector.Output = false; var clientEvidence = clientInspector.Submit(); // Ввод/вывод WM на банковский счет var clientInspector = new ClientInspector(WmCurrency.U, amount, secondaryWmId, (Description)"Пупкин", (Description)"Василий", (Description)"АльфаБанк", BankAccount.Parse("111222")); //clientInspector.Output = false; var clientEvidence = clientInspector.Submit(); // Ввод/вывод WM на банковскую карту var clientInspector = new ClientInspector(WmCurrency.U, amount, secondaryWmId, (Description)"Петров", (Description)"Иван", (Description)"ПриватБанк", BankCard.Parse("4246667766776677")); //clientInspector.Output = false; var clientEvidence = clientInspector.Submit(); // Обмен WM на электронную валюту других систем var clientInspector = new ClientInspector(WmCurrency.U, amount, secondaryWmId, PaymentSystem.MoneyYandex, (Description)"41001231231231"); //clientInspector.Output = false; string s = clientInspector.Compile(); // Ввод WM за SMS (только operation/direction=2) var clientInspector = new ClientInspector(WmCurrency.U, amount, secondaryWmId, Phone.Parse("+380440000001")); clientInspector.Output = false; var clientEvidence = clientInspector.Submit();
X20. Экспресс-оплата
var expressPaymentRequest = new ExpressPaymentRequest( _storePurse, 0, (Amount)2.01M, (Description)"Проверка ExpressPayment", _clientPhone, ConfirmationType.SMS, CultureInfo.GetCultureInfo("ru-RU")); var expressPaymentResponse = expressPaymentRequest.Submit(); Console.WriteLine(expressPaymentResponse.Info); Console.WriteLine(expressPaymentResponse.InvoiceId); string confirmationCode = null; if (ConfirmationType.SMS == expressPaymentResponse.ConfirmationType) confirmationCode = Console.ReadLine(); var expressPaymentConfirmation = new ExpressPaymentConfirmation( _storePurse, confirmationCode, expressPaymentResponse.InvoiceId, CultureInfo.CreateSpecificCulture("ru-RU")); string c1 = expressPaymentConfirmation.Compile(); Console.WriteLine(c1); var expressPaymentReport = expressPaymentConfirmation.Submit(); Console.WriteLine(expressPaymentReport.SmsState
X21. Установка доверия по SMS/USSD
var expressTrustRequest = new ExpressTrustRequest( _storePurse, (Amount)0.01, (Amount)0.0, (Amount)0.0, _clientPhone, ConfirmationType.SMS, CultureInfo.CreateSpecificCulture("ru-RU")); var expressTrustResponse = expressTrustRequest.Submit(); Console.WriteLine(expressTrustResponse.Info); string confirmationCode = null; if (ConfirmationType.SMS == expressTrustResponse.ConfirmationType) confirmationCode = Console.ReadLine(); var expressTrustConfirmation = new ExpressTrustConfirmation( expressTrustResponse.Reference, confirmationCode, CultureInfo.CreateSpecificCulture("ru-RU")); var expressTrustReport = expressTrustConfirmation.Submit(); Console.WriteLine(expressTrustReport.TrustId);
X22. Получение ссылки для оплаты через Merchant WebMoney
var originalMerchantPayment = new OriginalMerchantPayment( 1000, _storePurse, (Amount)10.0, (Description)"Тестовый платеж (проверка API)", 1); var merchantPaymentToken = originalMerchantPayment.Submit(); Console.WriteLine(merchantPaymentToken.Token);
Список изменений¶
Версия 2.0¶
- Добавлена поддержка .Net Core (.Net Standard 2.0).
Версия 1.1.3¶
- Добавлены спец. исключения TransferFilterException, OutgoingInvoiceFilterException, MerchantOperationObtainerException, ExpressPaymentException, ExpressTrustException, OriginalMerchantPaymentException.
- Добавлена возможность получить код ошибки на русском или английском языке (для всех спец. исключений).
- Добавлена возможность получить доп. информацию об ошибке оплаты (для интерфейса X18).
Версия 1.1.2¶
- Добавлены интерфейсы X20, X21, X22.
- Созданы NuGet-пакеты для удобного подключения библиотеки и зависимостей.
- Уменьшено количество зависимых библиотек.
- Убрана проверкa длины ключа WinPro в Keys Extractor (возникала ошибка с некоторыми ключами).
- Исправлены мелкие баги.
Ссылки на ресурсы:¶
Зеркала на SF.net, CodePlex и Google Code более не поддерживаются.