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)); }
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)); }
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)); }
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)); }
/// <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)); } }
public override Task <RefundResult> RefundAsync(GatewayRefundPaymentContext refundPaymentContext) { return(Task.FromResult(Refund(refundPaymentContext))); }
public override RefundResult Refund(GatewayRefundPaymentContext refundPaymentContext) { return(new RefundResult(Gateway.Tejarat, 0, RefundResultStatus.Failed, "Gateway Tejarat does not have Refund operation.")); }
public override RefundResult Refund(GatewayRefundPaymentContext refundPaymentContext) { return(new RefundResult(Gateway.ParbadVirtualGateway, refundPaymentContext.Amount, RefundResultStatus.Success, "Transaction refund successfully.")); }