public void SendPaymentResultErrors(string email, PaymentResultParameters touchNetValues, NameValueCollection requestAllParams, string extraBody, PaymentResultType paymentResultType) { var emailNotFound = false; if(string.IsNullOrEmpty(email)) { email = "*****@*****.**"; emailNotFound = true; } var message = new MailMessage("*****@*****.**", email) {IsBodyHtml = true}; var body = new StringBuilder("TouchNet Results<br/><br/>"); body.Append(DateTime.UtcNow.ToPacificTime() + "<br/>"); switch (paymentResultType) { case PaymentResultType.TransactionNotFound: message.Subject = "TouchNet Post Results -- Transaction not found"; break; case PaymentResultType.OverPaid: message.Subject = "TouchNet Post Results -- Has Overpaid"; break; case PaymentResultType.InValidPaymentLog: message.Subject = "TouchNet Post Results -- PaymentLog is Not Valid"; break; default: message.Subject = "TouchNet Post Results -- Unknown Result Type"; break; } if (emailNotFound) { message.Subject = string.Format("email missing too {0}", message.Subject); } foreach (var k in requestAllParams.AllKeys) { if (k.ToLower() != "posting_key") { body.Append(k + ":" + requestAllParams[k]); body.Append("<br/>"); } } message.Body = body.ToString(); body.Append("<br/>Function parameters================<br/>"); body.Append("acct_addr: " + touchNetValues.acct_addr + "<br/>"); body.Append("acct_addr2: " + touchNetValues.acct_addr2 + "<br/>"); body.Append("acct_city: " + touchNetValues.acct_city + "<br/>"); body.Append("acct_state: " + touchNetValues.acct_state + "<br/>"); body.Append("acct_zip: " + touchNetValues.acct_zip + "<br/>"); body.Append("CANCEL_LINK: " + touchNetValues.CANCEL_LINK + "<br/>"); body.Append("CARD_TYPE: " + touchNetValues.CARD_TYPE + "<br/>"); body.Append("ERROR_LINK: " + touchNetValues.ERROR_LINK + "<br/>"); body.Append("EXT_TRANS_ID: " + touchNetValues.EXT_TRANS_ID + "<br/>"); body.Append("NAME_ON_ACCT: " + touchNetValues.NAME_ON_ACCT + "<br/>"); body.Append("PMT_AMT: " + touchNetValues.PMT_AMT + "<br/>"); body.Append("pmt_date: " + touchNetValues.pmt_date + "<br/>"); body.Append("PMT_STATUS: " + touchNetValues.PMT_STATUS + "<br/>"); body.Append("Submit: " + touchNetValues.Submit + "<br/>"); body.Append("SUCCESS_LINK: " + touchNetValues.SUCCESS_LINK + "<br/>"); body.Append("sys_tracking_id: " + touchNetValues.sys_tracking_id + "<br/>"); body.Append("TPG_TRANS_ID: " + touchNetValues.TPG_TRANS_ID + "<br/>"); body.Append("UPAY_SITE_ID: " + touchNetValues.UPAY_SITE_ID + "<br/>"); message.Body = body.ToString(); if(!string.IsNullOrEmpty(extraBody)) { message.Body = message.Body + extraBody; } _emailService.SendEmail(message); }
public ActionResult PaymentResult(PaymentResultParameters touchNetValues) { #region Actual Work // validate to make sure a transaction value was received if (!string.IsNullOrEmpty(touchNetValues.EXT_TRANS_ID)) { string parsedTransaction = touchNetValues.EXT_TRANS_ID.Substring(0, touchNetValues.EXT_TRANS_ID.LastIndexOf (" FID=")); var transaction = Repository.OfType<Transaction>() .Queryable.Where(a => a.TransactionGuid == new Guid(parsedTransaction)) .SingleOrDefault(); //var transaction = Repository.OfType<Transaction>().GetNullableById(touchNetValues.EXT_TRANS_ID.Value); if(transaction == null) { #region Email Error Results _notificationProvider.SendPaymentResultErrors(CloudConfigurationManager.GetSetting("EmailForErrors"), touchNetValues, Request.Params, null, PaymentResultType.TransactionNotFound); #endregion Email Error Results return View(); } // create a payment log var paymentLog = new PaymentLog(transaction.Total); paymentLog.Credit = true; // on success, save the valid information if (touchNetValues.PMT_STATUS.ToLower() == "success") { paymentLog.Name = touchNetValues.NAME_ON_ACCT; paymentLog.Amount = touchNetValues.PMT_AMT.Value; paymentLog.Accepted = true; paymentLog.GatewayTransactionId = touchNetValues.TPG_TRANS_ID; paymentLog.CardType = touchNetValues.CARD_TYPE; if (!transaction.IsActive) { //Possibly we could email someone here to say it has been re-activated transaction.IsActive = true; } } paymentLog.TnBillingAddress1 = touchNetValues.acct_addr; paymentLog.TnBillingAddress2 = touchNetValues.acct_addr2; paymentLog.TnBillingCity = touchNetValues.acct_city; paymentLog.TnBillingState = touchNetValues.acct_state; paymentLog.TnBillingZip = touchNetValues.acct_zip; paymentLog.TnCancelLink = touchNetValues.CANCEL_LINK; paymentLog.TnErrorLink = touchNetValues.ERROR_LINK; paymentLog.TnPaymentDate = touchNetValues.pmt_date; paymentLog.TnSubmit = touchNetValues.Submit; paymentLog.TnSuccessLink = touchNetValues.SUCCESS_LINK; paymentLog.TnSysTrackingId = touchNetValues.sys_tracking_id; paymentLog.TnUpaySiteId = touchNetValues.UPAY_SITE_ID; switch (touchNetValues.PMT_STATUS.ToLower()) { case "success": paymentLog.TnStatus = "S"; break; case "cancelled": case "canceled": paymentLog.TnStatus = "C"; break; default: paymentLog.TnStatus = "E"; break; } if(touchNetValues.posting_key != CloudConfigurationManager.GetSetting("TouchNetPostingKey")) { ModelState.AddModelError("PostingKey", "Posting Key Error"); paymentLog.Accepted = false; } if (touchNetValues.UPAY_SITE_ID != CloudConfigurationManager.GetSetting("TouchNetSiteId")) { ModelState.AddModelError("SiteId", "TouchNet Site Id Error"); paymentLog.Accepted = false; } if (touchNetValues.TPG_TRANS_ID == "DUMMY_TRANS_ID") { ModelState.AddModelError("TPG_TRANS_ID", "TouchNet TPG_TRANS_ID Error"); paymentLog.Accepted = false; } if (touchNetValues.PMT_AMT != transaction.Total) { paymentLog.Accepted = false; if (touchNetValues.PMT_AMT != 0 && paymentLog.TnStatus == "S") { ModelState.AddModelError("Amount", "TouchNet Amount does not match local amount"); } } transaction.AddPaymentLog(paymentLog); //paymentLog.Transaction = transaction; paymentLog.TransferValidationMessagesTo(ModelState); if (ModelState.IsValid) { Repository.OfType<Transaction>().EnsurePersistent(transaction); if (paymentLog.Accepted) { // attempt to get the contact information question set and retrieve email address var question = transaction.TransactionAnswers.Where( a => a.QuestionSet.Name == StaticValues.QuestionSet_ContactInformation && a.Question.Name == StaticValues.Question_Email).FirstOrDefault(); if (question != null) { // send an email to the user _notificationProvider.SendConfirmation(Repository, transaction, question.Answer); } if (transaction.TotalPaid > transaction.Total) { _notificationProvider.SendPaymentResultErrors( CloudConfigurationManager.GetSetting("EmailForErrors"), touchNetValues, Request.Params, null, PaymentResultType.OverPaid); } } } else { #region InValid PaymentLog -- Email Results var body = new StringBuilder(); try { body.Append("<br/><br/>Payment log values:<br/>"); body.Append("Name:" + paymentLog.Name + "<br/>"); body.Append("Amount:" + paymentLog.Amount + "<br/>"); body.Append("Accepted:" + paymentLog.Accepted + "<br/>"); body.Append("Gateway transaction id:" + paymentLog.GatewayTransactionId + "<br/>"); body.Append("Card Type: " + paymentLog.CardType + "<br/>"); body.Append("ModelState: " + ModelState.IsValid); body.Append("<br/><br/>===== modelstate errors text===<br/>"); foreach (var result in ModelState.Values) { foreach (var errs in result.Errors) { body.Append("Error:" + errs.ErrorMessage + "<br/>"); } } } catch (Exception ex) { body.Append(ex.Message); } _notificationProvider.SendPaymentResultErrors(CloudConfigurationManager.GetSetting("EmailForErrors"), touchNetValues, Request.Params, body.ToString(), PaymentResultType.InValidPaymentLog); #endregion InValid PaymentLog -- Email Results } } #endregion return View(); }