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.

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.

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.

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.

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.

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>
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).


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!

