Vor einiger Zeit hatte das Unternehmen ein Projekt, das SMS-Benachrichtigungen verwenden musste, und dann habe ich eine Alibaba Cloud SMS für die Entwicklung der SMS-Schnittstelle gekauft. Aber das Projekt läuft auf dem XP-System, also muss das Projekt das Framework von .NET3.5 sein, aber die von Alibaba bereitgestellte SMS-DLL kann nur in .NET 4.0 und höher verwendet werden, was sehr peinlich ist. Glücklicherweise hat Alibaba ein Beispiel für Java für HTTP gegeben, also habe ich versucht, die Methode zu schreiben, Alibaba Cloud HTTP in C# gemäß dem Java-Code zu rufen. Zurück zum Punkt: Geh zum Code! (Ich habe auch in CSDN veröffentlicht, Personality Guarantee ist kein Raubkopie, danke.) öffentliche Klasse SendShort { /// <summary> SMS-Schnittstelle C#-Aufrufmethode /// </summary> <param name="url"></param> /// <returns></returns> öffentliche statische Zeichenkette GetHtmlFormUrl(String-URL) { string strRet = null; wenn (URL == null || URL. Trim(). ToString() == "") { return strRet; } String-Targeturl = URL. Trim(). ToString(); Versuch es { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (kompatibel; MSIE 6.0; Windows NT 5.1)"; HR. Methode = "GET"; HR. Auszeit = 30 * 60 * 1000; WebResponse hs = st. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = neuer StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } catch (Ausnahme z. B.) { strRet = "SMS gesendet fehlgeschlagen!" +ex. Nachricht; } return strRet; } /// <summary> Überprüfen Sie, ob die Handynummer legitim ist /// </summary> <param name="str_handset"></param> /// <returns></returns> öffentlicher statischer 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-Verifizierungscode /// </summary> <param name="mobile"></param> <param name="code"></param> /// <returns></returns> öffentlicher statischer String SignDemo (String mobile, int-Code) { String accessKeyId = "Your accessKeyId"; string accessSecret = "dein accessSecret"; String nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); GTM-Zeit Dictionary<string, string> keyValues = neuer Dictionary<string, string>(); Deklarieren Sie ein Wörterbuch 1. Systemparameter 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"); kann durch XML ersetzt werden
2. Geschäfts-API-Parameter 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. Entfernen Sie das Signatur-Schlüsselwort wenn (keyValues.ContainsKey("Signature")) { keyValues.Remove("Signature"); }
4. Parameterschlüsselsortierung Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Konstruiere die zu signierte Zeichenkette StringBuilder Builder = neuer StringBuilder(); foreach (var-Element in ascDic) { wenn (Element. Schlüssel == "SignName") {
} oder { Bauherr. Anhang ("&"). Anhang(specialUrlEncode(item. Schlüssel)). Anhang("="). Anhang(specialUrlEncode(item. Value)); } wenn (Element. Key == "RegionId") { Bauherr. Anhang ("&"). Anhang(specialUrlEncode("SignName")). Anhang("="). Anhang(specialUrlEncode(keyValues["SignName"])); } } String sorteQueryString = Builder. ToString(). Teilstring(1);
StringBuilder stringToSign = neuer StringBuilder(); stringToSign.Append("GET"). Anhang ("&"); stringToSign.Append(specialUrlEncode("/")). Anhang ("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
String Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Die Signatur sollte außerdem mit einer speziellen URL am Ende codiert sein. String-Signture = specialUrlEncode(Sign); Zum Schluss drucken Sie die URL der legitimen GET-Anfrage aus String-URL = "http://dysmsapi.aliyuncs.com/?Signature=" + Signture + Builder; String result = GetHtmlFormUrl(url); Rückgabeergebnis; } /// <summary> URL-Codierung /// </summary> <param name="value"></param> /// <returns></returns> öffentliche statische Zeichenkette speziellUrlEncode(String-Temperatur) {
StringBuilder stringBuilder = neuer StringBuilder(); für (int i = 0; Ich < Temporär. Länge; i++) { Saite t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); wenn (t == k) { stringBuilder.Append(t); } oder { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Replace("+", "%20"). Replace("*", "%2A"). ersetzen("%7E", "~"); } /// <summary> HMACSHA1 Signatur /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> öffentlicher statischer String MySign (String accessSecret, String stringToSign) { Versuch es { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); stringstringbyte = BitConverter.ToString(hashBytes, 0). Replace("-", Schnur. Leer). ToLower(); byte[] Bytes = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } catch (Ausnahme z. B.) {
Throw Ex; } } /// <summary> String zu 16-Byte-Array /// </summary> <param name="hexString"></param> /// <returns></returns> private statische Byte[] strToToHexByte(String hexString) { hexString = hexString.Replace(" ", ""); wenn ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = neues Byte[hexString.Length / 2]; für (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Nachrichtenverarbeitungsmechanismen /// </summary> <param name="str"></param> /// <returns></returns> private statische Zeichenkette MessageHandle (String str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); String-Ergebnis = ""; Switch (Nachricht. Code) { Fall "OK": Ergebnis = "SMS erfolgreich gesendet!"; Unterbrechung; Fall "ISP. RAM_PERMISSION_DENY": Ergebnis = "RAM-Berechtigung VERWEIGERT"; Unterbrechung; Fall "ISV. OUT_OF_SERVICE": Ergebnis = "Betriebsausfall"; Unterbrechung; Fall "ISV. PRODUCT_UN_SUBSCRIPT": Ergebnis = "Alibaba Cloud-Kunden, die keine Cloud-Kommunikationsprodukte geöffnet haben"; Unterbrechung; Fall "ISV. PRODUCT_UNSUBSCRIBE": Ergebnis = "Produkt nicht geöffnet"; Unterbrechung; Fall "ISV. ACCOUNT_NOT_EXISTS": Ergebnis = "Konto existiert nicht"; Unterbrechung; Fall "ISV. ACCOUNT_ABNORMAL": Ergebnis = "Konto-Ausnahme"; Unterbrechung; Fall "isv.SMS_TEMPLATE_ILLEGAL": result = "SMS-Vorlage ist nicht legal"; Unterbrechung; Fall "isv.SMS_SIGNATURE_ILLEGAL": Ergebnis = "SMS-Signatur ist nicht legal"; Unterbrechung; Fall "ISV. INVALID_PARAMETERS": Ergebnis = "Parameter-Ausnahme"; Unterbrechung; Fall "ISV. MOBILE_NUMBER_ILLEGAL": Ergebnis = "illegale Mobiltelefonnummer"; Unterbrechung; Fall "ISV. MOBILE_COUNT_OVER_LIMIT": Ergebnis = "Anzahl der Mobilfunknummern überschreitet die Grenze"; Unterbrechung; Fall "ISV. TEMPLATE_MISSING_PARAMETERS": Ergebnis = "Vorlage fehlende Variable"; Unterbrechung; Fall "ISV. BUSINESS_LIMIT_CONTROL": Ergebnis = "Geschäftsaktuell"; Unterbrechung; Fall "ISV. INVALID_JSON_PARAM": Ergebnis = "JSON-Parameter ist nicht legitim, nur String-Werte werden akzeptiert"; Unterbrechung; Fall "ISV. PARAM_LENGTH_LIMIT": Ergebnis = "Parameter überschreitet die Längengrenze"; Unterbrechung; Fall "ISV. PARAM_NOT_SUPPORT_URL": result = "URL nicht unterstützt"; Unterbrechung; Fall "ISV. AMOUNT_NOT_ENOUGH": Ergebnis = "Unzureichender Kontostand"; Unterbrechung; Fall "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Template-Variablen enthalten illegale Schlüsselwörter"; Unterbrechung; } Rückgabeergebnis; } }
|