public ActivateReservationResponse Activate(global::Nop.Core.Domain.Orders.Order order)
        {
            var reservation = order.AuthorizationTransactionId;

            if (!string.IsNullOrEmpty(order.CaptureTransactionId))
            {
                throw new KlarnaCheckoutException("The payment has already been captured. Order Id: " + order.Id);
            }

            try
            {
                var configuration = new Configuration(Country.Code.SE, Language.Code.SV, Currency.Code.SEK, Encoding.Sweden)
                {
                    Eid        = _klarnaSettings.EId,
                    Secret     = _klarnaSettings.SharedSecret,
                    IsLiveMode = !_klarnaSettings.TestMode
                };

                var api = new Api(configuration);
                return(api.Activate(reservation));
            }
            catch (Exception ex)
            {
                throw new KlarnaCheckoutException("Error activating Klarna reservation for order " + order.Id, ex);
            }
        }
        public void Acknowledge(global::Nop.Core.Domain.Orders.Order order)
        {
            try
            {
                var entity      = _klarnaRepository.Table.First(x => x.OrderGuid == order.OrderGuid);
                var resourceUri = new Uri(entity.KlarnaResourceUri);
                var apiOrder    = Fetch(resourceUri);
                var klarnaOrder = KlarnaCheckoutOrder.FromApiOrder(apiOrder);

                if (klarnaOrder.Status == KlarnaCheckoutOrder.StatusCheckoutComplete)
                {
                    var updateData = new KlarnaCheckoutOrder
                    {
                        Status            = KlarnaCheckoutOrder.StatusCreated,
                        MerchantReference = new MerchantReference
                        {
                            OrderId1 = order.Id.ToString(CultureInfo.InvariantCulture),
                            OrderId2 = order.OrderGuid.ToString()
                        }
                    };

                    var dictData = updateData.ToDictionary();

                    apiOrder.Update(dictData);

                    order.AuthorizationTransactionId = klarnaOrder.Reservation;
                    _orderService.UpdateOrder(order);
                }
            }
            catch (Exception ex)
            {
                throw new KlarnaCheckoutException("Error acknowledging Klarna order. Order Id: " + order.Id, ex);
            }
        }
        public void FullRefund(global::Nop.Core.Domain.Orders.Order order)
        {
            try
            {
                var configuration = new Klarna.Api.Configuration(Country.Code.SE,
                                                                 Language.Code.SV, Currency.Code.SEK, Encoding.Sweden)
                {
                    Eid        = _klarnaSettings.EId,
                    Secret     = _klarnaSettings.SharedSecret,
                    IsLiveMode = !_klarnaSettings.TestMode
                };

                var api    = new Api(configuration);
                var result = api.CreditInvoice(order.CaptureTransactionId);

                _logger.Information(string.Format(CultureInfo.InvariantCulture, "KlarnaCheckout: Order refunded. InvoiceNumber: {0}, AppliedTo: {1}",
                                                  result, result), customer: order.Customer);

                order.OrderNotes.Add(new OrderNote
                {
                    Note = string.Format(CultureInfo.CurrentCulture, "KlarnaCheckout: Order has been refunded. Invoice Number: {0}; Refund applied to: {1}",
                                         order.CaptureTransactionId, result),
                    CreatedOnUtc      = DateTime.UtcNow,
                    DisplayToCustomer = false
                });
                _orderService.UpdateOrder(order);
            }
            catch (Exception ex)
            {
                throw new KlarnaCheckoutException("An error occurred when refunding order " + order.Id, ex);
            }
        }