Tempo fa, l'azienda aveva un progetto che richiedeva l'uso delle notifiche SMS, e poi ho acquistato un SMS su Alibaba Cloud per lo sviluppo di un'interfaccia SMS. Ma il progetto gira sul sistema XP, quindi deve essere il framework di .NET3.5, ma la DLL SMS fornita da Alibaba può essere usata solo in .net 4.0 e superiori, il che è molto imbarazzante; fortunatamente Alibaba ha fornito un esempio di Java per HTTP, così ho provato a scrivere il metodo per chiamare Alibaba Cloud HTTP in C# secondo il codice Java. Tornando al punto, vai al codice! (Ho anche pubblicato su CSDN, la garanzia di personalità non è un post piratato, grazie) Classe pubblica SendShort { /// <summary> Metodo di chiamata C# dell'interfaccia SMS, /// </summary> <param name="url"></param> /// <returns></returns> stringa statica pubblica GetHtmlFormUrl(string url) { stringa strRet = nullo; if (url == null || url. Trim(). ToString() == "") { ritorno strRet; } stringa targeturl = URL. Trim(). ToString(); prova { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (compatibile; MSIE 6.0; Windows NT 5.1)"; HR. Metodo = "GET"; HR. Timeout = 30 * 60 * 1000; WebResponse hs = hr. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = new StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } catch (eccezione ex) { strRet = "SMS inviato fallito!" +es. Messaggio; } ritorno strRet; } /// <summary> Verifica che il numero di cellulare sia legittimo /// </summary> <param name="str_handset"></param> /// <returns></returns> bool statico pubblico IsHandset(string str_handset) { return System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> Codice di verifica SMS /// </summary> <param name="mobile"></param> <param name="code"></param> /// <returns></returns> stringa statica pubblica SignDemo(stringa mobile, codice int) { stringa accessKeyId = "Il tuo accessKeyId "; stringa accessSecret = "il tuo accessSecret"; stringa oraData = Ora.Ora.ATempoUniversale(). ToString("yyy-MM-dd'T'HH:mm:ss'Z'"); Orario GTM Dizionario<stringa, stringa> chiaveValori = nuovo Dizionario<stringa, stringa>(); Dichiara un dizionario 1. Parametri di sistema 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"); può essere sostituito con XML
2. Parametri dell'API aziendale keyValues.Add("Action", "SendSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", mobile); keyValues.Add("NomeSegno", "La tua Firma"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Il tuo numero template"); keyValues.Add("OutId", "123");
3. Rimuovere la parola chiave signature if (keyValues.ContainsKey("Signature")) { chiaveValori.Remove("Firma"); }
4. Ordinamento delle chiavi dei parametri Dizionario<stringa, stringa> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Costruire la stringa da segnatura StringBuilder builder = nuovo StringBuilder(); foreach (oggetto var in ascDic) { se (item. Chiave == "SignName") {
} altrimenti { muratore. Appendere("&"). Append(specialUrlEncode(item. Importante)). Appendere("="). Append(specialUrlEncode(item. Valore)); } se (item. Chiave == "RegionId") { muratore. Appendere("&"). Append(specialUrlEncode("SignName")). Appendere("="). Append(specialUrlEncode(keyValues["SignName"])); } } stringeQueryString = builder. ToString(). Sottostringa(1);
StringBuilder stringToSign = nuovo StringBuilder(); stringToSign.Appende("GET"). Appendere("&"); stringToSign.Append(specialUrlEncode("/")). Appendere("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
stringa Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. La firma dovrebbe anche essere codificata con un URL speciale alla fine stringa signture = specialUrlEncode(Sign); Infine, stampa l'URL della richiesta GET legittima URL stringa = "http://dysmsapi.aliyuncs.com/?Signature=" + segnale + costruttore; string result = GetHtmlFormUrl(url); risultato di ritorno; } /// <summary> Codifica URL /// </summary> <param name="value"></param> /// <returns></returns> stringa statica pubblica specialUrlEncode(string temp) {
StringBuilder stringBuilder = nuovo StringBuilder(); per (int i = 0; Ho < temperatura. Lunghezza; i++) { stringa t = temp[i]. ToString(); stringa k = HttpUtility.UrlEncode(t, Encoding.UTF8); if (t == k) { stringBuilder.Append(t); } altrimenti { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Sostituisci("+", "%20"). Sostituire("*", "%2A"). Sostituire("%7E", "~"); } /// <summary> HMACSHA1 firma /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> stringa statica pubblica MySign (stringa accessSecret, stringaSignoStringa) { prova { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); stringbyte = BitConverter.ToString(hashBytes, 0). Sostituisci("-", corda. Vuoto). ToLower(); byte[] byte = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } catch (eccezione ex) {
buttare l'ex; } } /// <summary> Stringa a array da 16 byte /// </summary> <param name="hexString"></param> /// <returns></returns> byte statico privato[] strToToHexByte(stringstringa hexString) { hexString = hexString.Replace(" ", ""); se ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = nuovo byte[hexString.Length / 2]; per (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Meccanismi di elaborazione dei messaggi /// </summary> <param name="str"></param> /// <returns></returns> stringa statica privata MessageHandle(stringa str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); risultato della stringa = ""; Switch (messaggio. Codice) { caso "OK": risultato = "SMS inviato con successo!"; pausa; Caso "ISP. RAM_PERMISSION_DENY": risultato = "RAM Permesso NEGA"; pausa; Caso "ISV. OUT_OF_SERVICE": risultato = "Tempo di inattività aziendale"; pausa; Caso "ISV. PRODUCT_UN_SUBSCRIPT": risultato = "Clienti Alibaba Cloud che non hanno aperto prodotti di comunicazione cloud"; pausa; Caso "ISV. PRODUCT_UNSUBSCRIBE": risultato = "Prodotto non aperto"; pausa; Caso "ISV. ACCOUNT_NOT_EXISTS": risultato = "Account non esiste"; pausa; Caso "ISV. ACCOUNT_ABNORMAL": risultato = "Eccezione Conto"; pausa; Caso "isv.SMS_TEMPLATE_ILLEGAL": risultato = "Il template SMS non è legale"; pausa; Caso "isv.SMS_SIGNATURE_ILLEGAL": risultato = "La firma SMS non è legale"; pausa; Caso "ISV. INVALID_PARAMETERS": risultato = "eccezione parametro"; pausa; Caso "ISV. MOBILE_NUMBER_ILLEGAL": risultato = "numero di cellulare illegale"; pausa; Caso "ISV. MOBILE_COUNT_OVER_LIMIT": risultato = "Il numero di numeri di cellulare supera il limite"; pausa; Caso "ISV. TEMPLATE_MISSING_PARAMETERS": risultato = "variabile mancante del template"; pausa; Caso "ISV. BUSINESS_LIMIT_CONTROL": risultato = "Business Current"; pausa; Caso "ISV. INVALID_JSON_PARAM": risultato = "Il parametro JSON non è legittimo, sono accettati solo i valori delle stringhe"; pausa; Caso "ISV. PARAM_LENGTH_LIMIT": risultato = "Il parametro supera il limite di lunghezza"; pausa; Caso "ISV. PARAM_NOT_SUPPORT_URL": risultato = "URL non supportato"; pausa; Caso "ISV. AMOUNT_NOT_ENOUGH": risultato = "Saldo del conto insufficiente"; pausa; Caso "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Le variabili template contengono parole chiave illegali"; pausa; } risultato di ritorno; } }
|