def get_govuk_capture_time(self, govuk_payment): response = requests.get( get_link_by_rel(govuk_payment, 'events'), headers=govuk_headers(), timeout=15 ) if response.status_code != 200: raise RequestException('Status code not 200', response=response) try: data = response.json() for event in data['events']: if event['state']['status'] == 'success': return parse_datetime(event['updated']) except (ValueError, KeyError): raise RequestException('Cannot parse response', response=response)
def create_govuk_payment(self, payment_ref, new_govuk_payment): govuk_response = requests.post(govuk_url('/payments'), headers=govuk_headers(), json=new_govuk_payment, timeout=15) try: if govuk_response.status_code != 201: raise ValueError('Status code not 201') govuk_data = govuk_response.json() payment_update = {'processor_id': govuk_data['payment_id']} self.update_payment(payment_ref, payment_update) return govuk_data except (KeyError, ValueError): logger.exception( 'Failed to create new GOV.UK payment for MTP payment %s. Received: %s' % (payment_ref, govuk_response.content))
def get_govuk_payment(self, govuk_id): response = requests.get( govuk_url('/payments/%s' % govuk_id), headers=govuk_headers(), timeout=15 ) if response.status_code != 200: raise RequestException('Status code not 200', response=response) try: data = response.json() try: validate_email(data.get('email')) except ValidationError: data['email'] = None return data except (ValueError, KeyError): raise RequestException('Cannot parse response', response=response)
def get_govuk_payment(self, govuk_id): response = requests.get(govuk_url('/payments/%s' % govuk_id), headers=govuk_headers(), timeout=15) if response.status_code != 200: if response.status_code == 404: return None raise RequestException('Unexpected status code: %s' % response.status_code, response=response) try: data = response.json() try: validate_email(data.get('email')) except ValidationError: data['email'] = None return data except (ValueError, KeyError): raise RequestException('Cannot parse response', response=response)
def create_govuk_payment(self, payment_ref, new_govuk_payment): govuk_response = requests.post( govuk_url('/payments'), headers=govuk_headers(), json=new_govuk_payment, timeout=15 ) try: if govuk_response.status_code != 201: raise ValueError('Status code not 201') govuk_data = govuk_response.json() payment_update = { 'processor_id': govuk_data['payment_id'] } self.update_payment(payment_ref, payment_update) return govuk_data except (KeyError, ValueError): logger.exception( 'Failed to create new GOV.UK payment for MTP payment %s. Received: %s' % (payment_ref, govuk_response.content) )
def get_govuk_payment_events(self, govuk_id): """ :return: list with events information about a certain govuk payment. :param govuk_id: id of the govuk payment :raise HTTPError: if GOV.UK Pay returns a 4xx or 5xx response :raise RequestException: if the response body cannot be parsed """ response = requests.get( govuk_url(f'/payments/{govuk_id}/events'), headers=govuk_headers(), timeout=15, ) response.raise_for_status() try: data = response.json() return data['events'] except (ValueError, KeyError): raise RequestException('Cannot parse response', response=response)
def cancel_govuk_payment(self, govuk_payment): """ Cancels a payment in status 'capturable'. :raise HTTPError: if GOV.UK Pay returns a 4xx or 5xx response """ govuk_status = GovUkPaymentStatus.get_from_govuk_payment(govuk_payment) if govuk_status is None or govuk_status.finished(): return govuk_status govuk_id = govuk_payment['payment_id'] response = requests.post( govuk_url(f'/payments/{govuk_id}/cancel'), headers=govuk_headers(), timeout=15, ) response.raise_for_status() govuk_status = GovUkPaymentStatus.cancelled govuk_payment['state']['status'] = govuk_status.name return govuk_status