https://a.storyblok.com/f/270183/83992/c15e7e5805/2018-08-07-11-20-15.jpg

Como exibir notificações de SMS no navegador usando Angular, Node.JS e Ably

Publicado em November 8, 2020

Tempo de leitura: 13 minutos

A SMS API da Vonage permite que você envie e receba mensagens em todo o mundo usando um número virtual que pode ser alugado da Vonage. Neste tutorial, veremos como você pode usar o Node.js e o Express para receber um SMS, enviá-lo via Ably para um navegador da web e, em seguida, usar o Angular para exibi-lo como uma notificação em um aplicativo de página única.

Antes de começar

Antes de começarmos, você vai precisar de algumas coisas:

  • Conhecimentos básicos de JavaScript e Angular

  • Node.js instalado no seu computador

  • ngrok instalado no seu computador

  • Um Um relato

  • O código inicial do GitHub

Baixando o código inicial do GitHub

Primeiro, vamos clonar o código-fonte do tutorial e mudar para o branch “getting-started”

git clone https://github.com/nexmo-community/nexmo-angular-sms.git cd nexmo-angular-sms/ git checkout getting-started

A seguir, vamos instalar as dependências necessárias para o nosso código. Há um aplicativo Node.js que utiliza o Express, o body-parser e o Ably, além de um aplicativo Angular gerado com o Angular CLI.

npm install

Criação de endpoints de webhook com o Express

Para receber uma mensagem SMS da Vonage, você precisa definir um endpoint de Webhook (URL) e, em seguida, associá-lo ao seu número virtual da Vonage. Sempre que seu número receber uma mensagem SMS, a Vonage irá enviá-la para o endpoint de Webhook. Portanto, vamos prosseguir com a criação desse endpoint usando Express.

No código que você acabou de baixar, há um arquivo chamado server.js, que vem com um servidor Express padrão escutando na porta 3000. Deve ficar assim:

'use strict';
const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

const server = app.listen(3000, () => {
	console.log('Express server listening on port %d in %s mode', server.address().port, app.settings.env);
});

Agora vamos criar uma rota HTTP POST para processar as solicitações enviadas ao servidor. No final do arquivo, basta adicionar:

app.post('/inbound', (req, res) => {
	handleParams(req.body, res);
});

O handleParams método ainda não está definido, então vamos implementá-lo agora. Vamos adicionar algumas validações para verificar se recebemos uma mensagem SMS válida e, se for o caso, mapearemos os dados recebidos antes de enviá-los. Precisamos retornar um 200 OK código de status no final, para que o painel da Vonage possa reconhecê-la como uma URL de Webhook válida.

function handleParams(params, res) {
	if (!params.to || !params.msisdn) {
    		console.log('This is not a valid inbound SMS message!');
	} else {
    		console.log('Success');
    		let incomingData = {
        		messageId: params.messageId,
        		from: params.msisdn,
        		text: params.text,
        		type: params.type,
        		timestamp: params['message-timestamp']
    	};
    	res.send(incomingData);
	}

	res.status(200).end();
}

Agora você pode executar o servidor, que ficará disponível em localhost:3000:

$ node server.js

Como registrar um endpoint de webhook na Vonage

Agora que você criou seu endpoint de Webhook, é hora de associá-lo ao seu número da Vonage. No entanto, durante o desenvolvimento, é um saco ter que reimplantar constantemente o trabalho em andamento. Então, vamos usar o o ngrok para expor o endpoint do Webhook que acabamos de criar em nossa máquina local como uma URL pública! Para instruções mais detalhadas, consulte postagem do Aaron post explicando como conectar seu servidor de desenvolvimento local à API da Vonage usando um túnel do ngrok.

Depois de instalar o ngrok, execute-o na porta 3000, a mesma porta do servidor Express:

ngrok http 3000

start ngrok in terminalstart ngrok in terminal

Seu servidor Express (localhost:3000) agora possui uma URL do ngrok (https://3be084f6.ngrok.io), que pode ser usada como um endpoint público de Webhook durante este tutorial.

Configurando o endpoint do webhook com a Vonage

Para que o painel do Vonage reconheça a URL como um ponto de extremidade do Webhook, ela precisa retornar um código de status 200 OK; portanto, certifique-se de que seu servidor esteja em execução. Caso contrário, você pode acessar a raiz do código baixado do GitHub e usar o terminal para executá-lo:

npm run server

Faça login no seu Account da Vonage e acesse seus Numbers. Na seção “Gerenciar” do seu número, clique em “Editar”. Na janela modal que aparecerá, vamos configurar o Webhook que acabamos de criar. Na seção “SMS”, insira a URL do ngrok com a rota de entrada (https://3be084f6.ngrok.io/inbound) no campo “URL do Webhook”.

set webhookset webhook

Agora, todas as suas mensagens recebidas serão encaminhadas para a URL do Webhook. Vamos seguir em frente e enviá-las pelo Ably para um navegador moderno bem perto de você!

Observação: este método configura o Webhook de SMS no nível do número. No entanto, você também pode configurá-lo no nível da Account, para poder ler as mensagens SMS de todos os números da sua Account.

Enviando o SMS para a web com o Ably

Ao criar um Account no Ably, você receberá uma chave de API. Se já tiver um Account, faça login no Ably e obtenha a chave de API primeiro. Precisaremos passá-la para o servidor Express e para o aplicativo Angular mais adiante.

Agora vamos atualizar nosso servidor Express para que, ao receber uma mensagem SMS da API da Vonage, ele a envie por meio do Ably para um canal.

Ainda em server.js, importe primeiro o pacote Ably e obtenha o sms-notification canal

var ably = new require('ably').Realtime('ABLY_KEY');

var channel = ably.channels.get('sms-notification');

E, em seguida, vamos modificar o handleParams método para publicar nesse canal do Ably quando houver um SMS recebido.

function handleParams(params, res) {
	if (!params.to || !params.msisdn) {
    	console.log('This is not a valid inbound SMS message!');
	} else {
    	console.log('Success');
    	let incomingData = {
        	messageId: params.messageId,
        	from: params.msisdn,
        	text: params.text,
        	type: params.type,
        	timestamp: params['message-timestamp']
    	};

    	channel.publish('new-sms', incomingData);

    	res.send(incomingData);
	}

	res.status(200).end();

}

Executando o aplicativo Angular usando o Angular CLI

Se você não tiver o Angular CLI instalado, precisará instalá-lo primeiro:

npm install -g @angular/cli

Agora execute o aplicativo Angular

ng serve

ng serveng serve

O aplicativo agora está em execução no http://localhost:4200, e você pode acessá-lo em um navegador. Ele foi gerado usando o Angular CLI, mas também adicionei o Materialize.css e a identidade visual a ele. Deve ficar assim:

booilerplate appbooilerplate app

Criação de um componente Angular para exibir notificações de SMS recebidas

Agora é hora de criar nosso componente Angular, que usaremos para exibir notificações de SMS recebidas. Usaremos a CLI para gerá-lo

ng generate component sms-notifications

A CLI criou quatro arquivos para nós: o arquivo TypeScript do componente, o modelo HTML, a folha de estilo CSS e a especificação de teste.

generated filesgenerated files

Vamos atualizar o arquivo TypeScript do componente (src/app/sms-notifications/sms-notifications.component.ts) para importar o Ably.

import * as Ably from 'ably';

ngOnInit é uma função de gancho de ciclo de vida no Angular e é executada quando um componente está sendo inicializado. Vamos atualizar ngOnInit para receber a notificação do Ably. Vamos instanciar o Ably e, em seguida, acessar o sms-notification canal, assinando os new-sms eventos. Quando um novo SMS chegar, vamos inseri-lo no modelo do nosso componente, smsNotifications.

ngOnInit() {
	let options: Ably.Types.ClientOptions = { key: 'ABLY_KEY' };
  let client = new Ably.Realtime(options);
  let channel = client.channels.get('sms-notification');

	channel.subscribe('new-sms', data => {
  	this.smsNotifications.push(data.data);
	});
}

smsNotifications :Object[] = []

Agora que já temos o smsNotifications no modelo do componente, vamos substituir tudo no arquivo de modelo (src/app/sms-notifications/sms-notifications.component.html) para exibir a notificação de SMS recebida. Queremos criar uma lista de notificações de SMS, então teremos que usar a diretiva *ngFor para percorrer o smsNotifications. O design é minimalista; vamos usar um painel de cartão do Material Design para exibir o número de origem, a notificação por SMS e a data e hora.

<div class="row">
  <div *ngFor="let sms of smsNotifications" class="col s12">
		<div class="row">
	  	<div class="col s12 m6 offset-m3">
	    	<div class="white-text card-panel blue">
	      	<p class="left-align valign-wrapper"><i class="small material-icons">perm_phone_msg</i>	{{sms.from}}</p>
	      	<p class="center-align">{{sms.text}}</p>
	      	<p class="right-align"><i>{{sms.timestamp}}</i></p>
	    	</div>
	  	</div>
		</div>
  </div>
</div>

Para que o componente seja exibido na tela, precisaremos atualizar também o modelo do App, a fim de adicionar o sms-notifications componente a ele. Portanto, no final do arquivo (src/app/app.component.html), adicione

<app-sms-notifications></app-sms-notifications>

Agora que tudo está funcionando, vamos enviar uma mensagem para o número da Vonage e ver se ela é exibida no aplicativo de página única do Angular:

demodemo

Ao criar um túnel com o ngrok, você também pode visualizar as solicitações no navegador em http://127.0.0.1:4040/

ngrok requestsngrok requests

Assim, conseguimos enviar uma notificação por SMS para um número da Vonage, que nosso servidor Express recebeu por meio de um Webhook, o qual, por sua vez, enviou a mensagem via Ably para nosso aplicativo Angular, e recebemos a notificação no navegador.

Você pode dar uma olhada no exemplo de código no GitHub se quiser ver o produto final.

Espero que isso tenha sido útil para você. Você pode me avisar no Twitter, meu nome de usuário é @lakatos88.

Leituras complementares

Compartilhar:

https://a.storyblok.com/f/270183/384x384/dabe7c5397/laka.png
Alex LakatosEx-funcionários da Vonage

Alex Lakatos é um Developer Advocate de JavaScript na Nexmo. Em seu tempo livre, ele atua como voluntário na Mozilla como palestrante técnico e mentor do programa Reps. Como desenvolvedor de JavaScript que trabalha na web aberta, ele vem ampliando seus limites a cada dia. Quando não está programando em Londres, ele gosta de viajar pelo mundo; por isso, é provável que você o encontre em um lounge de aeroporto.