Il y a quelque temps, l’entreprise avait un projet nécessitant l’utilisation des notifications SMS, puis j’ai acheté un SMS Alibaba Cloud pour le développement d’interfaces SMS. Mais le projet tourne sur le système XP, donc il doit être le cadre de .NET3.5, mais la DLL SMS fournie par Alibaba ne peut être utilisée qu’en .net 4.0 et supérieur, ce qui est très embarrassant ; heureusement, Alibaba a donné un exemple de Java pour HTTP, alors j’ai essayé d’écrire la méthode d’appel d’Alibaba Cloud HTTP en C# selon le code Java. Revenons au sujet, allez au code ! (J’ai aussi publié dans CSDN, la garantie de personnalité n’est pas un post piraté, merci) classe publique SendShort { /// <summary> Méthode d’appel C# de l’interface SMS /// </summary> <param name="url"></param> /// <returns></returns> chaîne statique publique GetHtmlFormUrl(url de chaîne) { string stret = nul ; if (url == null || url. Trim(). ToString() == « ») { retour de la Retraite ; } Cibleurl de chaîne = URL. Trim(). ToString() ; essaie { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl) ; HR. UserAgent = « Mozilla/4.0 (compatible ; MSIE 6.0 ; Windows NT 5.1) » ; HR. Méthode = « GET » ; HR. Temps mort = 30 * 60 * 1000 ; WebResponse hs = hr. GetResponse() ; Stream sr = hs. GetResponseStream() ; StreamReader ser = new StreamReader(sr, Encoding.Default) ; strRet = MessageHandle(ser. ReadToEnd()) ; } catch (Exception ex) { strRet = « SMS envoyé échoué ! » +ex. Message; } retour de la Retraite ; } /// <summary> Vérifiez que le numéro de portable est légitime /// </summary> <param name="str_handset"></param> /// <returns></returns> bool statique public IsHandset(string str_handset) { return System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$ ») ; } /// <summary> Code de vérification SMS /// </summary> <param name="mobile"></param> <param name="code"></param> /// <returns></returns> chaîne statique publique SignDemo(chaîne mobile, code int) { chaîne accessKeyId = « Your accessKeyId » ; chaîne accessSecret = « votre accessSecret » ; chaîne maintenantDoutDeuxTemps = DateTime.Now.ToUniversalTime(). ToString(« yyyy-mm-dd’T’HH :mm :ss’Z' ») ; Heure GTM Dictionnaire<chaîne, chaîne> keyValues = nouveau dictionnaire<chaîne, chaîne>() ; Déclarer un dictionnaire 1. Paramètres du système 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 ») ; peut être remplacé par XML
2. Paramètres de l’API métier keyValues.Add(« Action « , « SendSms ») ; keyValues.Add(« Version », « 2017-05-25 ») ; keyValues.Add(« RegionId », « cn-hangzhou ») ; keyValues.Add(« PhoneNumbers », mobile) ; keyValues.Add(« NomDeSigne », « Votre Signature ») ; keyValues.Add(« TemplateParam », « {\"code\ » :\" » + code + « \"} ») ; keyValues.Add(« TemplateCode », « Votre numéro de modèle ») ; keyValues.Add(« OutId », « 123 ») ;
3. Supprimer le mot-clé signature if (keyValues.ContainsKey(« Signature »)) { valeurs-clés.Supper(« Signature ») ; }
4. Tri des clés de paramètres Dictionnaire<chaîne, chaîne> ascDic = valeurs-clé.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()) ; 5. Construire la chaîne à signer Constructeur de StringBuilder = nouveau Constructeur de String() ; foreach (objet var dans ascDic) { if (item. Clé == « SignName ») {
} sinon { constructeur. Appender(« & »). Append(specialUrlEncode(item. Clé)). Appendice(« = »). Append(specialUrlEncode(item. Value) ; } if (item. Clé == « RegionId) { constructeur. Appender(« & »). Append(specialUrlEncode(« SignName »)). Appendice(« = »). Append(specialUrlEncode(keyValues["SignName"])) ; } } chaîne sorteQueryString = constructeur. ToString(). Sous-chaîne(1) ;
StringBuilder stringToSign = nouveau StringBuilder() ; stringToSign.Append(« GET « ). Appender(« & ») ; stringToSign.Append(specialUrlEncode(« / »)). Appender(« & ») ; stringToSign.Append(specialUrlEncode(sorteQueryString)) ;
string Sign = MonSign(accessSecret + « & », stringToSign.ToString()) ; 6. La signature doit également être encodée avec une URL spéciale à la fin chaîne signture = specialUrlEncode(Sign) ; Enfin, imprimez l’URL de la demande GET légitime URL de chaîne = « http://dysmsapi.aliyuncs.com/?Signature= » + signture + constructeur ; résultat de chaîne = GetHtmlFormUrl(url) ; résultat de retour ; } /// <summary> Codage d’URL /// </summary> <param name="value"></param> /// <returns></returns> chaîne statique publique specialUrlEncode(string temp) {
StringBuilder chaenConstructeur = nouveau StringBuilder() ; pour (int i = 0 ; J’ai < la température. Longueur ; i++) { chaîne t = temp[i]. ToString() ; chaîne k = HttpUtility.UrlEncode(t, Encoding.UTF8) ; if (t == k) { stringBuilder.Append(t) ; } sinon { stringBuilder.Append(k.ToUpper()) ; } } return stringBuilder.ToString(). Remplacer(« + », « %20 »). Remplacer (« * », « %2A »). Replace(« %7E », « ~ ») ; } /// <summary> HMACSHA1 signature /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> chaîne statique publique MySign (chaîne accessSecret, chaîne stringToSign) { essaie { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)) ; var dataBuffer = Encoding.UTF8.GetBytes(stringToSign) ; var hashBytes = hmacsha1. ComputeHash(dataBuffer) ; stringbyte = BitConverter.ToString(hashBytes, 0). Remplace(« -« , corde. Vide). Abaisser() ; octet[] octets = strToToHexByte(stringbyte) ; return Convert.ToBase64String(bytes) ; } catch (Exception ex) {
jeter son ex ; } } /// <summary> Chaîne vers tableau de 16 octets /// </summary> <param name="hexString"></param> /// <returns></returns> octet statique privé[] strToToHexByte(chaîne hexagonale) { hexString = hexString.Replace( » « , « ») ; si ((hexString.Length % 2) != 0) hexString += " « ; octet[] returnBytes = nouvel octet[hexString.Length / 2] ; pour (int i = 0 ; i < returnBytes.Length ; i++) returnBytes[i] = Convert.ToByte(hexString.Sous-chaîne(i * 2, 2), 16) ; return returnBytes ; } /// <summary> Mécanismes de traitement des messages /// </summary> <param name="str"></param> /// <returns></returns> chaîne statique privée MessageHandle(string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str) ; résultat de la chaîne = « » ; Switch (message. Code) { Cas « OK » : résultat = « SMS envoyé avec succès ! » ; pause ; Cas « ISP. RAM_PERMISSION_DENY » : résultat = « REFUS de RAM » ; pause ; Cas « ISV. OUT_OF_SERVICE » : résultat = « Temps d’arrêt de l’activité » ; pause ; Cas « ISV. PRODUCT_UN_SUBSCRIPT » : résultat = « Clients Alibaba Cloud qui n’ont pas ouvert de produits de communication cloud » ; pause ; Cas « ISV. PRODUCT_UNSUBSCRIBE » : résultat = « Produit non ouvert » ; pause ; Cas « ISV. ACCOUNT_NOT_EXISTS » : résultat = « Le compte n’existe pas » ; pause ; Cas « ISV. ACCOUNT_ABNORMAL » : résultat = « Exception de compte » ; pause ; Cas « isv.SMS_TEMPLATE_ILLEGAL » : résultat = « Le modèle SMS n’est pas légal » ; pause ; Cas « isv.SMS_SIGNATURE_ILLEGAL » : résultat = « La signature SMS n’est pas légale » ; pause ; Cas « ISV. INVALID_PARAMETERS » : résultat = « exception de paramètre » ; pause ; Cas « ISV. MOBILE_NUMBER_ILLEGAL » : résultat = « numéro de téléphone mobile illégal » ; pause ; Cas « ISV. MOBILE_COUNT_OVER_LIMIT » : résultat = « Le nombre de numéros mobiles dépasse la limite » ; pause ; Cas « ISV. TEMPLATE_MISSING_PARAMETERS » : résultat = « variable manquante » modèle ; pause ; Cas « ISV. BUSINESS_LIMIT_CONTROL » : résultat = « Business Current » ; pause ; Cas « ISV. INVALID_JSON_PARAM » : résultat = « le paramètre JSON n’est pas légitime, seules les valeurs de chaîne sont acceptées » ; pause ; Cas « ISV. PARAM_LENGTH_LIMIT » : résultat = « Le paramètre dépasse la limite de longueur » ; pause ; Cas « ISV. PARAM_NOT_SUPPORT_URL » : résultat = « URL non prise en charge » ; pause ; Cas « ISV. AMOUNT_NOT_ENOUGH » : résultat = « Solde de compte insuffisant » ; pause ; Cas « ISV. TEMPLATE_PARAMS_ILLEGAL » : résultat = « Les variables modèles contiennent des mots-clés illégaux » ; pause ; } résultat de retour ; } }
|