Acum ceva timp, compania a avut un proiect care necesita să folosească notificări SMS, iar apoi am cumpărat un SMS Alibaba Cloud pentru dezvoltarea interfeței SMS. Dar proiectul rulează pe sistemul XP, deci trebuie să fie cadrul .NET3.5, însă DLL-ul SMS oferit de Alibaba poate fi folosit doar în .net 4.0 și versiuni, ceea ce este foarte jenant, din fericire Alibaba a dat un exemplu de Java pentru HTTP, așa că am încercat să scriu metoda de a chema Alibaba Cloud HTTP în C# conform codului java. Revenind la subiect, mergi la cod! (Am publicat și în CSDN, garanția personalității nu este o postare piratată, mulțumesc) clasa publică SendShort { /// <summary> Interfață SMS metodă de apel C# /// </summary> <param name="url"></param> /// <returns></returns> șirul static public GetHtmlFormUrl(string url) { stringstring-ul = nul; if (url == null || url. Trim(). ToString() == "") { returnează strRet; } string targeturl = url. Trim(). ToString(); încearcă { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); hr. UserAgent = "Mozilla/4.0 (compatibil; MSIE 6.0; Windows NT 5.1)"; hr. Method = "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 (excepție ex) { strRet = "SMS trimis a eșuat!" +ex. Mesaj; } returnează strRet; } /// <summary> Verifică dacă numărul de telefon mobil este legitim /// </summary> <param name="str_handset"></param> /// <returns></returns> bool static public IsHandset(string str_handset) { return System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> Cod de verificare SMS /// </summary> <param name="mobile"></param> <param name="code"></param> /// <returns></returns> șirul static public SignDemo(string mobile, cod int) { stringAccessKeyId = "AccessKeyId-ul tău "; stringstringAccessSecret = "accessSecretul tău"; string nowDate = DateTime.Now.PentruUniversalTime(). ToString("yyy-MM-dd'T'HH:mm:ss'Z'"); Ora GTM Dictionary<string, string> keyValues = Dictionary<string, string>(); Declară un dicționar 1. Parametri ai sistemului 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"); poate fi înlocuit cu XML
2. Parametrii API-ului de afaceri keyValues.Add("Action", "SendSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", mobil); keyValues.Add("NumeSemn", "Semnătura ta"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Numărul tău de șablon"); keyValues.Add("OutId", "123");
3. Eliminarea cuvântului cheie semnătură if (keyValues.ContainsKey("Signature")) { cheieValori. Elimină("Semnătură"); }
4. Sortarea cheilor parametrice Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Construiește șirul semnat StringBuilder constructor = noul StringBuilder(); foreach (element var în ascDic) { dacă (itemul. Cheie == "NumeSemnal") {
} altfel { Constructor. Anexă("&"). Append(specialUrlEncode(item. Cheie)). Append("="). Append(specialUrlEncode(item. Value)); } dacă (itemul. Key == "RegionId") { Constructor. Anexă("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } șir sorteQueryString = constructor. ToString(). Substring(1);
StringBuilder stringToSign = noul StringBuilder(); stringToSign.Append("GET"). Anexă("&"); stringToSign.Append(specialUrlEncode("/")). Anexă("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Semnătura ar trebui să fie codificată și cu un URL special la final semn de șir = specialUrlEncode(Sign); În final, printează URL-ul cererii legitime GET URL de șir = "http://dysmsapi.aliyuncs.com/?Signature=" + semnalizare + constructor; string result = GetHtmlFormUrl(url); rezultatul returnării; } /// <summary> Codarea URL /// </summary> <param name="value"></param> /// <returns></returns> șirul static public, specialUrlEncode(string temp) {
StringBuilder stringBuilder = noul StringBuilder(); pentru (int i = 0; Am < temperatură. Lungime; i++) { string t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); if (t == k) { stringBuilder.Append(t); } altfel { stringBuilder.Adaugă(k.ToUpper()); } } return stringBuilder.ToString(). Replace("+", "%20"). Replace("*", "%2A"). Replace("%7E", "~"); } /// <summary> HMACSHA1 semnătură /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> string static public MySign (string accessSecret, string stringToSign) { încearcă { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); string byte = BitConverter.ToString(hashBytes, 0). Înlocuire("-", coardă. Gol). ToLower(); octet[] octeți = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } catch (excepție ex) {
aruncă ex; } } /// <summary> De la șir la un tablou de 16 octeți /// </summary> <param name="hexString"></param> /// <returns></returns> byte static privat[] strToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); dacă ((hexString.Length % 2) != 0) hexString += " "; octet[] returnBytes = new byte[hexString.Length / 2]; pentru (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mecanisme de procesare a mesajelor /// </summary> <param name="str"></param> /// <returns></returns> șirul static privat MessageHandle(string str) { MessageModel mesaj = JsonConvert.DeserializeObject<MessageModel>(str); Rezultatul șirului = ""; Switch (mesaj. Cod) { cazul "OK": rezultat = "SMS trimis cu succes!"; pauză; Cazul "ISP. RAM_PERMISSION_DENY": result = "RAM Permission DENY"; pauză; Cazul "ISV. OUT_OF_SERVICE": rezultat = "Timp de nefuncționare al afacerii"; pauză; Cazul "ISV. PRODUCT_UN_SUBSCRIPT": rezultat = "Clienți Alibaba Cloud care nu au deschis produse de comunicații cloud"; pauză; Cazul "ISV. PRODUCT_UNSUBSCRIBE": rezultat = "Produs nedeschis"; pauză; Cazul "ISV. ACCOUNT_NOT_EXISTS": rezultat = "Contul nu există"; pauză; Cazul "ISV. ACCOUNT_ABNORMAL": rezultat = "Excepție de cont"; pauză; Cazul "isv.SMS_TEMPLATE_ILLEGAL": rezultat = "Șablonul SMS nu este legal"; pauză; Cazul "isv.SMS_SIGNATURE_ILLEGAL": rezultat = "Semnătura SMS nu este legală"; pauză; Cazul "ISV. INVALID_PARAMETERS": Rezultat = "excepție de parametru"; pauză; Cazul "ISV. MOBILE_NUMBER_ILLEGAL": Rezultat = "număr de telefon mobil ilegal"; pauză; Cazul "ISV. MOBILE_COUNT_OVER_LIMIT": rezultat = "Numărul de numere mobile depășește limita"; pauză; Cazul "ISV. TEMPLATE_MISSING_PARAMETERS": rezultat = "variabilă lipsă de șablon"; pauză; Cazul "ISV. BUSINESS_LIMIT_CONTROL": rezultat = "Business Current"; pauză; Cazul "ISV. INVALID_JSON_PARAM": result = "parametrul JSON nu este legitim, sunt acceptate doar valorile șirurilor"; pauză; Cazul "ISV. PARAM_LENGTH_LIMIT": rezultat = "Parametrul depășește limita de lungime"; pauză; Cazul "ISV. PARAM_NOT_SUPPORT_URL": result = "URL nesuportat"; pauză; Cazul "ISV. AMOUNT_NOT_ENOUGH": rezultat = "Sold insuficient al contului"; pauză; Cazul "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Variabilele șablon conțin cuvinte-cheie ilegale"; pauză; } rezultatul returnării; } }
|