public void PaymentCallBack(FormCollection collection)
        {
            int orderId = _paymentService.GetOrderIdFor(collection);
            GetOrderRequest request = new GetOrderRequest() { OrderId = orderId };

            GetOrderResponse response = _orderService.GetOrder(request);

            OrderPaymentRequest orderPaymentRequest =
                   response.Order.ConvertToOrderPaymentRequest();

            TransactionResult transactionResult =
                   _paymentService.HandleCallBack(orderPaymentRequest, collection);

            if (transactionResult.PaymentOk)
            {
                SetOrderPaymentRequest paymentRequest = new SetOrderPaymentRequest();
                paymentRequest.Amount = transactionResult.Amount;
                paymentRequest.PaymentToken = transactionResult.PaymentToken;
                paymentRequest.PaymentMerchant = transactionResult.PaymentMerchant;
                paymentRequest.OrderId = orderId;

                _orderService.SetOrderPayment(paymentRequest);
            }
            else
            {
                LoggingFactory.GetLogger().Log(String.Format(
                 "Payment not ok for order id {0}, payment token {1}",
                    orderId, transactionResult.PaymentToken));
            }
        }
        public SetOrderPaymentResponse SetOrderPayment(
                                        SetOrderPaymentRequest paymentRequest)
        {
            SetOrderPaymentResponse paymentResponse = new SetOrderPaymentResponse();

            Order order = _orderRepository.FindBy(paymentRequest.OrderId);

            try
            {
                order.SetPayment(
                    PaymentFactory.CreatePayment(paymentRequest.PaymentToken,
                                                 paymentRequest.Amount,
                                                 paymentRequest.PaymentMerchant));

                _orderRepository.Save(order);
                _uow.Commit();
            }
            catch (OrderAlreadyPaidForException ex)
            {
                // Out of scope of case study: 
                // Refund the payment using the payment service.

                LoggingFactory.GetLogger().Log(ex.Message);
            }
            catch (PaymentAmountDoesNotEqualOrderTotalException ex)
            {
                // Out of scope of case study:
                // Refund the payment using the payment service.

                LoggingFactory.GetLogger().Log(ex.Message);
            }

            paymentResponse.Order = order.ConvertToOrderView();

            return paymentResponse;
        }