public function processPaypalIPNMessage($orderId, array $parameters)
    {
        /**
         * Retrieving the order object.
         */
        $order = $this
            ->paymentBridge
            ->findOrder($orderId);

        if (!$order) {
            throw new PaymentOrderNotFoundException(sprintf(
                    'Order #%s not found', $orderId)
            );
        }

        $this
            ->paymentBridge
            ->setOrder($order);

        /**
         * Check that we receive the mandatory parameters.
         */
        $this->checkResultParameters($parameters);

        /**
         * Initializing PaypalWebCheckoutMethod, which is
         * an object representation of the payment information
         * coming from the payment processor.
         */
        $paypalMethod = $this
            ->paymentMethodFactory
            ->create(
                $parameters['mc_gross'],
                $parameters['payment_status'],
                $parameters['notify_version'],
                $parameters['payer_status'],
                $parameters['business'],
                null,
                $parameters['verify_sign'],
                $parameters['payer_email'],
                $parameters['txn_id'],
                $parameters['payment_type'],
                $parameters['receiver_email'],
                null,
                $parameters['txn_type'],
                null,
                $parameters['mc_currency'],
                null,
                $parameters['test_ipn'],
                $parameters['ipn_track_id']
            );

        /**
         * Notifying payment.done, which means that the
         * payment has been received, although we still
         * do not know if it is succesful or not.
         * Listening fot this event is useful when one
         * wants to record transaction informations.
         */
        $this
            ->paymentEventDispatcher
            ->notifyPaymentOrderDone(
                $this->paymentBridge,
                $paypalMethod
            );

        /**
         * Check if the transaction is successful.
         */
        if (!$this->transactionSuccessful($parameters)) {
            $this
                ->paymentEventDispatcher
                ->notifyPaymentOrderFail(
                    $this->paymentBridge,
                    $paypalMethod
                );

            throw new PaymentException();
        }

        /**
         * Payment paid successfully.
         *
         * Paid process has ended successfully
         */
        $this
            ->paymentEventDispatcher
            ->notifyPaymentOrderSuccess(
                $this->paymentBridge,
                $paypalMethod
            );
    }