Esempio n. 1
0
        public static string ToDatatransRequest(this DatatransRefundRequest request)
        {
            var requestXml =
                new XElement("paymentService", new XAttribute("version", request.ServiceVersion),
                             new XElement("body", new XAttribute("merchantId", request.MerchantId),
                                          new XElement("transaction", new XAttribute("refno", request.ReferenceNumber),
                                                       new XElement("request",
                                                                    new XElement("amount", request.Amount),
                                                                    new XElement("currency", request.Currency),
                                                                    new XElement("uppTransactionId", request.TransactionId),
                                                                    new XElement("transtype", request.TransType),
                                                                    new XElement("sign", request.Sign)
                                                                    )
                                                       )
                                          )
                             );

            return(requestXml.ToString());
        }
        public coreModel.DatatransRefundResponse Refund(DatatransRefundRequest request)
        {
            var requestXml = request.ToDatatransRequest();
            var response   = MakeDatatransCall(ProcessEndpoint, requestXml);

            if (!response.ErrorMessage.IsNullOrEmpty())
            {
                return(new DatatransRefundResponse
                {
                    ErrorMessage = response.ErrorMessage
                });
            }

            var datatransRefundResponse = response.ResponseContent.DeserializeXml <RefundResponse.paymentService>();

            var result = datatransRefundResponse.ToCoreModel();

            result.ResponseData = response.ResponseContent;

            return(result);
        }
        public override RefundProcessPaymentResult RefundProcessPayment(RefundProcessPaymentEvaluationContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (context.Payment == null)
            {
                throw new InvalidOperationException(nameof(context.Payment));
            }

            if (context.Order == null)
            {
                throw new InvalidOperationException(nameof(context.Order));
            }

            if (string.IsNullOrEmpty(context.Payment.OuterId))
            {
                throw new InvalidOperationException(nameof(context.Payment.OuterId));
            }

            if (string.IsNullOrEmpty(context.Order.Currency))
            {
                throw new InvalidOperationException(nameof(context.Order.Currency));
            }

            if (string.IsNullOrEmpty(context.Order.Number))
            {
                throw new InvalidOperationException(nameof(context.Payment.OuterId));
            }

            var result = new RefundProcessPaymentResult();

            var payment = context.Payment;

            var request = new DatatransRefundRequest
            {
                TransactionId   = payment.OuterId,
                Amount          = GetNormalizedAmountForRefund(context, payment),
                Currency        = context.Order.Currency,
                MerchantId      = MerchantId,
                ReferenceNumber = context.Order.Number,
                Sign            = GetSignProvider(HMACHex).Sign(MerchantId, GetNormalizedAmountForRefund(context, payment), context.Order.Currency, context.Order.Number)
            };

            var datatransClient = CreateDatatransClient(ServerToServerApi);

            var response = datatransClient.Refund(request);

            var transaction = new PaymentGatewayTransaction();

            payment.Transactions.Add(transaction);

            transaction.ResponseData = response.ResponseData;

            if (!response.ErrorMessage.IsNullOrEmpty())
            {
                transaction.ProcessError = response.ErrorMessage;

                result.ErrorMessage = GetErrorMessage(response.ErrorCode, response.ErrorMessage);
                result.IsSuccess    = false;
                return(result);
            }

            transaction.Amount        = GetAmountForRefund(context, payment);
            transaction.CurrencyCode  = payment.Currency;
            transaction.IsProcessed   = true;
            transaction.Note          = "Datatrans refund";
            transaction.ResponseCode  = response.ResponseCode;
            transaction.Status        = response.ResponseMessage;
            transaction.ProcessedDate = DateTime.Now;

            result.NewPaymentStatus = IsPartialRefund(context.Parameters) ? PaymentStatus.PartiallyRefunded : PaymentStatus.Refunded;
            result.IsSuccess        = true;

            return(result);
        }