Pred časom je podjetje imelo projekt, ki je potreboval SMS obvestila, nato pa sem kupil Alibaba Cloud SMS za razvoj SMS vmesnika. Projekt pa teče na XP sistemu, zato mora biti projekt okvir .NET3.5, vendar je SMS DLL, ki ga ponuja Alibaba, mogoče uporabljati le v .net 4.0 in novejših, kar je zelo nerodno, na srečo je Alibaba dal primer jave za HTTP, zato sem poskušal napisati metodo klicanja Alibaba Cloud HTTP v C# glede na java kodo. Nazaj k bistvu, pojdi k kodi! (Objavil sem tudi na CSDN, garancija osebnosti ni piratska objava, hvala) javni razred SendShort { /// <summary> SMS vmesnik C# metoda klica /// </summary> <ime parametra="URL"></param> /// <returns></returns> javni statični niz GetHtmlFormUrl(string url) { string strRet = null; if (url == null || url. trim(). ToString() == "") { vračajoč strRet; } String targeturl = URL. trim(). ToString(); poskusi { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); hr. UserAgent = "Mozilla/4.0 (združljiv; MSIE 6.0; Windows NT 5.1)"; hr. Metoda = "GET"; hr. Timeout = 30 * 60 * 1000; WebResponse hs = uro. GetResponse(); Tok sr = hs. GetResponseStream(); StreamReader ser = novi StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } ulov (Izjema ex) { strRet = "SMS poslan ni uspel!" +ex. Sporočilo; } vračajoč strRet; } /// <summary> Preverite, ali je mobilna številka legitimna /// </summary> <ime parametra="str_handset"></param> /// <returns></returns> javni statični 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 verifikacijska koda /// </summary> <ime parametra="mobilno"></param> <ime parametra="code"></param> /// <returns></returns> javni statični niz SignDemo (string mobile, int code) { string accessKeyId = "Your accessKeyId "; string accessSecret = "your accessSecret"; string nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); GTM čas Dictionary<string, string> keyValues = nov Dictionary<string, string>(); Declare a dictionary 1. Parametri sistema keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid(). ToString()); keyValues.Add("AccessKeyId", accessKeyId); keyValues.Add("SignatureVersion", "1.0"); keyValues.Add("Časovni žig", nowDate); keyValues.Add("Format", "json"); ga je mogoče zamenjati z XML
2. Parametri poslovnega API-ja keyValues.Add("Action", "SendSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", mobilni); keyValues.Add("SignName", "Your Signature"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "vaša številka predloge"); keyValues.Add("OutId", "123");
3. Odstranite podpisno ključno besedo if (keyValues.ContainsKey("Signature")) { keyValues.Reremove ("Signature"); }
4. Razvrščanje ključev s parametri Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Sestavi niz, ki ga je treba podpisati StringBuilder builder = novi StringBuilder(); foreach (var element v ascDic) { če (predmet. Key == "SignName") {
} else { graditelj. Dodatek ("&"). Append(specialUrlEncode(item. Key)). Dodatek ("="). Append(specialUrlEncode(item. Vrednost)); } če (predmet. Key == "RegionId") { graditelj. Dodatek ("&"). Append(specialUrlEncode("SignName")). Dodatek ("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = graditelj. ToString(). Podniz(1);
StringBuilder stringToSign = novi StringBuilder(); stringToSign.Append("GET"). Dodatek ("&"); stringToSign.Append(specialUrlEncode("/")). Dodatek ("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Podpis naj bo prav tako kodiran s posebnim URL-jem na koncu string signture = specialUrlEncode(Sign); Na koncu natisnite URL legitimne GET zahteve string url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; string result = GetHtmlFormUrl(url); vrni rezultat; } /// <summary> Kodiranje URL-jev /// </summary> <ime parametra="vrednost"></param> /// <returns></returns> public static string specialUrlEncode(string temp) {
StringBuilder stringBuilder = novi StringBuilder(); za (int i = 0; Jaz sem < začasni čas. Dolžina; i++) { struna t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); če (t == k) { stringBuilder.Append(t); } else { stringBuilder.Append(k.ToUpper()); } } vrni stringBuilder.ToString(). Replace("+", "%20"). Replace("*", "%2A"). Replace("%7E", "~"); } /// <summary> HMACSHA1 podpis /// </summary> <param name="accessSecret"></param> <ime parametra="stringToSign"></param> /// <returns></returns> javni statični niz MySign(string accessSecret, stringToSign) { poskusi { 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). Replace("-", struna. Prazno). ToLower(); bajt[] bajti = strToToHexByte(stringbyte); return Convert.ToBase64String(bajti); } ulov (Izjema ex) {
Vrzi Ex; } } /// <summary> Niz v 16 bajtov /// </summary> <ime parametra="hexString"></param> /// <returns></returns> zasebni statični bajt[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += " "; bajt[] returnBytes = novi bajt[hexString.Length / 2]; za (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mehanizmi obdelave sporočil /// </summary> <ime parametra="str"></param> /// <returns></returns> zasebni statični niz MessageHandle(string str) { MessageModel message message = JsonConvert.DeserializeObject<MessageModel>(str); string result = ""; Stikalo (sporočilo. Code) { primer "OK": rezultat = "SMS poslan uspešno!"; premor; Primer "ISP. RAM_PERMISSION_DENY": rezultat = "RAM dovoljenje zavrženo"; premor; Primer "ISV. OUT_OF_SERVICE": rezultat = "Izpad poslovanja"; premor; Primer "ISV. PRODUCT_UN_SUBSCRIPT": result = "Stranke Alibaba Cloud, ki še niso odprle oblačnih komunikacijskih produktov"; premor; Primer "ISV. PRODUCT_UNSUBSCRIBE": rezultat = "Izdelek ni odprt"; premor; Primer "ISV. ACCOUNT_NOT_EXISTS": rezultat = "Račun ne obstaja"; premor; Primer "ISV. ACCOUNT_ABNORMAL": rezultat = "Izjema računa"; premor; Primer "isv.SMS_TEMPLATE_ILLEGAL": result = "SMS predloga ni zakonita"; premor; Primer "isv.SMS_SIGNATURE_ILLEGAL": result = "SMS podpis ni zakonit"; premor; Primer "ISV. INVALID_PARAMETERS": rezultat = "izjema parametrov"; premor; Primer "ISV. MOBILE_NUMBER_ILLEGAL": rezultat = "nezakonita mobilna telefonska številka"; premor; Primer "ISV. MOBILE_COUNT_OVER_LIMIT": rezultat = "Število mobilnih številk presega mejo"; premor; Primer "ISV. TEMPLATE_MISSING_PARAMETERS": rezultat = "manjkajoča spremenljivka predloge"; premor; Primer "ISV. BUSINESS_LIMIT_CONTROL": rezultat = "Poslovni tok"; premor; Primer "ISV. INVALID_JSON_PARAM": result = "JSON parameter ni legitimen, sprejemane so le vrednosti nizov"; premor; Primer "ISV. PARAM_LENGTH_LIMIT": rezultat = "Parameter presega omejitev dolžine"; premor; Primer "ISV. PARAM_NOT_SUPPORT_URL": result = "URL ni podprt"; premor; Primer "ISV. AMOUNT_NOT_ENOUGH": rezultat = "Nezadostno stanje na računu"; premor; Primer "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Predloge spremenljivk vsebujejo nelegalne ključne besede"; premor; } vrni rezultat; } }
|