Pred časom mala firma projekt, ktorý potreboval používať SMS notifikácie, a potom som si kúpil Alibaba Cloud SMS na vývoj SMS rozhraní. Projekt však beží na systéme XP, takže projekt musí byť frameworkom .NET3.5, ale SMS DLL od Alibaby sa dá použiť len v .net 4.0 a vyšších, čo je veľmi trápne, našťastie Alibaba poskytla príklad Javy pre HTTP, tak som sa pokúsil napísať metódu volania Alibaba Cloud HTTP v C# podľa java kódu. Vráťme sa k veci, choď ku kódu! (Publikoval som aj na CSDN, záruka osobnosti nie je pirátsky príspevok, ďakujem) verejná trieda SendShort { /// <summary> SMS rozhranie C# metóda volania /// </summary> <názov parametra="URL"></param> /// <returns></returns> public static string GetHtmlFormUrl(string url) { string strRet = null; ak (url == null || url. trim(). ToString() == "") { return strRet; } String targeturl = URL. trim(). ToString(); Skús { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); hr. UserAgent = "Mozilla/4.0 (kompatibilný; MSIE 6.0; Windows NT 5.1)"; hr. Metóda = "ZÍSKAŤ"; hr. Timeout = 30 * 60 * 1000; WebResponse hs = hod. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = nový StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } chytiť (Výnimka ex) { strRet = "SMS odoslaná zlyhala!" +napr. Správa; } return strRet; } /// <summary> Overte, či je mobilné číslo legitímne /// </summary> <názov parametra="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 overovací kód /// </summary> <názov parametra="mobil"></param> <názov parametra="kód"></param> /// <returns></returns> public static string SignDemo (string mobile, int code) { string accessKeyId = "Your accessKeyId"; string accessSecret = "your accessSecret"; string nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); GTM čas Dictionary<string, string> keyValues = nový Dictionary<string, string>(); Vyhláste slovník 1. Systémové parametre 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žno nahradiť XML
2. Parametre Business API keyValues.Add("Action", "SendSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", mobil); keyValues.Add("SignName", "Your Signature"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Your Template Number"); keyValues.Add("OutId", "123");
3. Odstrániť podpisové kľúčové slovo if (keyValues.ContainsKey("Signature")) { keyValues.Reremove ("Signature"); }
4. Triedenie kľúčov podľa parametrov Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Konštruujte reťazec, ktorý sa má podpísať StringBuilder builder = nový StringBuilder(); foreach (var položka v ascDic) { ak (položka. Key == "SignName") {
} else { staviteľ. Príloha ("&"). Append(specialUrlEncode(item. Key)). Pridať ("="). Append(specialUrlEncode(item. Hodnota)); } ak (položka. Key == "RegionId") { staviteľ. Príloha ("&"). Append(specialUrlEncode("SignName")). Pridať ("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = builder. ToString(). Podreťazec(1);
StringBuilder stringToSign = nový StringBuilder(); stringToSign.Append("GET"). Príloha ("&"); stringToSign.Append(specialUrlEncode("/")). Príloha ("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Podpis by mal byť tiež zakódovaný so špeciálnou URL na konci string signture = specialUrlEncode(Sign); Nakoniec vytlačte URL legitímnej požiadavky GET string url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; string result = GetHtmlFormUrl(url); vrátiť výsledok; } /// <summary> Kódovanie URL /// </summary> <názov parametra="hodnota"></param> /// <returns></returns> public static string specialUrlEncode(string temp) {
StringBuilder stringBuilder = nový StringBuilder(); pre (int i = 0; Ja < dočasnú teplotu. Dĺžka; i++) { Struna t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); ak (t == k) { stringBuilder.Append(t); } else { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Replace("+", "%20"). Nahradiť ("*", "%2A"). Nahradiť ("%7E", "~"); } /// <summary> HMACSHA1 podpis /// </summary> <názov parametra="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> public static string MySign(string accessSecret, string stringToSign) { Skús { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); string stringbyte = BitConverter.ToString(hashBytes, 0). Replace("-", reťazec. Prázdne). ToLower(); byte[] bytes = strToHexByte(stringbyte); return Convert.ToBase64String(bytes); } chytiť (Výnimka ex) {
Vyhoď ex; } } /// <summary> Pole reťazcov na 16 bajtov /// </summary> <názov parametra="hexString"></param> /// <returns></returns> súkromný statický bajt[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); ak ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = new byte[hexString.Length / 2]; pre (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mechanizmy spracovania správ /// </summary> <názov parametra="str"></param> /// <returns></returns> súkromný statický reťazec MessageHandle(string str) { MessageModel správa = JsonConvert.DeserializeObject<MessageModel>(str); string result = ""; Prepínač (správa. Kód) { prípad "OK": výsledok = "SMS odoslaná úspešne!"; prestávka; Prípad "ISP. RAM_PERMISSION_DENY": výsledok = "RAM povolenie ZAKÁZANÉ"; prestávka; Prípad "ISV. OUT_OF_SERVICE": výsledok = "Výpadky podnikania"; prestávka; Prípad "ISV. PRODUCT_UN_SUBSCRIPT": výsledok = "Zákazníci Alibaba Cloud, ktorí ešte neotvorili cloudové komunikačné produkty"; prestávka; Prípad "ISV. PRODUCT_UNSUBSCRIBE": výsledok = "Produkt neotvorený"; prestávka; Prípad "ISV. ACCOUNT_NOT_EXISTS": výsledok = "Účet neexistuje"; prestávka; Prípad "ISV. ACCOUNT_ABNORMAL": výsledok = "Výnimka účtu"; prestávka; Prípad "isv.SMS_TEMPLATE_ILLEGAL": výsledok = "SMS šablóna nie je legálna"; prestávka; Prípad "isv.SMS_SIGNATURE_ILLEGAL": výsledok = "SMS podpis nie je legálny"; prestávka; Prípad "ISV. INVALID_PARAMETERS": výsledok = "výnimka parametra"; prestávka; Prípad "ISV. MOBILE_NUMBER_ILLEGAL": výsledok = "nelegálne mobilné telefónne číslo"; prestávka; Prípad "ISV. MOBILE_COUNT_OVER_LIMIT": výsledok = "Počet mobilných čísel presahuje limit"; prestávka; Prípad "ISV. TEMPLATE_MISSING_PARAMETERS": výsledok = "chýbajúca premenná šablóny"; prestávka; Prípad "ISV. BUSINESS_LIMIT_CONTROL": výsledok = "Obchodný prúd"; prestávka; Prípad "ISV. INVALID_JSON_PARAM": result = "JSON parameter nie je legitímny, akceptujú sa len hodnoty reťazcov"; prestávka; Prípad "ISV. PARAM_LENGTH_LIMIT": výsledok = "Parameter presahuje dĺžkový limit"; prestávka; Prípad "ISV. PARAM_NOT_SUPPORT_URL": výsledok = "URL nie podporovaná"; prestávka; Prípad "ISV. AMOUNT_NOT_ENOUGH": výsledok = "Nedostatočný zostatok na účte"; prestávka; Prípad "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Šablónové premenné obsahujú nelegálne kľúčové slová"; prestávka; } vrátiť výsledok; } }
|