/// <summary>
        /// Determines if the API operation was successful
        /// </summary>
        /// <param name="message">The XML response string.</param>
        /// <param name="paymentMethod">The payment method.</param>
        /// <returns>The call status</returns>
        private bool ValidateApiCall(string message, PaymentMethod paymentMethod)
        {
            string md5Secret = paymentMethod.DynamicProperty <string>().Md5secret;

            string md5ResponseString = "";
            string md5Check          = "";

            var responseElement = XDocument.Parse(message).Element("response");

            if (responseElement == null)
            {
                return(false);
            }

            // Concat all elements for MD5 check to
            // validate the returned response.
            // Make sure to exclude to sent MD5 value.
            md5ResponseString = responseElement.Descendants()
                                .Where(x => x.Name.ToString() != "md5check")
                                .Select(x => x.Value)
                                .Aggregate((a, b) => a + b);

            md5Check = responseElement.Element("md5check").Value;

            string status = responseElement.Element("qpstat").Value;

            string md5CheckResponse = QuickpayMd5Computer.GetMd5KeyFromResponseValueString(md5ResponseString, md5Secret);

            return(status.Equals("000") &&
                   !String.IsNullOrEmpty(md5Check) &&
                   !String.IsNullOrEmpty(md5CheckResponse) &&
                   md5Check.Equals(md5CheckResponse));
        }
        /// <summary>
        /// Refunds the payment from the payment provider. This is often used when you need to call external services to handle the refund process.
        /// </summary>
        /// <param name="payment">The payment.</param>
        /// <param name="status">The status.</param>
        /// <returns></returns>
        protected override bool RefundPaymentInternal(Payment payment, out string status)
        {
            string merchant  = payment.PaymentMethod.DynamicProperty <string>().Merchant.ToString();
            string apiKey    = payment.PaymentMethod.DynamicProperty <string>().ApiKey.ToString();
            string md5Secret = payment.PaymentMethod.DynamicProperty <string>().Md5secret.ToString();

            var postValues = GetDefaultPostValues(payment.PaymentMethod);

            postValues.Add("msgtype", "refund");
            postValues.Add("amount", payment.Amount.ToCents().ToString());
            postValues.Add("transaction", payment.TransactionId);
            postValues.Add("md5check", QuickpayMd5Computer.GetRefundPreMd5Key(PROTOCOL, payment.Amount.ToCents().ToString(), payment.TransactionId, merchant, apiKey, md5Secret));

            var httpPost = new HttpPost(API_ENDPOINT_URL, postValues);

            string postResponse = httpPost.GetString();
            bool   callStatus   = ValidateApiCall(postResponse, payment.PaymentMethod);

            if (callStatus)
            {
                status = PaymentMessages.RefundSuccess + " >> " + postResponse;
            }
            else
            {
                status = String.Format("{0} >> {1} >> {2}", PaymentMessages.RefundFailed, GetCallStatusMessage(postResponse), postResponse);
            }

            return(callStatus);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="QuickpayPageBuilder"/> class.
 /// </summary>
 public QuickpayPageBuilder(QuickpayMd5Computer md5Computer, IAbsoluteUrlService absoluteUrlService, ICallbackUrl callbackUrl)
 {
     _absoluteUrlService = absoluteUrlService;
     _callbackUrl        = callbackUrl;
     LocalizationContext = new CustomGlobalization();
     Md5Computer         = md5Computer;
 }
        private bool ValidateCallback(PaymentMethod paymentMethod)
        {
            string md5Secret = paymentMethod.DynamicProperty <string>().Md5secret;

            string[] requestFieldNames =
            {
                "msgtype",
                "ordernumber",
                "amount",
                "currency",
                "time",
                "state",
                "qpstat",
                "qpstatmsg",
                "chstat",
                "chstatmsg",
                "merchant",
                "merchantemail",
                "transaction",
                "cardtype",
                "cardnumber",
                "cardexpire",
                "splitpayment",
                "fraudprobability",
                "fraudremarks",
                "fraudreport",
                "fee"
            };

            var sb = new StringBuilder();

            foreach (string field in requestFieldNames)
            {
                sb.Append(HttpContext.Current.Request[field]);
            }

            string md5Response    = QuickpayMd5Computer.GetMd5KeyFromResponseValueString(sb.ToString(), md5Secret);
            string md5Check       = HttpContext.Current.Request["md5check"];
            string quickPayStatus = HttpContext.Current.Request["qpstat"];

            return(quickPayStatus.Equals("000") && md5Response.Equals(md5Check));
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="QuickpayPaymentMethodService"/> class.
 /// </summary>
 public QuickpayPaymentMethodService(QuickpayPageBuilder pageBuilder, QuickpayMd5Computer md5Computer, IWebRuntimeInspector webRuntimeInspector)
 {
     _webRuntimeInspector = webRuntimeInspector;
     QuickpayMd5Computer  = md5Computer;
     PageBuilder          = pageBuilder;
 }