public ContentResult Pay(string Id, [FromServices] SessionManagerService sessionManager, [FromServices] OperationManagerService operationManager, [FromServices] FormManagerService formManager, [FromServices] PaymentSystemContext dbContext, [FromServices] FormDataCryptService cryptService) { try { var session = sessionManager.Get(Id); if (session.SessionType != SessionType.OneStep && session.SessionType != SessionType.TwoStep) { return(base.Content(formManager.GetErrorForm())); } var result = operationManager.CheckPaymentPossibility(session); var dictionary = new Dictionary <string, string>(); switch (result) { case PaymentPossibility.LimitExceeded: case PaymentPossibility.SessionExpired: return(base.Content(formManager.GetErrorForm())); case PaymentPossibility.AlreadyPaid: return(base.Content(formManager.GetSuccessForm())); default: var generationTime = DateTime.UtcNow; session.LastFormGenerationTime = generationTime; session.TryCount++; dbContext.SaveChanges(); var formSign = new FormSign { GenerationTime = generationTime, SessionId = session.Id }; dictionary.Add("sessionId", session.ExternalId); dictionary.Add("code", cryptService.Crypt(formSign)); return(base.Content(formManager.GetPaymentForm(dictionary))); } } catch (Exception) { return(base.Content(formManager.GetErrorForm())); } }
public ContentResult Pay([FromForm] SubmitPay submitPay, [FromServices] OperationManagerService operationManager, [FromServices] FormManagerService formManager, [FromServices] PaymentSystemContext dbContext, [FromServices] FormDataCryptService cryptService) { if (string.IsNullOrEmpty(submitPay.ExternalId) || string.IsNullOrEmpty(submitPay.Code)) { return(base.Content(formManager.GetErrorForm())); } var formCrypt = cryptService.DeCrypt(submitPay.Code); var session = dbContext.Session.Include(x => x.Merchant).FirstOrDefault(x => x.Id == formCrypt.SessionId); if (session == null || session.ExternalId != submitPay.ExternalId || session.ExpireTime != formCrypt.GenerationTime) { return(base.Content(formManager.GetErrorForm())); } var paymentData = new PaymentData(submitPay.Pan, submitPay.Year, submitPay.Month, submitPay.Cvv); var result = operationManager.Deposit(session.Merchant, session, paymentData); switch (result.OperationStatus) { case OperationStatus.AdditionalAuth: return(base.Content(formManager.Get3DsForm(result.AdditionalAuth))); case OperationStatus.Pending: return(base.Content(formManager.GetPendingForm())); case OperationStatus.Success: return(base.Content(formManager.GetSuccessForm())); case OperationStatus.Redirected: return(base.Content(formManager.GetRedirectForm(result.RedirectedUrl))); case OperationStatus.Error: return(session.CanTryToPayAnotherTime ? base.Content(formManager.GetRedirectForm("/form/v1/pay")) : base.Content(formManager.GetErrorForm())); default: return(base.Content(formManager.GetErrorForm())); } }