Jakiś czas temu firma miała projekt, który wymagał obsługi powiadomień SMS, a potem kupiłem Alibaba Cloud SMS do tworzenia interfejsów SMS. Projekt działa jednak na systemie XP, więc musi być frameworkiem .NET3.5, ale DLL SMS udostępnione przez Alibabę można używać tylko w .NET 4.0 i wyższych, co jest bardzo krępujące, na szczęście Alibaba podała przykład Javy dla HTTP, więc próbowałem napisać metodę wywoływania Alibaba Cloud HTTP w C# zgodnie z kodem Java. Wracając do sedna, przejdź do kodu! (Publikowałem też w CSDN, gwarancja osobistości to nie piracki post, dziękuję) Klasa publiczna SendShort { /// <summary> Metoda wywołań w interfejsie SMS C# /// </summary> <nazwa parametru="URL"></param> /// <returns></returns> public static string GetHtmlFormUrl(string url) { string strRet = null; if (url == null || url. trim(). ToString() == "") { powrót strRet; } String targeturl = URL. trim(). ToString(); spróbuj { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (kompatybilny; MSIE 6.0; Windows NT 5.1)"; HR. Metoda = "GET"; HR. Timeout = 30 * 60 * 1000; WebResponse hs = godzina. GetResponse(); Strumień sr = hs. GetResponseStream(); StreamReader ser = nowy StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } złapanie (Wyjątek ex) { strRet = "SMS wysłany niepowodzeniem!" +ex. Komunikat; } powrót strRet; } /// <summary> Sprawdź, czy numer komórkowy jest prawidłowy /// </summary> <nazwa parametru="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> Kod weryfikacyjny SMS /// </summary> <nazwa parametru="mobilny"></param> <nazwa parametru="kod"></param> /// <returns></returns> publiczny ciąg statyczny SignDemo (string mobile, kod int) { string accessKeyId = "Twój accessKeyId"; string accessSecret = "twój accessSecret"; string nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); Czas GTM Dictionary<string, string> keyValues = nowy Dictionary<string, string>(); Deklaruj słownik 1. Parametry systemu 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"); można zastąpić XML
2. Parametry API biznesowego keyValues.Add("Action", "SendSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", telefon komórkowy); keyValues.Add("SignName", "Your Signature"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Twój numer szablonu"); keyValues.Add("OutId", "123");
3. Usuń słowo kluczowe charakterystyczne if (keyValues.ContainsKey("Signature")) { keyValues.Reremove ("Signature"); }
4. Sortowanie kluczy parametrów Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Skonstruuj ciąg znaków StringBuilder builder = nowy StringBuilder(); foreach (element var w ascDic) { jeśli (pozycja. Key == "SignName") {
} else { Budowniczcie. Dodaj ("&"). Dodaj(specialUrlEncode(item. Key)). Dodaj ("="). Dodaj(specialUrlEncode(item. Value)); } jeśli (pozycja. Key == "RegionId") { Budowniczcie. Dodaj ("&"). Dodaj(specialUrlEncode("SignName")). Dodaj ("="). Append(specialUrlEncode(keyValues["SignName"]); } } string sorteQueryString = builder. ToString(). Podciąg(1);
StringBuilder stringToSign = nowy StringBuilder(); stringToSign.Append("GET"). Dołącz ("&"); stringToSign.Append(specialUrlEncode("/")). Dołącz ("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Podpis powinien być również zakodowany specjalnym adresem URL na końcu string signture = specialUrlEncode(Sign); Na koniec wydrukuj adres URL prawdziwego żądania GET string url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; string result = GetHtmlFormUrl(url); Zwróć wynik; } /// <summary> Kodowanie URL /// </summary> <nazwa parametru="wartość"></param> /// <returns></returns> public static string specialUrlEncode(string temp) {
StringBuilder stringBuilder = nowy StringBuilder(); dla (int i = 0; Ja < temperaturę. Długość; i++) { Struna T = Temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); jeśli (t == k) { stringBuilder.Append(t); } else { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Zastąp("+", "%20"). Zamień ("*", "%2A"). Zastąp("%7E", "~"); } /// <summary> HMACSHA1 podpis /// </summary> <nazwa paramu="accessSecret"></param> <nazwa parametru="stringToSign"></param> /// <returns></returns> publiczny ciąg statyczny MySign(string accessSecret, stringToSign) { spróbuj { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); stringbytebyte = BitConverter.ToString(hashBytes, 0). Replace("-", string. Pusty). ToLower(); bajt[] bajty = strToHexByte(stringbyte); return Convert.ToBase64String(bytes); } złapanie (Wyjątek ex) {
Rzuć ex; } } /// <summary> Tablica łańcuchowa do 16-bajtowej /// </summary> <nazwa parametru="hexString"></param> /// <returns></returns> prywatny bajt statyczny[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); if (hexString.Length % 2) != 0) hexString += " "; bajt[] returnBytes = nowy bajt[hexString.Length / 2]; dla (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mechanizmy przetwarzania wiadomości /// </summary> <nazwa parametru="str"></param> /// <returns></returns> prywatny statyczny ciąg MessageHandle(string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); wynik ciągu = ""; przełącznik (wiadomość. Kod) { przypadek "OK": result = "SMS wysłany pomyślnie!"; przerwę; Sprawa "ISP. RAM_PERMISSION_DENY": result = "Pozwolenie na RAM DEN"; przerwę; Sprawa "ISV. OUT_OF_SERVICE": rezultat = "Przestoje biznesowe"; przerwę; Sprawa "ISV. PRODUCT_UN_SUBSCRIPT": result = "Klienci Alibaba Cloud, którzy nie otworzyli jeszcze produktów komunikacyjnych w chmurze"; przerwę; Sprawa "ISV. PRODUCT_UNSUBSCRIBE": result = "Produkt nie otwarty"; przerwę; Sprawa "ISV. ACCOUNT_NOT_EXISTS": result = "Konto nie istnieje"; przerwę; Sprawa "ISV. ACCOUNT_ABNORMAL": result = "Wyjątek od konta"; przerwę; Przypadek "isv.SMS_TEMPLATE_ILLEGAL": result = "Szablon SMS jest nielegalny"; przerwę; Przypadek "isv.SMS_SIGNATURE_ILLEGAL": result = "Podpis SMS nie jest legalny"; przerwę; Sprawa "ISV. INVALID_PARAMETERS": result = "wyjątek parametrów"; przerwę; Sprawa "ISV. MOBILE_NUMBER_ILLEGAL": rezultat = "nielegalny numer telefonu komórkowego"; przerwę; Sprawa "ISV. MOBILE_COUNT_OVER_LIMIT": wynik = "Liczba numerów komórkowych przekracza limit"; przerwę; Sprawa "ISV. TEMPLATE_MISSING_PARAMETERS": result = "brakująca zmienna szablonu"; przerwę; Sprawa "ISV. BUSINESS_LIMIT_CONTROL": wynik = "Bieżący biznes"; przerwę; Sprawa "ISV. INVALID_JSON_PARAM": result = "Parametr JSON nie jest legalny, akceptowane są tylko wartości ciągu znaków"; przerwę; Sprawa "ISV. PARAM_LENGTH_LIMIT": result = "Parametr przekracza limit długości"; przerwę; Sprawa "ISV. PARAM_NOT_SUPPORT_URL": result = "URL nie obsługiwany"; przerwę; Sprawa "ISV. AMOUNT_NOT_ENOUGH": rezultat = "Niewystarczające saldo na koncie"; przerwę; Sprawa "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Zmienne szablonowe zawierają nielegalne słowa kluczowe"; przerwę; } Zwróć wynik; } }
|