You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.7 KiB
104 lines
3.7 KiB
from django.conf import settings
|
|
import xml.etree.ElementTree as ET
|
|
from kkb.kkb_sign import KKBSign
|
|
from django.template.loader import render_to_string
|
|
import base64
|
|
|
|
|
|
class Result:
|
|
def __init__(self, **entries):
|
|
self.__dict__.update(entries)
|
|
|
|
|
|
def xml2dict(xml):
|
|
root = ET.fromstring(xml)
|
|
bank = root.find('bank')
|
|
customer = bank.find('customer')
|
|
merchant = customer.find('merchant')
|
|
order = merchant.find('order')
|
|
department = order.find('department')
|
|
merchant_sign = customer.find('merchant_sign')
|
|
customer_sign = bank.find('customer_sign')
|
|
results = bank.find('results')
|
|
payment = results.find('payment')
|
|
bank_sign = root.find('bank_sign')
|
|
result = {
|
|
'BANK_NAME': bank.get('name'),
|
|
'CUSTOMER_NAME': customer.get('name'),
|
|
'CUSTOMER_MAIL': customer.get('mail'),
|
|
'CUSTOMER_PHONE': customer.get('phone'),
|
|
'MERCHANT_CERT_ID': merchant.get('cert_id'),
|
|
'MERCHANT_NAME': merchant.get('name'),
|
|
'ORDER_ID': order.get('order_id'),
|
|
'ORDER_AMOUNT': order.get('amount'),
|
|
'ORDER_CURRENCY': order.get('currency'),
|
|
'DEPARTMENT_MERCHANT_ID': department.get('merchant_id'),
|
|
'DEPARTMENT_AMOUNT': department.get('amount'),
|
|
'MERCHANT_SIGN_TYPE': merchant_sign.get('type'),
|
|
'CUSTOMER_SIGN_TYPE': customer_sign.get('type'),
|
|
'RESULTS_TIMESTAMP': results.get('timestamp'),
|
|
'PAYMENT_MERCHANT_ID': payment.get('merchant_id'),
|
|
'PAYMENT_AMOUNT': payment.get('amount'),
|
|
'PAYMENT_REFERENCE': payment.get('reference'),
|
|
'PAYMENT_APPROVAL_CODE': payment.get('approval_code'),
|
|
'PAYMENT_RESPONSE_CODE': payment.get('response_code'),
|
|
'BANK_SIGN_CERT_ID': bank_sign.get('cert_id'),
|
|
'BANK_SIGN_TYPE': bank_sign.get('type'),
|
|
}
|
|
result['LETTER'] = letter = '<bank ' + xml.split('<bank ')[1].split('</bank>')[0] + '</bank>'
|
|
result['SIGN'] = ET.tostring(bank_sign)
|
|
result['RAWSIGN'] = bank_sign.text
|
|
return result
|
|
|
|
|
|
def postlink_process(response=""):
|
|
args = {
|
|
'status': False,
|
|
'message': "",
|
|
}
|
|
result = Result(**args)
|
|
try:
|
|
root = ET.fromstring(response)
|
|
except Exception as e:
|
|
result.message = "xml file not parsable"
|
|
return result
|
|
if root.find('error'):
|
|
result.message = root.find('error').text
|
|
return result
|
|
if root.tag == 'document':
|
|
kkbSign = KKBSign()
|
|
data = xml2dict(response)
|
|
check = kkbSign.check(data['RAWSIGN'], data['LETTER'])
|
|
if "Verified OK" in check:
|
|
result.status = True
|
|
result.data = data
|
|
result.message = check
|
|
else:
|
|
result.message = check
|
|
else:
|
|
result.message = "[XML_DOCUMENT_UNKNOWN_TYPE]"
|
|
return result
|
|
|
|
|
|
def get_context(order_id, amount='0', currency_id='398', b64=True):
|
|
context = {
|
|
'ORDER_ID': int(order_id),
|
|
'CURRENCY': currency_id,
|
|
'AMOUNT': float(amount),
|
|
'MERCHANT_CERTIFICATE_ID': settings.MERCHANT_CERTIFICATE_ID,
|
|
'MERCHANT_NAME': settings.MERCHANT_NAME,
|
|
'MERCHANT_ID': settings.MERCHANT_ID,
|
|
}
|
|
kkbSign = KKBSign()
|
|
try:
|
|
rendered = render_to_string(settings.XML_TEMPLATE_FN, context)
|
|
except Exception as e:
|
|
return "Error reading XML template."
|
|
result_sign = "".join(['<merchant_sign type="RSA" cert_id="', settings.MERCHANT_CERTIFICATE_ID, '">',
|
|
kkbSign.sign64(rendered).decode('utf-8'), '</merchant_sign>'])
|
|
xml = "".join(["<document>", rendered, result_sign, "</document>"])
|
|
if b64:
|
|
return base64.b64encode(xml.encode('ascii')).decode('utf-8')
|
|
# return "".join(base64.b64encode(xml.encode('utf-8')).split("\n"))
|
|
else:
|
|
return xml
|
|
|