Деякий час тому компанія мала проєкт, який потребував використання 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 = hr. 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) { повернути 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="code"></param> /// <returns></returns> публічний статичний рядок SignDemo (рядок мобільний, int code) { рядок accessKeyId = "Ваш accessKeyId "; string 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. Параметри Business API keyValues.Add("Дія", "SendSms"); 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("Підпис")) { keyValues.Remove("Підпис"); }
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(specialUrlEncode(item. Value)); } якщо (пункт. Ключ == «RegionId») { Будівельник. Додаток("&"). Додати(specialUrlEncode("SignName")). Додати("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = builder. ToString(). Підстрінг(1);
StringBuilder stringToSign = новий StringBuilder(); stringToSign.Append("GET"). Append("&"); stringToSign.Append(specialUrlEncode("/")). Append("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string sign = 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(temp string) {
StringBuilder stringBuilder = новий StringBuilder(); для (int i = 0; Я < тимчасово. Довжина; i++) { Струна t = темп[i]. ToString(); string 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> public static string 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(string hexString) { hexString = hexString.Replace(" ", ""); якщо ((hexString.Length % 2) != 0) hexString += " "; байт[] 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(string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); результат рядка = ""; Switch (повідомлення. Код) { Випадок «OK»: результат = "SMS успішно надіслано!"; перерва; Справа: «Ісп. 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": результат = «Змінні шаблону містять незаконні ключові слова»; перерва; } результат повернення; } }
|