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!