summaryrefslogtreecommitdiff
path: root/python-pyqiwip2p.spec
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-15 08:00:11 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-15 08:00:11 +0000
commit3ba774633668e0b060382292b6e5f54a198377c7 (patch)
tree78c32bf8e20133dc64ca14d978bbb50f858b9fae /python-pyqiwip2p.spec
parentcb551c9ac55342a2b5d8e57c5f1fc913f2320d45 (diff)
automatic import of python-pyqiwip2p
Diffstat (limited to 'python-pyqiwip2p.spec')
-rw-r--r--python-pyqiwip2p.spec540
1 files changed, 540 insertions, 0 deletions
diff --git a/python-pyqiwip2p.spec b/python-pyqiwip2p.spec
new file mode 100644
index 0000000..cb889c7
--- /dev/null
+++ b/python-pyqiwip2p.spec
@@ -0,0 +1,540 @@
+%global _empty_manifest_terminate_build 0
+Name: python-pyQiwiP2P
+Version: 2.0.6
+Release: 1
+Summary: pyQiwiP2P
+License: Mozilla Public License 2.0
+URL: https://github.com/WhiteApfel/pyQiwiP2P
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/86/51/452ff6eeab5efa55d9c4fb0d3c036aa4c920afa7256aa51e601a76e1ca73/pyQiwiP2P-2.0.6.tar.gz
+BuildArch: noarch
+
+Requires: python3-setuptools
+Requires: python3-phonenumbers
+Requires: python3-email-validator
+Requires: python3-typing
+Requires: python3-Hypercorn
+Requires: python3-starlette
+Requires: python3-httpx
+Requires: python3-pydantic
+Requires: python3-validators
+Requires: python3-ipaddress
+Requires: python3-loguru
+Requires: python3-dotenv
+Requires: python3-pytest
+Requires: python3-CherryPy
+Requires: python3-response-report
+
+%description
+## А как пользоваться
+### Что есть?
+Есть сам класс QiwiP2P, который обладает тремя инструментами:
+для выставления, проверки и закрытия платежа (счёта).
+Пример использования:
+```python
+from pyqiwip2p import QiwiP2P
+from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods
+QIWI_PRIV_KEY = "abCdef...xYz"
+p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY)
+# Выставим счет на сумму 228 рублей который будет работать 45 минут
+new_bill = p2p.bill(bill_id=212332030, amount=228, lifetime=45)
+print(new_bill.bill_id, new_bill.pay_url)
+# Проверим статус выставленного счета
+print(p2p.check(bill_id=new_bill.bill_id).status)
+# Потеряли ссылку на оплату счета? Не проблема!
+print(p2p.check(bill_id=245532).pay_url)
+# Клиент отменил заказ? Тогда и счет надо закрыть
+p2p.reject(bill_id=new_bill.bill_id)
+# Если планируете выставлять счета с одинаковой суммой,
+# можно воспользоваться параметром default_amount
+p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148)
+# Теперь, если не указывать в методе p2p.bill() значение суммы заказа,
+# будет применяться указанная базовая сумма
+new_bill = p2p.bill(bill_id=6627358)
+# А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически.
+# Его можно будет посмотреть в объекте ответа Bill
+# В комбинации со стандартным значением суммы будет вот так
+new_bill = p2p.bill()
+print(new_bill.bill_id, new_bill.pay_url)
+# Чтобы запретить приём платежей через какой-то метод оплаты, например, карты,
+# необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode
+fields = {
+ "paySourcesFilter": "qw,card",
+ "themeCode": "MalchikGay",
+}
+p2p.bill(fields=fields)
+# Либо же воспользоваться удобными полями
+p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card])
+p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay")
+```
+### А асинхронно могёте?
+Могём. Причём примерно так же.
+```python
+from pyqiwip2p import AioQiwiP2P
+from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods
+QIWI_PRIV_KEY = "abCdef...xYz"
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY)
+# Если планируете выставлять счета с одинаковой суммой,
+# можно воспользоваться параметром default_amount
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148)
+async def main():
+ async with p2p:
+ # Выставим счет на сумму 228 рублей который будет работать 45 минут
+ new_bill = await p2p.bill(bill_id=212332030, amount=228, lifetime=45)
+ print(new_bill.bill_id, new_bill.pay_url)
+ # Проверим статус выставленного счета
+ print((await p2p.check(bill_id=new_bill.bill_id)).status)
+ # Потеряли ссылку на оплату счета? Не проблема!
+ print((await p2p.check(bill_id=245532)).pay_url)
+ # Клиент отменил заказ? Тогда и счет надо закрыть
+ await p2p.reject(bill_id=new_bill.bill_id)
+ # Если не указывать в методе p2p.bill() значение суммы заказа,
+ # будет применяться указанная базовая сумма, которую вы установили
+ new_bill = await p2p.bill(bill_id=6627358)
+ # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически.
+ # Его можно будет посмотреть в объекте ответа Bill
+ # В комбинации со стандартным значением суммы будет вот так
+ new_bill = await p2p.bill()
+ print(new_bill.bill_id, new_bill.pay_url)
+ # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты,
+ # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode
+ fields = {
+ "paySourcesFilter": "qw,card",
+ "themeCode": "MalchikGay",
+ }
+ await p2p.bill(fields=fields)
+ # Либо же воспользоваться удобными полями
+ await p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card])
+ await p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay")
+p2p.run(main())
+# Аналог
+# asyncio.run(main())
+```
+### И всё?
+Нет, не всё. Ещё можно настроить кивишные уведомления на свой сервер,
+для этого придется немного пострадать, но лишь немного.
+**Внимание!** Для работы будет необходим проксирующий сервер (например, Nginx) с доверенным SSL-сертификатом.
+Да. Подробнее про требования к проксирующему серверу в [документации Qiwi](https://developer.qiwi.com/ru/p2p-payments/?shell#notification "Почитай, это полезно")
+А эта шайтан-машина нужна для захендлирования функций на события. Она не готова самостоятельно контактировать с внешним миром. Пожалей её.
+Запросы сервер по умолчанию принимает на 8099 порту, его можно изменить, и только на `/qiwi_notify` - изменить нельзя.
+```python
+from pyqiwip2p.notify import QiwiNotify
+from pyqiwip2p.p2p_types import Bill
+QIWI_PRIV_KEY = "abCdef...xYz"
+qiwi_notify = QiwiNotify(QIWI_PRIV_KEY)
+#
+# Хэндлер принимает в себя аргументом функцию,
+# в которую передаст объект счёта - Bill
+#
+# Добавим хэндлер, который будет печатать billID для всех счетов
+@qiwi_notify.handler(lambda bill: True)
+def print_bill(bill: Bill):
+ print(bill.bill_id)
+# Создадим хэндлер, который будет печатать сумму оплаченных счетов
+@qiwi_notify.handler(lambda bill: bill.status == "PAID")
+def print_bill(bill: Bill):
+ print(bill.amount)
+# Теперь запустим сервер на 12345'ом порту
+qiwi_notify.start(port=12345)
+```
+### И асинхронный сервер, наверное, у вас есть?
+Да есть. Причём хендлить функции можно и асинхронные, и синхронные.
+```python
+from pyqiwip2p import QiwiP2P, AioQiwiP2P
+from pyqiwip2p.p2p_types import Bill
+from pyqiwip2p.notify import AioQiwiNotify
+import asyncio
+QIWI_PRIV_KEY = "abCdef...xYz"
+qiwi_notify = AioQiwiNotify(QIWI_PRIV_KEY)
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY)
+@qiwi_notify.handler(lambda bill: bill.status == "EXPIRED")
+async def on_expired(bill: Bill):
+ new_bill = await p2p.bill(amount=bill.amount, comment=bill.comment)
+ print(new_bill.pay_url)
+@qiwi_notify.handler(lambda bill: True)
+def on_all(bill: Bill):
+ print(bill.status)
+async def main():
+ p = asyncio.get_event_loop()
+ server = p.create_task(qiwi_notify.a_start(port=12345))
+ await server
+loop = asyncio.get_event_loop()
+loop.run_until_complete(main())
+```
+### Настройка проксирующего Nginx
+Для порта 12345 (как в примерах выше) будет:
+```
+server {
+ listen 443;
+ server_name qiwinotify.domain.com;
+ ssl_certificate cert.crt;
+ ssl_certificate_key pkey.key;
+ location /superSecretQiwiURI {
+ proxy_pass http://0.0.0.0:12345/qiwi_notify;
+ }
+}
+```
+В таком случае при генерации ключей API на https://qiwi.com/p2p-admin/transfers/api
+нужно будет указать `https://qiwinotify.domain.com/superSecretQiwiURI` в качестве URL для уведомлений
+**P.S. за неприходящие от Qiwi запросы ответственность не несу, как и за приходящие, кстати, тоже.
+Если запроса от Qiwi не было, то пишите им в поддержку [@qiwi_api_help_bot](https://t.me/qiwi_api_help_bot)**
+
+%package -n python3-pyQiwiP2P
+Summary: pyQiwiP2P
+Provides: python-pyQiwiP2P
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-pyQiwiP2P
+## А как пользоваться
+### Что есть?
+Есть сам класс QiwiP2P, который обладает тремя инструментами:
+для выставления, проверки и закрытия платежа (счёта).
+Пример использования:
+```python
+from pyqiwip2p import QiwiP2P
+from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods
+QIWI_PRIV_KEY = "abCdef...xYz"
+p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY)
+# Выставим счет на сумму 228 рублей который будет работать 45 минут
+new_bill = p2p.bill(bill_id=212332030, amount=228, lifetime=45)
+print(new_bill.bill_id, new_bill.pay_url)
+# Проверим статус выставленного счета
+print(p2p.check(bill_id=new_bill.bill_id).status)
+# Потеряли ссылку на оплату счета? Не проблема!
+print(p2p.check(bill_id=245532).pay_url)
+# Клиент отменил заказ? Тогда и счет надо закрыть
+p2p.reject(bill_id=new_bill.bill_id)
+# Если планируете выставлять счета с одинаковой суммой,
+# можно воспользоваться параметром default_amount
+p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148)
+# Теперь, если не указывать в методе p2p.bill() значение суммы заказа,
+# будет применяться указанная базовая сумма
+new_bill = p2p.bill(bill_id=6627358)
+# А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически.
+# Его можно будет посмотреть в объекте ответа Bill
+# В комбинации со стандартным значением суммы будет вот так
+new_bill = p2p.bill()
+print(new_bill.bill_id, new_bill.pay_url)
+# Чтобы запретить приём платежей через какой-то метод оплаты, например, карты,
+# необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode
+fields = {
+ "paySourcesFilter": "qw,card",
+ "themeCode": "MalchikGay",
+}
+p2p.bill(fields=fields)
+# Либо же воспользоваться удобными полями
+p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card])
+p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay")
+```
+### А асинхронно могёте?
+Могём. Причём примерно так же.
+```python
+from pyqiwip2p import AioQiwiP2P
+from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods
+QIWI_PRIV_KEY = "abCdef...xYz"
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY)
+# Если планируете выставлять счета с одинаковой суммой,
+# можно воспользоваться параметром default_amount
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148)
+async def main():
+ async with p2p:
+ # Выставим счет на сумму 228 рублей который будет работать 45 минут
+ new_bill = await p2p.bill(bill_id=212332030, amount=228, lifetime=45)
+ print(new_bill.bill_id, new_bill.pay_url)
+ # Проверим статус выставленного счета
+ print((await p2p.check(bill_id=new_bill.bill_id)).status)
+ # Потеряли ссылку на оплату счета? Не проблема!
+ print((await p2p.check(bill_id=245532)).pay_url)
+ # Клиент отменил заказ? Тогда и счет надо закрыть
+ await p2p.reject(bill_id=new_bill.bill_id)
+ # Если не указывать в методе p2p.bill() значение суммы заказа,
+ # будет применяться указанная базовая сумма, которую вы установили
+ new_bill = await p2p.bill(bill_id=6627358)
+ # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически.
+ # Его можно будет посмотреть в объекте ответа Bill
+ # В комбинации со стандартным значением суммы будет вот так
+ new_bill = await p2p.bill()
+ print(new_bill.bill_id, new_bill.pay_url)
+ # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты,
+ # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode
+ fields = {
+ "paySourcesFilter": "qw,card",
+ "themeCode": "MalchikGay",
+ }
+ await p2p.bill(fields=fields)
+ # Либо же воспользоваться удобными полями
+ await p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card])
+ await p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay")
+p2p.run(main())
+# Аналог
+# asyncio.run(main())
+```
+### И всё?
+Нет, не всё. Ещё можно настроить кивишные уведомления на свой сервер,
+для этого придется немного пострадать, но лишь немного.
+**Внимание!** Для работы будет необходим проксирующий сервер (например, Nginx) с доверенным SSL-сертификатом.
+Да. Подробнее про требования к проксирующему серверу в [документации Qiwi](https://developer.qiwi.com/ru/p2p-payments/?shell#notification "Почитай, это полезно")
+А эта шайтан-машина нужна для захендлирования функций на события. Она не готова самостоятельно контактировать с внешним миром. Пожалей её.
+Запросы сервер по умолчанию принимает на 8099 порту, его можно изменить, и только на `/qiwi_notify` - изменить нельзя.
+```python
+from pyqiwip2p.notify import QiwiNotify
+from pyqiwip2p.p2p_types import Bill
+QIWI_PRIV_KEY = "abCdef...xYz"
+qiwi_notify = QiwiNotify(QIWI_PRIV_KEY)
+#
+# Хэндлер принимает в себя аргументом функцию,
+# в которую передаст объект счёта - Bill
+#
+# Добавим хэндлер, который будет печатать billID для всех счетов
+@qiwi_notify.handler(lambda bill: True)
+def print_bill(bill: Bill):
+ print(bill.bill_id)
+# Создадим хэндлер, который будет печатать сумму оплаченных счетов
+@qiwi_notify.handler(lambda bill: bill.status == "PAID")
+def print_bill(bill: Bill):
+ print(bill.amount)
+# Теперь запустим сервер на 12345'ом порту
+qiwi_notify.start(port=12345)
+```
+### И асинхронный сервер, наверное, у вас есть?
+Да есть. Причём хендлить функции можно и асинхронные, и синхронные.
+```python
+from pyqiwip2p import QiwiP2P, AioQiwiP2P
+from pyqiwip2p.p2p_types import Bill
+from pyqiwip2p.notify import AioQiwiNotify
+import asyncio
+QIWI_PRIV_KEY = "abCdef...xYz"
+qiwi_notify = AioQiwiNotify(QIWI_PRIV_KEY)
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY)
+@qiwi_notify.handler(lambda bill: bill.status == "EXPIRED")
+async def on_expired(bill: Bill):
+ new_bill = await p2p.bill(amount=bill.amount, comment=bill.comment)
+ print(new_bill.pay_url)
+@qiwi_notify.handler(lambda bill: True)
+def on_all(bill: Bill):
+ print(bill.status)
+async def main():
+ p = asyncio.get_event_loop()
+ server = p.create_task(qiwi_notify.a_start(port=12345))
+ await server
+loop = asyncio.get_event_loop()
+loop.run_until_complete(main())
+```
+### Настройка проксирующего Nginx
+Для порта 12345 (как в примерах выше) будет:
+```
+server {
+ listen 443;
+ server_name qiwinotify.domain.com;
+ ssl_certificate cert.crt;
+ ssl_certificate_key pkey.key;
+ location /superSecretQiwiURI {
+ proxy_pass http://0.0.0.0:12345/qiwi_notify;
+ }
+}
+```
+В таком случае при генерации ключей API на https://qiwi.com/p2p-admin/transfers/api
+нужно будет указать `https://qiwinotify.domain.com/superSecretQiwiURI` в качестве URL для уведомлений
+**P.S. за неприходящие от Qiwi запросы ответственность не несу, как и за приходящие, кстати, тоже.
+Если запроса от Qiwi не было, то пишите им в поддержку [@qiwi_api_help_bot](https://t.me/qiwi_api_help_bot)**
+
+%package help
+Summary: Development documents and examples for pyQiwiP2P
+Provides: python3-pyQiwiP2P-doc
+%description help
+## А как пользоваться
+### Что есть?
+Есть сам класс QiwiP2P, который обладает тремя инструментами:
+для выставления, проверки и закрытия платежа (счёта).
+Пример использования:
+```python
+from pyqiwip2p import QiwiP2P
+from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods
+QIWI_PRIV_KEY = "abCdef...xYz"
+p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY)
+# Выставим счет на сумму 228 рублей который будет работать 45 минут
+new_bill = p2p.bill(bill_id=212332030, amount=228, lifetime=45)
+print(new_bill.bill_id, new_bill.pay_url)
+# Проверим статус выставленного счета
+print(p2p.check(bill_id=new_bill.bill_id).status)
+# Потеряли ссылку на оплату счета? Не проблема!
+print(p2p.check(bill_id=245532).pay_url)
+# Клиент отменил заказ? Тогда и счет надо закрыть
+p2p.reject(bill_id=new_bill.bill_id)
+# Если планируете выставлять счета с одинаковой суммой,
+# можно воспользоваться параметром default_amount
+p2p = QiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148)
+# Теперь, если не указывать в методе p2p.bill() значение суммы заказа,
+# будет применяться указанная базовая сумма
+new_bill = p2p.bill(bill_id=6627358)
+# А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически.
+# Его можно будет посмотреть в объекте ответа Bill
+# В комбинации со стандартным значением суммы будет вот так
+new_bill = p2p.bill()
+print(new_bill.bill_id, new_bill.pay_url)
+# Чтобы запретить приём платежей через какой-то метод оплаты, например, карты,
+# необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode
+fields = {
+ "paySourcesFilter": "qw,card",
+ "themeCode": "MalchikGay",
+}
+p2p.bill(fields=fields)
+# Либо же воспользоваться удобными полями
+p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card])
+p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay")
+```
+### А асинхронно могёте?
+Могём. Причём примерно так же.
+```python
+from pyqiwip2p import AioQiwiP2P
+from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime, PaymentMethods
+QIWI_PRIV_KEY = "abCdef...xYz"
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY)
+# Если планируете выставлять счета с одинаковой суммой,
+# можно воспользоваться параметром default_amount
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY, default_amount=148)
+async def main():
+ async with p2p:
+ # Выставим счет на сумму 228 рублей который будет работать 45 минут
+ new_bill = await p2p.bill(bill_id=212332030, amount=228, lifetime=45)
+ print(new_bill.bill_id, new_bill.pay_url)
+ # Проверим статус выставленного счета
+ print((await p2p.check(bill_id=new_bill.bill_id)).status)
+ # Потеряли ссылку на оплату счета? Не проблема!
+ print((await p2p.check(bill_id=245532)).pay_url)
+ # Клиент отменил заказ? Тогда и счет надо закрыть
+ await p2p.reject(bill_id=new_bill.bill_id)
+ # Если не указывать в методе p2p.bill() значение суммы заказа,
+ # будет применяться указанная базовая сумма, которую вы установили
+ new_bill = await p2p.bill(bill_id=6627358)
+ # А ещё можно не указывать bill_id, тогда значение сгенерируется автоматически.
+ # Его можно будет посмотреть в объекте ответа Bill
+ # В комбинации со стандартным значением суммы будет вот так
+ new_bill = await p2p.bill()
+ print(new_bill.bill_id, new_bill.pay_url)
+ # Чтобы запретить приём платежей через какой-то метод оплаты, например, карты,
+ # необходимо передать paySourcesFilter в fields. Туда же можно передать themeCode
+ fields = {
+ "paySourcesFilter": "qw,card",
+ "themeCode": "MalchikGay",
+ }
+ await p2p.bill(fields=fields)
+ # Либо же воспользоваться удобными полями
+ await p2p.bill(pay_sources=[PaymentMethods.qiwi, PaymentMethods.card])
+ await p2p.bill(pay_sources=[PaymentMethods.qiwi], theme_code="MalchikGay")
+p2p.run(main())
+# Аналог
+# asyncio.run(main())
+```
+### И всё?
+Нет, не всё. Ещё можно настроить кивишные уведомления на свой сервер,
+для этого придется немного пострадать, но лишь немного.
+**Внимание!** Для работы будет необходим проксирующий сервер (например, Nginx) с доверенным SSL-сертификатом.
+Да. Подробнее про требования к проксирующему серверу в [документации Qiwi](https://developer.qiwi.com/ru/p2p-payments/?shell#notification "Почитай, это полезно")
+А эта шайтан-машина нужна для захендлирования функций на события. Она не готова самостоятельно контактировать с внешним миром. Пожалей её.
+Запросы сервер по умолчанию принимает на 8099 порту, его можно изменить, и только на `/qiwi_notify` - изменить нельзя.
+```python
+from pyqiwip2p.notify import QiwiNotify
+from pyqiwip2p.p2p_types import Bill
+QIWI_PRIV_KEY = "abCdef...xYz"
+qiwi_notify = QiwiNotify(QIWI_PRIV_KEY)
+#
+# Хэндлер принимает в себя аргументом функцию,
+# в которую передаст объект счёта - Bill
+#
+# Добавим хэндлер, который будет печатать billID для всех счетов
+@qiwi_notify.handler(lambda bill: True)
+def print_bill(bill: Bill):
+ print(bill.bill_id)
+# Создадим хэндлер, который будет печатать сумму оплаченных счетов
+@qiwi_notify.handler(lambda bill: bill.status == "PAID")
+def print_bill(bill: Bill):
+ print(bill.amount)
+# Теперь запустим сервер на 12345'ом порту
+qiwi_notify.start(port=12345)
+```
+### И асинхронный сервер, наверное, у вас есть?
+Да есть. Причём хендлить функции можно и асинхронные, и синхронные.
+```python
+from pyqiwip2p import QiwiP2P, AioQiwiP2P
+from pyqiwip2p.p2p_types import Bill
+from pyqiwip2p.notify import AioQiwiNotify
+import asyncio
+QIWI_PRIV_KEY = "abCdef...xYz"
+qiwi_notify = AioQiwiNotify(QIWI_PRIV_KEY)
+p2p = AioQiwiP2P(auth_key=QIWI_PRIV_KEY)
+@qiwi_notify.handler(lambda bill: bill.status == "EXPIRED")
+async def on_expired(bill: Bill):
+ new_bill = await p2p.bill(amount=bill.amount, comment=bill.comment)
+ print(new_bill.pay_url)
+@qiwi_notify.handler(lambda bill: True)
+def on_all(bill: Bill):
+ print(bill.status)
+async def main():
+ p = asyncio.get_event_loop()
+ server = p.create_task(qiwi_notify.a_start(port=12345))
+ await server
+loop = asyncio.get_event_loop()
+loop.run_until_complete(main())
+```
+### Настройка проксирующего Nginx
+Для порта 12345 (как в примерах выше) будет:
+```
+server {
+ listen 443;
+ server_name qiwinotify.domain.com;
+ ssl_certificate cert.crt;
+ ssl_certificate_key pkey.key;
+ location /superSecretQiwiURI {
+ proxy_pass http://0.0.0.0:12345/qiwi_notify;
+ }
+}
+```
+В таком случае при генерации ключей API на https://qiwi.com/p2p-admin/transfers/api
+нужно будет указать `https://qiwinotify.domain.com/superSecretQiwiURI` в качестве URL для уведомлений
+**P.S. за неприходящие от Qiwi запросы ответственность не несу, как и за приходящие, кстати, тоже.
+Если запроса от Qiwi не было, то пишите им в поддержку [@qiwi_api_help_bot](https://t.me/qiwi_api_help_bot)**
+
+%prep
+%autosetup -n pyQiwiP2P-2.0.6
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-pyQiwiP2P -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Mon May 15 2023 Python_Bot <Python_Bot@openeuler.org> - 2.0.6-1
+- Package Spec generated