· 7 years ago · Sep 09, 2018, 01:50 PM
1# -*- coding: UTF-8 -*-
2
3import base64
4import hmac
5import hashlib
6
7import httplib
8import urllib
9
10import re
11
12import pytz
13
14pattern_epayidn = re.compile(r"^IDN=(?P<idn>\d+)$")
15
16def parse_idn(response_body):
17
18 idn = None
19 if response_body:
20 match = pattern_epayidn.search(response_body)
21
22 if match:
23 idn = match.group("idn")
24
25 return idn
26
27def epay_datetime(datetime, timezone):
28
29 if (datetime.tzinfo is None) or (datetime.tzinfo.utcoffset(datetime) is None):
30 datetime = pytz.timezone(timezone).localize(datetime)
31
32 return datetime.astimezone(pytz.timezone('Europe/Sofia'))
33
34def request(trader_id, secret_key, invoice_number, expiration_datetime, amount, description = "", currency = 'BGN', timezone = 'Europe/Sofia'):
35
36 params = list()
37 params.append(u"MIN={0}".format(trader_id))
38 params.append(u"INVOICE={0}".format(invoice_number))
39 params.append(u"AMOUNT={0:.2f}".format(amount))
40 params.append(u"CURRENCY={0}".format(currency))
41 params.append(u"EXP_TIME={0}".format(epay_datetime(expiration_datetime, timezone).strftime("%d.%m.%Y %H:%M:%S")))
42 params.append(u"DESCR={0}".format(description[:100]))
43 params.append(u"ENCODING={0}".format("cp1251"))
44
45 encoded = base64.b64encode(u"\n".join(params).encode("cp1251"))
46
47 request_params = {
48 "ENCODED": encoded,
49 "CHECKSUM": hmac.new(secret_key.encode("ascii"), encoded, hashlib.sha1).hexdigest()
50 }
51
52 connection = httplib.HTTPSConnection("devep2.datamax.bg")
53 connection.request("GET", "/ep2/epay2_demo/ezp/reg_bill.cgi?{0}".format(urllib.urlencode(request_params)))
54 response = connection.getresponse()
55 response_body = response.read()
56 connection.close()
57
58 response_idn = None
59 if (response.status == 200) and (response.reason == "OK"):
60 response_idn = parse_idn(response_body)
61
62 return response_idn, (response.status, response.reason, response_body)