<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https://wiki.welard.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.248.41.234&amp;*</id>
	<title>Wiki Welard - Внесок користувача [uk]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.welard.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.248.41.234&amp;*"/>
	<link rel="alternate" type="text/html" href="https://wiki.welard.com/index.php?title=%D0%A1%D0%BF%D0%B5%D1%86%D1%96%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0:%D0%92%D0%BD%D0%B5%D1%81%D0%BE%D0%BA/94.248.41.234"/>
	<updated>2026-10-22T12:39:01Z</updated>
	<subtitle>Внесок користувача</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://wiki.welard.com/index.php?title=Programming&amp;diff=1939</id>
		<title>Programming</title>
		<link rel="alternate" type="text/html" href="https://wiki.welard.com/index.php?title=Programming&amp;diff=1939"/>
		<updated>2010-03-07T19:04:43Z</updated>

		<summary type="html">&lt;p&gt;94.248.41.234: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Django FAQ]]&lt;br /&gt;
 [[Django Links]]&lt;br /&gt;
 [[MySQL-python]]&lt;br /&gt;
 [[Mysql unicode]]&lt;br /&gt;
 [[Mercurial]]&lt;br /&gt;
 [[Django]]&lt;br /&gt;
 [[Подключение_интернет-магазина_к_WebMoney_на_Python]]&lt;/div&gt;</summary>
		<author><name>94.248.41.234</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.welard.com/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%BC%D0%B0%D0%B3%D0%B0%D0%B7%D0%B8%D0%BD%D0%B0_%D0%BA_WebMoney_%D0%BD%D0%B0_Python&amp;diff=1938</id>
		<title>Подключение интернет-магазина к WebMoney на Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.welard.com/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%BC%D0%B0%D0%B3%D0%B0%D0%B7%D0%B8%D0%BD%D0%B0_%D0%BA_WebMoney_%D0%BD%D0%B0_Python&amp;diff=1938"/>
		<updated>2010-03-07T19:03:18Z</updated>

		<summary type="html">&lt;p&gt;94.248.41.234: Created page with 'http://habrahabr.ru/blogs/django/86123/  Организационная часть  Существует несколько вариантов подключения к сист...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://habrahabr.ru/blogs/django/86123/&lt;br /&gt;
&lt;br /&gt;
Организационная часть&lt;br /&gt;
&lt;br /&gt;
Существует несколько вариантов подключения к системе WebMoney. В данной статье я опишу два варианта: WebMoney XML-interface (по сути WebMoney API для продавцов) и Web Merchant Interface (переход на страницу оплаты WebMoney по специально сформированной ссылке).&lt;br /&gt;
&lt;br /&gt;
Чтобы иметь возможность работать с любым из этих вариантов, вам нужно получить аттестат продавца. То есть зарегистрироваться и подтвердить, что вы являетесь юридическим лицом. Правда на практике все нужные нам функции обоих вариантов подключения работают и при обычном персональном аттестате (хотя в документации и написано обратное). Поэтому смело можете начать с него и потом получить аттестат продавца. Процесс получения персонального аттестата или аттестата продавца выходит за пределы данной статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вариант подключения через WebMoney XML-interface&lt;br /&gt;
&lt;br /&gt;
Для работы с ним нам потребуются библиотеки openssl и curl (скомпилированный с поддержкой ssl). Плюс потребуется питоновская библиотека для работы с curl: pycurl. Команды для инсталляции библиотек из мак-портов (в убунту ставим из пакетов):&lt;br /&gt;
&lt;br /&gt;
sudo port install openssl&lt;br /&gt;
sudo port install curl +ssl&lt;br /&gt;
sudo port install py26-curl&lt;br /&gt;
&lt;br /&gt;
Предупреждение: не используйте версию openssl 0.9.8l. В ней баг работы с ssl-ключами! К сожалению на данный момент эта библиотека идет по умолчанию в мак-портах. Я потратил несколько часов, прежде чем понял, что дело было в ней. Точно рабочими являются версии openssl 0.9.8k или 0.9.8g.&lt;br /&gt;
&lt;br /&gt;
Для оплаты товара через WebMoney из всех функций API нам нужны только следующие:&lt;br /&gt;
&lt;br /&gt;
— Выставление счета&lt;br /&gt;
— Проверка, что счет оплачен&lt;br /&gt;
&lt;br /&gt;
Все запросы и ответы производятся в формате XML. Не буду долго расписывать и просто приведу примеры кода.&lt;br /&gt;
&lt;br /&gt;
Выставить счет на оплату:&lt;br /&gt;
&lt;br /&gt;
    Copy Source | Copy HTML&lt;br /&gt;
    xml_request = &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
            &amp;lt;w3s.request&amp;gt;&lt;br /&gt;
            &amp;lt;reqn&amp;gt;%s&amp;lt;/reqn&amp;gt;&lt;br /&gt;
                &amp;lt;invoice&amp;gt;&lt;br /&gt;
                    &amp;lt;orderid&amp;gt;%s&amp;lt;/orderid&amp;gt;&lt;br /&gt;
                    &amp;lt;customerwmid&amp;gt;%s&amp;lt;/customerwmid&amp;gt;&lt;br /&gt;
                    &amp;lt;storepurse&amp;gt;%s&amp;lt;/storepurse&amp;gt;&lt;br /&gt;
                    &amp;lt;amount&amp;gt;%s&amp;lt;/amount&amp;gt;&lt;br /&gt;
                    &amp;lt;desc&amp;gt;%s&amp;lt;/desc&amp;gt;&lt;br /&gt;
                    &amp;lt;period&amp;gt;0&amp;lt;/period&amp;gt;&lt;br /&gt;
                    &amp;lt;expiration&amp;gt;0&amp;lt;/expiration&amp;gt;&lt;br /&gt;
                &amp;lt;/invoice&amp;gt;&lt;br /&gt;
            &amp;lt;/w3s.request&amp;gt;&lt;br /&gt;
            &amp;quot;&amp;quot;&amp;quot; % (_get_reqn(), payment_id, customer_wmid, your_web_money_purse, payment_amount,&lt;br /&gt;
                   payment_description)&lt;br /&gt;
     &lt;br /&gt;
            result = request('https://w3s.wmtransfer.com/asp/XMLInvoiceCert.asp',&lt;br /&gt;
                                      xml_request.encode('utf-8'))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пояснение параметров запроса:&lt;br /&gt;
&lt;br /&gt;
    * _get_reqn() — функция формирования уникального номера запроса (приведена ниже)&lt;br /&gt;
    * payment_id — id платежа в вашем интернет-магазине&lt;br /&gt;
    * customer_wmid — WMID покупателя (предполагается, что у покупателя есть кошелек в той же валюте, что и у вас)&lt;br /&gt;
    * your_web_money_purse — ваш номер кошелька, например: R12345678900&lt;br /&gt;
    * payment_amount — цена вашего заказа&lt;br /&gt;
    * payment_description — описание заказа&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В XML-ответе будет содержаться номер выставленного счета (invoice_id) и дата его создания (created). Мы используем их в следующем запросе.&lt;br /&gt;
&lt;br /&gt;
Проверка, что счет оплачен:&lt;br /&gt;
&lt;br /&gt;
    Copy Source | Copy HTML&lt;br /&gt;
    from datetime import timedelta&lt;br /&gt;
     &lt;br /&gt;
        xml_request = &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
            &amp;lt;w3s.request&amp;gt;&lt;br /&gt;
            &amp;lt;reqn&amp;gt;%s&amp;lt;/reqn&amp;gt;&lt;br /&gt;
                &amp;lt;getoutinvoices&amp;gt;&lt;br /&gt;
                    &amp;lt;purse&amp;gt;%s&amp;lt;/purse&amp;gt;&lt;br /&gt;
                    &amp;lt;wminvid&amp;gt;%s&amp;lt;/wminvid&amp;gt;&lt;br /&gt;
                    &amp;lt;orderid&amp;gt;%s&amp;lt;/orderid&amp;gt;&lt;br /&gt;
                    &amp;lt;datestart&amp;gt;%s 00:00:00&amp;lt;/datestart&amp;gt;&lt;br /&gt;
                    &amp;lt;datefinish&amp;gt;%s 00:00:00&amp;lt;/datefinish&amp;gt;&lt;br /&gt;
                &amp;lt;/getoutinvoices&amp;gt; &lt;br /&gt;
            &amp;lt;/w3s.request&amp;gt;&lt;br /&gt;
            &amp;quot;&amp;quot;&amp;quot; % (_get_reqn(), customer_web_money_purse, invoice_id, payment_id,&lt;br /&gt;
                   created.strftime('%Y%m%d'), (created + timedelta(1)).strftime('%Y%m%d'))&lt;br /&gt;
     &lt;br /&gt;
            result = request('https://w3s.webmoney.ru/asp/XMLOutInvoicesCert.asp', xml_request.encode('utf-8'))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пояснение параметров запроса:&lt;br /&gt;
&lt;br /&gt;
    * your_web_money_purse — ваш номер кошелька, например: R12345678900&lt;br /&gt;
    * invoice_id — номер выставленного счета в WebMoney&lt;br /&gt;
    * payment_id — номер счета в вашем интернет-магазине&lt;br /&gt;
    * created — дата создания счета в WebMoney&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В XML-ответе, будет указано состояние счета. Возможные варианты состояния:&lt;br /&gt;
1 — не оплачен&lt;br /&gt;
2 — оплачен&lt;br /&gt;
3 — отменен пользователем&lt;br /&gt;
&lt;br /&gt;
Самое интересное — код функций формирования уникального номера и самого запроса:&lt;br /&gt;
&lt;br /&gt;
    Copy Source | Copy HTML&lt;br /&gt;
    import pycurl&lt;br /&gt;
    import random&lt;br /&gt;
    import StringIO&lt;br /&gt;
    from time import time, sleep&lt;br /&gt;
     &lt;br /&gt;
    def _get_reqn():&lt;br /&gt;
        return int(time()*100)&lt;br /&gt;
     &lt;br /&gt;
    def request(url, xml_body, retries=5, delay=5):&lt;br /&gt;
        import os.path&lt;br /&gt;
        current_dir = os.path.dirname(__file__)&lt;br /&gt;
     &lt;br /&gt;
        for i in range( 0, retries):&lt;br /&gt;
            def is_last_attempt():&lt;br /&gt;
                return i &amp;gt;= retries - 1&lt;br /&gt;
     &lt;br /&gt;
            try:&lt;br /&gt;
                r = pycurl.Curl()&lt;br /&gt;
                r.setopt(pycurl.URL, url)&lt;br /&gt;
                r.setopt(pycurl.TIMEOUT, 30)&lt;br /&gt;
                r.setopt(pycurl.HEADER,  0)&lt;br /&gt;
                r.setopt(pycurl.POST, 1)&lt;br /&gt;
                b = StringIO.StringIO()&lt;br /&gt;
                r.setopt(pycurl.WRITEFUNCTION, b.write)&lt;br /&gt;
                r.setopt(pycurl.POSTFIELDS, xml_body)&lt;br /&gt;
                r.setopt(pycurl.CAINFO, current_dir + 'WebMoneyCA.crt')&lt;br /&gt;
                r.setopt(pycurl.SSLKEY, current_dir + 'your_key.key')&lt;br /&gt;
                r.setopt(pycurl.SSLKEYPASSWD, '12345')&lt;br /&gt;
                r.setopt(pycurl.SSLCERT, current_dir + 'your_certificate.cer')&lt;br /&gt;
                r.perform()&lt;br /&gt;
                return b.getvalue()&lt;br /&gt;
            except BaseException as e:&lt;br /&gt;
                logging.warning(u'Http request to web-money, Curl error: %s' % e) # e.args[0] - error code&lt;br /&gt;
                if is_last_attempt():&lt;br /&gt;
                    raise&lt;br /&gt;
            finally:&lt;br /&gt;
                r.close()&lt;br /&gt;
     &lt;br /&gt;
            sleep(delay)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пояснение:&lt;br /&gt;
В параметрах запроса указываются следующие файлы: сертификат WebMoney (WebMoneyCA.crt), ваш ssl-сертификат (your_certificate.cer), ваш ssl-ключ (your_key.key). Так же указывается пароль к ключу: «12345». Как сформировать сертификат и ключ вы можете посмотреть в статье Программное обращение к XML-интерфейсам системы... (внизу). Сертификат WebMoney вы можете взять с сайта WebMoney&lt;br /&gt;
&lt;br /&gt;
Вариант подключения через web merchant interface&lt;br /&gt;
&lt;br /&gt;
Тут все проще, никаких дополнительных библиотек нам ставить не нужно. Все что нужно — это сформировать POST запрос на страницу https://merchant.webmoney.ru/lmi/payment.asp. Пример html-формы:&lt;br /&gt;
&lt;br /&gt;
    Copy Source | Copy HTML&lt;br /&gt;
    &amp;lt;form action=&amp;quot;https://merchant.webmoney.ru/lmi/payment.asp&amp;quot; method=&amp;quot;post&amp;quot; id=&amp;quot;web_money_redirect_form&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_PAYMENT_AMOUNT&amp;quot; value=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_PAYMENT_DESC&amp;quot; value=&amp;quot;Описание товара&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_PAYMENT_NO&amp;quot; value=&amp;quot;11&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_PAYEE_PURSE&amp;quot; value=&amp;quot;Номер вашего кошелька в Web-money&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_SUCCESS_URL&amp;quot; value=&amp;quot;URL-страницы в случае успешной операции&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_SUCCESS_METHOD&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_FAIL_URL&amp;quot; value=&amp;quot;URL-страницы в случае ошибки проведения платежа&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;LMI_FAIL_METHOD&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Перейти на сайт Web Money для оплаты&amp;quot; id=&amp;quot;return_button&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Описание переменных формы:&lt;br /&gt;
&lt;br /&gt;
    * LMI_PAYMENT_AMOUNT — стоимость вашего заказа&lt;br /&gt;
    * LMI_PAYMENT_DESC — текстовое описание заказа&lt;br /&gt;
    * LMI_PAYMENT_NO — номер платежа в вашей системе (в вашем интернет-магазине)&lt;br /&gt;
    * LMI_PAYEE_PURSE — Номер вашего кошелька в WebMoney, например R12345678900&lt;br /&gt;
    * LMI_SUCCESS_URL — URL вашей страницы, на которую покупатель попадет после оплаты в системе WebMoney в случае успешной операции&lt;br /&gt;
    * LMI_SUCCESS_METHOD — метод вызова вашей успешной страницы, указанной в LMI_SUCCESS_URL. Варианты: 0 — GET, 1 — POST, 2 — LINK&lt;br /&gt;
    * LMI_FAIL_URL — URL вашей страницы, на которую покупатель попадет в случае ошибки оплаты в системе WebMoney или если покупатель просто отказался от оплаты&lt;br /&gt;
    * LMI_FAIL_METHOD — метод вызова вашей страницы в случае ошибки. Варианты такие же: 0 — GET, 1 — POST, 2 — LINK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Примечание: вы можете указать LMI_SUCCESS_URL, LMI_SUCCESS_METHOD, LMI_FAILED_URL и LMI_FAILED_METHOD в настройках вашего кошелька в WebMoney, если они у вас всегда одинаковые и не указывать их в параметрах формы. В нашем случае они у нас всегда меняются.&lt;br /&gt;
&lt;br /&gt;
В процессе оплаты WebMoney дополнительно вызовет указанный в настройках вашего кошелька Result URL, причем два раза: сначала до снятия денег (предварительный запрос) и второй раз в случае успешного снятия денег. Если произошла ошибка в процессе оплаты, то второго вызова не будет. Метод вызова: POST.&lt;br /&gt;
&lt;br /&gt;
Параметры предварительного запросы мы пропустим, тем более что они по умолчанию пустые (указывается в настройках вашего кошелька в WebMoney). Если вы не собираетесь обрабатывать предварительный запрос, то в коде django view можно написать такую заглушку:&lt;br /&gt;
&lt;br /&gt;
    Copy Source | Copy HTML&lt;br /&gt;
    if not request.POST or request.POST.get('LMI_PREREQUEST', None):&lt;br /&gt;
            return HttpResponse('OK')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Важные для нас параметры второго POST-запроса от WebMoney:&lt;br /&gt;
&lt;br /&gt;
    * LMI_PAYEE_PURSE — номер нашего кошелька в WebMoney&lt;br /&gt;
    * LMI_PAYMENT_AMOUNT — стоимость вашего заказа&lt;br /&gt;
    * LMI_PAYMENT_NO — номер заказа в нашем интернет-магазине&lt;br /&gt;
    * LMI_MODE — 1 — тестовый режим (реально деньги в WebMoney не снимаются), 0 — нормальный режим работы&lt;br /&gt;
    * LMI_SYS_INVS_NO — номер счета в системе WebMoney&lt;br /&gt;
    * LMI_SYS_TRANS_NO — номер транзакции в системе WebMoney&lt;br /&gt;
    * LMI_SYS_TRANS_DATE — дата транзакции&lt;br /&gt;
    * LMI_PAYER_PURSE — номер кошелька покупателя&lt;br /&gt;
    * LMI_PAYER_WM — WMID покупателя&lt;br /&gt;
    * LMI_HASH — подпись, чтобы проверить параметры запроса и убедиться, что это действительно запрос от WebMoney&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В WebMoney есть два алгоритма формирования подписи: MD5 и собственный алгоритм (SIGN).В случае использования MD5 код&lt;br /&gt;
проверки подписи в вашем view может быть такой:&lt;br /&gt;
&lt;br /&gt;
    Copy Source | Copy HTML&lt;br /&gt;
        import hashlib&lt;br /&gt;
     &lt;br /&gt;
        string_to_sign = ''.join([request.POST['LMI_PAYEE_PURSE'], request.POST['LMI_PAYMENT_AMOUNT'],&lt;br /&gt;
                                 request.POST['LMI_PAYMENT_NO'], request.POST['LMI_MODE'],&lt;br /&gt;
                                 request.POST['LMI_SYS_INVS_NO'], request.POST['LMI_SYS_TRANS_NO'],&lt;br /&gt;
                                 request.POST['LMI_SYS_TRANS_DATE'], secret_key,&lt;br /&gt;
                                 request.POST['LMI_PAYER_PURSE'], request.POST['LMI_PAYER_WM']])&lt;br /&gt;
        sign = hashlib.md5(string_to_sign).hexdigest().upper()&lt;br /&gt;
        if sign != request.POST['LMI_HASH']:&lt;br /&gt;
            return HttpResponseBadRequest('Some error')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из кода, вам нужно указать в переменной secret_key ваш секретный ключ, который вы указали в настройках вашего кошелька.&lt;br /&gt;
&lt;br /&gt;
Так же хорошей идеей является проверить номер вашего кошелька и стоимость товара, что они действительно совпадают с тем, что вы ожидаете:&lt;br /&gt;
&lt;br /&gt;
    Copy Source | Copy HTML&lt;br /&gt;
    if request.POST['LMI_PAYEE_PURSE'] != your_web_money_purse:&lt;br /&gt;
        return HttpResponseBadRequest('Some error')&lt;br /&gt;
     &lt;br /&gt;
    if request.POST['LMI_PAYMENT_AMOUNT'] != your_payment_amount:&lt;br /&gt;
        return HttpResponseBadRequest('Some error')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Дальше вы можете делать, все что нужно для вашего интернет-магазина, чтобы отметить, что товар был оплачен и в самом конце view написать ответ на запрос: return HttpResponse('OK')&lt;br /&gt;
&lt;br /&gt;
Заключение&lt;br /&gt;
&lt;br /&gt;
Надеюсь описание было понятным и полезным. Замечания по теме статьи всегда приветствуются :)&lt;/div&gt;</summary>
		<author><name>94.248.41.234</name></author>
		
	</entry>
</feed>