Enige tijd geleden had het bedrijf een project dat SMS-meldingen moest gebruiken, en toen kocht ik een Alibaba Cloud SMS voor de ontwikkeling van de SMS-interface. Maar het project draait op het XP-systeem, dus het project moet het framework van .NET3.5 zijn, maar de SMS-DLL van Alibaba kan alleen gebruikt worden in .NET 4.0 en hoger, wat erg gênant is. Gelukkig gaf Alibaba een voorbeeld van Java voor HTTP, dus probeerde ik de methode te schrijven om Alibaba Cloud HTTP in C# aan te roepen volgens de java-code. Terug naar het punt, ga naar de code! (Ik heb ook gepubliceerd in CSDN, Personality Guarantee is geen illegale post, dank je wel) publieke klasse SendShort { /// <summary> SMS-interface C#-aanroepmethode /// </summary> <param name="url"></param> /// <returns></returns> publieke statische string GetHtmlFormUrl(string url) { string strRet = null; als (URL == null || URL. Trim(). ToString() == "") { return strRet; } string targeturl = url. Trim(). ToString(); Probeer het { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (compatibel; MSIE 6.0; Windows NT 5.1)"; HR. Methode = "GET"; HR. Timeout = 30 * 60 * 1000; WebResponse hs = uur. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = nieuwe StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } vangen (Uitzondering bijv.) { strRet = "SMS verzonden mislukt!" +ex. Bericht; } return strRet; } /// <summary> Controleer of het mobiele nummer legitiem is /// </summary> <param name="str_handset"></param> /// <returns></returns> publieke statische 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-verificatiecode /// </summary> <param name="mobiel"></param> <param name="code"></param> /// <returns></returns> publieke statische string SignDemo (string mobile, int-code) { string accessKeyId = "Uw accessKeyId"; string accessSecret = "uw accessSecret"; string nowDate = DateTime.Now.ToUniversalTime(). ToString ("yyyyy-MM-dd'T'HH:mm:ss'Z'"); GTM-tijd Dictionary<string, string> keyValues = nieuwe Dictionary<string, string>(); Verklaar een woordenboek 1. Systeemparameters 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 worden vervangen door XML
2. Business API-parameters keyValues.Add("Actie", "SendSms"); keyValues.Add("Versie", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", mobiel); keyValues.Add("SignName", "Your Signature"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Your Template Number"); keyValues.Add("OutId", "123");
3. Verwijder het handtekening-trefwoord als (keyValues.ContainsKey("Signature")) { keyValues.Remove("Handtekening"); }
4. Parametersleutelsortering Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Construeer de string die ondertekend moet worden StringBuilder builder = nieuwe StringBuilder(); foreach (var-item in ascDic) { als (item. Key == "SignName") {
} anders { Bouwer. Append("&"). Append(specialUrlEncode(item. Key)). Append("="). Append(specialUrlEncode(item. Waarde); } als (item. Key == "RegionId") { Bouwer. Append("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = builder. ToString(). Substring(1);
StringBuilder stringToSign = nieuwe StringBuilder(); stringToSign.Append("GET"). Append("&"); stringToSign.Append(specialUrlEncode("/")). Append("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. De handtekening moet ook worden gecodeerd met een speciale URL aan het einde stringsignture = specialUrlEncode(Sign); Print tenslotte de URL van het legitieme GET-verzoek uit string url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; string result = GetHtmlFormUrl(url); retourresultaat; } /// <summary> URL-codering /// </summary> <param name="value"></param> /// <returns></returns> publieke statische string specialUrlEncode(string temp) {
StringBuilder stringBuilder = nieuwe StringBuilder(); voor (int i = 0; Ik < tijdelijk. Lengte; i++) { String t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); als (t == k) { stringBuilder.Append(t); } anders { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Replace("+", "%20"). Replace("*", "%2A"). Replace("%7E", "~"); } /// <summary> HMACSHA1 handtekening /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> publieke statische string MySign (string accessSecret, string stringToSign) { Probeer het { 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). Vervangen("-", snaar. Leeg). ToLower(); byte[] bytes = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } vangen (Uitzondering bijv.) {
Gooi ex; } } /// <summary> String naar 16 bytes array /// </summary> <param name="hexString"></param> /// <returns></returns> privé statische byte[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); als ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = nieuwe byte[hexString.Length / 2]; voor (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mechanismen voor berichtverwerking /// </summary> <param name="str"></param> /// <returns></returns> privé statische string MessageHandle (string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); string result = ""; Switch (bericht. Code) { case "OK": resultaat = "SMS verzonden succesvol!"; pauze; Case "ISP. RAM_PERMISSION_DENY": resultaat = "RAM Permission WEIGER"; pauze; Zaak "ISV. OUT_OF_SERVICE": resultaat = "Bedrijfsstilstand"; pauze; Zaak "ISV. PRODUCT_UN_SUBSCRIPT": resultaat = "Alibaba Cloud-klanten die geen cloudcommunicatieproducten hebben geopend"; pauze; Zaak "ISV. PRODUCT_UNSUBSCRIBE": resultaat = "Product niet geopend"; pauze; Zaak "ISV. ACCOUNT_NOT_EXISTS": resultaat = "Account bestaat niet"; pauze; Zaak "ISV. ACCOUNT_ABNORMAL": resultaat = "Account Exception"; pauze; Case "isv.SMS_TEMPLATE_ILLEGAL": resultaat = "SMS-sjabloon is niet legaal"; pauze; Zaak "isv.SMS_SIGNATURE_ILLEGAL": resultaat = "SMS-handtekening is niet legaal"; pauze; Zaak "ISV. INVALID_PARAMETERS": resultaat = "parameteruitzondering"; pauze; Zaak "ISV. MOBILE_NUMBER_ILLEGAL": resultaat = "illegaal mobiel nummer"; pauze; Zaak "ISV. MOBILE_COUNT_OVER_LIMIT": resultaat = "Aantal mobiele nummers overschrijdt limiet"; pauze; Zaak "ISV. TEMPLATE_MISSING_PARAMETERS": resultaat = "sjabloon ontbrekende variabele"; pauze; Zaak "ISV. BUSINESS_LIMIT_CONTROL": resultaat = "Bedrijfsstroom"; pauze; Zaak "ISV. INVALID_JSON_PARAM": result = "JSON-parameter is niet legitiem, alleen stringwaarden worden geaccepteerd"; pauze; Zaak "ISV. PARAM_LENGTH_LIMIT": resultaat = "Parameter overschrijdt lengtelimiet"; pauze; Zaak "ISV. PARAM_NOT_SUPPORT_URL": resultaat = "URL niet ondersteund"; pauze; Zaak "ISV. AMOUNT_NOT_ENOUGH": resultaat = "Onvoldoende rekeningbalans"; pauze; Zaak "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Sjabloonvariabelen bevatten illegale trefwoorden"; pauze; } retourresultaat; } }
|