Há algum tempo, a empresa teve um projeto que precisava usar notificações por SMS, e então comprei um SMS na nuvem Alibaba para desenvolvimento de interfaces SMS. Mas o projeto está rodando no sistema XP, então o projeto deve ser a estrutura do .NET3.5, mas o DLL SMS fornecido pelo Alibaba só pode ser usado em .net 4.0 e superiores, o que é muito constrangedor, felizmente o Alibaba deu um exemplo de Java para HTTP, então tentei escrever o método para chamar o Alibaba Cloud HTTP em C# de acordo com o código java. Voltando ao ponto, vá ao código! (Também publiquei no CSDN, garantia de personalidade não é um post pirata, obrigado) Classe pública SendShort { /// <summary> Método de chamada C# da interface SMS /// </summary> <param name="url"></param> /// <returns></returns> string estática pública GetHtmlFormUrl(string url) { stringstrings strRet = nulo; if (url == null || url. Trim(). ToString() == "") { retorne strRet; } string targeturl = url. Trim(). ToString(); tente { HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl); HR. UserAgent = "Mozilla/4.0 (compatível; MSIE 6.0; Windows NT 5.1)"; HR. Método = "GET"; HR. Tempo de descanso = 30 * 60 * 1000; WebResponse hs = hr. GetResponse(); Stream sr = hs. GetResponseStream(); StreamReader ser = new StreamReader(sr, Encoding.Default); strRet = MessageHandle(ser. ReadToEnd()); } captura (exceção ex) { strRet = "SMS enviado falhou!" +ex. Mensagem; } retorne strRet; } /// <summary> Verifique se o número de celular é 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 verificação por SMS /// </summary> <param name="mobile"></param> <param name="code"></param> /// <returns></returns> string estática pública SignDemo(string mobile, int code) { stringstringAccessKeyId = "Seu acessKeyId "; stringstring: accessSecret = "seu acessoSecreto"; string nowData = Tempo.Agora.ParaTempoUniversal(). ToString("yyy-MM-dd'T'HH:mm:ss'Z'"); Horário GTM Dicionário<string, string> keyValues = novo Dicionário<string, string>(); Declare um dicionário 1. Parâmetros do sistema keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid(). ToString()); keyValues.Add("AccessKeyId", accessKeyId); keyValues.Add("SignatureVersion", "1.0"); keyValues.Add("Timestamp", agoraData); keyValues.Add("Format", "Json"); pode ser substituído por XML
2. Parâmetros da API empresarial keyValues.Add("Ação", "EnviarSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", celular); keyValues.Add("NomeDeSinal", "Sua Assinatura"); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", "Seu Número do Modelo"); keyValues.Add("OutId", "123");
3. Remover a palavra-chave de assinatura if (keyValues.ContainsKey("Assinatura")) { keyValues.Remove("Assinatura"); }
4. Ordenação de chaves de parâmetros Dicionário<string, string> ascDic = keyValue.OrderBy(o => o.Key). ToDictionary(o => o.Key, p => p.Value.ToString()); 5. Construa a cadeia a ser com sinal Construtor de Strings = novo Construtor de Cadeias(); foreach (item var em ascDic) { se (item. Chave == "NomeDeAssinamento") {
} senão { construtor. Apender("&"). Append(specialUrlEncode(item. Chave)). Append("="). Append(specialUrlEncode(item. Valor)); } se (item. Chave == "RegionId") { construtor. Apender("&"). Append(specialUrlEncode("SignName")). Append("="). Append(specialUrlEncode(keyValues["SignName"])); } } string sorteQueryString = construtor. ToString(). Substring(1);
StringBuilder stringToSign = novo StringBuilder(); stringToSign.Append("GET"). Apêndice("&"); stringToSign.Append(specialUrlEncode("/")). Apêndice("&"); stringToSign.Append(specialUrlEncode(sorteQueryString));
string Sign = MySign(accessSecret + "&", stringToSign.ToString()); 6. A assinatura também deve ser codificada com uma URL especial no final string signture = specialUrlEncode(Sign); Por fim, imprima a URL da solicitação legítima do GET string url = "http://dysmsapi.aliyuncs.com/?Signature=" + sinestria + construtor; string result = GetHtmlFormUrl(url); resultado do retorno; } /// <summary> Codificação de URL /// </summary> <param name="value"></param> /// <returns></returns> string estática pública specialUrlEncode(string temp) {
StringBuilder stringBuilder = novo StringBuilder(); para (int i = 0; Eu < temperatura. Comprimento; i++) { string t = temp[i]. ToString(); string k = HttpUtility.UrlEncode(t, Encoding.UTF8); if (t == k) { stringBuilder.Append(t); } senão { stringBuilder.Append(k.ToUpper()); } } return stringBuilder.ToString(). Substituir("+", "%20"). Replace("*", "%2A"). Replace("%7E", "~"); } /// <summary> HMACSHA1 assinatura /// </summary> <nome do param="acessoSecreto"></param> <param name="stringToSign"></param> /// <returns></returns> string estática pública MySign (stringstringAccessSecret, stringstringToSign) { tente { var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(accessSecret)); var dataBuffer = Encoding.UTF8.GetBytes(stringToSign); var hashBytes = hmacsha1. ComputeHash(dataBuffer); stringbyte = BitConverter.ParaString(hashBytes, 0). Substituir("-", corda. Vazio). ToLower(); byte[] bytes = strToHexByte(stringbyte); return Convert.ToBase64String(bytes); } captura (exceção ex) {
jogar ex; } } /// <summary> String para array de 16 bytes /// </summary> <param name="hexString"></param> /// <returns></returns> byte estático privado[] strToToHexByte(string hexadecimal) { hexString = hexString.Replace(" ", ""); se ((hexString.Comprimento % 2) != 0) hexString += " "; byte[] returnBytes = novo byte[hexString.Length / 2]; para (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); return returnBytes; } /// <summary> Mecanismos de processamento de mensagens /// </summary> <param name="str"></param> /// <returns></returns> string estática privada MessageHandle(string str) { MessageModel mensagem = JsonConvert.DeserializeObject<MessageModel>(str); resultado da string = ""; Switch (mensagem. Código) { caso "OK": resultado = "SMS enviado bem-sucedido!"; intervalo; Caso "ISP. RAM_PERMISSION_DENY": resultado = "PERMISSÃO RAM NEGAR"; intervalo; Caso "ISV. OUT_OF_SERVICE": resultado = "Tempo de inatividade do negócio"; intervalo; Caso "ISV. PRODUCT_UN_SUBSCRIPT": resultado = "Clientes da Alibaba Cloud que não abriram produtos de comunicação em nuvem"; intervalo; Caso "ISV. PRODUCT_UNSUBSCRIBE": resultado = "Produto não aberto"; intervalo; Caso "ISV. ACCOUNT_NOT_EXISTS": resultado = "Conta não existe"; intervalo; Caso "ISV. ACCOUNT_ABNORMAL": resultado = "Exceção da Conta"; intervalo; Caso "isv.SMS_TEMPLATE_ILLEGAL": resultado = "O modelo SMS não é legal"; intervalo; Caso "isv.SMS_SIGNATURE_ILLEGAL": resultado = "Assinatura SMS não é legal"; intervalo; Caso "ISV. INVALID_PARAMETERS": resultado = "exceção de parâmetro"; intervalo; Caso "ISV. MOBILE_NUMBER_ILLEGAL": resultado = "número de celular ilegal"; intervalo; Caso "ISV. MOBILE_COUNT_OVER_LIMIT": resultado = "Número de números móveis ultrapassa o limite"; intervalo; Caso "ISV. TEMPLATE_MISSING_PARAMETERS": resultado = "variável faltando no template"; intervalo; Caso "ISV. BUSINESS_LIMIT_CONTROL": resultado = "Business Current"; intervalo; Caso "ISV. INVALID_JSON_PARAM": resultado = "O parâmetro JSON não é legítimo, apenas valores de string são aceitos"; intervalo; Caso "ISV. PARAM_LENGTH_LIMIT": resultado = "Parâmetro excede o limite de comprimento"; intervalo; Caso "ISV. PARAM_NOT_SUPPORT_URL": resultado = "URL não suportada"; intervalo; Caso "ISV. AMOUNT_NOT_ENOUGH": resultado = "Saldo insuficiente da conta"; intervalo; Caso "ISV. TEMPLATE_PARAMS_ILLEGAL": resultado = "Variáveis modelo contêm palavras-chave ilegais"; intervalo; } resultado do retorno; } }
|