Example #1
0
        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);
        }
Example #2
0
        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();
        }