Enviando SMS em Java com Twilio
1. Introdução
O envio de mensagens SMS é uma grande parte de muitos aplicativos modernos. Há uma variedade de casos de uso que as mensagens SMS podem atender: autenticação de dois fatores, alertas em tempo real, chatbots e muito mais.
Neste tutorial, construiremos um aplicativo Java simples que envia mensagens SMS usandoTwilio.
Existem vários serviços que fornecem recursos de SMS, comoNexmo,Plivo, AmazonSimple Notification Service (SNS),Zapier e mais.
Usando o cliente Twilio Java,we can send an SMS message in just a few lines of code.
2. Configurando o Twilio
To get started we’ll need a Twilio account. Eles oferecem uma conta de teste que é suficiente para testar todos os recursos de sua plataforma.
Como parte da configuração da conta, também devemos criar um número de telefone. Isso é importante porque a conta de avaliação requer um número de telefone verificado para o envio de mensagens.
Twilio oferece umquick setup tutorial para novas contas. Depois de concluir a configuração da conta e verificar nosso número de telefone, podemos começar a enviar mensagens.
3. Introdução ao TwiML
Antes de escrevermos nosso aplicativo de amostra, vamos dar uma olhada rápida no formato de troca de dados usado para serviços Twilio.
TwiML é uma linguagem de marcação proprietária baseada em XML. Os elementos em uma mensagem TwiML refletem as diferentes ações que podemos executar relacionadas à telefonia: fazer uma ligação telefônica, gravar uma mensagem, enviar uma mensagem e assim por diante.
Aqui está um exemplo de mensagem TwiML para enviar um SMS:
Sample Twilio SMS
E aqui está outro exemplo de mensagem TwiML que faz uma ligação:
415-123-4567
Ambos são exemplos triviais, mas eles nos dão uma boa compreensão de como o TwiML se parece. É composto por verbos e substantivos fáceis de lembrar e diretamente relacionados à ação que realizaríamos com um telefone.
4. Enviando SMS em Java com Twilio
O Twilio fornece um rico cliente Java que facilita a interação com seus serviços. Instead of having to write code that builds TwiML messages from scratch, we can use an out-of-the-box Java client.
4.1. Dependências
Podemos baixar a dependência diretamente deMaven Central ou adicionando a seguinte entrada ao nosso arquivopom.xml:
com.twilio.sdk
twilio
7.20.0
4.2. Enviando um SMS
Para começar, vejamos alguns exemplos de código:
Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
Message message = Message.creator(
new PhoneNumber("+12225559999"),
new PhoneNumber(TWILIO_NUMBER),
"Sample Twilio SMS using Java")
.create();
Vamos dividir em partes essenciais o código do exemplo acima:
-
A chamadaTwilio.init() é necessária uma vez para configurar o ambiente Twilio com nosso exclusivo Sid e Token de conta
-
O objetoMessage é o Java equivalente ao elemento TwiML<Message> que vimos anteriormente
-
Message.creator() requer 3 parâmetros: Para o número do telefone, Do número do telefone e o corpo da mensagem
-
O métodocreate() lida com o envio da mensagem
4.3. Enviando um MMS
The Twilio API also supports sending multimedia messages. Podemos misturar e combinar texto e imagens, para que isso funcione, o telefone receptor deve suportar mensagens de mídia:
Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
Message message = Message.creator(
new PhoneNumber("+12225559999"),
new PhoneNumber(TWILIO_NUMBER),
"Sample Twilio MMS using Java")
.setMediaUrl(
Promoter.listOfOne(URI.create("http://www.domain.com/image.png")))
.create();
5. Status da mensagem de rastreamento
Nos exemplos anteriores, não confirmamos se a mensagem foi realmente entregue. No entanto,Twilio provides a mechanism for us to determine whether a message was successfully delivered or not.
5.1. Códigos de status da mensagem
Ao enviar uma mensagem, ela terá um dos status a qualquer momento:
-
Queued - Twilio recebeu a mensagem e a colocou na fila para entrega
-
Sending - o servidor está enviando sua mensagem para a operadora upstream mais próxima na rede
-
Sent - a mensagem foi aceita com sucesso pela operadora upstream mais próxima
-
Delivered - Twilio recebeu confirmação de entrega da mensagem da operadora upstream e, possivelmente, do aparelho de destino, quando disponível
-
Failed - a mensagem não pôde ser enviada
-
Undelivered - o servidor recebeu um recibo de entrega indicando que a mensagem não foi entregue
Observe que, nos dois últimos status, podemos encontrar um código de erro com detalhes mais específicos para nos ajudar a solucionar problemas de entrega.
O Twilio Java Client oferece métodos síncronos e assíncronos para buscar o status. Vamos dar uma olhada.
5.2. Verificando o status da entrega (síncrono)
Depois de criar um objetoMessage, podemos chamarMessage.getStatus() para ver em qual status ele está:
Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
ResourceSet messages = Message.reader().read();
for (Message message : messages) {
System.out.println(message.getSid() + " : " + message.getStatus());
}
Observe queMessage.reader().read() faz uma chamada de API remota, portanto, use-a com moderação. By default, it returns all messages we’ve sent, mas podemos filtrar as mensagens retornadas por números de telefone ou intervalo de datas.
5.3. Verificando o status da entrega (assíncrono)
Como a recuperação do status da mensagem requer uma chamada de API remota, pode levar muito tempo. Para evitar o bloqueio do thread atual, o cliente Twilio Java também fornece uma versão assíncrona deMessage.getStatus().read().
Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
ListenableFuture> future = Message.reader().readAsync();
Futures.addCallback(
future,
new FutureCallback>() {
public void onSuccess(ResourceSet messages) {
for (Message message : messages) {
System.out.println(message.getSid() + " : " + message.getStatus());
}
}
public void onFailure(Throwable t) {
System.out.println("Failed to get message status: " + t.getMessage());
}
});
Isso usa a interface GuavaListenableFuture para processar a resposta do Twilio em um thread diferente.
6. Conclusão
Neste artigo, aprendemos como enviar SMS e MMS usando o Twilio e Java.
Enquanto o TwiML é a base de todas as mensagens de e para servidores Twilio, o cliente Java do Twilio facilita o envio de mensagens de maneira incrivelmente fácil.
E, como sempre, a base de código completa para este exemplo pode ser encontrada em nossoGitHub repository.