Подключение WebMoney
От: 0K Ниоткуда  
Дата: 04.05.08 07:47
Оценка: 6 (1)
#Имя: FAQ.dotnet.web.webmoney
Здравствуйте, 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, как вы заметили, есть. Они действительно находятся в разработке. Однако при желании разобраться можно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.