Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, 0K.
Q>Спасибо большое за отклик!
0K>>Есть проект для разработчиков использующих WebMoney с ASP.Net: www.wmsigner.com. На этом сайте есть WMSigner разработанный полностью для платформы .Net и работающий примерно в 10 раз быстрее старого COM-овского за счет применения алгортма Монтгомери для RSA-подписи. Так-же есть примеры работы со всеми интерфейсами системы (правда эти самые примеры на данный момент в разработке).
Q>Да, мне попадались ссылки на этот проект. Емнип, там есть возможность работать только с клиентом WM Keeper Classic, мне же нужна версия аутентификации WM Keeper Light.
Посмотрите на
Модуль для интеграции с XML-интерфейсами системы WebMoney. Работает как с ключем Classic, так и с сертификатом (и закрытым ключем) WM Keeper Light. Только контейнер .pfx хранится в виде байтового массива, но вы можете загружать и с хранилища сертификатов компьютера (используйте класс X509Store).
0K>>Web Merchant Interface -- для приема средств.
0K>>XML-интерфейс №2 -- для перечисления средств
Q>Я понял немного не так. Для перечисления средств от ресурса к пользователю нужен X2, а в обратном направлении — X1, это интерфейс с выписыванием счёта. Web Merchant Interface можно вообще не трогать. Впрочем, скоро придётся плотно потестить эти два интерфейса. Пока что удалось разобраться только с «безобидным» интерфейсом X9 — получение информации о балансе.
Существует 4 способа принимать оплату от клиентов с помощью системы WebMoney:
с помощью интерфейса WebMoney Merchant;
с помощью выписки счета на оплату, используя XML-интерфейс №1;
напрямую переводить титульные знаки с доверенных кошельков клиентов, используя XML-интерфейс №2;
с помощью интерфейса Click&Buy;
1 способ -- для мгновенного зачисления средств через шлюз WebMoney. Т.е. клиент будет перенаправлен на сайт WM, где и произведет операцию. Вы же получите только результат (оплатил/не оплатил и какую сумму). Этот вариант приема средств самый распространенный
2 способ -- отложенный. Клиент получает счет на оплату, он может оплатить его в определенный срок (несколько дней) или отказаться от оплаты счета.
3 способ позволяет снимать деньги с кошелька клиента напрямую. Но клиент должен должен доверить вам это делать (с указанием суммы, которую вы можете снимать).
4 способ -- мгновенное зачисление средств одним кликом. Пример работы вы можете посмотреть
здесь.
Q>Трудность ещё была в работе с персональными цифровыми сертификатами X.509, которые используются для аутентификации при работе с WM Keeper Light.
Q>Мне нужен код на ASP.NET/C# (в которых я пока что не очень-то разбираюсь), а в примере на офсайте находятся лишь не вполне вразумительные примеры на ASP/JScript (в которых я вообще никак). В частности, вызвал вопрос фрагмент
Q>Q>var xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP");
Q>if ('light' == AuthorizeType)
Q>{
Q> xmlhttp.setOption(3, 'WM id: '+reqwmid)
Q>}
Q>xmlhttp.open('POST', url, false);
Q>
Q>Вроде как создаётся какой-то COM-объект, и у него устанавливается какое-то свойство. Ну, я смекнул, что это дело неплохо бы выразить в терминах HttpWebRequest, но вот что делать с этим setOption() не сообразил. В итоге пришлось установить сертификат в хранилище Windows (через WinHttpCertCfg.exe), затем при каждом запросе его оттуда извлекать, как-то так:
Q>Q>var store = new X509Store("...", StoreLocation.LocalMachine);
Q>store.Open(OpenFlags.ReadOnly);
Q>X509Certificate certificate = store.Certificates[0];
Q>request.ClientCertificates.Add(certificate);
Q>
Вы все верно делаете. Установите сертификат с закрытым ключем в хранилище машины (не пользователя) и используйте HttpWebRequest для создания запросов. Пример вы можете найти
здесь.
Вот вам код на C# для запросов к серверу WM с аутентификацией сертификатом Light:
public static string Send(Uri uri, string question, X509Certificate clientCertificate, Encoding encoding)
{
if (null == uri)
throw new ArgumentNullException("uri");
string answer;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.ProtocolVersion = new Version(1, 0);
if (null != clientCertificate)
request.ClientCertificates.Add(clientCertificate);
if (!string.IsNullOrEmpty(question))
{
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
StreamWriter streamWriter = null;
try
{
Stream reqStream = request.GetRequestStream();
streamWriter = new StreamWriter(reqStream, encoding ?? defaultEncoding);
streamWriter.Write(question);
}
finally
{
if (null != streamWriter)
streamWriter.Close();
}
}
WebResponse response = request.GetResponse();
StreamReader streamReader = null;
try
{
streamReader = new StreamReader(response.GetResponseStream(), encoding ?? defaultEncoding);
answer = streamReader.ReadToEnd();
}
finally
{
if (null != streamReader)
streamReader.Close();
}
return answer;
}
Q>В общем, разбираться с подключением плат. систем — удовольствие ниже среднего. В идеале от webmoney.ru хотелось бы, чтобы они предоставили на каждую основную операцию по 2*2*2=8 примеров: через Web Merchant Interface и через XML-интерфейсы, с аут-цией через Classic и Light, исходники на ASP.NET/C# и PHP.
Примеры для ASP.Net, как вы заметили, есть. Они действительно находятся в разработке. Однако при желании разобраться можно.