def get_online_url(self, payment_id: str, url_type: LinkType = LinkType.EXTERNAL_LINK):
if url_type == LinkType.INTERNAL_LINK:
return self.app_online_url.replace('{id}', payment_id)
payment, tenant = self._get_payment_and_tenant(payment_id=payment_id)
payload = self._get_creation_request(payment)
logger.debug(
f'Event {payment.id} from application {payment.remote_id}: Sending creation request with data {payload}',
)
response = requests.post(url=self.payment_url, json=payload, allow_redirects=False)
if response.status_code != status.HTTP_302_FOUND:
error = response.json()
logger.error(f'An error occurred: {error["title"]}: {error["detail"]}')
raise PagopaException(f'An error occurred: {error["title"]}: {error["detail"]}')
payment = payment.update_time('links.online_payment_begin.last_opened_at')
payment = payment.update_time('updated_at')
return response.headers['Location'], json.loads(payment.json())
def _get_creation_request(self, payment: Payment):
logger.debug(f'Event {payment.id} from application {payment.remote_id}: Prepare payload for creation request')
_, tenant = self._get_payment_and_tenant(payment_id=str(payment.id))
landing_url = self.get_landing_url(payment_id=str(payment.id), url_type=LinkType.INTERNAL_LINK)
payload = {
'emailNotice': payment.payer.email,
'paymentNotices': [
{
'noticeNumber': payment.payment.notice_code,
'fiscalCode': tenant['tax_identification_number'],
'amount': payment.payment.amount * 100,
'companyName': tenant['company_name'],
'description': payment.reason,
},
],
'returnUrls': {
'returnOkUrl': f'{landing_url}?status=OK',
'returnCancelUrl': f'{landing_url}?status=KO',
'returnErrorUrl': f'{landing_url}?status=KO',
},
}
return payload