/// <summary> /// Voids payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Void(Order order, ref CancelPaymentResult cancelPaymentResult) { InitSettings(); string transactionID = cancelPaymentResult.AuthorizationTransactionId; if (String.IsNullOrEmpty(transactionID)) { transactionID = cancelPaymentResult.CaptureTransactionId; } DoVoidReq req = new DoVoidReq(); req.DoVoidRequest = new DoVoidRequestType(); req.DoVoidRequest.Version = this.APIVersion; req.DoVoidRequest.AuthorizationID = transactionID; DoVoidResponseType response = service2.DoVoid(req); string error = string.Empty; bool Success = PaypalHelper.CheckSuccess(response, out error); if (Success) { cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Voided; //cancelPaymentResult.VoidTransactionID = response.RefundTransactionID; } else { cancelPaymentResult.Error = error; } }
/// <summary> /// Refunds payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Refund(Order order, ref CancelPaymentResult cancelPaymentResult) { InitSettings(); string transactionID = cancelPaymentResult.CaptureTransactionId; RefundTransactionReq req = new RefundTransactionReq(); req.RefundTransactionRequest = new RefundTransactionRequestType(); //NOTE: Specify amount in partial refund req.RefundTransactionRequest.RefundType = RefundType.Full; req.RefundTransactionRequest.RefundTypeSpecified = true; req.RefundTransactionRequest.Version = this.APIVersion; req.RefundTransactionRequest.TransactionID = transactionID; RefundTransactionResponseType response = service1.RefundTransaction(req); string error = string.Empty; bool Success = PaypalHelper.CheckSuccess(response, out error); if (Success) { cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Refunded; //cancelPaymentResult.RefundTransactionID = response.RefundTransactionID; } else { cancelPaymentResult.Error = error; } }
public void Void(Order order, ref CancelPaymentResult cancelPaymentResult) { var usaepay = new USAePayAPI.USAePay(); usaepay.SourceKey = sourceKey; usaepay.Pin = pin; try { usaepay.Void(order.AuthorizationTransactionId); switch (usaepay.ResultCode) { case "A": cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Voided; //cancelPaymentResult.AuthorizationTransactionId = usaepay.RefNum; break; case "D": cancelPaymentResult.Error = "Void Declined: " + usaepay.ErrorMesg; cancelPaymentResult.FullError = "Void Declined : " + usaepay.ErrorMesg; break; default: cancelPaymentResult.Error = "Error during void"; cancelPaymentResult.FullError = "Error during void: " + usaepay.ErrorMesg; break; } } catch { cancelPaymentResult.Error = "Error during void"; cancelPaymentResult.FullError = "Error during void"; } }
/// <summary> /// Refunds payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Refund(Order order, ref CancelPaymentResult cancelPaymentResult) { try { using (usaepayService svc = new usaepayService()) { svc.Url = EPaymentFormSettings.ServiceUrl; TransactionResponse rsp = svc.refundTransaction(EPaymentFormHelper.ServiceSecurityToken, cancelPaymentResult.CaptureTransactionId, (double)cancelPaymentResult.Amount); switch (rsp.ResultCode) { case "A": cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Refunded; break; case "D": case "E": default: cancelPaymentResult.Error = rsp.ErrorCode; cancelPaymentResult.FullError = rsp.Error; break; } } } catch (Exception ex) { cancelPaymentResult.Error = ex.Message; cancelPaymentResult.FullError = ex.Message; } }
//This works only on refund to customer (refund what has already been captured...) private void DoRefund(Order order, ref CancelPaymentResult cancelPaymentResult, bool alreadyTriedCancel) { string merchant = IoC.Resolve <ISettingManager>().GetSettingValue(QuickPayConstants.SETTING_MERCHANTID); string protocol = "3"; string capturePostUrl = "https://secure.quickpay.dk/api"; string msgtype = "refund"; string amount = (cancelPaymentResult.Amount * 100).ToString("0", CultureInfo.InvariantCulture); //NOTE: Primary store should be changed to DKK, if you do not have internatinal agreement with pbs and quickpay. Otherwise you need to do currency conversion here. string transaction = order.AuthorizationTransactionId; string md5secret = IoC.Resolve <ISettingManager>().GetSettingValue(QuickPayConstants.SETTING_MD5SECRET); string stringToMd5 = string.Concat(protocol, msgtype, merchant, amount, transaction, md5secret); string querystring = string.Empty; string md5check = GetMD5(stringToMd5); querystring += string.Format("protocol={0}&", protocol); querystring += string.Format("msgtype={0}&", msgtype); querystring += string.Format("merchant={0}&", merchant); querystring += string.Format("amount={0}&", amount); querystring += string.Format("transaction={0}&", transaction); querystring += string.Format("md5check={0}", md5check); string retval = HttpRequestsFunctions.HttpPost(capturePostUrl, querystring); try { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(retval); XmlElement xmlElement = xmlDocument.DocumentElement; string rep_qpstatmsg = xmlElement.SelectSingleNode("qpstatmsg").InnerText; string rep_qpstat = xmlElement.SelectSingleNode("qpstat").InnerText; string rep_transaction = xmlElement.SelectSingleNode("transaction").InnerText; //refund successful if (rep_qpstat == "000") { cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Refunded; } //not allowed in current state. This probably means that it has not been caputered yet. //we therefore try to just cancel, but not refund else if (rep_qpstat == "004" && (!alreadyTriedCancel)) { DoCancel(order, ref cancelPaymentResult, true); } else { cancelPaymentResult.Error = "Quickpay Caputure refund did not succeed, qpstat is:" + rep_qpstat; cancelPaymentResult.FullError = "Quickpay Caputure refund did not succeed, qpstat is:" + rep_qpstat; } } catch (Exception exception) { throw new NopException("XML response for Quickpay Capture was not successfull. Reasons could be that the host did not respond. Below is stacktrace:" + exception.Message + exception.StackTrace + exception.Source, exception.InnerException); } }
/// <summary> /// Voids payment /// </summary> /// <param name="transactionPayment">transactionPayment</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Void(TransactionPayment transactionPayment, ref CancelPaymentResult cancelPaymentResult) { var paymentMethod = GetPaymentMethodById(transactionPayment.PaymentMethodId); if (paymentMethod == null) { throw new Exception("Payment method couldn't be loaded"); } var iPaymentMethod = Activator.CreateInstance(Type.GetType(paymentMethod.ClassName)) as IPaymentMethod; iPaymentMethod.Void(transactionPayment, ref cancelPaymentResult); }
//This only works when a payment have been authorized and not captured. private void DoCancel(Order order, ref CancelPaymentResult cancelPaymentResult, bool alreadyTriedRefund) { string merchant = IoC.Resolve <ISettingManager>().GetSettingValue(QuickPayConstants.SETTING_MERCHANTID); string protocol = "3"; string capturePostUrl = "https://secure.quickpay.dk/api"; string msgtype = "cancel"; string transaction = order.AuthorizationTransactionId; string md5secret = IoC.Resolve <ISettingManager>().GetSettingValue(QuickPayConstants.SETTING_MD5SECRET); string stringToMd5 = string.Concat(protocol, msgtype, merchant, transaction, md5secret); string querystring = string.Empty; string md5check = GetMD5(stringToMd5); querystring += string.Format("protocol={0}&", protocol); querystring += string.Format("msgtype={0}&", msgtype); querystring += string.Format("merchant={0}&", merchant); querystring += string.Format("transaction={0}&", transaction); querystring += string.Format("md5check={0}", md5check); string retval = HttpRequestsFunctions.HttpPost(capturePostUrl, querystring); try { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(retval); XmlElement xmlElement = xmlDocument.DocumentElement; string rep_qpstatmsg = xmlElement.SelectSingleNode("qpstatmsg").InnerText; string rep_qpstat = xmlElement.SelectSingleNode("qpstat").InnerText; string rep_transaction = xmlElement.SelectSingleNode("transaction").InnerText; //refund successful if (rep_qpstat == "000") { cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Refunded; } else if (rep_qpstat == "004" && (!alreadyTriedRefund)) { DoRefund(order, ref cancelPaymentResult, true); } else { cancelPaymentResult.Error = "Quickpay Cancel did not succeed, qpstat is:" + rep_qpstat; cancelPaymentResult.FullError = "Quickpay Cancel did not succeed, qpstat is:" + rep_qpstat; } } catch (Exception exception) { throw new NopException("XML response for Quickpay Capture was not successfull. Reasons could be that the host did not respond. Below is stacktrace:" + exception.Message + exception.StackTrace + exception.Source, exception.InnerException); } }
public async Task <CancelPaymentResult> CancelRequest(CancelPaymentRequest request) { string merchantId = request.BankParameters["merchantId"]; string terminalId = request.BankParameters["terminalId"]; var xmlBuilder = new StringBuilder(); xmlBuilder.Append($@"<?xml version=""1.0"" encoding=""utf-8""?> <posnetRequest> <mid>{merchantId}</mid> <tid>{terminalId}</tid> <reverse> <transaction>sale</transaction> <hostLogKey>{request.ReferenceNumber.Split('-').First().Trim()}</hostLogKey>"); //taksitli işlemde 6 haneli auth kodu isteniyor if (request.Installment > 0) { xmlBuilder.Append($"<authCode>{request.ReferenceNumber.Split('-').Last().Trim()}</authCode>"); } xmlBuilder.Append(@"</reverse> </posnetRequest>"); var httpParameters = new Dictionary <string, string>(); httpParameters.Add("xmldata", xmlBuilder.ToString()); var response = await client.PostAsync(request.BankParameters["verifyUrl"], new FormUrlEncodedContent(httpParameters)); string responseContent = await response.Content.ReadAsStringAsync(); var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(responseContent); if (xmlDocument.SelectSingleNode("posnetResponse/approved") == null || xmlDocument.SelectSingleNode("posnetResponse/approved").InnerText != "1") { string errorMessage = xmlDocument.SelectSingleNode("posnetResponse/respText")?.InnerText ?? string.Empty; if (string.IsNullOrEmpty(errorMessage)) { errorMessage = "Bankadan hata mesajı alınamadı."; } return(CancelPaymentResult.Failed(errorMessage)); } var transactionId = xmlDocument.SelectSingleNode("posnetResponse/hostlogkey")?.InnerText; return(CancelPaymentResult.Successed(transactionId, transactionId)); }
public async Task <CancelPaymentResult> CancelRequest(CancelPaymentRequest request) { string clientId = request.BankParameters["clientId"]; string userName = request.BankParameters["cancelUsername"]; string password = request.BankParameters["cancelUserPassword"]; string requestXml = $@"<?xml version=""1.0"" encoding=""utf-8""?> <CC5Request> <Name>{userName}</Name> <Password>{password}</Password> <ClientId>{clientId}</ClientId> <Type>Void</Type> <OrderId>{request.OrderNumber}</OrderId> </CC5Request>"; var response = await client.PostAsync(request.BankParameters["verifyUrl"], new StringContent(requestXml, Encoding.UTF8, "text/xml")); string responseContent = await response.Content.ReadAsStringAsync(); var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(responseContent); if (xmlDocument.SelectSingleNode("CC5Response/Response") == null || xmlDocument.SelectSingleNode("CC5Response/Response").InnerText != "Approved") { var errorMessage = xmlDocument.SelectSingleNode("CC5Response/ErrMsg")?.InnerText ?? string.Empty; if (string.IsNullOrEmpty(errorMessage)) { errorMessage = "Bankadan hata mesajı alınamadı."; } return(CancelPaymentResult.Failed(errorMessage)); } if (xmlDocument.SelectSingleNode("CC5Response/ProcReturnCode") == null || xmlDocument.SelectSingleNode("CC5Response/ProcReturnCode").InnerText != "00") { var errorMessage = xmlDocument.SelectSingleNode("CC5Response/ErrMsg")?.InnerText ?? string.Empty; if (string.IsNullOrEmpty(errorMessage)) { errorMessage = "Bankadan hata mesajı alınamadı."; } return(CancelPaymentResult.Failed(errorMessage)); } var transactionId = xmlDocument.SelectSingleNode("CC5Response/TransId")?.InnerText ?? string.Empty; return(CancelPaymentResult.Successed(transactionId, transactionId)); }
/// <summary> /// Cancels recurring payment /// </summary> /// <param name="transactionPayment">transactionPayment</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void CancelRecurringPayment(TransactionPayment transactionPayment, ref CancelPaymentResult cancelPaymentResult) { if (transactionPayment.TransactionPaymentTotal == decimal.Zero) { return; } var paymentMethod = GetPaymentMethodById(transactionPayment.PaymentMethodId); if (paymentMethod == null) { throw new Exception("Payment method couldn't be loaded"); } var iPaymentMethod = Activator.CreateInstance(Type.GetType(paymentMethod.ClassName)) as IPaymentMethod; iPaymentMethod.CancelRecurringPayment(transactionPayment, ref cancelPaymentResult); }
/// <summary> /// Cancel payment based on the given Token. /// </summary> /// <param name="apiKey">Divider [ApiKey]</param> /// <param name="token">Payment token</param> /// <returns>A boolean value representing if cancel process is successful or not.</returns> public CancelPaymentResult CancelPayment(string apiKey, string token) { apiKey.CheckArgumentIsNull(nameof(apiKey)); token.CheckArgumentIsNull(nameof(token)); var client = new HttpRestClient <string, bool>(_httpClient, ENDPOINT_CancelPayment); client.WithApiKey(apiKey); try { var result = client.PostJson(token); return(CancelPaymentResult.Ok(result)); } catch (Exception ex) { return(CancelPaymentResult.Failed(ex)); } }
public async Task <CancelPaymentResult> CancelRequest(CancelPaymentRequest request) { string mbrId = request.BankParameters["mbrId"]; //Mağaza numarası string merchantId = request.BankParameters["merchantId"]; //Mağaza numarası string userCode = request.BankParameters["userCode"]; // string userPass = request.BankParameters["userPass"]; //Mağaza anahtarı string txnType = request.BankParameters["txnType"]; //İşlem tipi string secureType = request.BankParameters["secureType"]; string requestXml = $@"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes""?> <PayforIptal> <MbrId>{mbrId}</MbrId> <MerchantID>{merchantId}</MerchantID> <UserCode>{userCode}</UserCode> <UserPass>{userPass}</UserPass> <OrgOrderId>{request.OrderNumber}</OrgOrderId> <SecureType>NonSecure</SecureType> <TxnType>Void</TxnType> <Currency>{request.CurrencyIsoCode}</Currency> <Lang>{request.LanguageIsoCode.ToUpper()}</Lang> </PayforIptal>"; var response = await client.PostAsync(request.BankParameters["verifyUrl"], new StringContent(requestXml, Encoding.UTF8, "text/xml")); string responseContent = await response.Content.ReadAsStringAsync(); var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(responseContent); //TODO Finansbank response //if (xmlDocument.SelectSingleNode("VposResponse/ResultCode") == null || // xmlDocument.SelectSingleNode("VposResponse/ResultCode").InnerText != "0000") //{ // string errorMessage = xmlDocument.SelectSingleNode("VposResponse/ResultDetail")?.InnerText ?? string.Empty; // if (string.IsNullOrEmpty(errorMessage)) // errorMessage = "Bankadan hata mesajı alınamadı."; // return CancelPaymentResult.Failed(errorMessage); //} var transactionId = xmlDocument.SelectSingleNode("VposResponse/TransactionId")?.InnerText; return(CancelPaymentResult.Successed(transactionId, transactionId)); }
/// <summary> /// Cancels recurring payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void CancelRecurringPayment(Order order, ref CancelPaymentResult cancelPaymentResult) { InitSettings(); MerchantAuthenticationType authentication = PopulateMerchantAuthentication(); long subscriptionID = 0; long.TryParse(cancelPaymentResult.SubscriptionTransactionId, out subscriptionID); ARBCancelSubscriptionResponseType response = webService.ARBCancelSubscription(authentication, subscriptionID); if (response.resultCode == MessageTypeEnum.Ok) { //ok } else { cancelPaymentResult.Error = "Error cancelling subscription, please contact customer support. " + GetErrors(response); cancelPaymentResult.FullError = "Error cancelling subscription, please contact customer support. " + GetErrors(response); } }
public void Refund(Order order, ref CancelPaymentResult cancelPaymentResult) { XmlTransaction sxml = new XmlTransaction(XmlPaymentSettings.TestMode ? XmlTransaction.MODE_TEST : XmlTransaction.MODE_LIVE, SecurePaySettings.MerchantId, SecurePaySettings.MerchantPassword, ID); bool success = false; string code = ""; success = sxml.processRefund(cancelPaymentResult.Amount, order.OrderGuid.ToString(), cancelPaymentResult.CaptureTransactionId); code = sxml["response_code"]; if (!success) { cancelPaymentResult.Error = String.Format("Declined ({0})", code); cancelPaymentResult.FullError = sxml.Error; } else { cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Refunded; } }
public async Task <CancelPaymentResult> CancelRequest(CancelPaymentRequest request) { string merchantId = request.BankParameters["merchantId"]; string merchantPassword = request.BankParameters["merchantPassword"]; string requestXml = $@"<VposRequest> <MerchantId>{merchantId}</MerchantId> <Password>{merchantPassword}</Password> <TransactionType>Cancel</TransactionType> <ReferenceTransactionId>{request.TransactionId}</ReferenceTransactionId> <ClientIp>{_httpContextAccessor.HttpContext.Connection.RemoteIpAddress}</ClientIp> </VposRequest>"; var parameters = new Dictionary <string, string>(); parameters.Add("prmstr", requestXml); var response = await client.PostAsync(request.BankParameters["verifyUrl"], new FormUrlEncodedContent(parameters)); string responseContent = await response.Content.ReadAsStringAsync(); var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(responseContent); if (xmlDocument.SelectSingleNode("VposResponse/ResultCode") == null || xmlDocument.SelectSingleNode("VposResponse/ResultCode").InnerText != "0000") { string errorMessage = xmlDocument.SelectSingleNode("VposResponse/ResultDetail")?.InnerText ?? string.Empty; if (string.IsNullOrEmpty(errorMessage)) { errorMessage = "Bankadan hata mesajı alınamadı."; } return(CancelPaymentResult.Failed(errorMessage)); } var transactionId = xmlDocument.SelectSingleNode("VposResponse/TransactionId")?.InnerText; return(CancelPaymentResult.Successed(transactionId)); }
public async Task <CancelPaymentResult> CancelRequest(CancelPaymentRequest request) { string shopCode = request.BankParameters["shopCode"]; string userCode = request.BankParameters["cancelUserCode"]; string userPass = request.BankParameters["cancelUserPass"]; var formBuilder = new StringBuilder(); formBuilder.AppendFormat("ShopCode={0}&", shopCode); formBuilder.AppendFormat("PurchAmount={0}&", request.TotalAmount.ToString(new CultureInfo("en-US"))); formBuilder.AppendFormat("Currency={0}&", request.CurrencyIsoCode); formBuilder.Append("OrderId=&"); formBuilder.Append("TxnType=Void&"); formBuilder.AppendFormat("orgOrderId={0}&", request.OrderNumber); formBuilder.AppendFormat("UserCode={0}&", userCode); formBuilder.AppendFormat("UserPass={0}&", userPass); formBuilder.Append("SecureType=NonSecure&"); formBuilder.AppendFormat("Lang={0}&", request.LanguageIsoCode.ToUpper()); formBuilder.Append("MOTO=0"); var response = await client.PostAsync(request.BankParameters["verifyUrl"], new StringContent(formBuilder.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded")); string responseContent = await response.Content.ReadAsStringAsync(); if (string.IsNullOrEmpty(responseContent)) { return(CancelPaymentResult.Failed("İptal işlemi başarısız.")); } responseContent = responseContent.Replace(";;", ";").Replace(";", "&"); var responseParams = HttpUtility.ParseQueryString(responseContent); if (responseParams["ProcReturnCode"] != "00") { return(CancelPaymentResult.Failed(responseParams["ErrorMessage"])); } return(CancelPaymentResult.Successed(responseParams["TransId"], responseParams["TransId"])); }
/// <summary> /// Voids paymen /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Void(Order order, ref CancelPaymentResult cancelPaymentResult) { try { using (usaepayService svc = new usaepayService()) { svc.Url = EPaymentFormSettings.ServiceUrl; if (svc.voidTransaction(EPaymentFormHelper.ServiceSecurityToken, cancelPaymentResult.AuthorizationTransactionId)) { cancelPaymentResult.PaymentStatus = PaymentStatusEnum.Voided; } else { cancelPaymentResult.Error = "Failed"; cancelPaymentResult.FullError = "Failed"; } } } catch (Exception ex) { cancelPaymentResult.Error = ex.Message; cancelPaymentResult.FullError = ex.Message; } }
/// <summary> /// Refunds payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Refund(Order order, ref CancelPaymentResult cancelPaymentResult) { DoRefund(order, ref cancelPaymentResult, false); }
/// <summary> /// Cancels recurring payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void CancelRecurringPayment(Order order, ref CancelPaymentResult cancelPaymentResult) { throw new NotImplementedException(); }
/// <summary> /// Voids payment /// </summary> /// <param name="transactionPayment">transactionPayment</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Void(TransactionPayment transactionPayment, ref CancelPaymentResult cancelPaymentResult) { throw new Exception("Void method not supported"); }
public void Void(Order order, ref CancelPaymentResult cancelPaymentResult) { throw new NotImplementedException(); }
/// <summary> /// Cancels recurring payment /// </summary> /// <param name="transactionPayment">transactionPayment</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void CancelRecurringPayment(TransactionPayment transactionPayment, ref CancelPaymentResult cancelPaymentResult) { }
/// <summary> /// Voids payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void Void(Order order, ref CancelPaymentResult cancelPaymentResult) { throw new NopException("Void method not supported"); }
/// <summary> /// Cancels recurring payment /// </summary> /// <param name="order">Order</param> /// <param name="cancelPaymentResult">Cancel payment result</param> public void CancelRecurringPayment(Order order, ref CancelPaymentResult cancelPaymentResult) { }
public async Task <CancelPaymentResult> CancelRequest(CancelPaymentRequest request) { string terminalUserId = request.BankParameters["terminalUserId"]; string terminalId = request.BankParameters["terminalId"]; string terminalMerchantId = request.BankParameters["terminalMerchantId"]; string cancelUserId = request.BankParameters["cancelUserId"]; string cancelUserPassword = request.BankParameters["cancelUserPassword"]; string mode = request.BankParameters["mode"];//PROD | TEST //garanti tarafından terminal numarasını 9 haneye tamamlamak için başına sıfır eklenmesi isteniyor. string _terminalid = string.Format("{0:000000000}", int.Parse(terminalId)); //garanti bankasında tutar bilgisinde nokta, virgül gibi değerler istenmiyor. 1.10 TL'lik işlem 110 olarak gönderilmeli. Yani tutarı 100 ile çarpabiliriz. string amount = (request.TotalAmount * 100m).ToString("N");//virgülden sonraki sıfırlara gerek yok //provizyon şifresi ve 9 haneli terminal numarasının birleşimi ile bir hash oluşturuluyor string securityData = GetSHA1($"{cancelUserPassword}{_terminalid}"); //ilgili veriler birleştirilip hash oluşturuluyor string hashstr = GetSHA1($"{request.OrderNumber}{terminalId}{amount}{securityData}"); string requestXml = $@"<?xml version=""1.0"" encoding=""utf-8""?> <GVPSRequest> <Mode>{mode}</Mode> <Version>v0.01</Version> <ChannelCode></ChannelCode> <Terminal> <ProvUserID>{cancelUserId}</ProvUserID> <HashData>{hashstr}</HashData> <UserID>{terminalUserId}</UserID> <ID>{terminalId}</ID> <MerchantID>{terminalMerchantId}</MerchantID> </Terminal> <Customer> <IPAddress>{request.CustomerIpAddress}</IPAddress> <EmailAddress></EmailAddress> </Customer> <Order> <OrderID>{request.OrderNumber}</OrderID> <GroupID></GroupID> </Order> <Transaction> <Type>void</Type> <InstallmentCnt>{request.Installment}</InstallmentCnt> <Amount>{amount}</Amount> <CurrencyCode>{request.CurrencyIsoCode}</CurrencyCode> <CardholderPresentCode>0</CardholderPresentCode> <MotoInd>N</MotoInd> <OriginalRetrefNum>{request.ReferenceNumber}</OriginalRetrefNum> </Transaction> </GVPSRequest>"; var response = await client.PostAsync(request.BankParameters["verifyUrl"], new StringContent(requestXml, Encoding.UTF8, "text/xml")); string responseContent = await response.Content.ReadAsStringAsync(); var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(responseContent); if (xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ReasonCode") == null || xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ReasonCode").InnerText != "00" || xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ReasonCode").InnerText != "0000") { string errorMessage = xmlDocument.SelectSingleNode("GVPSResponse/Transaction/Response/ErrorMsg")?.InnerText ?? string.Empty; if (string.IsNullOrEmpty(errorMessage)) { errorMessage = "Bankadan hata mesajı alınamadı."; } return(CancelPaymentResult.Failed(errorMessage)); } string transactionId = xmlDocument.SelectSingleNode("GVPSResponse/Transaction/RetrefNum")?.InnerText; return(CancelPaymentResult.Successed(transactionId, transactionId)); }