public IActionResult ResultUrl(string IncSum, string OutSum, string InvId, string SignatureValue, string Shp_id, string Shp_type)
        {
            if (!string.IsNullOrWhiteSpace(SignatureValue))
            {
                var sMrchPass2 = infoOptions.Value.Robokassa.Pass2;

                string sCrc = TextUtilites.MD5Hash($"{OutSum}:{InvId}:{sMrchPass2}:Shp_id={Shp_id}:Shp_type={Shp_type}");

                if (sCrc.ToLower() == SignatureValue.ToLower())
                {
                    double dOutSum;

                    if (double.TryParse(OutSum, NumberStyles.Number, CultureInfo.InvariantCulture, out dOutSum))
                    {
                        double dIncSum;
                        var    sIncSum = IncSum;
                        if (double.TryParse(IncSum, NumberStyles.Number, CultureInfo.InvariantCulture, out dIncSum))
                        {
                            sIncSum = dIncSum.ToString("0.00", CultureInfo.InvariantCulture);
                        }
                        usersService.AddProlongationPayment(Shp_id, dOutSum, Shp_type, $"Robokassa: сумма с комиссией {sIncSum}");
                        smsService.SendSms(infoOptions.Value.SmsNotifyPhone, $"Payment: {dOutSum.ToString("0.00", CultureInfo.InvariantCulture)}");
                    }
                    else
                    {
                        logger.Error($"Invalid OutSum on payment: {OutSum}");
                    }
                }
                else
                {
                    logger.Error($"Invalid payment: [{OutSum}:{InvId}:[PASS2]:Shp_id={Shp_id}:Shp_type={Shp_type}] <> {SignatureValue}");
                }
            }

            return(Content($"OK{InvId}"));
        }
Esempio n. 2
0
        private async Task <String> Send(String from, String[] to, String text, DateTime dateTime, EnumAuthenticationTypes authType)
        {
            // TODO: Нужно проверить хватит ли баланса. Баланса не хватит, чтобы отправить на все номера - сообщение будет уничтожено (его не получит никто).
            String result = String.Empty;

            if (to.Length < 1)
            {
                logger.Error("SmsRu: to=Неверные входные данные - массив пуст.");
                return(result);
            }
            if (to.Length > 100)
            {
                logger.Error("SmsRu: to=Неверные входные данные - слишком много элементов (больше 100) в массиве.");
                return(result);
            }
            if (dateTime == DateTime.MinValue)
            {
                dateTime = DateTime.Now;
            }
            // Лишнее, не надо генерировать это исключение. Если время меньше текущего времени, сообщение отправляется моментально - правило на сервере.
            // if ((DateTime.Now - dateTime).Days > new TimeSpan(7, 0, 0, 0).Days)
            //    throw new ArgumentOutOfRangeException("dateTime", "Неверные входные данные - должно быть не больше 7 дней с момента подачи запроса.");

            String auth       = String.Empty;
            String parameters = String.Empty;
            String answer     = String.Empty;
            String recipients = String.Empty;
            String token      = String.Empty;

            foreach (String item in to)
            {
                recipients += item + ",";
            }

            recipients = recipients.Substring(0, recipients.Length - 1);

            logger.Info($"SmsRu: Отправка СМС получателям: {recipients}");

            try
            {
                token = await GetToken();

                String sha512     = HashCodeHelper.GetSHA512Hash(String.Format("{0}{1}", password, token)).ToLower();
                String sha512wapi = HashCodeHelper.GetSHA512Hash(String.Format("{0}{1}{2}", password, token, apiId)).ToLower();

                if (authType == EnumAuthenticationTypes.Simple)
                {
                    auth = String.Format("api_id={0}", apiId);
                }
                if (authType == EnumAuthenticationTypes.Strong)
                {
                    auth = String.Format("login={0}&token={1}&sha512={2}", login, token, sha512);
                }
                if (authType == EnumAuthenticationTypes.StrongApi)
                {
                    auth = String.Format("login={0}&token={1}&sha512={2}", login, token, sha512wapi);
                }

                parameters = String.Format("{0}&to={1}&text={2}&from={3}", auth, recipients, text, from);
                if (dateTime != DateTime.MinValue)
                {
                    parameters += "&time=" + TimeHelper.GetUnixTime(dateTime);
                }
                if (!string.IsNullOrWhiteSpace(partnerId))
                {
                    parameters += "&partner_id=" + partnerId;
                }
                if (translit == true)
                {
                    parameters += "&translit=1";
                }
                if (test == true)
                {
                    parameters += "&test=1";
                }
                logger.Info($"SmsRu: Запрос: {parameters}");

                WebRequest request = WebRequest.Create(sendUrl);
                request.ContentType = "application/x-www-form-urlencoded";
                request.Method      = "POST";
                Byte[] bytes = Encoding.UTF8.GetBytes(parameters);
                request.Headers["ContentLength"] = bytes.Length.ToString();
                using (Stream os = await request.GetRequestStreamAsync())
                {
                    os.Write(bytes, 0, bytes.Length);
                }

                using (WebResponse resp = await request.GetResponseAsync())
                {
                    if (resp == null)
                    {
                        return(null);
                    }
                    using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                    {
                        answer = sr.ReadToEnd().Trim();
                    }
                }

                logger.Info($"SmsRu: Ответ: {answer}");

                String[] lines = answer.Split(new String[] { "\n" }, StringSplitOptions.None);
                if (Convert.ToInt32(lines[0]) == Convert.ToInt32(ResponseOnSendRequest.MessageAccepted))
                {
                    result = answer;
                }
                else
                {
                    result = String.Empty;
                }
            }
            catch (Exception ex)
            {
                logger.Error("SmsRu: Возникла непонятная ошибка", ex);
            }

            return(result);
        }