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}")); }
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); }