Преди известно време компанията имаше проект, който трябваше да използва 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> public static 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="мобилен"></param> <param name="код"></param> /// <returns></returns> публичен статичен низ SignDemo (мобилен низ, int код) { низов 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. Параметри на бизнес 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.Redele("Подпис"); }
4. Сортиране на ключове по параметри Речник<низ, низ> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Конструирайте струната, която ще бъде подписана StringBuilder builder = нов StringBuilder(); foreach (var елемент в ascDic) { ако (елемент. Ключ == "SignName") {
} Друго { Строител. Append("&"). Append(specialUrlEncode(предмет. Ключ)). Append("="). Append(specialUrlEncode(предмет. Стойност)); } ако (елемент. Ключ == "RegionId") { Строител. Append("&"). Append(specialUrlEncode("SignName")). Append("="). 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 = GetHtmlFormUrl(url); резултат от връщане; } /// <summary> URL кодиране /// </summary> <param name="стойност"></param> /// <returns></returns> public static string specialUrlEncode(temp на струна) {
StringBuilder stringBuilder = нов StringBuilder(); за (int i = 0; Аз < временно. Дължина; i++) { Струна t = temp[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> публичен статичен низ MySign(низов 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(); байт[] байтове = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } catch (Изключение напр.) {
хвърли бивши; } } /// <summary> Масив от низ към 16 байта /// </summary> <param name="hexString"></param> /// <returns></returns> private static byte[] 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(string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); резултат от струна = ""; Switch (съобщение. Код) { Случай "ОК": резултат = "SMS изпратено успешно!"; прекъсване; Случай "Isp. RAM_PERMISSION_DENY": резултат = "ОТКАЗ от разрешение за RAM"; прекъсване; Дело "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": result = "изключение от параметъра"; прекъсване; Дело "ISV. MOBILE_NUMBER_ILLEGAL": резултат = "незаконен мобилен телефонен номер"; прекъсване; Дело "ISV. MOBILE_COUNT_OVER_LIMIT": резултат = "Броят на мобилните номера надвишава лимита"; прекъсване; Дело "ISV. TEMPLATE_MISSING_PARAMETERS": резултат = "липсваща променлива в шаблона"; прекъсване; Дело "ISV. BUSINESS_LIMIT_CONTROL": резултат = "Бизнес текущи"; прекъсване; Дело "ISV. INVALID_JSON_PARAM": result = "JSON параметърът не е легитимен, приемат се само стойности на низове"; прекъсване; Дело "ISV. PARAM_LENGTH_LIMIT": резултат = "Параметърът надвишава лимита на дължината"; прекъсване; Дело "ISV. PARAM_NOT_SUPPORT_URL": резултат = "URL не се поддържа"; прекъсване; Дело "ISV. AMOUNT_NOT_ENOUGH": резултат = "Недостатъчно баланс по сметката"; прекъсване; Дело "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Променливите в шаблона съдържат незаконни ключови думи"; прекъсване; } резултат от връщане; } }
|