# -*- coding: utf-8 -*-
from .constants import INITIALIZATION_XML
from .constants import LOGO_1_TEMPLATE
from .constants import LOGO_2_TEMPLATE
from .constants import LOGO_WRAPPER_TEMPLATE
from .constants import MESSAGE_1_TEMPLATE
from .constants import MESSAGE_2_TEMPLATE
from .constants import MESSAGE_3_TEMPLATE
from .constants import MESSAGE_4_TEMPLATE
from .constants import MESSAGE_PAYMENT_DESCRIPTION
from .constants import MESSAGE_PAYMENT_TITLE
from .constants import PDF_XSLT_TEMPLATE
from .constants import PRESENTATION_XML
from .constants import PROTOCOL_DATA_XML
from .exceptions import InvalidCPRValue
from .exceptions import InvalidFormatValue
from .exceptions import InvalidRegistration
from .utils import _build_payment_code_notebook_60
from .utils import _calculate_payment_identification_notebook_60
from .utils import _calculate_reference_number_with_control_digits_notebook_60
from .utils import _parse_initialization_response
import requests
[docs]def make_payment_request(
cpr, sender, format, suffix, reference_number, payment_limit_date, quantity,
language, return_url, payment_modes=['01', '02'], test_environment=False, extra={}):
"""This method creates an XML file and creates a payment request on the
Government platform in order to have the basis to be shown to the end
user.
According to the payment platform specs, after the registration, an HTML
file is created which must be shown to the user. This HTML file has an
"auto-refresh" feature which allows to redirect the user to the payment
platform, where all the data of the payment is already entered.
There, the enduser only has to select the bank of his choice to complete
the payment.
After completing the payment the user will be redirected to the
`return_url`.
See the documentation for more information about the parameters
"""
if test_environment:
from .constants import TEST_ENVIRON_INITIALIZATION_URL as INITIALIZATION_URL # noqa
from .constants import TEST_ENVIRON_SERVICE_URL as SERVICE_URL
else:
from .constants import PROD_ENVIRON_INITIALIZATION_URL as INITIALIZATION_URL # noqa
from .constants import PROD_ENVIRON_SERVICE_URL as SERVICE_URL
if cpr != '9052180':
raise InvalidCPRValue('We only accept payments with CPR 9052180')
if format != '521':
raise InvalidFormatValue('We only accept payments with Format 521')
payment_identification = _calculate_payment_identification_notebook_60(
payment_limit_date, suffix
)
reference_number_with_control_digits = _calculate_reference_number_with_control_digits_notebook_60( # noqa
sender,
reference_number,
payment_identification,
quantity,
)
payment_code = _build_payment_code_notebook_60(
sender, reference_number, payment_identification, quantity)
# Message overrides
message_1 = ''
if 'message_1' in extra:
message_1 = MESSAGE_1_TEMPLATE.format(
es=extra.get('message_1').get('es', ''),
eu=extra.get('message_1').get('eu', ''),
)
message_2 = ''
if 'message_2' in extra:
message_2 = MESSAGE_2_TEMPLATE.format(
es=extra.get('message_2').get('es', ''),
eu=extra.get('message_2').get('eu', ''),
)
message_3 = ''
if 'message_3' in extra:
message_3 = MESSAGE_3_TEMPLATE.format(
es=extra.get('message_3').get('es', ''),
eu=extra.get('message_3').get('eu', ''),
)
message_4 = ''
if 'message_4' in extra:
message_4 = MESSAGE_4_TEMPLATE.format(
es=extra.get('message_4').get('es', ''),
eu=extra.get('message_4').get('eu', ''),
)
message_payment_title = ''
if 'message_payment_title' in extra:
message_payment_title = MESSAGE_PAYMENT_TITLE.format(
es=extra.get('message_payment_title').get('es', ''),
eu=extra.get('message_payment_title').get('eu', ''),
)
mipago_payment_description = ''
if 'mipago_payment_description' in extra:
mipago_payment_description = MESSAGE_PAYMENT_DESCRIPTION.format(
es=extra.get('mipago_payment_description').get('es', ''),
eu=extra.get('mipago_payment_description').get('eu', ''),
)
logo_urls = ''
if 'logo_1_url' in extra:
logo_urls += LOGO_1_TEMPLATE.format(
url=extra.get('logo_1_url', '')
)
if 'logo_2_url' in extra:
logo_urls += LOGO_2_TEMPLATE.format(
url=extra.get('logo_2_url', '')
)
if logo_urls:
logo_urls = LOGO_WRAPPER_TEMPLATE.format(
data=logo_urls,
)
pdf_xslt_url = ''
if 'pdf_xslt_url' in extra:
pdf_xslt_url = PDF_XSLT_TEMPLATE.format(
url=extra.get('pdf_xslt_url', '')
)
initialization_xml = INITIALIZATION_XML.format(
code=payment_code,
cpr=cpr,
suffix=suffix,
quantity=quantity,
payment_identification=payment_identification,
end_date=payment_limit_date.strftime('%d%m%y'),
format=format,
sender=sender,
reference_with_control=reference_number_with_control_digits,
reference=reference_number,
message_1=message_1,
message_2=message_2,
message_3=message_3,
message_4=message_4,
message_payment_title=message_payment_title,
mipago_payment_description=mipago_payment_description,
citizen_name=extra.get('citizen_name', ''),
citizen_surname_1=extra.get('citizen_surname_1', ''),
citizen_surname_2=extra.get('citizen_surname_2', ''),
citizen_city=extra.get('citizen_city', ''),
citizen_nif=extra.get('citizen_nif', ''),
citizen_address=extra.get('citizen_address', ''),
citizen_postal_code=extra.get('citizen_postal_code', ''),
citizen_territory=extra.get('citizen_territory', ''),
citizen_country=extra.get('citizen_country', ''),
citizen_phone=extra.get('citizen_phone', ''),
citizen_email=extra.get('citizen_email', ''),
logo_urls=logo_urls,
pdf_xslt_url=pdf_xslt_url,
)
response = requests.post(
INITIALIZATION_URL,
data={'xmlRPC': initialization_xml}
)
registered_payment_id, error = _parse_initialization_response(response.content) # noqa
if registered_payment_id is not None:
payment_mode_string = ''
for payment_mode in payment_modes:
payment_mode_string += "<paymentMode oid='{}'/>".format(payment_mode) # noqa
presentation_request_data = PRESENTATION_XML.format(
language=language,
payment_mode=payment_mode_string
)
protocol_data = PROTOCOL_DATA_XML.format(
return_url=return_url
)
response = requests.post(
SERVICE_URL,
data={
'p12iOidsPago': registered_payment_id,
'p12iPresentationRequestData': presentation_request_data,
'p12iProtocolData': protocol_data
}
)
return response.text, registered_payment_id
raise InvalidRegistration(error)