90 lines
3.3 KiB
Python
90 lines
3.3 KiB
Python
|
# Qiwi module v1.00
|
|||
|
# 21/08/2020
|
|||
|
# https://t.me/ssleg © 2020
|
|||
|
|
|||
|
import requests
|
|||
|
import logging
|
|||
|
|
|||
|
headers = {
|
|||
|
'accept': 'application/json',
|
|||
|
'content-type': 'application/json',
|
|||
|
'Authorization': 'Bearer xxxxxx' # ваш секретный ключ из личного кабинета
|
|||
|
}
|
|||
|
|
|||
|
url = 'https://api.qiwi.com/partner/bill/v1/bills/'
|
|||
|
|
|||
|
|
|||
|
# создание платежа. на входе; сумма (число), номер заказа (текст, идет в комментарий к платежу)
|
|||
|
# номер счета (текст, любой уникальный счетчик) и str(datetime) формата 2020-08-21 10:34:22
|
|||
|
# на выходе возвращает URL формы оплаты для клиента.
|
|||
|
def create_bill(summa, order_num, bill_num, exp_datetime):
|
|||
|
am = {'currency': 'RUB', 'value': '{:.2f}'.format(summa)}
|
|||
|
exp = exp_datetime.replace(' ', 'T') + '+03:00'
|
|||
|
# персональная форма платежа, может не использоваться
|
|||
|
# cust = {'themeCode': 'ваш код формы из личного кабинета'}
|
|||
|
|
|||
|
rdata = {'amount': am, 'expirationDateTime': exp, 'comment': order_num} # , 'customFields': cust}
|
|||
|
rurl = url + bill_num
|
|||
|
|
|||
|
try:
|
|||
|
response = requests.put(rurl, json=rdata, headers=headers, timeout=5)
|
|||
|
cod = response.status_code
|
|||
|
res = response.json()
|
|||
|
if cod == 200:
|
|||
|
return res.get('payUrl')
|
|||
|
else:
|
|||
|
levent = 'qiwi server error (create bill). code - ' + str(cod) + ', response - ' + str(res)
|
|||
|
logging.error(levent)
|
|||
|
return 'error'
|
|||
|
|
|||
|
except Exception as e:
|
|||
|
levent = 'protocol error (create bill): ' + str(e)
|
|||
|
logging.error(levent)
|
|||
|
return 'error'
|
|||
|
|
|||
|
|
|||
|
# проверка статуса платежа,на входе его номер (текст), на выходе статус из документации.
|
|||
|
# можно вызывать 1 раз в секунду и реже.
|
|||
|
def bill_status(bill_num):
|
|||
|
rurl = url + bill_num
|
|||
|
|
|||
|
try:
|
|||
|
response = requests.get(rurl, headers=headers, timeout=5)
|
|||
|
cod = response.status_code
|
|||
|
res = response.json()
|
|||
|
if cod == 200:
|
|||
|
status = res.get('status')
|
|||
|
return status.get('value')
|
|||
|
else:
|
|||
|
levent = 'qiwi server error (bill status). code - ' + str(cod) + ', response - ' + str(res)
|
|||
|
logging.error(levent)
|
|||
|
return 'error'
|
|||
|
|
|||
|
except Exception as e:
|
|||
|
levent = 'protocol error (bill status): ' + str(e)
|
|||
|
logging.error(levent)
|
|||
|
return 'error'
|
|||
|
|
|||
|
|
|||
|
# отмена счета, на входе его номер (текст).
|
|||
|
# в случае успеха возвращает REJECTED
|
|||
|
def cancel_bill(bill_num):
|
|||
|
rurl = url + bill_num + '/reject'
|
|||
|
|
|||
|
try:
|
|||
|
response = requests.post(rurl, headers=headers, timeout=5)
|
|||
|
cod = response.status_code
|
|||
|
res = response.json()
|
|||
|
if cod == 200:
|
|||
|
status = res.get('status')
|
|||
|
return status.get('value')
|
|||
|
else:
|
|||
|
levent = 'qiwi server error (cancel bill). code - ' + str(cod) + ', response - ' + str(res)
|
|||
|
logging.error(levent)
|
|||
|
return 'error'
|
|||
|
|
|||
|
except Exception as e:
|
|||
|
levent = 'protocol error (cancel bill): ' + str(e)
|
|||
|
logging.error(levent)
|
|||
|
return 'error'
|