public ActionResult Index() { try { Request.InputStream.Position = 0; var receivedModel = (PushReceivedModel.API3G)PushReceivedXmlSerializer.Deserialize(Request.InputStream); var confirmedPayment = new ConfirmedPaymentModel(); confirmedPayment.TransactionToken = receivedModel.TransactionToken; confirmedPayment.TerminalType = TerminalType.ExternalServer; confirmedPayment.TerminalUUID = "DPO"; confirmedPayment.Receipt = receivedModel.TransactionApproval; confirmedPayment.Amount = receivedModel.TransactionAmount; //transactionModel.CreatedTimestamp = DateTime.ParseExact(receivedModel.TransactionSettlementDate, "yyyy/MM/dd", CultureInfo.InvariantCulture); confirmedPayment.CustomerContactNumber = receivedModel.CustomerPhone; confirmedPayment.CustomerFirstName = receivedModel.CustomerName; var paymentService = new PaymentService(CoreGatewaySession.SessionToken); paymentService.SettlePayment(confirmedPayment); return(Content("<?xml version=\"1.0\" encoding=\"utf-8\"?><API3G><Response>OK</Response></API3G>")); } catch (Exception ex) { Request.InputStream.Position = 0; var reader = new StreamReader(Request.InputStream); var payload = reader.ReadToEnd(); Log.Error(string.Format("Unxepected error when receiving: {0}", payload), ex); return(Content("<?xml version=\"1.0\" encoding=\"utf-8\"?><API3G><Response>Failed</Response></API3G>")); } }
public void SettlePayment(ConfirmedPaymentModel model) { var request = new RestRequest("/api/Payment/Transaction", Method.PUT); request.RequestFormat = DataFormat.Json; request.JsonSerializer = new RestSharpJsonNetSerializer(); request.AddBody(model); var response = RestClient.Execute(request); if (response.StatusCode != HttpStatusCode.OK) { throw CreateException(response); } }
private void ProcessUnallocated(DataContext dbContext, ConfirmedPaymentModel confirmedPaymentModel) { var rollingRegister = new RollingRegister(); rollingRegister.Amount = confirmedPaymentModel.Amount; rollingRegister.CredentialID = SessionModel.CredentialID; rollingRegister.DateOpened = DateTime.Now; rollingRegister.PaymentMethod = (Data.Enums.PaymentMethod)confirmedPaymentModel.PaymentSource; rollingRegister.PaymentTransactionID = null; rollingRegister.Reference = string.Format("Token: {0}, Transaction Approval: {1}", confirmedPaymentModel.TransactionToken, confirmedPaymentModel.Receipt); rollingRegister.RollingRegisterStatus = Data.Enums.RollingRegisterStatus.Open; rollingRegister.RollingRegisterType = Data.Enums.RollingRegisterType.Unallocated; dbContext.RollingRegisters.Add(rollingRegister); dbContext.SaveChanges(); }
public ActionResult CourtPayment(PaymentSummary model) { ViewBag.Districts = AuthenticatedUser.UserData.Districts; if (!ModelState.IsValid) { return(View(model)); } var paymentDate = DateTime.Now; if (!DateTime.TryParseExact(model.PaymentDate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out paymentDate)) { ModelState.AddModelError("PaymentDate", "Invalid Payment Date."); return(View(model)); } try { PaymentSummary cachedModel = Session["PaymentSummary"] as PaymentSummary; model.Fines = cachedModel.Fines; var paymentTransaction = new PaymentTransactionModel(); paymentTransaction.CredentialID = AuthenticatedUser.SessionData.CredentialID; paymentTransaction.CustomerContactNumber = model.MobileNumber; paymentTransaction.CustomerIDNumber = string.Empty; paymentTransaction.CustomerFirstName = model.FirstName; paymentTransaction.CustomerLastName = model.LastName; paymentTransaction.PaymentSource = model.PaymentMethod; paymentTransaction.Receipt = model.PaymentReference; paymentTransaction.ReceiptTimestamp = paymentDate; paymentTransaction.CourtID = model.CourtID; paymentTransaction.TerminalType = Core.Gateway.Models.Enums.TerminalType.InternalServer; paymentTransaction.TerminalUUID = "IMS"; paymentTransaction.Amount = model.Fines.Sum(f => f.OutstandingAmount).Value; paymentTransaction.PaymentTransactionItems = model.Fines.Select(f => new PaymentTransactionItemModel { ReferenceNumber = f.ReferenceNumber, Amount = f.OutstandingAmount.Value, TransactionToken = string.Empty, EntityReferenceTypeID = long.Parse(f.ReferenceNumber[1].ToString()), Description = "Notice issued." }) .ToList(); var paymentService = new PaymentService(AuthenticatedUser.SessionToken); var transactionToken = paymentService.RegisterPayment(paymentTransaction); var confirmedPayment = new ConfirmedPaymentModel(); confirmedPayment.CustomerContactNumber = model.MobileNumber; confirmedPayment.CustomerIDNumber = string.Empty; confirmedPayment.CustomerFirstName = model.FirstName; confirmedPayment.CustomerLastName = model.LastName; confirmedPayment.PaymentSource = model.PaymentMethod; confirmedPayment.Receipt = model.PaymentReference; confirmedPayment.TerminalType = Core.Gateway.Models.Enums.TerminalType.InternalServer; confirmedPayment.TerminalUUID = "IMS"; confirmedPayment.Amount = paymentTransaction.Amount; confirmedPayment.TransactionToken = transactionToken; paymentService.SettlePayment(confirmedPayment); Session.Remove("PaymentSummary"); return(RedirectToAction("Index")); } catch (GatewayException ex) { ModelState.AddModelError(string.Empty, ex.Message); return(View(model)); } }
private void ProcessUnderpayment(DataContext dbContext, PaymentTransaction paymentTransaction, ConfirmedPaymentModel confirmedPaymentModel) { var paymentProvider = resolvePaymentProvider(); var rollingRegister = new RollingRegister(); rollingRegister.Amount = confirmedPaymentModel.Amount; rollingRegister.CredentialID = SessionModel.CredentialID; rollingRegister.DateOpened = DateTime.Now; rollingRegister.PaymentMethod = (Data.Enums.PaymentMethod)confirmedPaymentModel.PaymentSource; rollingRegister.PaymentTransactionID = paymentTransaction.ID; rollingRegister.Reference = string.Format("Token: {0}, Transaction Approval: {1}", confirmedPaymentModel.TransactionToken, confirmedPaymentModel.Receipt); rollingRegister.RollingRegisterStatus = Data.Enums.RollingRegisterStatus.Open; rollingRegister.RollingRegisterType = Data.Enums.RollingRegisterType.UnderPayment; dbContext.RollingRegisters.Add(rollingRegister); paymentTransaction.CredentialID = SessionModel.CredentialID; paymentTransaction.ModifiedTimestamp = DateTime.Now; paymentTransaction.Status = Data.Enums.PaymentTransactionStatus.RollingRegister; foreach (var paymentTransactionItem in paymentTransaction.TransactionItems) { paymentTransactionItem.Status = Data.Enums.PaymentTransactionStatus.RollingRegister; try { paymentProvider.CancelTransaction(paymentTransactionItem.TransactionToken); } catch { // Empty on purpose } } dbContext.SaveChanges(); }
public IHttpActionResult SettleTransaction(ConfirmedPaymentModel confirmedPaymentModel) { using (var dbContext = new DataContext()) { var paymentTransactions = dbContext.PaymentTransactions .Include(f => f.TransactionItems).Where(f => f.TransactionToken == confirmedPaymentModel.TransactionToken) .ToList(); if (paymentTransactions == null || paymentTransactions.Count == 0) { ProcessUnallocated(dbContext, confirmedPaymentModel); return(Ok()); } // Iffy var paymentTransaction = paymentTransactions.FirstOrDefault(f => f.Status == Data.Enums.PaymentTransactionStatus.Added); if (paymentTransaction == null) { ProcessDuplicate(dbContext, confirmedPaymentModel); return(Ok()); } if (confirmedPaymentModel.Amount < paymentTransaction.Amount) { ProcessUnderpayment(dbContext, paymentTransaction, confirmedPaymentModel); return(Ok()); } if (confirmedPaymentModel.Amount > paymentTransaction.Amount) { ProcessOverpayment(dbContext, paymentTransaction, confirmedPaymentModel); return(Ok()); } var paymentProvider = resolvePaymentProvider(); if (!paymentTransaction.TerminalID.HasValue) { var paymentTerminal = dbContext.PaymentTerminals.FirstOrDefault(f => f.TerminalType == (Data.Enums.TerminalType)confirmedPaymentModel.TerminalType && f.UUID == confirmedPaymentModel.TerminalUUID); if (paymentTerminal == null) { return(this.BadRequestEx(Error.PaymentTerminalDoesNotExist)); } paymentTransaction.TerminalID = paymentTerminal.ID; } if (string.IsNullOrEmpty(paymentTransaction.Receipt)) { paymentTransaction.Receipt = confirmedPaymentModel.Receipt; paymentTransaction.ReceiptTimestamp = confirmedPaymentModel.TransactionTimestamp; } paymentTransaction.CredentialID = SessionModel.CredentialID; paymentTransaction.ModifiedTimestamp = DateTime.Now; paymentTransaction.Status = Data.Enums.PaymentTransactionStatus.Settled; foreach (var paymentTransactionItem in paymentTransaction.TransactionItems) { paymentTransactionItem.Status = Data.Enums.PaymentTransactionStatus.Settled; try { paymentProvider.CancelTransaction(paymentTransactionItem.TransactionToken); } catch { // Empty on purpose } } dbContext.SaveChanges(); PaymentTransactionHub.SendStatusChanged( paymentTransaction.TransactionToken, (PaymentTransactionStatus)paymentTransaction.Status, paymentTransaction.Amount); Task.Run(() => ProcessTransaction(paymentTransaction.ID, SessionModel.CredentialID)); } return(Ok()); }