| Правильная ссылка на эту статью: |
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 более не поддерживаются.