using System; using System.Configuration; using System.IO; using System.Net; using System.Net.Mail; using System.Text.RegularExpressions; using System.Web.UI.HtmlControls; using Castle.ActiveRecord; using ECOEarth.Web.Domain; namespace ECOEarth.Web { public partial class WorldPayTransfer : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { using(StreamWriter wr = new StreamWriter("c:\\temp\\wplog.txt")) { wr.WriteLine("Form:"); foreach(string key in Request.Form.Keys) { string value = Request.Form[key]; wr.WriteLine(key + ":" + value); } wr.WriteLine("Querystring:"); foreach (string key in Request.QueryString.Keys) { string value = Request.Form[key]; wr.WriteLine(key + ":" + value); } wr.Flush(); } string callbackPW = Request.Form["callbackPW"]; if (!callbackPW.Equals (ConfigurationManager.AppSettings["WorldpayCallbackPW"])) return; int transId = Convert.ToInt32(Request.Form["cartId"]); Order order = ActiveRecordBase.Find(transId); string transStatus = Request.Form["transStatus"]; #region Security Checks - Check accept, correct amount and currency if (transStatus.Equals("C")) { order.OrderStatus = OrderStatus.PaymentRejected; return; } if(transStatus.Equals("Y")) { order.OrderStatus = OrderStatus.PaymentApproved; } double transAmount = Convert.ToDouble(Request.Form["amount"]); if (transAmount != order.OrderTotal) { return; } string currency = Request.Form["currency"]; if (!currency.Equals("GBP")) return; #endregion TransactionReceipt transReceipt = new TransactionReceipt(); transReceipt.AvsCheck = Request.Form["AVS"]; transReceipt.CardType = Request.Form["cardType"]; transReceipt.TransactionDate = Convert.ToDateTime("1/1/1970") .AddMilliseconds(Convert.ToDouble(Request.Form["transTime"])); transReceipt.TransactionId = Request.Form["transId"]; order.TransactionReceipt = transReceipt; order.SaveAndFlush(); SendInvoiceToClient(order); } private void SendInvoiceToClient(Order order) { string emailContent = null; string invoiceUrl = ConfigurationManager.AppSettings["InvoiceUrl"]; invoiceUrl = invoiceUrl + "?orderId=" + order.OrderId.ToString() + "&password=" + ConfigurationManager.AppSettings["AdminPassword"]; //Invoice content is pulled via web client so we can reuse the SalesInvoice.aspx //for web rather than email scenario later on, for say account section //or administration area. SalesInvoice.aspx uses repeater for part of generation. //Could of done via custom templating if larger budget. Ends justification :) using(WebClient webClient = new WebClient()) { emailContent = webClient.DownloadString(invoiceUrl); } Match innerBodyMatch = Regex.Match(emailContent, "(?.*?)", RegexOptions.Singleline | RegexOptions.IgnoreCase); string innerBodyContent = innerBodyMatch.Groups["content"].Value; string from = ConfigurationManager.AppSettings["EmailResultsFrom"]; string to = order.Customer.Email; string subject = "Sales Invoice"; MailMessage msg = new MailMessage(from, to); msg.Subject = "Sales Invoice"; msg.CC.Add(ConfigurationManager.AppSettings["EmailResultsFrom"]); msg.Body = innerBodyContent; msg.IsBodyHtml = true; SmtpClient smtp = new SmtpClient(); smtp.Send(msg); } } }