Некоторое время назад у компании был проект, в котором нужно было использовать SMS-уведомления, и тогда я купил Alibaba Cloud SMS для разработки SMS-интерфейсов. Но проект работает на системе XP, поэтому он должен быть фреймворком .NET3.5, а SMS-DLL, предоставленный Alibaba, может использоваться только в .NET 4.0 и выше, что очень неловко, к счастью, Alibaba привела пример Java для HTTP, поэтому я попытался написать метод вызова Alibaba Cloud HTTP на C# в соответствии с java-кодом. Вернёмся к сути, переходите к коду! (Я также публиковался в CSDN, гарантия личности — это не пиратский пост, спасибо) публичный класс SendShort { /// <summary> Метод вызова SMS-интерфейса C# /// </summary> <param name="url"></param> /// <returns></returns> публичная статическая строка GetHtmlFormUrl (строка url) { string strRet = null; если (url == null || url. Trim(). ToString() == "") { возвращать strRet; } String targeturl = url. Trim(). ToString(); Попробуй { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (совместим; MSIE 6.0; Windows NT 5.1)»; HR. Метод = «GET»; HR. Тайм-аут = 30 * 60 * 1000; WebResponse hs = ч. GetResponse(); Поток sr = hs. GetResponseStream(); StreamReader ser = новый StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } catch (исключение, например) { strRet = «SMS не удалось!» +ex. Сообщение; } возвращать strRet; } /// <summary> Проверьте, что номер мобильного телефона легитимен /// </summary> <param name="str_handset"></param> /// <returns></returns> публичный статический bool IsHandset (string str_handset) { return System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> Код проверки SMS /// </summary> <param name="mobile"></param> <param name="код"></param> /// <returns></returns> публичная статическая строка SignDemo (строка мобильная, int код) { строка accessKeyId = «Ваш accessKeyId»; строка accessSecret = «ваш accessSecret»; string nowDate = DateTime.Now.toUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); Время GTM Словарь<строка, строка> ключЗначения = новый словарь<строка, строка>(); Объявить словарь 1. Параметры системы keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add ("SignatureNonce", Guid.NewGuid(). ToString()); keyValues.Add("AccessKeyId", accessKeyId); keyValues.Add ("SignatureVersion", "1.0"); keyValues.Add ("Timestamp", nowDate); keyValues.Add("Format", "Json"); может быть заменён на XML
2. Параметры бизнес-API keyValues.Add («Действие», «Отправить SMS»); keyValues.Add ("Версия", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", мобильный телефон); keyValues.Add("SignName", "Ваша подпись"); keyValues.Add("TemplateParam", "{\"code\":\"" + код + "\"}"); keyValues.Add("TemplateCode", "Ваш номер шаблона"); keyValues.Add("OutId", "123");
3. Удалите ключевое слово с подписью если (keyValues.ContainsKey("Signature")) { keyValues.Redele(«Подпись»); }
4. Сортировка ключей параметров Словарь<строка, строка> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Постройте строку для подписи Конструктор StringBuilder = новый StringBuilder(); foreach (var элемент в ascDic) { если (пункт. Ключ == «SignName») {
} Другое { Строитель. Приложение("&"). Append(specialUrlEncode(item. Ключ)). Append("="). Append(specialUrlEncode(item. Value)); } если (пункт. Ключ == «RegionId») { Строитель. Приложение("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = builder. ToString(). Substring(1);
StringBuilder stringToSign = новый StringBuilder(); stringToSign.Append("GET"). Append("&"); stringToSign.Append(specialUrlEncode("/")). Append("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
строковый знак = MySign(accessSecret + "&", stringToSign.ToString()); 6. Подпись также должна быть закодирована специальным URL в конце string signture = specialUrlEncode(Sign); Наконец, распечатайте URL легитимного запроса GET String url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; string result = GetHtmlFormUrl(url); результат возврата; } /// <summary> Кодирование URL /// </summary> <param name="значение"></param> /// <returns></returns> public static string specialUrlEncode(string temp) {
StringBuilder stringBuilder = новый StringBuilder(); для (int i = 0; Я < временно. Длина; i++) { Строка t = temp[i]. ToString(); строка k = HttpUtility.UrlEncode(t, Encoding.UTF8); если (t == k) { stringBuilder.Append(t); } Другое { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Заменить("+", "%20"). Заменить("*", "%2A"). Заменить ("%7E", "~"); } /// <summary> HMACSHA1 подпись /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> публичная статическая строка MySign(string accessSecret, string stringToSign) { Попробуй { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); stringbyte = BitConverter.ToString(hashBytes, 0). Заменить("-", струну. Пусто). ToLower(); byte[] bytes = strToToHexByte(stringbyte); вернуть Convert.ToBase64String(bytes); } catch (исключение, например) {
брось бывшего; } } /// <summary> Строка в массив на 16 байт /// </summary> <param name="hexString"></param> /// <returns></returns> приватный статический байт[] strToToHexByte(строка hexString) { hexString = hexString.Replace(" ", ""); если ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = новый байт[hexString.Length / 2]; для (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Механизмы обработки сообщений /// </summary> <param name="str"></param> /// <returns></returns> приватная статическая строка MessageHandle(строка str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); результат строки = ""; Switch (сообщение. Код) { Случай «ОК»: результат = «SMS отправлен успешно!»; перерыв; Дело «ISP. RAM_PERMISSION_DENY»: результат = «ОТКЛОНЕНИЕ разрешения на использование оперативной памяти»; перерыв; Дело «ISV. OUT_OF_SERVICE»: результат = «Простой бизнеса»; перерыв; Дело «ISV. PRODUCT_UN_SUBSCRIPT»: результат = «Клиенты Alibaba Cloud, которые не открывали облачные коммуникационные продукты»; перерыв; Дело «ISV. PRODUCT_UNSUBSCRIBE»: результат = «Продукт не открыт»; перерыв; Дело «ISV. ACCOUNT_NOT_EXISTS»: результат = «Аккаунт не существует»; перерыв; Дело «ISV. ACCOUNT_ABNORMAL»: результат = «Исключение для аккаунта»; перерыв; Дело «isv.SMS_TEMPLATE_ILLEGAL»: результат = «Шаблон SMS не является легальным»; перерыв; Случай «isv.SMS_SIGNATURE_ILLEGAL»: результат = «SMS-подпись нелегальна»; перерыв; Дело «ISV. INVALID_PARAMETERS»: результат = «исключение параметров»; перерыв; Дело «ISV. MOBILE_NUMBER_ILLEGAL»: результат = «нелегальный номер мобильного телефона»; перерыв; Дело «ISV. MOBILE_COUNT_OVER_LIMIT»: результат = «Количество мобильных номеров превышает лимит»; перерыв; Дело «ISV. TEMPLATE_MISSING_PARAMETERS»: результат = «отсутствующая переменная шаблона»; перерыв; Дело «ISV. BUSINESS_LIMIT_CONTROL»: результат = «Деловой текущий»; перерыв; Дело «ISV. INVALID_JSON_PARAM»: результат = «Параметр JSON не является легитимным, принимаются только значения строк»; перерыв; Дело «ISV. PARAM_LENGTH_LIMIT»: результат = «Параметр превышает предел длины»; перерыв; Дело «ISV. PARAM_NOT_SUPPORT_URL»: результат = «URL не поддерживается»; перерыв; Дело «ISV. AMOUNT_NOT_ENOUGH»: результат = «Недостаток баланса счета»; перерыв; Дело «ISV. TEMPLATE_PARAMS_ILLEGAL»: результат = «Переменные шаблона содержат незаконные ключевые слова»; перерыв; } результат возврата; } }
|