Exemple #1
0
        public override async Task <RefundResult> RefundAsync(GatewayRefundPaymentContext refundPaymentContext)
        {
            if (!long.TryParse(refundPaymentContext.TransactionId, out var longTransactionId))
            {
                throw new Exception($"Transaction ID format is not valid. Transaction ID must be Int64. Value: {refundPaymentContext.TransactionId}");
            }

            string webServiceXml = CreateReverseWebService(
                terminalId: Configuration.TerminalId,
                userName: Configuration.UserName,
                userPassword: Configuration.UserPassword,
                orderId: refundPaymentContext.OrderNumber,
                saleOrderId: refundPaymentContext.OrderNumber,
                saleReferenceId: longTransactionId);

            var xmlResult = await WebHelper.SendXmlWebRequestAsync(GetWebServiceUrl(), webServiceXml);

            var result = XmlHelper.GetNodeValueFromXml(xmlResult, "return");

            bool isSuccess = result == "0";

            var status = isSuccess ? RefundResultStatus.Success : RefundResultStatus.Failed;

            IGatewayResultTranslator gatewayResultTranslator = new MellatGatewayResultTranslator();

            var translatedResult = gatewayResultTranslator.Translate(result);

            return(new RefundResult(Gateway.Mellat, refundPaymentContext.Amount, status, translatedResult));
        }
Exemple #2
0
        public override async Task <RefundResult> RefundAsync(GatewayRefundPaymentContext refundPaymentContext)
        {
            string webServiceXml = CreateReverseWebServiceXml(ParsianConfiguration.Pin,
                                                              refundPaymentContext.OrderNumber,
                                                              refundPaymentContext.Amount);

            var result = await WebHelper.SendXmlWebRequestAsync(WebServiceUrl, webServiceXml);

            byte status = Convert.ToByte(XmlHelper.GetNodeValueFromXml(result, "status", "http://tempuri.org/"));

            IGatewayResultTranslator gatewayResultTranslator = new ParsianStatusTranslator();

            var translatedMessage = gatewayResultTranslator.Translate(status);

            var isSuccess = status == 0;

            var reverseResultStatus = isSuccess ? RefundResultStatus.Success : RefundResultStatus.Failed;

            return(new RefundResult(Gateway.Parsian, refundPaymentContext.Amount, reverseResultStatus, translatedMessage));
        }
Exemple #3
0
        public override async Task <RefundResult> RefundAsync(GatewayRefundPaymentContext refundPaymentContext)
        {
            var invoiceDate = refundPaymentContext.AdditionalData;

            var timeStamp = PasargadHelper.GetTimeStamp(DateTime.Now);

            var dataToSign = string.Format("#{0}#{1}#{2}#{3}#{4}#{5}#{6}#",
                                           PasargadConfiguration.MerchantCode,
                                           PasargadConfiguration.TerminalCode,
                                           refundPaymentContext.OrderNumber,
                                           invoiceDate,
                                           refundPaymentContext.Amount,
                                           RefundNumber,
                                           timeStamp);

            var signedData = PasargadHelper.SignData(PasargadConfiguration.PrivateKey, dataToSign);

            var data = "InvoiceNumber=" + refundPaymentContext.OrderNumber +
                       "&InvoiceDate=" + invoiceDate +
                       "&MerchantCode=" + PasargadConfiguration.MerchantCode +
                       "&TerminalCode=" + PasargadConfiguration.TerminalCode +
                       "&Amount=" + refundPaymentContext.Amount +
                       "&action=" + RefundNumber +
                       "&TimeStamp=" + timeStamp +
                       "&Sign=" + signedData;

            var response = await WebHelper.SendWebRequestAsync(RefundPaymentPageUrl, data, "POST", "application/x-www-form-urlencoded");

            var result = XmlHelper.GetNodeValueFromXml(response, "result");

            var resultMessage = XmlHelper.GetNodeValueFromXml(response, "resultMessage");

            var isSuccess = result.Equals("true", StringComparison.InvariantCultureIgnoreCase);

            var status = isSuccess ? RefundResultStatus.Success : RefundResultStatus.Failed;

            return(new RefundResult(Gateway.Pasargad, refundPaymentContext.Amount, status, resultMessage));
        }
Exemple #4
0
        public override async Task <RefundResult> RefundAsync(GatewayRefundPaymentContext refundPaymentContext)
        {
            string reverseXml = CreateReverseWebServiceXml(
                SamanConfiguration.MerchantId,
                SamanConfiguration.Password,
                refundPaymentContext.TransactionId,
                refundPaymentContext.Amount);

            var result = await WebHelper.SendXmlWebRequestAsync(WebServiceUrl, reverseXml);

            result = XmlHelper.GetNodeValueFromXml(result, "result");

            int integerResult = Convert.ToInt32(result);

            IGatewayResultTranslator gatewayResultTranslator = new SamanResultTranslator();

            var translatedMessage = gatewayResultTranslator.Translate(integerResult);

            var isSuccess = integerResult > 0;

            var status = isSuccess ? RefundResultStatus.Success : RefundResultStatus.Failed;

            return(new RefundResult(Gateway.Saman, refundPaymentContext.Amount, status, translatedMessage));
        }
Exemple #5
0
        /// <summary>
        /// Refunds a specific payment by its Order Number.
        /// </summary>
        /// <param name="refundInvoice">RefundInvoice object</param>
        public static async Task <RefundResult> RefundAsync(RefundInvoice refundInvoice)
        {
            if (refundInvoice == null)
            {
                throw new ArgumentNullException(nameof(refundInvoice));
            }

            var paymentData = await SelectPaymentDataByOrderNumberAsync(refundInvoice.OrderNumber);

            if (paymentData == null)
            {
                return(new RefundResult(0, 0, RefundResultStatus.Failed, $"No payment found with order's number: {refundInvoice.OrderNumber}"));
            }

            if (refundInvoice.AmountToRefund > paymentData.Amount)
            {
                return(new RefundResult(0, 0, RefundResultStatus.Failed, $"Amount To Refund cannot be greater than original amount. Original Amount: {paymentData.Amount:N0}. Amount To Refund: {refundInvoice.AmountToRefund:N0}"));
            }

            ThrowExceptionIfGatewayIsNotConfigured(paymentData.Gateway);

            var gateway = GatewayFactory.CreateGateway(paymentData.Gateway);

            var amountToRefund = refundInvoice.AmountToRefund > 0 ? refundInvoice.AmountToRefund : paymentData.Amount;

            var gatewayRefundPaymentContext = new GatewayRefundPaymentContext(paymentData.OrderNumber, amountToRefund, paymentData.ReferenceId, paymentData.TransactionId, paymentData.AdditionalData);

            try
            {
                var refundResult = await gateway.RefundAsync(gatewayRefundPaymentContext);

                //  Log
                TryLog(() => new Log
                {
                    Type          = LogType.Refund,
                    Gateway       = paymentData.Gateway,
                    OrderNumber   = paymentData.OrderNumber,
                    Amount        = paymentData.Amount,
                    Message       = refundResult.Message,
                    CreatedOn     = DateTime.Now,
                    ReferenceId   = paymentData.ReferenceId,
                    TransactionId = paymentData.TransactionId,
                    Status        = refundResult.Status.ToString()
                });

                if (refundResult.IsSuccess())
                {
                    paymentData.Status = PaymentDataStatus.Refunded;

                    await UpdatePaymentDataAsync(paymentData);
                }

                return(refundResult);
            }
            catch (Exception exception)
            {
                //  Log
                TryLog(() => new Log
                {
                    Type          = LogType.Error,
                    Gateway       = paymentData.Gateway,
                    OrderNumber   = paymentData.OrderNumber,
                    Amount        = amountToRefund,
                    Message       = exception.Message,
                    CreatedOn     = DateTime.Now,
                    ReferenceId   = paymentData.ReferenceId,
                    TransactionId = paymentData.TransactionId,
                    Status        = string.Empty
                });

                return(new RefundResult(paymentData.Gateway, 0, RefundResultStatus.Failed, exception.Message));
            }
        }
Exemple #6
0
 public override Task <RefundResult> RefundAsync(GatewayRefundPaymentContext refundPaymentContext)
 {
     return(Task.FromResult(Refund(refundPaymentContext)));
 }
Exemple #7
0
 public override RefundResult Refund(GatewayRefundPaymentContext refundPaymentContext)
 {
     return(new RefundResult(Gateway.Tejarat, 0, RefundResultStatus.Failed, "Gateway Tejarat does not have Refund operation."));
 }
Exemple #8
0
 public override RefundResult Refund(GatewayRefundPaymentContext refundPaymentContext)
 {
     return(new RefundResult(Gateway.ParbadVirtualGateway, refundPaymentContext.Amount, RefundResultStatus.Success, "Transaction refund successfully."));
 }