For noget tid siden havde virksomheden et projekt, der skulle bruge SMS-notifikationer, og så købte jeg en Alibaba Cloud SMS til udvikling af SMS-grænsefladen. Men projektet kører på XP-systemet, så projektet må være frameworket fra .NET3.5, men SMS-DLL'en fra Alibaba kan kun bruges i .NET 4.0 og derover, hvilket er meget pinligt, heldigvis gav Alibaba et eksempel på Java til HTTP, så jeg prøvede at skrive metoden til at kalde Alibaba Cloud HTTP i C# i henhold til java-koden. Tilbage til sagen, gå til koden! (Jeg har også publiceret i CSDN, Personality Guarantee er ikke et piratindlæg, tak) offentlig klasse SendShort { /// <summary> SMS-interface C# kaldsmetode /// </summary> <param name="url"></param> /// <returns></returns> offentlig statisk streng GetHtmlFormUrl(streng-url) { streng strRet = null; hvis (url == null || url. Trim(). ToString() == "") { return strRet; } streng targeturl = url. Trim(). ToString(); Prøv { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (kompatibel; MSIE 6.0; Windows NT 5.1)"; HR. Metode = "GET"; HR. Timeout = 30 * 60 * 1000; WebResponse hs = t. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = ny StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } catch (Undtagelse f.eks.) { strRet = "SMS sendt mislykkedes!" +ex. Besked; } return strRet; } /// <summary> Tjek at mobilnummeret er legitimt /// </summary> <param name="str_handset"></param> /// <returns></returns> offentlig statisk bool IsHandset (streng str_handset) { return System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> SMS-verifikationskode /// </summary> <param name="mobile"></param> <param name="kode"></param> /// <returns></returns> offentlig statisk streng SignDemo (streng mobil, int-kode) { streng accessKeyId = "Din accessKeyId"; string accessSecret = "din accessSecret"; streng nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); GTM-tid Dictionary<string, string> keyValues = ny Dictionary<string, string>(); Deklarer en ordbog 1. Systemparametre 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"); kan erstattes med XML
2. Business API-parametre 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. Fjern signaturnøgleordet hvis (keyValues.ContainsKey("Signature")) { keyValues.Remove("Signatur"); }
4. Parameter-nøglesortering Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Konstruer strengen, der skal signeres StringBuilder builder = ny StringBuilder(); foreach (var-element i ascDic) { hvis (element. Key == "SignName") {
} ellers { Bygger. Append("&"). Append(specialUrlEncode(item. Key)). Append("="). Append(specialUrlEncode(item. Værdi)); } hvis (element. Key == "RegionId") { Bygger. Append("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } streng sorteQueryString = builder. ToString(). Understreng(1);
StringBuilder stringToSign = ny StringBuilder(); stringToSign.Append("GET"). Append("&"); stringToSign.Append(specialUrlEncode("/")). Append("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Signaturen skal også kodes med en særlig URL til sidst strengsignture = specialUrlEncode(Sign); Til sidst udskriv URL'en til den legitime GET-anmodning streng url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; strengresultat = GetHtmlFormUrl(url); returneringsresultat; } /// <summary> URL-kodning /// </summary> <param name="value"></param> /// <returns></returns> offentlig statisk streng specialUrlEncode(streng temp) {
StringBuilder stringBuilder = ny StringBuilder(); for (int i = 0; Jeg < midlertidigt. Længde; i++) { streng t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); hvis (t == k) { stringBuilder.Append(t); } ellers { stringBuilder.Append(k.ToUpper()); } } returner stringBuilder.ToString(). Replace("+", "%20"). Replace("*", "%2A"). Replace("%7E", "~"); } /// <summary> HMACSHA1 signatur /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> offentlig statisk streng MySign (streng accessSecret, streng stringToSign) { Prøv { 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). Udskifte("-", snor. Tom). ToLower(); byte[] bytes = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } catch (Undtagelse f.eks.) {
Kast eks; } } /// <summary> Streng til 16 byte array /// </summary> <param name="hexString"></param> /// <returns></returns> privat statisk byte[] strToToHexByte(streng hexString) { hexString = hexString.Replace(" ", ""); hvis ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = ny byte[hexString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mekanismer til meddelelsesbehandling /// </summary> <param name="str"></param> /// <returns></returns> privat statisk streng MessageHandle (streng str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); strengresultat = ""; skift (besked. Kode) { tilfælde "OK": resultat = "SMS sendt succesfuldt!"; pause; Case "ISP. RAM_PERMISSION_DENY": resultat = "RAM Tilladelse NÆGTER"; pause; Sag "ISV. OUT_OF_SERVICE": resultat = "Forretningsnedetid"; pause; Sag "ISV. PRODUCT_UN_SUBSCRIPT": resultat = "Alibaba Cloud-kunder, der ikke har åbnet cloud-kommunikationsprodukter"; pause; Sag "ISV. PRODUCT_UNSUBSCRIBE": resultat = "Produkt ikke åbnet"; pause; Sag "ISV. ACCOUNT_NOT_EXISTS": resultat = "Konto eksisterer ikke"; pause; Sag "ISV. ACCOUNT_ABNORMAL": resultat = "Kontoundtagelse"; pause; tilfælde "isv.SMS_TEMPLATE_ILLEGAL": result = "SMS-skabelon er ikke lovlig"; pause; tilfælde "isv.SMS_SIGNATURE_ILLEGAL": resultat = "SMS-signatur er ikke lovlig"; pause; Sag "ISV. INVALID_PARAMETERS": resultat = "parameterundtagelse"; pause; Sag "ISV. MOBILE_NUMBER_ILLEGAL": resultat = "ulovligt mobilnummer"; pause; Sag "ISV. MOBILE_COUNT_OVER_LIMIT": resultat = "Antal mobilnumre overstiger grænsen"; pause; Sag "ISV. TEMPLATE_MISSING_PARAMETERS": resultat = "skabelon mangler variabel"; pause; Sag "ISV. BUSINESS_LIMIT_CONTROL": resultat = "Forretningsaktuel"; pause; Sag "ISV. INVALID_JSON_PARAM": resultat = "JSON-parameteren er ikke legitim, kun strengværdier accepteres"; pause; Sag "ISV. PARAM_LENGTH_LIMIT": resultat = "Parameter overstiger længdegrænsen"; pause; Sag "ISV. PARAM_NOT_SUPPORT_URL": resultat = "URL ikke understøttet"; pause; Sag "ISV. AMOUNT_NOT_ENOUGH": resultat = "Utilstrækkelig kontobalance"; pause; Sag "ISV. TEMPLATE_PARAMS_ILLEGAL": resultat = "Skabelonvariabler indeholder ulovlige nøgleord"; pause; } returneringsresultat; } }
|