public IHttpActionResult PaymentCallback([FromBody] PaymentCallbackDto callback, int orderGroupId)
        {
            if (!string.IsNullOrWhiteSpace(callback?.PaymentOrder?.Id?.ToString()))
            {
                var purchaseOrder = _checkoutService.GetOrCreatePurchaseOrder(orderGroupId, callback.PaymentOrder.Id.OriginalString);
                if (purchaseOrder == null)
                {
                    return(new StatusCodeResult(HttpStatusCode.NotFound, this));
                }

                var purchaseOrderContainsPaymentTransaction = purchaseOrder.Forms.SelectMany(x => x.Payments)
                                                              .Any(p => p.ProviderTransactionID == callback.Transaction.Number.ToString());

                if (!purchaseOrderContainsPaymentTransaction)
                {
                    var paymentOrder = _swedbankPayCheckoutService.GetPaymentOrder(purchaseOrder, PaymentOrderExpand.All);
                    var transaction  = paymentOrder.PaymentOrderResponse.CurrentPayment.Payment.Transactions.TransactionList
                                       .FirstOrDefault(x => x.Number == callback.Transaction.Number.ToString());

                    var swedbankPayCheckoutPaymentMethodDto = _paymentManager.GetPaymentMethodBySystemName(Constants.SwedbankPayCheckoutSystemKeyword, paymentOrder.PaymentOrderResponse.Language.TwoLetterISOLanguageName);
                    var paymentMethod = swedbankPayCheckoutPaymentMethodDto?.PaymentMethod?.FirstOrDefault();
                    if (paymentMethod != null && transaction != null)
                    {
                        if (paymentOrder.PaymentOrderResponse.CurrentPayment.Payment.Instrument == PaymentInstrument.Invoice &&
                            transaction.Type == TransactionType.Authorization)
                        {
                            //Already added a authorization transaction for Invoice when creating payment.
                            return(Ok());
                        }

                        var payment = purchaseOrder.CreatePayment(_orderGroupFactory);
                        payment.PaymentType           = PaymentType.Other;
                        payment.PaymentMethodId       = paymentMethod.PaymentMethodId;
                        payment.PaymentMethodName     = Constants.SwedbankPayCheckoutSystemKeyword;
                        payment.TransactionType       = transaction.Type.ConvertToEpiTransactionType().ToString();
                        payment.ProviderTransactionID = transaction.Number;
                        payment.Amount = transaction.Amount.Value / (decimal)100;
                        payment.Status = PaymentStatus.Processed.ToString();
                        purchaseOrder.AddPayment(payment);
                        _orderRepository.Save(purchaseOrder);
                    }
                }

                return(Ok());
            }

            return(new StatusCodeResult(HttpStatusCode.Accepted, this));
        }
Ejemplo n.º 2
0
        protected PaymentMethodBase(LocalizationService localizationService,
                                    IOrderGroupFactory orderGroupFactory,
                                    LanguageService languageService,
                                    IPaymentManagerFacade paymentManager)
        {
            LocalizationService = localizationService;
            OrderGroupFactory   = orderGroupFactory;

            if (!string.IsNullOrEmpty(SystemKeyword))
            {
                var currentLanguage = languageService.GetCurrentLanguage().TwoLetterISOLanguageName;
                var dto             = paymentManager.GetPaymentMethodBySystemName(SystemKeyword, currentLanguage);
                var paymentMethod   = dto?.PaymentMethod?.FirstOrDefault();
                if (paymentMethod != null)
                {
                    PaymentMethodId = paymentMethod.PaymentMethodId;
                    Name            = paymentMethod.Name;
                    Description     = paymentMethod.Description;
                }
            }
        }