public ActionResult PaymentPre(string orderId, string userName) { // Retrieve Work Order WorkOrder workOrder = woServ.Get(Convert.ToInt32(orderId)); if (workOrder == null) { levent.Level = LogLevel.Error; levent.Message = "WorkOrder ID not valid Work Order. WO#:" + orderId; log.Log(levent); return View("IndexError", workOrder); } double payment = workOrder.transportFee; if (payment <= 0.0) { levent.Level = LogLevel.Error; levent.Message = "There is no transportation fee associated with this work order - there is no PayPal transaction required. WO#:" + orderId; log.Log(levent); return View("IndexError", workOrder); } PaypalExpressCheckout paypal = new PaypalExpressCheckout(); SetExpressCheckoutResponseType response = paypal.SetExpressCheckout(payment.ToString()); if (response != null) { // # Success values if (response.Ack.ToString().Trim().ToUpper().Equals("SUCCESS")) { // # Redirecting to PayPal for authorization // Once you get the "Success" response, needs to authorise the // transaction by making buyer to login into PayPal. For that, // need to construct redirect url using EC token from response. // For example, // `redirectURL="https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=" + setExpressCheckoutResponse.Token;` // Save PayPal token workOrder.paypalToken = response.Token; // Save work order updates woServ.Save(workOrder, userName); object paypalConfigSection = null; try { paypalConfigSection = System.Web.Configuration.WebConfigurationManager.GetSection("paypal"); } catch (System.Exception ex) { throw new ConfigException("Unable to load 'paypal' section from *.config: " + ex.Message); } if (paypalConfigSection == null) { throw new ConfigException( "Cannot parse *.Config file. Ensure you have configured the 'paypal' section correctly."); } NameValueConfigurationCollection paypalSettings = (NameValueConfigurationCollection)paypalConfigSection.GetType().GetProperty("Settings").GetValue(paypalConfigSection, null); var paypalUrl = paypalSettings["paypalUrl"].Value; var redirectUrl = paypalUrl + "_express-checkout&token=" + response.Token; return new RedirectResult(redirectUrl, false); } // # Error Values else { List<ErrorType> errorMessages = response.Errors; foreach (ErrorType error in errorMessages) { levent.Level = LogLevel.Error; levent.Message += error.LongMessage; log.Log(levent); workOrder.paypalErrors += error.ShortMessage; } // Save work order updates woServ.Save(workOrder, userName); return View("IndexError", workOrder); } } else { levent.Level = LogLevel.Error; levent.Message = "The response from PayPal SetExpressCheckoutResponseType API was null. WO#:" + orderId; log.Log(levent); return View("IndexError", workOrder); } }
public ActionResult PaymentPost(string token, string payerId, string userName) { double payment = 0.0; // TODO: There was an issue with the WO returned by the first query below - the work order // can't be saved unless the work order is retrieved with the woServ.Get() call WorkOrder woAll = woServ.GetRepo().GetAllQ().Where(wo => wo.paypalToken == token).FirstOrDefault(); WorkOrder workOrder = woServ.Get(woAll.ID); if (workOrder != null) { if (workOrder.transportFee <= 0.0) { levent.Level = LogLevel.Error; levent.Message = "There is no transportation fee associated with this work order - there is no PayPal transaction required. WO#:" + workOrder.ID; log.Log(levent); return View("IndexError", workOrder); } else { payment = workOrder.transportFee; } } else { levent.Level = LogLevel.Error; levent.Message = "WorkOrder ID not valid Work Order. WO#:" + workOrder.ID; log.Log(levent); return View("IndexError", workOrder); } // PayPal call to get buyer details PaypalExpressCheckout paypal = new PaypalExpressCheckout(); GetExpressCheckoutDetailsResponseType detailsResponse = paypal.GetExpressCheckoutDetails(token); if (detailsResponse != null) { // # Success values if (detailsResponse.Ack.ToString().Trim().ToUpper().Equals("SUCCESS")) { if ((detailsResponse.GetExpressCheckoutDetailsResponseDetails.PaymentDetails == null) || (Convert.ToDouble(detailsResponse.GetExpressCheckoutDetailsResponseDetails.PaymentDetails[0].OrderTotal.value) != workOrder.transportFee)) { // PayPal charge is different than transportFee in database - can't process payment levent.Level = LogLevel.Error; levent.Message = "Transport Fee request to PayPal is a different amount than associated with the WO in database. WO# " + workOrder.ID; log.Log(levent); return View("IndexError", workOrder); } // Unique PayPal Customer Account identification number. This value will be null unless // you authorize the payment by redirecting to PayPal after `SetExpressCheckout` call. workOrder.paypalPayerId = detailsResponse.GetExpressCheckoutDetailsResponseDetails.PayerInfo.PayerID; woServ.Save(workOrder, userName); } // # Error Values else { List<ErrorType> errorMessages = detailsResponse.Errors; foreach (ErrorType error in errorMessages) { levent.Level = LogLevel.Error; levent.Message += error.LongMessage; log.Log(levent); workOrder.paypalErrors += error.ShortMessage; } // Save work order updates woServ.Save(workOrder, userName); return View("IndexError", workOrder); } } else { levent.Level = LogLevel.Error; levent.Message = "The response from PayPal GetExpressCheckoutDetailsResponseType API was null. WO#:" + workOrder.ID; log.Log(levent); return View("IndexError", workOrder); } return View("IndexPostPaypal", workOrder); }