Beberapa waktu lalu, perusahaan memiliki proyek yang perlu menggunakan notifikasi SMS, dan kemudian saya membeli Alibaba Cloud SMS untuk pengembangan antarmuka SMS. Namun project berjalan pada sistem XP, jadi project harus framework dari .NET3.5, namun DLL SMS yang diberikan oleh Alibaba hanya dapat digunakan di .net 4.0 ke atas, yang sangat memalukan, untungnya Alibaba memberikan contoh java untuk HTTP, jadi saya mencoba menulis metode memanggil HTTP Alibaba Cloud di C# sesuai dengan kode java. Kembali ke intinya, buka kodenya! (Saya juga telah diterbitkan di CSDN, jaminan kepribadian bukanlah posting bajakan, terima kasih) kelas umum SendShort { /// <summary> Antarmuka SMS Metode panggilan C# /// </summary> <param name="url"></param> /// <returns></returns> string statis publik GetHtmlFormUrl(url string) { string strRet = null; if (url == null || url. Pangkas(). ToString() == "") { kembali strRet; } string targeturl = url. Pangkas(). ToString(); Coba { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); Jam. UserAgent = "Mozilla/4.0 (kompatibel; MSIE 6.0; Windows NT 5.1)"; Jam. Metode = "DAPATKAN"; Jam. Batas waktu = 30 * 60 * 1000; WebResponse hs = jam. GetResponse(); Aliran sr = hs. GetResponseStream(); StreamReader ser = StreamReader baru (sr, Encoding.Default); strRet = MessageHandle(ser. BacaToEnd()); } tangkap (Pengecualian mis) { strRet = "SMS terkirim gagal!" +ex. Pesan; } kembali strRet; } /// <summary> Verifikasi bahwa nomor ponsel tersebut sah /// </summary> <param name="str_handset"></param> /// <returns></returns> bool statis publik IsHandset(string str_handset) { mengembalikan System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> Kode verifikasi SMS /// </summary> <param name="seluler"></param> <param name="kode"></param> /// <returns></returns> string statis publik SignDemo (string seluler, kode int) { string accessKeyId = "AccessKeyId Anda "; string accessSecret = "accessSecret Anda"; string nowDate = DateTime.Now.ToUniversalTime(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); Waktu GTM Dictionary<string, string> keyValues = Dictionary<string, string>(); Mendeklarasikan kamus 1. Parameter sistem keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid(). ToString()); keyValues.Add("AccessKeyId", accessKeyId); keyValues.Add("SignatureVersion", "1.0"); keyValues.Add("Stempel waktu", nowDate); keyValues.Add("Format", "Json"); dapat diganti dengan XML
2. Parameter API Bisnis keyValues.Add("Action", "SendSms"); keyValues.Add("Versi", "25-05-2017"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", seluler); keyValues.Add("SignName", "Tanda Tangan Anda"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Nomor Template Anda"); keyValues.Add("OutId", "123");
3. Hapus kata kunci tanda tangan if (keyValues.ContainsKey("Signature")) { keyValues.Remove("Tanda Tangan"); }
4. Penyortiran kunci parameter Dictionary<string, string> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Bangun string yang akan ditandatangani StringBuilder builder = StringBuilder baru(); foreach (item var di ascDic) { jika (item. Kunci == "Nama Tanda") {
} yang lain { pembangun. Lampiran("&"). Tambahkan(khususUrlEncode(item. Kunci)). Lampirkan("="). Tambahkan(khususUrlEncode(item. Nilai)); } jika (item. Kunci == "RegionId") { pembangun. Lampiran("&"). Tambahkan(khususUrlEncode("SignName")). Lampirkan("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = pembuat. ToString(). Substring(1);
StringBuilder stringToSign = StringBuilder(); baru stringToSign.Append("GET"). Lampirkan ("&"); stringToSign.Append(specialUrlEncode("/")). Lampirkan ("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. Tanda tangan juga harus dikodekan dengan URL khusus di bagian akhir string signture = specialUrlEncode(Sign); Terakhir, cetak URL permintaan GET yang sah string url = "http://dysmsapi.aliyuncs.com/?Signature=" + signture + builder; hasil string = GetHtmlFormUrl(url); mengembalikan hasil; } /// <summary> Pengkodean URL /// </summary> <param name="value"></param> /// <returns></returns> string statis publik specialUrlEncode(string temp) {
StringBuilder stringBuilder = StringBuilder(); baru untuk (int i = 0; Saya < suhu. Panjang; i++) { string t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); jika (t == k) { stringBuilder.Append(t); } yang lain { stringBuilder.Append(k.ToUpper()); } } mengembalikan stringBuilder.ToString(). Ganti("+", "%20"). Ganti("*", "%2A"). Ganti("%7E", "~"); } /// <summary> HMACSHA1 tanda tangan /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> string statis publik MySign(string accessSecret, string stringToSign) { Coba { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Pengkodean.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); string stringbyte = BitConverter.ToString(hashBytes, 0). Ganti("-", string. Kosong). Keturunkan(); byte[] byte = strToToHexByte(stringbyte); mengembalikan Convert.ToBase64String(byte); } tangkap (Pengecualian mis) {
melempar mantan; } } /// <summary> String ke array 16 byte /// </summary> <param name="hexString"></param> /// <returns></returns> byte statis pribadi[] strToToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = byte baru[hexString.Length / 2]; untuk (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); mengembalikan Byte; } /// <summary> Mekanisme pemrosesan pesan /// </summary> <param name="str"></param> /// <returns></returns> string statis pribadi MessageHandle(string str) { Pesan MessageModel = JsonConvert.DeserializeObject<MessageModel>(str); hasil string = ""; beralih (pesan. Kode) { kasus "OK": result = "SMS berhasil terkirim!"; istirahat; Kasus "ISP. RAM_PERMISSION_DENY": result = "PENOLAKAN Izin RAM"; istirahat; Kasus "ISV. OUT_OF_SERVICE": result = "Waktu henti bisnis"; istirahat; Kasus "ISV. PRODUCT_UN_SUBSCRIPT": result = "Pelanggan Alibaba Cloud yang belum membuka produk komunikasi cloud"; istirahat; Kasus "ISV. PRODUCT_UNSUBSCRIBE": result = "Produk tidak dibuka"; istirahat; Kasus "ISV. ACCOUNT_NOT_EXISTS": result = "Akun tidak ada"; istirahat; Kasus "ISV. ACCOUNT_ABNORMAL": result = "Pengecualian Akun"; istirahat; kasus "isv.SMS_TEMPLATE_ILLEGAL": result = "Templat SMS tidak legal"; istirahat; kasus "isv.SMS_SIGNATURE_ILLEGAL": result = "Tanda tangan SMS tidak legal"; istirahat; Kasus "ISV. INVALID_PARAMETERS": result = "pengecualian parameter"; istirahat; Kasus "ISV. MOBILE_NUMBER_ILLEGAL": result = "nomor ponsel ilegal"; istirahat; Kasus "ISV. MOBILE_COUNT_OVER_LIMIT": result = "Jumlah nomor ponsel melebihi batas"; istirahat; Kasus "ISV. TEMPLATE_MISSING_PARAMETERS": result = "variabel templat yang hilang"; istirahat; Kasus "ISV. BUSINESS_LIMIT_CONTROL": result = "Bisnis Saat Ini"; istirahat; Kasus "ISV. INVALID_JSON_PARAM": result = "Parameter JSON tidak sah, hanya nilai string yang diterima"; istirahat; Kasus "ISV. PARAM_LENGTH_LIMIT": result = "Parameter melebihi batas panjang"; istirahat; Kasus "ISV. PARAM_NOT_SUPPORT_URL": result = "URL tidak didukung"; istirahat; Kasus "ISV. AMOUNT_NOT_ENOUGH": result = "Saldo akun tidak mencukupi"; istirahat; Kasus "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Variabel templat berisi kata kunci ilegal"; istirahat; } mengembalikan hasil; } }
|