1. Prepare um projeto .NET
Você precisa do SDK .NET 10, de uma conta no SMS Fácil com créditos disponíveis e de um celular autorizado a receber a mensagem de teste.
dotnet new console --framework net10.0 --name ExemploSms
cd ExemploSmsConfigure as variáveis de ambiente SMSFACIL_USUARIO, SMSFACIL_SENHA e SMSFACIL_DESTINO no processo que executará a aplicação. O destino deve conter somente DDD + número, com 10 ou 11 dígitos, sem o prefixo +55.
Use as credenciais da sua conta. Não as coloque no repositório nem em código executado no navegador. Em produção, configure-as pelo mecanismo de segredos da sua hospedagem.
2. Envie o SMS com HttpClient
Substitua o conteúdo de Program.cs pelo exemplo abaixo. PostAsJsonAsync serializa o objeto e envia o cabeçalho Content-Type: application/json.
using System.Net.Http.Json;
using System.Text.Json;
static string Config(string nome) =>
!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(nome))
? Environment.GetEnvironmentVariable(nome)!
: throw new InvalidOperationException($"Configure {nome}.");
var usuario = Config("SMSFACIL_USUARIO");
var senha = Config("SMSFACIL_SENHA");
var destino = Config("SMSFACIL_DESTINO");
using var client = new HttpClient
{
BaseAddress = new Uri("https://www.smsfacil.com.br/"),
Timeout = TimeSpan.FromSeconds(60)
};
try
{
using var response = await client.PostAsJsonAsync("api/v2/EnviaSMS", new
{
usuario,
senha,
mensagens = new[]
{
new { para = destino, texto = "Sua consulta e amanha as 10h." }
}
});
if (!response.IsSuccessStatusCode)
{
Console.Error.WriteLine($"HTTP {(int)response.StatusCode}. Verifique antes de reenviar.");
return;
}
using var json = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
foreach (var item in json.RootElement.GetProperty("resultados").EnumerateArray())
{
var indice = item.GetProperty("indice").GetInt32();
var resultado = item.GetProperty("resultado").GetString() ?? "";
if (item.GetProperty("sucesso").GetBoolean()
&& resultado.StartsWith("OK ", StringComparison.Ordinal))
{
var pedido = resultado[3..].Trim();
Console.WriteLine($"Item {indice}: aceito na fila. Pedido: {pedido}");
// Persista o pedido junto ao evento de negócio.
}
else
{
Console.Error.WriteLine($"Item {indice}: falha {resultado}");
}
}
}
catch (Exception ex) when (ex is HttpRequestException or TaskCanceledException
or JsonException or KeyNotFoundException or InvalidOperationException)
{
Console.Error.WriteLine("Não foi possível confirmar o resultado. Não reenvie automaticamente.");
}Execute dotnet run uma única vez para fazer o teste. A execução solicita um envio real e consome créditos quando a mensagem é aceita conforme as regras do serviço.
3. Confira o resultado de cada mensagem
HTTP 200 informa que a requisição foi processada. Confira também sucesso em cada item de resultados. Quando verdadeiro, resultado começa com OK , seguido do número da solicitação.
O campo indice começa em zero e identifica a posição no lote. Por exemplo, -7 indica saldo insuficiente e -8 indica credenciais inválidas. Corrija a causa antes de fazer um novo envio. Veja a tabela de resultados.
Timeout não significa que o SMS falhou. A API pode ter aceitado a mensagem antes de a conexão cair. Ela não deduplica requisições: repetir automaticamente pode gerar mensagens e cobranças duplicadas. Se você não recebeu o número da solicitação, confira o histórico no painel ou procure o suporte antes de reenviar.
4. Consulte o status de entrega
Use o número que você salvou em uma operação separada. Este trecho reutiliza client, usuario e senha do exemplo anterior; execute-o depois que tiver um recibo válido.
var pedidoSalvo = "NUMERO_RETORNADO_NO_ENVIO";
using var consulta = await client.PostAsJsonAsync("api/v2/consultaenvio", new
{
usuario,
senha,
nr_pedido = pedidoSalvo
});
consulta.EnsureSuccessStatusCode();
var status = await consulta.Content.ReadAsStringAsync();
Console.WriteLine(status); // Resposta em texto, não JSON.A resposta desta consulta é texto, como Pendente, Enviada, Entregue ou Não entregue. Ela pode não ser definitiva imediatamente. Entregue não confirma leitura. Consulte os estados possíveis.
Antes de usar em produção
- Guarde o recibo junto ao evento de negócio para consultar o envio mais tarde.
- Reutilize HttpClient ou configure IHttpClientFactory na aplicação; não habilite repetição automática para o POST de envio.
- Para lotes, adicione até 1.000 itens em
mensagense trate cada resultado separadamente. - Para agendar, acrescente
data(dd/mm/aaaa) ehora(hh:mm), no horário de Brasília. Datas passadas provocam envio imediato. - Envie mensagens solicitadas pelo destinatário e sem links, conforme os termos de uso.
Também trabalha com PHP? Veja como enviar SMS com PHP e cURL.