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.

Содержание

  1. Базовые сведения об архитектуре библиотеки
  2. Инициализация библиотеки в коде программы.
  3. Инициализация библиотеки с помощью файла конфигурации.
  4. Общий сценарий использования библиотеки.
  5. Порядок логирования исключительных ситуаций.
  6. Примеры использования.
  7. Список изменений.

Базовые сведения об архитектуре библиотеки

Список библиотек

Название библиотеки Назначение
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, требуется указать:

  1. Управляющий WMID.
  2. Строковое представление ключа WM Keeper, полученное с помощью утилиты Key Extractor.
  3. Данные для генерации номера запроса: дата отсчета и период обновления в миллисекундах.

Для аутентификации ключом WM Keeper WebPro, требуется указать:

  1. Расположение X.509-ключа WM Keeper WebPro: название хранилища и тип хранилища. Альтернативный вариант: указать Base-64 представление сертификата и закрытого ключа, полученное с помощью утилиты Key Extractor.
  2. Отпечаток (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>&lt;RSAKeyValue&gt;&lt;Modulus&gt;ccqACxc2qzE3t+zJntCBGrw/qZTmrmJEPhmkVGUwhc+ZhDiIr4qwAvhnNwIme9r5YjWEdi7wm/XDnsp096aNjlkI&lt;/Modulus&gt;&lt;D&gt;FW1RaQMqZ6zHl6+wx+16uDB4zAmRr9sbBP7xVxzIg4vuIG4/w5b5XzFNv2sfSsmu+I3roO7E7qYmoeIn8otCeHgD&lt;/D&gt;&lt;/RSAKeyValue&gt;</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

  1. Добавлена поддержка .Net Core (.Net Standard 2.0).

Версия 1.1.3

  1. Добавлены спец. исключения TransferFilterException, OutgoingInvoiceFilterException, MerchantOperationObtainerException, ExpressPaymentException, ExpressTrustException, OriginalMerchantPaymentException.
  2. Добавлена возможность получить код ошибки на русском или английском языке (для всех спец. исключений).
  3. Добавлена возможность получить доп. информацию об ошибке оплаты (для интерфейса X18).

Версия 1.1.2

  1. Добавлены интерфейсы X20, X21, X22.
  2. Созданы NuGet-пакеты для удобного подключения библиотеки и зависимостей.
  3. Уменьшено количество зависимых библиотек.
  4. Убрана проверкa длины ключа WinPro в Keys Extractor (возникала ошибка с некоторыми ключами).
  5. Исправлены мелкие баги.

Ссылки на ресурсы:

Зеркала на SF.net, CodePlex и Google Code более не поддерживаются.