Beispiel #1
0
        public static Uri UriWithAdditionalParams(Uri uri, Dictionary <string, string> newParameters)
        {
            Dictionary <string, string> parameters;

            if (String.IsNullOrEmpty(uri.Query))
            {
                parameters = newParameters;
            }
            else
            {
                // extract existing query string parameters
                parameters = ChargeUtils.ParseQueryString(uri.Query);

                // add new parameters -- new parameters will overwrite old ones if key already exists
                foreach (var param in newParameters)
                {
                    parameters[param.Key] = param.Value;
                }
            }

            if (parameters.Count == 0)
            {
                // no parameters = no query string.
                return(uri);
            }

            // loop through parameters to generate param list
            List <string> paramList = new List <string>();

            foreach (var param in parameters)
            {
                if (param.Value != null)
                {
                    paramList.Add(
                        String.Format(
                            CultureInfo.InvariantCulture,
                            "{0}={1}",
                            Uri.EscapeDataString(param.Key),
                            Uri.EscapeDataString(param.Value)
                            )
                        );
                }
            }

            // join param list with & and prefix it with ?
            string queryString = String.Join("&", paramList);

            queryString = String.Format(CultureInfo.InvariantCulture, "?{0}", queryString);

            String uriString = null;

            if (uri.IsDefaultPort)
            {
                uriString = String.Format(
                    CultureInfo.InvariantCulture,
                    "{0}://{1}{2}{3}",
                    uri.Scheme,
                    uri.Host,
                    uri.AbsolutePath,
                    queryString);
            }
            else
            {
                uriString = String.Format(
                    CultureInfo.InvariantCulture,
                    "{0}://{1}:{2}{3}{4}",
                    uri.Scheme,
                    uri.Host,
                    uri.Port,
                    uri.AbsolutePath,
                    queryString);
            }

            return(new Uri(uriString));
        }
        public ChargeResponse(Uri responseUri)
        {
            if (null == responseUri)
            {
                throw new ArgumentNullException("uri");
            }

            string query = responseUri.Query;
            if (String.IsNullOrEmpty(query))
            {
                throw new ChargeException("Invalid Request: Query string is empty");
            }

            Dictionary<string, string> parameters = ChargeUtils.ParseQueryString(query);
            if (parameters.Count == 0)
            {
                throw new ChargeException("Invalid Request: Query string has no params");
            }

            // Validate nonce
            if (!parameters.ContainsKey(Keys.NONCE) || String.IsNullOrEmpty(parameters[Keys.NONCE]))
            {
                throw new ChargeException("No nonce was provided.");
            }
            string nonce = parameters[Keys.NONCE];
            this.ValidateNonce(nonce);

            // Parse parameters
            if (parameters.ContainsKey(Keys.AMOUNT))
            {
                this.Amount = parameters[Keys.AMOUNT];
            }
            if (parameters.ContainsKey(Keys.CARD_TYPE))
            {
                this.CardType = parameters[Keys.CARD_TYPE];
            }
            if (parameters.ContainsKey(Keys.CURRENCY))
            {
                this.Currency = parameters[Keys.CURRENCY];
            }
            if (parameters.ContainsKey(Keys.ERROR_MESSAGE))
            {
                this.ErrorMessage = parameters[Keys.ERROR_MESSAGE];
            }
            if (parameters.ContainsKey(Keys.REDACTED_CARD_NUMBER))
            {
                this.RedactedCardNumber = parameters[Keys.REDACTED_CARD_NUMBER];
            }
            if (parameters.ContainsKey(Keys.RESPONSE_TYPE))
            {
                this.ResponseType = parameters[Keys.RESPONSE_TYPE];
            }
            if (parameters.ContainsKey(Keys.TAX_AMOUNT))
            {
                this.TaxAmount = parameters[Keys.TAX_AMOUNT];
            }
            if (parameters.ContainsKey(Keys.TAX_RATE))
            {
                this.TaxRate = parameters[Keys.TAX_RATE];
            }
            if (parameters.ContainsKey(Keys.TIP_AMOUNT))
            {
                this.TipAmount = parameters[Keys.TIP_AMOUNT];
            }
            if (parameters.ContainsKey(Keys.TRANSACTION_ID))
            {
                this.TransactionId = parameters[Keys.TRANSACTION_ID];
            }

            this.ValidateFields();

            if (this.ResponseType == Type.APPROVED)
            {
                this.ResponseCode = Code.APPROVED;
            }
            else if (this.ResponseType == Type.CANCELLED)
            {
                this.ResponseCode = Code.CANCELLED;
            }
            else if (this.ResponseType == Type.DECLINED)
            {
                this.ResponseCode = Code.DECLINED;
            }
            else
            {
                this.ResponseCode = Code.ERROR;
            }

            this.ExtraParams = new Dictionary<string, string>();
            foreach (var parameter in parameters)
            {
                if (!parameter.Key.StartsWith("ifcc_", StringComparison.Ordinal))
                {
                    this.ExtraParams[parameter.Key] = parameter.Value;
                }
            }
        }