Πριν από λίγο καιρό, η εταιρεία είχε ένα έργο που έπρεπε να χρησιμοποιεί ειδοποιήσεις SMS και στη συνέχεια αγόρασα ένα Alibaba Cloud SMS για ανάπτυξη διεπαφής SMS. Αλλά το έργο εκτελείται στο σύστημα XP, επομένως το έργο πρέπει να είναι το πλαίσιο του .NET3.5, αλλά το SMS DLL που δίνεται από την Alibaba μπορεί να χρησιμοποιηθεί μόνο σε .net 4.0 και νεότερη έκδοση, κάτι που είναι πολύ ενοχλητικό, ευτυχώς η Alibaba έδωσε ένα παράδειγμα java για HTTP, οπότε προσπάθησα να γράψω τη μέθοδο κλήσης του Alibaba Cloud HTTP σε C# σύμφωνα με τον κώδικα java. Πίσω στο θέμα, πηγαίνετε στον κώδικα! (Έχω δημοσιεύσει και στο CSDN, η εγγύηση προσωπικότητας δεν είναι πειρατική ανάρτηση, ευχαριστώ) δημόσια τάξη SendShort { /// <summary> Διεπαφή SMS Μέθοδος κλήσης C# /// </summary> <όνομα παραμέτρου ="url"></param> /// <returns></returns> δημόσια στατική συμβολοσειρά GetHtmlFormUrl(string url) { συμβολοσειρά strRet = null; αν (url == null || url. Trim(). ToString() == "") { επιστροφή strRet; } συμβολοσειρά targeturl = διεύθυνση URL. Trim(). ToString(); Δοκιμάστε { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); hr. UserAgent = "Mozilla/4.0 (συμβατό; MSIE 6.0; Windows NT 5.1)"; hr. Μέθοδος = "GET"; hr. Χρονικό όριο = 30 * 60 * 1000; WebResponse hs = ώρα. GetResponse(); Ρεύμα sr = hs. GetResponseStream(); StreamReader ser = νέο StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } αλιεύματα (Εξαίρεση π.χ.) { strRet = "Το SMS που στάλθηκε απέτυχε!" +π.χ. Μήνυμα; } επιστροφή strRet; } /// <summary> Βεβαιωθείτε ότι ο αριθμός κινητού τηλεφώνου είναι νόμιμος /// </summary> <όνομα παραμέτρου ="str_handset"></param> /// <returns></returns> δημόσιο στατικό bool IsHandset (string str_handset) { επιστροφή System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> Κωδικός επαλήθευσης SMS /// </summary> <όνομα παραμέτρου = "κινητό"></param> <όνομα παραμέτρου = "κωδικός"></param> /// <returns></returns> δημόσια στατική συμβολοσειρά SignDemo (συμβολοσειρά για κινητά, int κώδικας) { συμβολοσειρά accessKeyId = "Το accessKeyId σας"; συμβολοσειρά accessSecret = "το accessSecret σας"; συμβολοσειρά nowDate = DateTime.Now.ToUniversalTime(). ToString("εεεε-MM-ηη'T'HH:mm:ss'Z'"); Ώρα GTM Λεξικό<συμβολοσειρά, συμβολοσειρά> keyValues = νέο λεξικό<συμβολοσειρά, συμβολοσειρά>(); Δήλωση λεξικού 1. Παράμετροι συστήματος keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid(). ToString()); keyValues.Add("AccessKeyId", accessKeyId); keyValues.Add("SignatureVersion", "1.0"); keyValues.Add("Χρονική σήμανση", nowDate); keyValues.Add("Μορφή", "Json"); μπορεί να αντικατασταθεί με XML
2. Παράμετροι API επιχείρησης keyValues.Add("Ενέργεια", "SendSms"); keyValues.Add("Έκδοση", "25-05-2017"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", κινητό); keyValues.Add("SignName", "Η υπογραφή σας"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Ο αριθμός του προτύπου σας"); keyValues.Add("OutId", "123");
3. Καταργήστε τη λέξη-κλειδί υπογραφής if (keyValues.ContainsKey("Υπογραφή")) { keyValues.Remove("Υπογραφή"); }
4. Ταξινόμηση κλειδιού παραμέτρων Λεξικό<συμβολοσειρά, συμβολοσειρά> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Κατασκευάστε τη συμβολοσειρά που θα υπογραφεί StringBuilder builder = νέο StringBuilder(); foreach (στοιχείο var στο ascDic) { αν (στοιχείο. Κλειδί == "SignName") {
} αλλιώς { οικοδόμος. Προσάρτημα("&"). Append(specialUrlEncode(item. Key)). Append("="). Append(specialUrlEncode(item. Value)); } αν (στοιχείο. Κλειδί == "RegionId") { οικοδόμος. Προσάρτημα("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } συμβολοσειρά sorteQueryString = δημιουργός. ToString(). Υποσυμβολοσειρά(1);
StringBuilder stringToSign = νέο StringBuilder(); stringToSign.Append("GET"). Προσάρτημα("&"); stringToSign.Append(specialUrlEncode("/")). Προσάρτημα("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
συμβολοσειρά Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Η υπογραφή θα πρέπει επίσης να κωδικοποιηθεί με μια ειδική διεύθυνση URL στο τέλος συμβολοσειρά = specialUrlEncode(Sign); Τέλος, εκτυπώστε τη διεύθυνση URL του νόμιμου αιτήματος GET url συμβολοσειράς = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; αποτέλεσμα συμβολοσειράς = GetHtmlFormUrl(url); αποτέλεσμα επιστροφής? } /// <summary> Κωδικοποίηση URL /// </summary> <όνομα παραμέτρου = "τιμή"></param> /// <returns></returns> δημόσια στατική συμβολοσειρά specialUrlEncode(string temp) {
StringBuilder stringBuilder = νέο StringBuilder(); για (int i = 0; Το I < temp. Μήκος; i++) { συμβολοσειρά t = temp[i]. ToString(); συμβολοσειρά k = HttpUtility.UrlEncode(t, Encoding.UTF8); αν (t == k) { stringBuilder.Append(t); } αλλιώς { stringBuilder.Append(k.ToUpper()); } } επιστροφή stringBuilder.ToString(). Αντικατάσταση("+", "%20"). Αντικατάσταση("*", "%2A"). Αντικατάσταση("%7E", "~"); } /// <summary> HMACSHA1 υπογραφή /// </summary> <όνομα παραμέτρου ="accessSecret"></param> <όνομα παραμέτρου ="stringToSign"></param> /// <returns></returns> δημόσια στατική συμβολοσειρά MySign(συμβολοσειρά accessSecret, συμβολοσειρά stringToSign) { Δοκιμάστε { var hmacsha1 = νέο HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Κωδικοποίηση.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); stringbyte συμβολοσειράς = BitConverter.ToString(hashBytes, 0). Αντικαθιστώ("-", συμβολοσειρά. Άδειο). ToLower(); byte[] bytes = strToToHexByte(stringbyte); επιστροφή Convert.ToBase64String(bytes); } αλιεύματα (Εξαίρεση π.χ.) {
ρίξε πρώην? } } /// <summary> Συμβολοσειρά σε πίνακα 16 byte /// </summary> <όνομα παραμέτρου ="hexString"></param> /// <returns></returns> ιδιωτικό στατικό byte[] strToToHexByte(συμβολοσειρά hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = νέο byte[hexString.Length / 2]; για (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Μετατροπή.ToByte(hexString.Substring(i * 2, 2), 16); επιστροφή returnBytes; } /// <summary> Μηχανισμοί επεξεργασίας μηνυμάτων /// </summary> <όνομα παραμέτρου ="str"></param> /// <returns></returns> ιδιωτική στατική συμβολοσειρά MessageHandle(string str) { Μήνυμα MessageModel = JsonConvert.DeserializeObject<MessageModel>(str); αποτέλεσμα συμβολοσειράς = ""; διακόπτης (μήνυμα. Κωδικός) { περίπτωση "OK": αποτέλεσμα = "Το SMS στάλθηκε με επιτυχία!"; διάλειμμα; Υπόθεση "ISP. RAM_PERMISSION_DENY": αποτέλεσμα = "ΑΡΝΗΣΗ άδειας RAM"; διάλειμμα; Υπόθεση "ISV. OUT_OF_SERVICE": αποτέλεσμα = "Διακοπή λειτουργίας της επιχείρησης"; διάλειμμα; Υπόθεση "ISV. PRODUCT_UN_SUBSCRIPT": αποτέλεσμα = "Πελάτες Alibaba Cloud που δεν έχουν ανοίξει προϊόντα επικοινωνίας cloud". διάλειμμα; Υπόθεση "ISV. PRODUCT_UNSUBSCRIBE": αποτέλεσμα = "Το προϊόν δεν έχει ανοιχτεί"; διάλειμμα; Υπόθεση "ISV. ACCOUNT_NOT_EXISTS": αποτέλεσμα = "Ο λογαριασμός δεν υπάρχει"; διάλειμμα; Υπόθεση "ISV. ACCOUNT_ABNORMAL": αποτέλεσμα = "Εξαίρεση λογαριασμού"; διάλειμμα; Περίπτωση "isv.SMS_TEMPLATE_ILLEGAL": αποτέλεσμα = "Το πρότυπο SMS δεν είναι νόμιμο"; διάλειμμα; Υπόθεση "isv.SMS_SIGNATURE_ILLEGAL": αποτέλεσμα = "Η υπογραφή SMS δεν είναι νόμιμη"; διάλειμμα; Υπόθεση "ISV. INVALID_PARAMETERS": αποτέλεσμα = "εξαίρεση παραμέτρου"; διάλειμμα; Υπόθεση "ISV. MOBILE_NUMBER_ILLEGAL": αποτέλεσμα = "παράνομος αριθμός κινητού τηλεφώνου"· διάλειμμα; Υπόθεση "ISV. MOBILE_COUNT_OVER_LIMIT": αποτέλεσμα = "Ο αριθμός των αριθμών κινητών τηλεφώνων υπερβαίνει το όριο"; διάλειμμα; Υπόθεση "ISV. TEMPLATE_MISSING_PARAMETERS": αποτέλεσμα = "λείπει μεταβλητή από το πρότυπο"; διάλειμμα; Υπόθεση "ISV. BUSINESS_LIMIT_CONTROL": αποτέλεσμα = "Επιχειρηματικό ρεύμα"; διάλειμμα; Υπόθεση "ISV. INVALID_JSON_PARAM": αποτέλεσμα = "Η παράμετρος JSON δεν είναι νόμιμη, μόνο οι τιμές συμβολοσειράς γίνονται δεκτές"; διάλειμμα; Υπόθεση "ISV. PARAM_LENGTH_LIMIT": αποτέλεσμα = "Η παράμετρος υπερβαίνει το όριο μήκους"; διάλειμμα; Υπόθεση "ISV. PARAM_NOT_SUPPORT_URL": αποτέλεσμα = "Η διεύθυνση URL δεν υποστηρίζεται"; διάλειμμα; Υπόθεση "ISV. AMOUNT_NOT_ENOUGH": αποτέλεσμα = "Ανεπαρκές υπόλοιπο λογαριασμού", διάλειμμα; Υπόθεση "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Οι μεταβλητές προτύπου περιέχουν παράνομες λέξεις-κλειδιά"; διάλειμμα; } αποτέλεσμα επιστροφής? } }
|