Beispiel #1
0
        /// <summary>
        /// Отправить HTTP-уведомление на URL магазина
        /// </summary>
        static async Task HttpNotice(CardInfoFromRequest info)
        {
            try
            {
                WebRequest request = WebRequest.Create(info.storeUrl);
                request.Method      = "POST";
                request.ContentType = "application/vnd.api+json";

                string json = JsonConvert.SerializeObject(info);
                byte[] data = Encoding.UTF8.GetBytes(json);
                request.ContentLength = data.Length;

                await Task.Run(() =>
                {
                    using (Stream dataStream = request.GetRequestStream())
                    {
                        dataStream.WriteAsync(data, 0, data.Length);
                    }
                });
            }
            catch (WebException) { }
        }
Beispiel #2
0
        public async Task <ActionResult <string> > CreateCardAsync([FromBody] CardInfoFromRequest info)
        {
            DateTime cardDate = new DateTime();

            #region Verify

            listErrors.Errors = new List <Error>();

            //  Проверка номера карты по алгоритму Луна
            if (!algoritmLuhn(info.CardNumber))
            {
                listErrors.Errors.Add(new Error()
                {
                    Status = "400", Title = "Invalid card number"
                });
            }

            //  Проверка срока действия карты
            try
            {
                int[] monthAndYear = info.CardDate.Split("/").Select(str => int.Parse(str)).ToArray();
                if (monthAndYear.Length != 2)
                {
                    throw new Exception();
                }
                monthAndYear[1] += 2000;
                string date = string.Format("{0}/{1} 23:59:59",
                                            DateTime.DaysInMonth(monthAndYear[1], monthAndYear[0]),
                                            monthAndYear[0].ToString() + "/" + monthAndYear[1]);
                if (!DateTime.TryParse(date, out cardDate))
                {
                    throw new Exception();
                }
                if (DateTime.Now > cardDate)
                {
                    throw new Exception();
                }
            }
            catch (Exception)
            {
                listErrors.Errors.Add(new Error()
                {
                    Status = "400", Title = "Invalid card date"
                });
            }

            //  Проверка CVC/CVV
            if (!int.TryParse(info.VerificationNumber, out _))
            {
                listErrors.Errors.Add(new Error()
                {
                    Status = "400", Title = "Invalid card verification number"
                });
            }

            //  Проверка на существование платежа
            if (!repository.Payments.Any(pay => pay.SessionId == info.SessionId))
            {
                listErrors.Errors.Add(new Error()
                {
                    Status = "400", Title = "Invalid sessionId"
                });
                return(BadRequest(listErrors));
            }

            //  Был ли уже оплачен платёж?
            if (repository.Receipts.Any(receipt => receipt.SessionId == info.SessionId))
            {
                listErrors.Errors.Add(new Error()
                {
                    Status = "400", Title = "Payment has already been made"
                });
                return(BadRequest(listErrors));
            }

            //  Не прошло ли время жизни платёжной сессии?
            PaymentInfo paymentInfo = repository.Payments.First(s => s.SessionId == info.SessionId);
            if (DateTime.Now - paymentInfo.ArrivalTime > TimeSpan.FromSeconds(settings.LifeTimeSession))
            {
                listErrors.Errors.Add(new Error()
                {
                    Status = "400", Title = "The payment session has expired"
                });
            }

            if (listErrors.Errors.Count != 0)
            {
                return(BadRequest(listErrors));
            }

            #endregion

            CardInfo cardInfo = new CardInfo()
            {
                CardNumber         = info.CardNumber,
                CardDate           = cardDate,
                VerificationNumber = info.VerificationNumber,
                PaymentInfo        = paymentInfo
            };
            await repository.SaveCardInfoAsync(cardInfo);

            Receipt receipt = new Receipt()
            {
                SessionId   = paymentInfo.SessionId,
                Amount      = paymentInfo.Amount,
                Description = paymentInfo.Description,
                ArrivalTime = paymentInfo.ArrivalTime,
                CardNumber  = info.CardNumber,
                TimePayment = DateTime.Now
            };
            await repository.SaveReceiptAsync(receipt);

            if (!string.IsNullOrEmpty(info.storeUrl))
            {
                await HttpNotice(info);
            }

            return(Ok(receipt));
        }