SMS as a Service em .NET com Twilio - Delegado Anônimo
Piadinha

SMS as a Service em .NET com Twilio

Everything as a service...

Postado por Marcelo Palladino em 25-11-2014

Um dia destes esbarrei em um serviço bem bacana que gostaria de compartilhar aqui.

O problema envolvia criar um aplicativo que, baseado em algumas regras, enviasse alarmes via SMS para os usuários. Há uma porrada de softwares que são vendidos como serviço e que se responsabilizam pela entrega de mensagens SMS. Acabei implementando alguns (o usuário tinha a opção de escolher qual utilizar dentro de um painel de administração da coisa toda), mas um deles se destacou dos demais devido à facilidade de contratação/cobrança, qualidade da documentação e, principalmente, pela elegância da implementação do REST. Trata-se do Twilio.

https://www.twilio.com/

Página inicial do Twilio

Sobre o serviço

Antes de falar sobre qualquer aspecto de implementação (que é bem simples para a maioria dos casos), vale citar alguns pontos que achei bem interessantes no serviço.

1-Suporte internacional. Com o twilio sua aplicação pode disparar mensagens para qualquer nÚmero de telefone no mundo. Algumas opções de serviço no Brasil suportam apenas números nacionais...

2-Ótimo log de mensagens e dashboard para acompanhamento do serviço. No log você consegue visualizar o custo de cada mensagem, se a ela foi quebrada em mais de um SMS, se houve erro na entrega e assim por diante.

Log de mensagens enviadas

3-Simplificação de contratação e cobrança: Você cria a conta e, a partir daí, é possível dar uma carga de '20' até '2000' dólares nela usando o paypal, por exemplo.

Visualização dos detalhes de cobrança

Ainda nesta parte de cobrança, o serviço possui algumas possibilidades uteis, como a notificação por email quando o saldo estiver abaixo de X dólares e a auto recarga para evitar que o serviço pare por falta de saldo. Esta Última funcionalidade é excelente e dos serviços que implementei, o twilio era um dos Únicos que fazia isso. Alguns serviços no Brasil exigem, acredite se quiser, ligações telefônicas e até pagamento de boletos (como Única opção) para iniciar a brincadeira. Aí é osso...

4-Suporte a credenciais para testes. Isso parece simples, mas a julgar por outros serviços, a solução do twilio é ótima. Quando você faz a contratação, o serviço lhe oferece duas credenciais: uma de produção e outra para testes. As credenciais de testes funcionam exatamente igual as de produção, mas não geram cobrança. Isso é ótimo para execução de testes de integração.

Credenciais para ambientes de produção e testes

Um pouco de mão na massa

Poderia falar ainda mais sobre o serviço dos caras, como o ótimo suporte técnico, por exemplo, mas vou parar por aqui para poder colocar a mão na massa. Partindo do princípio que você tem os dados para executar as chamadas (sid, token e nÚmero de telefone), podemos enviar uma mensagem SMS de forma bem simples:

1-Crie uma aplicação ASP.NET MVC simples e adicone o pacote Twilio via nuget.

Instalando o pacote do Twilio

2-Depois disso, crie uma view para receber os dados referentes às credenciais do twilio, o nÚmero de telefone que vai receber a mensagem e a mensagem propriamente dita. Eu dei uma limpada na aplicação padrão, então o formulário para este teste ficou simples assim:

 1 <style>
 2     fieldset {
 3         width: 400px;
 4     }
 5 
 6     label {
 7         display: block;
 8     }
 9 
10     input[type="text"] {
11         width: 300px;
12     }
13 
14     input[type="submit"] {
15         display: block;
16         margin-top: 20px;
17     }
18 </style>
 1 <form method="POST" action="@Url.Action("SendSms")">
 2     <fieldset>
 3         <legend>Informe os dados para enviar o SMS atraves do twilio</legend>
 4  
 5         <label>Chave de identificacao:</label>
 6         <input name="sid" type="text" />
 7  
 8         <label>Token:</label>
 9         <input name="token" type="text" />
10  
11         <label>Numero de telefone "de":</label>
12         <input name="fromPhoneNumber" type="text" />
13  
14         <label>Numero de telefone "para":</label>
15         <input name="toPhoneNumber" type="text" />
16  
17         <label>Mensagem:</label>
18         <textarea name="message" rows="4" cols="100"></textarea>
19  
20         <input type="submit" value="Enviar" />
21  
22         @ViewBag.SendSmsResultMessage
23  
24     </fieldset>
25 </form>

Uma chamada do serviço com dados válidos

3-No controller, a coisa toda se resume a isso:

 1 using System;
 2 using System.Web.Mvc;
 3 using Twilio;
 4 
 5 namespace TwilioSample.Controllers
 6 {
 7     public class HomeController : Controller
 8     {
 9         public ActionResult Index()
10         {
11             ViewBag.SendSmsResultMessage = TempData.ContainsKey("SendSmsResultMessage") ? TempData["SendSmsResultMessage"] : String.Empty;
12             return View();
13         }
14 
15         [HttpPost]
16         public ActionResult SendSms(string sid, string token, string fromPhoneNumber, string toPhoneNumber, string message)
17         {
18             var twilioClient = new TwilioRestClient(sid, token);
19             var sendMessageResult = twilioClient.SendMessage(fromPhoneNumber, toPhoneNumber, message, "");
20 
21             if (sendMessageResult.RestException == null)
22                 TempData["SendSmsResultMessage"] = "Mensagem enviada com sucesso!";
23             else
24                 TempData["SendSmsResultMessage"] = "Houve um erro durante a tentativa de enviar a mensagem: " + sendMessageResult.RestException.Message;
25 
26             return RedirectToAction("Index");
27         }
28     }
29 }

Note que o método SendMessage do Twilio retorna uma instância da classe Message, que dentre outras coisas, retorna a exceção (se houver).

Log do twilio mostrando os detalhes da mensagem enviada

Mensagem no log do Twilio

Bem, esta foi uma introdução bem rápida ao serviço. Talvez eu escreva um novo artigo explorando outros aspectos do serviço. O que você acha? O código do artigo pode ser encontrado aqui.

Até mais!

Código fonte utilizado no artigo