Beispiel #1
0
        private static void ExtractCart(WebAPIQueries queries, out long credit, out double value)
        {
            credit = 0;
            value  = 0;

            foreach (var kv in queries)
            {
                var i = kv.Key.IndexOf("item_number", StringComparison.OrdinalIgnoreCase);

                if (i < 0)
                {
                    continue;
                }

                string k = "0";

                if (i + 11 < kv.Key.Length)
                {
                    k = kv.Key.Substring(i + 11);
                }

                if (String.IsNullOrWhiteSpace(k))
                {
                    k = "0";
                }

                if (!Int32.TryParse(k, out i))
                {
                    continue;
                }

                if (Insensitive.Equals(kv.Value, CMOptions.CurrencyType.TypeName))
                {
                    var subTotal = Math.Max(0, Int64.Parse(queries["quantity" + i.ToString("#")] ?? "0"));
                    var subGross = Math.Max(0, Double.Parse(queries["mc_gross" + i.ToString("#")] ?? "0"));

                    if (subTotal <= 0)
                    {
                        subTotal = (long)(subGross / CMOptions.CurrencyPrice);
                    }
                    else
                    {
                        var expGross = subTotal * CMOptions.CurrencyPrice;

                        if (Math.Abs(expGross - subGross) > CMOptions.CurrencyPrice)
                        {
                            subGross = expGross;
                        }
                    }

                    credit += subTotal;
                    value  += subGross;
                }
            }
        }
Beispiel #2
0
		public WebAPIRequest(WebAPIClient client)
		{
			Client = client;

			Headers = new WebAPIHeaders();
			Queries = new WebAPIQueries();

			ContentType = FileMime.Default;
			Encoding = Encoding.UTF8;

			Data = String.Empty;
			Length = 0;
		}
Beispiel #3
0
        private static void EndVerification(HttpWebRequest webReq, string state, HttpWebResponse webRes)
        {
            var content = webRes.GetContent();

            if (Insensitive.Contains(content, "VERIFIED"))
            {
                using (var queries = new WebAPIQueries(state))
                {
                    ProcessTransaction(queries);
                }

                RefreshAdminUI();
            }
        }
Beispiel #4
0
        private static void EndVerification(HttpWebRequest webReq, string state, HttpWebResponse webRes)
        {
            var content = webRes.GetContent();

            File.AppendAllLines("IPN.log", new[] { "\n\nREQUEST:\n", state, "\n\nRESPONSE:\n", content });

            if (Insensitive.Contains(content, "VERIFIED"))
            {
                using (var queries = new WebAPIQueries(state))
                {
                    ProcessTransaction(queries);
                }

                RefreshAdminUI();
            }
        }
Beispiel #5
0
 private static bool VerifyValue(WebAPIQueries queries, string key, string val)
 {
     return(!String.IsNullOrWhiteSpace(queries[key]) && Insensitive.Equals(queries[key], val));
 }
Beispiel #6
0
        private static void ProcessTransaction(WebAPIQueries queries)
        {
            var id = queries["txn_id"];

            if (String.IsNullOrWhiteSpace(id))
            {
                return;
            }

            var type = queries["txn_type"];

            if (String.IsNullOrWhiteSpace(type) || !type.EqualsAny(true, _AcceptedTypes))
            {
                return;
            }

            var status = queries["payment_status"];

            if (String.IsNullOrWhiteSpace(status))
            {
                return;
            }

            TransactionState state;

            switch (status.Trim().ToUpper())
            {
            case "PENDING":
            case "PROCESSED":
            case "CREATED":
                state = TransactionState.Pending;
                break;

            case "COMPLETED":
                state = TransactionState.Processed;
                break;

            default:
                state = TransactionState.Voided;
                break;
            }

            long   credit;
            double value;

            ExtractCart(queries, out credit, out value);

            var custom = queries["custom"] ?? String.Empty;

            var trans = Transactions.GetValue(id);

            var create = trans == null;

            if (create)
            {
                var email = queries["payer_email"] ?? String.Empty;
                var notes = queries["payer_note"] ?? String.Empty;
                var extra = queries["extra_info"] ?? String.Empty;

                var a = Accounts.GetAccount(custom) ?? CMOptions.FallbackAccount;

                Transactions[id] = trans = new DonationTransaction(id, a, email, value, credit, notes, extra);

                var profile = EnsureProfile(a);

                if (profile == null)
                {
                    state        = TransactionState.Voided;
                    trans.Extra += "{VOID: NO PROFILE}";
                }
                else
                {
                    profile.Add(trans);
                }
            }

            if (!VerifyValue(queries, "business", CMOptions.Business) &&
                !VerifyValue(queries, "receiver_email", CMOptions.Business) &&
                !VerifyValue(queries, "receiver_id", CMOptions.Business))
            {
                state        = TransactionState.Voided;
                trans.Extra += "{VOID: UNEXPECTED BUSINESS}";
            }

            if (trans.Total != value)
            {
                state        = TransactionState.Voided;
                trans.Extra += "{VOID: TOTAL CHANGED}";
            }

            if (queries["test"] != null || queries["test_ipn"] != null)
            {
                state        = TransactionState.Voided;
                trans.Extra += "{VOID: TESTING}";
            }

            switch (state)
            {
            case TransactionState.Processed:
                trans.Process();
                break;

            case TransactionState.Voided:
                trans.Void();
                break;
            }

            if (create && trans.IsPending)
            {
                DonationEvents.InvokeTransPending(trans);
            }

            SpotCheck(trans.Account);
        }
Beispiel #7
0
		private static void ExtractCart(WebAPIQueries queries, out long credit, out double value)
		{
			credit = 0;
			value = 0;

			foreach (var kv in queries)
			{
				var i = kv.Key.IndexOf("item_number", StringComparison.OrdinalIgnoreCase);

				if (i < 0)
				{
					continue;
				}

				string k = "0";

				if (i + 11 < kv.Key.Length)
				{
					k = kv.Key.Substring(i + 11);
				}

				if (String.IsNullOrWhiteSpace(k))
				{
					k = "0";
				}

				if (!Int32.TryParse(k, out i))
				{
					continue;
				}

				if (Insensitive.Equals(kv.Value, CMOptions.CurrencyType.TypeName))
				{
					var subTotal = Math.Max(0, Int64.Parse(queries["quantity" + i.ToString("#")] ?? "0"));
					var subGross = Math.Max(0, Double.Parse(queries["mc_gross" + i.ToString("#")] ?? "0"));

					if (subTotal <= 0)
					{
						subTotal = (long)(subGross / CMOptions.CurrencyPrice);
					}
					else
					{
						var expGross = subTotal * CMOptions.CurrencyPrice;

						if (Math.Abs(expGross - subGross) > CMOptions.CurrencyPrice)
						{
							subGross = expGross;
						}
					}

					credit += subTotal;
					value += subGross;
				}
			}
		}
Beispiel #8
0
		private static bool VerifyValue(WebAPIQueries queries, string key, string val)
		{
			return !String.IsNullOrWhiteSpace(queries[key]) && Insensitive.Contains(queries[key], val);
		}
Beispiel #9
0
		private static void ProcessTransaction(WebAPIQueries queries)
		{
			var id = queries["txn_id"];

			if (String.IsNullOrWhiteSpace(id))
			{
				return;
			}

			var status = queries["payment_status"];

			if (String.IsNullOrWhiteSpace(status))
			{
				return;
			}

			TransactionState state;

			status = status.Trim();

			switch (status.ToUpper())
			{
				case "PENDING":
				case "IN-PROGRESS":
					state = TransactionState.Pending;
					break;
				case "COMPLETED":
					state = TransactionState.Processed;
					break;
				default:
					state = TransactionState.Voided;
					break;
			}

			long credit;
			double value;

			ExtractCart(queries, out credit, out value);

			var custom = queries["custom"] ?? String.Empty;

			var trans = Transactions.GetValue(id);

			if (trans == null)
			{
				var email = queries["payer_email"] ?? String.Empty;
				var notes = queries["payer_note"] ?? String.Empty;
				var extra = queries["extra_info"] ?? String.Empty;

				var a = Accounts.GetAccount(custom) ?? CMOptions.FallbackAccount;

				Transactions[id] = trans = new DonationTransaction(id, a, email, value, credit, notes, extra);

				var profile = EnsureProfile(a);

				if (profile == null)
				{
					state = TransactionState.Voided;
					trans.Extra += "{VOID: NO PROFILE}";
				}
				else
				{
					profile.Add(trans);
				}
			}

			if (!VerifyValue(queries, "business", CMOptions.Business) && !VerifyValue(queries, "receiver_email", CMOptions.Business) &&
				!VerifyValue(queries, "receiver_id", CMOptions.Business))
			{
				state = TransactionState.Voided;
				trans.Extra += "{VOID: UNEXPECTED BUSINESS}";
			}

			if (trans.Total != value)
			{
				state = TransactionState.Voided;
				trans.Extra += "{VOID: TOTAL CHANGED}";
			}

			if (queries["test"] != null || queries["test_ipn"] != null)
			{
				state = TransactionState.Voided;
				trans.Extra += "{VOID: TESTING}";
			}

			switch (state)
			{
				case TransactionState.Processed:
					trans.Process();
					break;
				case TransactionState.Voided:
					trans.Void();
					break;
			}

			SpotCheck(trans.Account);
		}
Beispiel #10
0
		private static void EndVerification(HttpWebRequest webReq, string state, HttpWebResponse webRes)
		{
			var content = webRes.GetContent();

			if (Insensitive.Contains(content, "VERIFIED"))
			{
				using (var queries = new WebAPIQueries(state))
				{
					ProcessTransaction(queries);
				}

				RefreshAdminUI();
			}
		}