Před časem měla firma projekt, který potřeboval používat SMS notifikace, a pak jsem si koupil Alibaba Cloud SMS pro vývoj SMS rozhraní. Ale projekt běží na systému XP, takže projekt musí být framework .NET3.5, ale SMS DLL dané Alibabou lze použít pouze ve .net 4.0 a vyšších, což je velmi trapné, naštěstí Alibaba uvedla příklad Javy pro HTTP, takže jsem se pokusil napsat metodu volání Alibaba Cloud HTTP v C# podle java kódu. Zpátky k věci, jdi ke kódu! (Publikoval jsem také na CSDN, záruka osobnosti není pirátský příspěvek, děkuji) veřejná třída SendShort { /// <summary> SMS rozhraní C# metoda volání /// </summary> <název parametru="URL"></param> /// <returns></returns> public static string GetHtmlFormUrl(string url) { string strRet = null; if (url == null || url. trim(). ToString() == "") { zpět strRet; } String targeturl = URL. trim(). ToString(); zkus { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (kompatibilní; MSIE 6.0; Windows NT 5.1)"; HR. Metoda = "DOSTAŇ"; HR. Timeout = 30 * 60 * 1000; WebResponse hs = hod. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = nový StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } chytit (Výjimka ex) { strRet = "SMS odeslána neuspěla!" +ex. Zpráva; } zpět strRet; } /// <summary> Ověřte, že je mobilní číslo legitimní /// </summary> <název 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> SMS ověřovací kód /// </summary> <název parametru="mobil"></param> <název parametru="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>(); Deklarujte slovník 1. Parametry systému 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"); lze nahradit XML
2. Parametry 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", "vaše číslo šablony"); keyValues.Add("OutId", "123");
3. Odstraňte podpisové klíčové slovo if (keyValues.ContainsKey("Signature")) { keyValues.Reremove ("Signature"); }
4. Třídění klíčů podle parametrů Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Sestavte řetězec, který má být podepsán StringBuilder builder = nový StringBuilder(); foreach (var položka v ascDic) { pokud (položka. Key == "SignName") {
} jinak { stavitel. Příloha ("&"). Append(specialUrlEncode(item. Key)). Příloha ("="). Append(specialUrlEncode(item. Value)); } pokud (položka. Key == "RegionId") { stavitel. Příloha ("&"). Append(specialUrlEncode("SignName")). Příloha ("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = builder. ToString(). Podřetěz(1);
StringBuilder stringToSign = nový StringBuilder(); stringToSign.Append("GET"). Příloha ("&"); stringToSign.Append(specialUrlEncode("/")). Příloha ("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Podpis by měl být také zakódován speciální URL na konci string signture = specialUrlEncode(Sign); Nakonec vytiskněte URL legitimního požadavku GET string url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; string result = GetHtmlFormUrl(url); Výsledek vrátit; } /// <summary> Kódování URL /// </summary> <název parametru="hodnota"></param> /// <returns></returns> public static string specialUrlEncode(string temp) {
StringBuilder stringBuilder = nový StringBuilder(); pro (int i = 0; Já < dočasnou teplotu. Délka; i++) { struna t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); pokud (t == k) { stringBuilder.Append(t); } jinak { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Nahrazení ("+", "%20"). Nahrazení ("*", "%2A"). Nahrazení ("%7E", "~"); } /// <summary> HMACSHA1 podpis /// </summary> <název parametru="accessSecret"></param> <název parametru="stringToSign"></param> /// <returns></returns> public static string MySign(string accessSecret, string stringToSign) { zkus { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); stringbytebyte = BitConverter.ToString(hashBytes, 0). Nahraďte ("-", strunu. Prázdné). ToLower(); byte[] bytes = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } chytit (Výjimka ex) {
vyhoďte ex; } } /// <summary> Pole řetězce na 16 bajtů /// </summary> <název parametru="hexString"></param> /// <returns></returns> soukromý statický bajt[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += " "; bajt[] returnBytes = nový bajt[hexString.Length / 2]; pro (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mechanismy zpracování zpráv /// </summary> <název parametru="str"></param> /// <returns></returns> soukromý statický řetězec MessageHandle(string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); string result = ""; Switch (zpráva. Kód) { případ "OK": výsledek = "SMS odeslána úspěšně!"; pauza; Případ "ISP. RAM_PERMISSION_DENY": výsledek = "RAM Permission ZAKÁZÁNO"; pauza; Případ "ISV. OUT_OF_SERVICE": výsledek = "Výpadky podnikání"; pauza; Případ "ISV. PRODUCT_UN_SUBSCRIPT": result = "Zákazníci Alibaba Cloud, kteří neotevřeli cloudové komunikační produkty"; pauza; Případ "ISV. PRODUCT_UNSUBSCRIBE": výsledek = "Produkt nebyl otevřen"; pauza; Případ "ISV. ACCOUNT_NOT_EXISTS": výsledek = "Účet neexistuje"; pauza; Případ "ISV. ACCOUNT_ABNORMAL": výsledek = "Výjimka účtu"; pauza; Případ "isv.SMS_TEMPLATE_ILLEGAL": result = "SMS šablona není legální"; pauza; Případ "isv.SMS_SIGNATURE_ILLEGAL": result = "SMS podpis není legální"; pauza; Případ "ISV. INVALID_PARAMETERS": výsledek = "výjimka parametrů"; pauza; Případ "ISV. MOBILE_NUMBER_ILLEGAL": výsledek = "nelegální mobilní telefonní číslo"; pauza; Případ "ISV. MOBILE_COUNT_OVER_LIMIT": výsledek = "Počet mobilních čísel překračuje limit"; pauza; Případ "ISV. TEMPLATE_MISSING_PARAMETERS": výsledek = "chybějící proměnná šablony"; pauza; Případ "ISV. BUSINESS_LIMIT_CONTROL": výsledek = "Obchodní proud"; pauza; Případ "ISV. INVALID_JSON_PARAM": result = "Parametr JSON není legitimní, přijímají se pouze hodnoty řetězců"; pauza; Případ "ISV. PARAM_LENGTH_LIMIT": výsledek = "Parametr překračuje délkový limit"; pauza; Případ "ISV. PARAM_NOT_SUPPORT_URL": výsledek = "URL není podporováno"; pauza; Případ "ISV. AMOUNT_NOT_ENOUGH": výsledek = "Nedostatečný zůstatek na účtu"; pauza; Případ "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Šablonové proměnné obsahují nelegální klíčová slova"; pauza; } Výsledek vrátit; } }
|