public override bool Process(IPayment payment, IOrderForm orderForm, IOrderGroup orderGroup, IShipment shipment, ref string message) { if (payment.TransactionType == TransactionType.Void.ToString()) { try { var orderId = orderGroup.Properties[Common.Constants.KlarnaOrderIdField]?.ToString(); if (!string.IsNullOrEmpty(orderId)) { KlarnaOrderService.CancelOrder(orderId); payment.Status = PaymentStatus.Processed.ToString(); AddNoteAndSaveChanges(orderGroup, payment.TransactionType, "Order cancelled at Klarna"); return(true); } } catch (Exception ex) when(ex is ApiException || ex is WebException) { var exceptionMessage = GetExceptionMessage(ex); payment.Status = PaymentStatus.Failed.ToString(); message = exceptionMessage; AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Error occurred {exceptionMessage}"); Logger.Error(exceptionMessage, ex); return(false); } } else if (Successor != null) { return(Successor.Process(payment, orderForm, orderGroup, shipment, ref message)); } return(false); }
/// <summary> /// When an order needs to be captured the cartridge needs to make an API Call /// POST /ordermanagement/v1/orders/{order_id}/captures for the amount which needs to be captured. /// If it's a partial capture the API call will be the same just for the /// amount that should be captured. Many captures can be made up to the whole amount authorized. /// The shipment information can be added in this call or amended aftewards using the method /// "Add shipping info to a capture". /// The amount captured never can be greater than the authorized. /// When an order is Partally Captured the status of the order in Klarna is PART_CAPTURED /// </summary> public override bool Process(IPayment payment, IOrderForm orderForm, IOrderGroup orderGroup, IShipment shipment, ref string message) { if (payment.TransactionType == TransactionType.Capture.ToString()) { var amount = AmountHelper.GetAmount(payment.Amount); var orderId = orderGroup.Properties[Common.Constants.KlarnaOrderIdField]?.ToString(); if (!string.IsNullOrEmpty(orderId)) { try { var captureData = KlarnaOrderService.CaptureOrder(orderId, amount, "Capture the payment", orderGroup, orderForm, payment, shipment); AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Captured {payment.Amount}, id {captureData.CaptureId}"); } catch (Exception ex) when(ex is ApiException || ex is WebException) { var exceptionMessage = GetExceptionMessage(ex); payment.Status = PaymentStatus.Failed.ToString(); message = exceptionMessage; AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Error occurred {exceptionMessage}"); Logger.Error(exceptionMessage, ex); return(false); } } return(true); } else if (Successor != null) { return(Successor.Process(payment, orderForm, orderGroup, shipment, ref message)); } return(false); }
public override async Task <PaymentStepResult> Process(IPayment payment, IOrderForm orderForm, IOrderGroup orderGroup, IShipment shipment) { var paymentStepResult = new PaymentStepResult(); if (payment.TransactionType == TransactionType.Credit.ToString()) { try { var orderId = orderGroup.Properties[Common.Constants.KlarnaOrderIdField]?.ToString(); if (!string.IsNullOrEmpty(orderId)) { var purchaseOrder = orderGroup as IPurchaseOrder; if (purchaseOrder != null) { var returnForm = purchaseOrder.ReturnForms.FirstOrDefault(x => ((OrderForm)x).Status == ReturnFormStatus.Complete.ToString() && ((OrderForm)x).ObjectState == MetaObjectState.Modified); if (returnForm != null) { await KlarnaOrderService.Refund(orderId, orderGroup, (OrderForm)returnForm, payment).ConfigureAwait(false); } } payment.Status = PaymentStatus.Processed.ToString(); AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Refunded {payment.Amount}"); paymentStepResult.Status = true; } } catch (Exception ex) when(ex is ApiException || ex is WebException || ex is AggregateException) { var exceptionMessage = GetExceptionMessage(ex); payment.Status = PaymentStatus.Failed.ToString(); AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Error occurred {exceptionMessage}"); Logger.Error(exceptionMessage, ex); paymentStepResult.Message = exceptionMessage; } } else if (Successor != null) { return(await Successor.Process(payment, orderForm, orderGroup, shipment).ConfigureAwait(false)); } return(paymentStepResult); }
public override bool ProcessAuthorization(IPayment payment, IOrderGroup orderGroup, ref string message) { var orderId = orderGroup.Properties[Constants.KlarnaCheckoutOrderIdCartField]?.ToString(); try { var result = Task .Run(() => KlarnaOrderService.GetOrder(orderId)) .Result; if (result != null) { payment.Properties[Common.Constants.FraudStatusPaymentField] = result.FraudStatus; AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Fraud status: {result.FraudStatus}"); if (result.FraudStatus == FraudStatus.REJECTED) { message = "Klarna fraud status rejected"; payment.Status = PaymentStatus.Failed.ToString(); } else { return(true); } } AddNoteAndSaveChanges(orderGroup, payment.TransactionType, "Authorize completed"); } catch (Exception ex) when(ex is ApiException || ex is WebException) { var exceptionMessage = GetExceptionMessage(ex); payment.Status = PaymentStatus.Failed.ToString(); message = exceptionMessage; AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Error occurred {exceptionMessage}"); Logger.Error(exceptionMessage, ex); return(false); } return(true); }
public override async Task<PaymentStepResult> ProcessAuthorization(IPayment payment, IOrderGroup orderGroup) { var paymentStepResult = new PaymentStepResult(); var orderId = orderGroup.Properties[Constants.KlarnaCheckoutOrderIdCartField]?.ToString(); try { var result = await KlarnaOrderService.GetOrder(orderId).ConfigureAwait(false); if (result != null) { payment.Properties[Common.Constants.FraudStatusPaymentField] = result.FraudStatus; AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Fraud status: {result.FraudStatus}"); if (result.FraudStatus == OrderManagementFraudStatus.REJECTED) { paymentStepResult.Message = "Klarna fraud status rejected"; payment.Status = PaymentStatus.Failed.ToString(); } else { paymentStepResult.Status = true; } } AddNoteAndSaveChanges(orderGroup, payment.TransactionType, "Authorize completed"); } catch (Exception ex) when (ex is ApiException || ex is WebException || ex is AggregateException) { var exceptionMessage = GetExceptionMessage(ex); payment.Status = PaymentStatus.Failed.ToString(); paymentStepResult.Message = exceptionMessage; AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Error occurred {exceptionMessage}"); Logger.Error(exceptionMessage, ex); } return paymentStepResult; }
public override async Task <PaymentStepResult> Process(IPayment payment, IOrderForm orderForm, IOrderGroup orderGroup, IShipment shipment) { var paymentStepResult = new PaymentStepResult(); if (payment.TransactionType == KlarnaAdditionalTransactionType.ReleaseRemainingAuthorization.ToString()) { try { var orderId = orderGroup.Properties[Common.Constants.KlarnaOrderIdField]?.ToString(); if (!string.IsNullOrEmpty(orderId)) { await KlarnaOrderService.ReleaseRemainingAuthorization(orderId).ConfigureAwait(false); payment.Status = PaymentStatus.Processed.ToString(); AddNoteAndSaveChanges(orderGroup, payment.TransactionType, "Released remaining authorization at Klarna"); paymentStepResult.Status = true; } } catch (Exception ex) when(ex is ApiException || ex is WebException || ex is AggregateException) { var exceptionMessage = GetExceptionMessage(ex); payment.Status = PaymentStatus.Failed.ToString(); paymentStepResult.Message = exceptionMessage; AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Error occurred {exceptionMessage}"); Logger.Error(exceptionMessage, ex); } } else if (Successor != null) { return(await Successor.Process(payment, orderForm, orderGroup, shipment).ConfigureAwait(false)); } return(paymentStepResult); }