Hace algún tiempo, la empresa tuvo un proyecto que necesitaba usar notificaciones SMS, y luego compré un SMS en la nube de Alibaba para el desarrollo de interfaces SMS. Pero el proyecto está funcionando en el sistema XP, así que debe ser el framework de .NET3.5, pero la DLL SMS que da Alibaba solo puede usarse en .net 4.0 y superiores, lo cual es muy embarazoso, afortunadamente Alibaba dio un ejemplo de Java para HTTP, así que intenté escribir el método para llamar a Alibaba Cloud HTTP en C# según el código java. Volviendo al tema, ¡ve al código! (También he publicado en CSDN, la garantía de personalidad no es una publicación pirata, gracias) clase pública SendShort { /// <summary> Método de llamada C# de interfaz SMS /// </summary> <param name="url"></param> /// <returns></returns> cadena estática pública GetHtmlFormUrl(string url) { string stret = nulo; if (url == null || url. Trim(). ToString() == "") { regresar strRet; } string targeturl = url. Trim(). ToString(); Prueba { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; HR. Método = "GET"; HR. Tiempo muerto = 30 * 60 * 1000; WebResponse hs = hr. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = new StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } catch (excepción ex) { strRet = "¡SMS enviado fallido!" +ex. Mensaje; } regresar strRet; } /// <summary> Verifica que el número de móvil sea legítimo /// </summary> <param name="str_handset"></param> /// <returns></returns> bool estático público IsHandset(string str_handset) { return System.Text.RegularExpressions.Regex.IsMatch(str_handset, @"^1[3|4|5|7|8][0-9]\d{8}$"); } /// <summary> Código de verificación SMS /// </summary> <param name="móvil"></param> <param name="code"></param> /// <returns></returns> cadena pública estática SignDemo(cadena móvil, código int) { cadena accessKeyId = "Tu accesoKeyId "; cadena accessSecret = "tu accesoSecreto"; cadena ahoraFecha = FechaTiempo.Ahora.ParaTiempoUniversal(). ToString("yyyy-MM-dd'T'HH:mm:ss'Z'"); Hora GTM Diccionario<cadena, cadena> claveValores = nuevo Diccionario<cadena, cadena>(); Declarar un diccionario 1. Parámetros del sistema 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"); puede ser reemplazado por XML
2. Parámetros de la API empresarial keyValues.Add("Acción", "EnviarMensajes"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("TeléfonoNúmeros", móvil); keyValues.Add("SignName", "Tu Firma"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Tu Número de Plantilla"); keyValues.Add("OutId", "123");
3. Eliminar la palabra clave signature si (keyValues.ContainsKey("Signature")) { keyValues.Remove("Signature"); }
4. Ordenación de claves de parámetros Diccionario<cadena, cadena> ascDic = keyValues.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Construir la cadena a ser signada Constructor de cadenas = nuevo Constructor de cadenas(); foreach (ítem var en ascDic) { si (ítem. Clave == "NombreDeSigno") {
} si no, { Constructor. Apend("&"). Append(specialUrlEncode(item. Clave)). Append("="). Append(specialUrlEncode(item. Valor)); } si (ítem. Key == "RegionId") { Constructor. Apend("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } cadena sorteQueryString = constructor. ToString(). Subcuerda(1);
StringBuilder stringToSign = nuevo StringBuilder(); stringToSign.Append("GET"). Apend("&"); stringToSign.Append(specialUrlEncode("/")). Apend("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MiSigno(accesoSecreto + "&", cadenaDeSigno.ToString()); 6. La firma también debe estar codificada con una URL especial al final signture de cadena = specialUrlEncode(Sign); Por último, imprime la URL de la solicitud legítima de GET URL de cadena = "http://dysmsapi.aliyuncs.com/?Signature=" + señal + constructor; resultado de cadena = GetHtmlFormUrl(url); resultado de retorno; } /// <summary> Codificación de URL /// </summary> <param name="value"></param> /// <returns></returns> cadena estática pública specialUrlEncode(string temp) {
StringBuilder stringBuilder = nuevo StringBuilder(); para (int i = 0; Yo < temperatura. Longitud; i++) { cadena t = temp[i]. ToString(); cadena k = HttpUtility.UrlEncode(t, Encoding.UTF8); if (t == k) { stringBuilder.Append(t); } si no, { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Replace("+", "%20"). Replace("*", "%2A"). Replace("%7E", "~"); } /// <summary> HMACSHA1 firma /// </summary> <param name="accessSecret"></param> <param name="stringToSign"></param> /// <returns></returns> cadena estática pública MySign (cadena accessSecret, cadena stringToSign) { Prueba { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); string byte = BitConverter.ToString(hashBytes, 0). Reemplazar("-", cuerda. Vacío). ToLower(); byte[] bytes = strToToHexByte(stringbyte); return Convert.ToBase64String(bytes); } catch (excepción ex) {
lanzar ex; } } /// <summary> Cadena a matriz de 16 bytes /// </summary> <param name="hexString"></param> /// <returns></returns> byte estático privado[] strToHexByte(string hexString) { hexString = hexString.Replace(" ", ""); si ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = new byte[hexString.Length / 2]; para (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convertir.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mecanismos de procesamiento de mensajes /// </summary> <param name="str"></param> /// <returns></returns> cadena estática privada MessageHandle(string str) { MessageModel message = JsonConvert.DeserializeObject<MessageModel>(str); resultado de la cadena = ""; Interruptor (mensaje. Código) { caso "OK": resultat = "¡SMS enviado con éxito!"; pausa; Caso "ISP. RAM_PERMISSION_DENY": resultado = "RAM Permission DENY"; pausa; Caso "ISV. OUT_OF_SERVICE": resultado = "Tiempo de inactividad empresarial"; pausa; Caso "ISV. PRODUCT_UN_SUBSCRIPT": resultado = "Clientes de Alibaba Cloud que no han abierto productos de comunicación en la nube"; pausa; Caso "ISV. PRODUCT_UNSUBSCRIBE": resultado = "Producto no abierto"; pausa; Caso "ISV. ACCOUNT_NOT_EXISTS": resultado = "Account does not exist"; pausa; Caso "ISV. ACCOUNT_ABNORMAL": resultado = "Excepción de cuenta"; pausa; Caso "isv.SMS_TEMPLATE_ILLEGAL": resultado = "La plantilla SMS no es legal"; pausa; Caso "isv.SMS_SIGNATURE_ILLEGAL": resultado = "La firma SMS no es legal"; pausa; Caso "ISV. INVALID_PARAMETERS": resultado = "excepción de parámetro"; pausa; Caso "ISV. MOBILE_NUMBER_ILLEGAL": resultado = "número de teléfono móvil ilegal"; pausa; Caso "ISV. MOBILE_COUNT_OVER_LIMIT": resultado = "El número de números móviles supera el límite"; pausa; Caso "ISV. TEMPLATE_MISSING_PARAMETERS": resultado = "plantilla que falta variable"; pausa; Caso "ISV. BUSINESS_LIMIT_CONTROL": resultado = "Business Current"; pausa; Caso "ISV. INVALID_JSON_PARAM": resultat = "el parámetro JSON no es legítimo, solo se aceptan los valores de cadena"; pausa; Caso "ISV. PARAM_LENGTH_LIMIT": resultado = "El parámetro excede el límite de longitud"; pausa; Caso "ISV. PARAM_NOT_SUPPORT_URL": resultado = "URL no soportada"; pausa; Caso "ISV. AMOUNT_NOT_ENOUGH": resultado = "Saldo insuficiente de la cuenta"; pausa; Caso "ISV. TEMPLATE_PARAMS_ILLEGAL": result = "Las variables plantilla contienen palabras clave ilegales"; pausa; } resultado de retorno; } }
|