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; } } }
public WebAPIRequest(WebAPIClient client) { Client = client; Headers = new WebAPIHeaders(); Queries = new WebAPIQueries(); ContentType = FileMime.Default; Encoding = Encoding.UTF8; Data = String.Empty; Length = 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(); } }
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(); } }
private static bool VerifyValue(WebAPIQueries queries, string key, string val) { return(!String.IsNullOrWhiteSpace(queries[key]) && Insensitive.Equals(queries[key], val)); }
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); }
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; } } }
private static bool VerifyValue(WebAPIQueries queries, string key, string val) { return !String.IsNullOrWhiteSpace(queries[key]) && Insensitive.Contains(queries[key], val); }
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); }
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(); } }