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)
Example #2
0
    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)
Example #4
0
    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)
            )
Example #6
0
    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)
Example #7
0
    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