Jonkin aikaa sitten yrityksellä oli projekti, jossa piti käyttää SMS-ilmoituksia, ja sitten ostin Alibaba Cloud -SMS:n SMS-käyttöliittymän kehittämiseen. Mutta projekti pyörii XP-järjestelmällä, joten projektin täytyy olla .NET3.5:n kehys, mutta Alibaban antama SMS DLL sopii vain .net 4.0:ssa ja uudemmissa versioissa, mikä on hyvin noloa. Onneksi Alibaba antoi esimerkin Javasta HTTP:lle, joten yritin kirjoittaa menetelmän, jossa kutsutaan Alibaba Cloud HTTP:tä C#:lla java-koodin mukaan. Takaisin asiaan, mene koodiin! (Olen myös julkaissut CSDN:ssä, persoonallisuustakuu ei ole piraattipostaus, kiitos) julkinen luokka SendShort { /// <summary> SMS-rajapinnan C#-kutsumenetelmä /// </summary> <param name="URL"></param> /// <returns></returns> public static string GetHtmlFormUrl(string url) { string strRet = null; if (url == null || url. Trim(). ToString() == "") { return strRet; } string targeturl = url. Trim(). ToString(); yritä { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (yhteensopiva; MSIE 6.0; Windows NT 5.1)"; HR. Metodi = "GET"; HR. Aikalisä = 30 * 60 * 1000; WebResponse hs = tunti. GetResponse(); Virta sr = hs. GetResponseStream(); StreamReader ser = uusi StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } catch (poikkeus esim.) { strRet = "SMS lähetetty epäonnistui!" +ex. Viesti; } return strRet; } /// <summary> Varmista, että matkapuhelinnumero on aito /// </summary> <param name="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-vahvistuskoodi /// </summary> <param name="mobiili"></param> <param name="code"></param> /// <returns></returns> julkinen staattinen merkkijono SignDemo(string mobile, int code) { string accessKeyId = "Sinun accessKeyId"; string accessSecret = "your accessSecret"; string nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); GTM-aika Sanakirja<merkkijono, merkkijono> keyValues = uusi sanakirja<merkkijono, merkkijono>(); Ilmoita sanakirja 1. Järjestelmän parametrit keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid(). ToString()); keyValues.Add("AccessKeyId", accessKeyId); keyValues.Add("SignatureVersion", "1.0"); keyValues.Add("Aikaleima", nowDate); keyValues.Add("Format", "Json"); voidaan korvata XML:llä
2. Liiketoiminnan API-parametrit keyValues.Add("Toiminto", "SendSms"); keyValues.Add ("Versio", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("Puhelinnumerot", matkapuhelin); keyValues.Add ("SignName", "Your Signature"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Mallinumerosi"); keyValues.Add("OutId", "123");
3. Poista allekirjoitusavainsana if (keyValues.ContainsKey("Signature")) { keyValues.Remove("Allekirjoitus"); }
4. Parametrien avainlajittelu Sanakirja<merkkijono, merkkijono> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Rakenna merkkijono, joka allekirjoitetaan StringBuilder builder = uusi StringBuilder(); foreach (var-kohde ascDicissa) { if (kohde. Key == "SignName") {
} else { rakentaja. Append("&"). Append(specialUrlEncode(item. Avain)). Append("="). Append(specialUrlEncode(item. Arvo)); } if (kohde. Key == "RegionId") { rakentaja. Append("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = builder. ToString(). Alajono(1);
StringBuilder stringToSign = uusi StringBuilder(); stringToSign.Append("GET"). Liite("&"); stringToSign.Append(specialUrlEncode("/")). Liite("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
merkki = MySign(accessSecret + "&", stringToSign.ToString()); 6. Allekirjoitus tulisi myös koodata erityisellä URL-osoitteella lopussa merkkijonosignture = specialUrlEncode(Sign); Lopuksi tulosta laillisen GET-pyynnön URL-osoite merkkijonon url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; merkkijonon tulos = GetHtmlFormUrl(url); palautustulos; } /// <summary> URL-koodaus /// </summary> <param name="value"></param> /// <returns></returns> public static string specialUrlEncode(string temp) {
StringBuilder stringBuilder = uusi StringBuilder(); kun (int i = 0; Minulla < väliaikainen. Pituus; i++) { merkkijono t = lämpötila[i]. ToString(); merkkijono k = HttpUtility.UrlEncode(t, Encoding.UTF8); jos (t == k) { stringBuilder.Append(t); } else { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Replace("+", "%20"). Replace("*", "%2A"). Replace("%7E", "~"); } /// <summary> HMACSHA1 allekirjoitus /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> public static string MySign(string accessSecret, string stringToSign) { yritä { var hmacsha1 = uusi HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); string stringbyte = BitConverter.ToString(hashBytes, 0). Replace("-", string. Tyhjä). ToLower(); byte[] bytes = strToToHexByte(stringbyte); return Convert.ToBase64String(tavut); } catch (poikkeus esim.) {
heitä ex; } } /// <summary> Merkkijono 16 tavun taulukkoon /// </summary> <param name="hexString"></param> /// <returns></returns> yksityinen staattinen tavu[] strToHexByte(merkkijono, hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Pituus % 2) != 0) hexString += " "; byte[] returnBytes = new byte[hexString.Length / 2]; kun (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Viestinkäsittelymekanismit /// </summary> <param name="str"></param> /// <returns></returns> yksityinen staattinen merkkijono MessageHandle(merkkijonon voima) { MessageModel-viesti = JsonConvert.DeserializeObject<MessageModel>(str); merkkijonon tulos = ""; Switch (viesti. Koodi) { tapaus "OK": result = "SMS lähetetty onnistui!"; tauko; tapaus "ISP. RAM_PERMISSION_DENY": result = "RAM-käyttöoikeuksien hylkääminen"; tauko; tapaus "ISV. OUT_OF_SERVICE": result = "Liiketoiminnan seisokki"; tauko; tapaus "ISV. PRODUCT_UN_SUBSCRIPT": result = "Alibaba Cloudin asiakkaat, jotka eivät ole avanneet pilviviestintätuotteita"; tauko; tapaus "ISV. PRODUCT_UNSUBSCRIBE": tulos = "Tuote ei avattu"; tauko; tapaus "ISV. ACCOUNT_NOT_EXISTS": result = "Tiliä ei ole olemassa"; tauko; tapaus "ISV. ACCOUNT_ABNORMAL": result = "Tilin poikkeus"; tauko; tapaus "isv.SMS_TEMPLATE_ILLEGAL": tulos = "SMS-malli ei ole laillinen"; tauko; Tapaus "isv.SMS_SIGNATURE_ILLEGAL": result = "SMS-allekirjoitus ei ole laillinen"; tauko; tapaus "ISV. INVALID_PARAMETERS": tulos = "parametripoikkeus"; tauko; tapaus "ISV. MOBILE_NUMBER_ILLEGAL": tulos = "laiton matkapuhelinnumero"; tauko; tapaus "ISV. MOBILE_COUNT_OVER_LIMIT": result = "Matkapuhelinnumeroiden määrä ylittää rajan"; tauko; tapaus "ISV. TEMPLATE_MISSING_PARAMETERS": tulos = "mallipohja puuttuva muuttuja"; tauko; tapaus "ISV. BUSINESS_LIMIT_CONTROL": tulos = "Business Current"; tauko; tapaus "ISV. INVALID_JSON_PARAM": result = "JSON-parametri ei ole legitiimi, hyväksytään vain merkkijonoarvot"; tauko; tapaus "ISV. PARAM_LENGTH_LIMIT": result = "Parametri ylittää pituusrajan"; tauko; tapaus "ISV. PARAM_NOT_SUPPORT_URL": result = "URL ei tuettu"; tauko; tapaus "ISV. AMOUNT_NOT_ENOUGH": result = "Riittämätön tilisaldo"; tauko; tapaus "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Mallimuuttujat sisältävät laittomia avainsanoja"; tauko; } palautustulos; } }
|