docs

A integração via Webhook tem como objetivo disponibilizar em real time os eventos gerados a partir das plataformas Invenio Center e Invenio Live.

  • Mensagens enviadas e atualização de status de entrega
  • Mensagens recebidas e atualização de status de recebimento
  • KPI Eventos inseridos no ambiente (sejam eles feitos por usuário ou sistema)
  • Campanhas e atualização de status
  • Carteiras e atualização ou edição de suas configurações
  • Status de templates HSM, bem como sua qualidade e alterações
  • Status de linhas WhatsApp, bem como sua qualidade e alterações
  • Relação de usuários, logs e alterações
  • Protocolos com suas estatísticas e dados relacionados

Manual de Integração #

Como funciona a integração via Webhook+Enpoint? #

Este serviço serve como receptor de todas interações que constam no banco de dados Robbu, os objetos enviados em blocos JSON são: [contact], [event] ,[messageincoming], [messageoutgoing], [campaign], [template], [protocol], [wallet], [whatsapp numbers], [status].

Esse serviço enviará blocos de 30 arquivos JSON em um intervalo médio de 2 segundos.

Configuração #

1 – Download do projeto #

Comece fazendo o download do projeto de referência em:

Localize o arquivo Script_Tabelas_Robbu.sql, é nesse schema de tabelas que o serviço webhook irá popular as tabelas do banco de dados do endpoint.

Obs: O script de criação das tabelas foi criado em SQL, assim como os métodos de inserção dos dados estão considerando esse banco de dados. Trazemos dessa forma para que funcione como um facilitador, porém fica a critério da empresa a definição das tecnologias a serem utilizados, ficando sob total responsabilidade do próprio cliente manter em funcionamento.

2 – Publicação do Projeto: #

Essa solução é a interpretadora dos blocos JSON que o webhook irá disparar ao endpoint destino. Ela fica responsável por separar cada tipo de interação e salvar as informações no banco de dados externo.

Caso você já possua uma infraestrutura cloud/on-premises e queira reaproveitá-la, você pode publicar nossa solução neste mesmo servidor disponível.

Fique à vontade para utilizar um servidor novo. A prioridade aqui é que serviço de disparo consiga acessar externamente a partir de uma rota de execução.

3 – Recomendações para o deploy: #

O arquivo root da solução é apiv1.ashx. Ele é o responsável por fazer com que o processamento seja iniciado.

Sobre versionamento do .NET Framework, ele deve ser 4.6.1. e 4.8. Atente-se aos .NET instalados no servidor para que tenham compatibilidade com a solução.

A URL da solução publicada não contém restrições. É possível publicá-la a partir de qualquer rota e pode ser exposta em rota HTTP ou HTTPS. Recomendamos HTTPS pela segurança.

Também se faz necessária a liberação da relação de IP’s abaixo no firewall para garantir a conectividade da integração:

104.41.15.44, 104.41.14.184, 104.41.13.132, 104.41.12.97, 104.41.56.229, 104.41.30.250, 20.206.191.81, 191.235.52.58, 191.235.52.65, 191.235.52.78, 191.235.52.195, 191.235.52.245, 191.235.53.35, 191.235.53.57, 191.235.53.74, 191.235.53.158, 191.235.54.48, 191.235.54.59, 104.41.13.179

4- Recomendações iniciais de infraestrutura: #

Para um servidor endpoint de ambiente de produção recomendamos o setup mínimo:

  • SSD de 250 GB
  • 16 GB de RAM
  • CPU com 4 núcleos.

Não recomendamos a utilização de um HD devido a velocidade e volume de mensagens de entrada, saída e eventos. O baixo desempenho pode gerar gargalos com a carga das replicações.

Esta é uma recomendação técnica inicial. A área de TI deve manter a gestão contínua da infraestrutura usada na solução devido a necessidade futura de escala. A solução a ser executada no servidor endpoint é desenvolvida em .NET, desta forma orientamos a usar produtos Microsoft. Recomendamos também a utilização de banco de dados SQL Server.

5 – Configuração final: #

Após configurar toda infraestrutura de servidor, banco de dados, liberações de firewall e publicação externamente do serviço webhook, acesse:

https://inveniocenter.robbu.com.br/painel/configuracoes > Webhook

Clique em gerenciar:

Adicione a URL final que foi gerada pelo Visual Studio ou pela IDE que foi utilizada e salve.

Após essa etapa aguarde em aproximadamente 60 minutos você deverá começar a receber as requisições em seu endpoint.

Mapeamento de Campos #

Abaixo apresentamos a estrutura de campos e tabelas para manipulação dos dados recebidos:

Tabela Message #
CampoDescriçãoTipo
MessageSentToProviderAtData e Hora do envio da mensagem ao provedorDatetime
MessageDeliveredAtData e Hora de entrega da mensagemDatetime
MessageReadAtData e Hora da leitura da mensagemDatetime
MessageFailedAtData e Hora da falha na entrega da mensagemDatetime
MessagemSentAtData e Hora do envio da mensagemDatetime
MessageReceivedAtData e Hora do recebimento da mensagemDatetime
MessageCampaignidId da campanhaInt
MessageTypeTipo do envio da mensagem.String
MessageDirectionInforma se a mensagem é Outcoming(Saída) ou Incoming(Entrada).String
MessageIdId da MensagemLong
MessageChannelEnumerador referente à mensagem.
  1 – E-mail
2 – SMS
3 – Whatsapp
4 – Chat
5 – Facebook
6 – Telegram
7 – Voz
8 – Instagram
9 – Viber
Int
MessageTextTexto da mensagemString
MessageSourceCountryCodeCódigo do país do remetenteInt
MessageSourcePhoneNumberNúmero de telefone do remetenteLong
MessageSourceEmailEmail do remetenteString
MessageDestinationCountryCodeCódigo do pais do destinatárioInt
MessageDestinationPhoneNumberNúmero de telefone do destinatárioLong
MessageDestinationEmailEmail do destinatárioString
ContactRobbuIdID do contato na RobbuLong
ContactNameNome do contatoString
ContactIDId do contatoString
ContactCustomCodeCod.Cliente do ContatoString
ContactMainEmailEmail principal do contatoString
ContactMainWhatsAppCountryCodeCódigo do pais da linha principal do WhatsApp do contatoInt
ContactMainWhatsAppPhoneNumberNúmero de telefone principal de WhatsApp do contatoLong
ContactMainSmsCountryCodeCódigo do pais da linha principal de SMS do contatoInt
ContactMainSmsPhoneNumberNúmero de telefone principal de Sms do contatolong
QueueWaitingSinceData e Hora de início da espera do contato na fila da operação.Datetime
QueueFirstAnswerAtData e Hora da primeira resposta ao contatoDatetime
ContactLastWalletCodeCódigo do último segmento do contatoString
ContactLastWalletNameNome do último segmento do contatoString
ContactLastChannelDescriptonDescrição do último canal do contatoString
ContactCreatedAtData e Hora da inclusão do contatoDatetime
ContactLastAnswearAtData e Hora da última mensagem enviada ao contato pela operaçãoDatetime
ContactLastIncomingMessageAtData e Hora da última mensagem recebida pelo contatoDatetime
DigitalPostmanInforma se o envio é via Carteiro DigitalBool
LocationLatitudeLatitude da localizaçãoDouble
LocationLongitudeLongitude da localizaçãoDouble
FileUrlURL do arquivoString
FileNameNome do arquivoString
FileExtensionExtensão do arquivoString
ProtocolMessageIdId do ProtocoloLong
ProtocolMessageNumberNúmero do ProtocoloString
MessageErrorCodeCódigo da falha na entrega da mensagemString
ErrorMessageDescrição da mensagem de erroString
MessageChannelDescriptionDescrição do CanalString
MessageTemplateNameNome do TemplateString
MessageTemplateIdId do TemplateLong

Tabela Event #
CampoDescriçãoTipo
IDId do eventoLong
TypeTipo do evento: Negativo, Neutro ou PositivoDatetime
DescriptionDescrição do eventoString
NoteObservação do eventoString
CustomCodeCódigo customizado do eventoString
SenderUsuário responsável pelo eventoString
FinalizedIndica se é um evento finalizadorBool
TypeTipo do evento: negativo, neutro ou positivoString
ProtocolNumberNúmero do protocoloString
ProtocolIDId do ProtocoloLong
ContactRobbuIdId único do contato na RobbuLong
ContactNameNome do contatoString
ContactIDId do contatoString
ContactCustomCodeCod.Cliente do ContatoString
ContactMainEmailEmail principal do contatoString
ContactMainWhatsAppCountryCodeCódigo do pais da linha principal do WhatsApp do contatoInt
ContactMainWhatsAppPhoneNumberNúmero de telefone principal de WhatsApp do contatoLong
ContactMainSmsCountryCodeCódigo do pais da linha principal de SMS do contatoInt
ContactMainSmsPhoneNumberNúmero de telefone principal de Sms do contatolong
QueueWaitingSinceData e Hora de início da espera do contato na fila da operação.Datetime
QueueFirstAnswerAtData e Hora da primeira resposta ao contatoDatetime
ContactLastWalletCodeCódigo do último segmento do contatoString
ContactLastWalletNameNome do último segmento do contatoString
ContactLastChannelDescriptonDescrição do último canal do contatoString
ContactCreatedAtData e Hora da inclusão do contatoDatetime
ContactLastAnswearAtData e Hora da última mensagem enviada ao contato pela operaçãoDatetime
ContactLastIncomingMessageAtData e Hora da última mensagem recebida pelo contatoDatetime
Tabela Campaign #
CampoDescriçãoTipo
CreatedAtData e Hora de criação da campanhaDatetime
CreatedByUsuário responsável pela campanhaString
IdId da CampanhaInt
ChannelEnumerador referente aos canais da campanha
1 – E-mail
2 – SMS
3 – Whatsapp
4 – Chat
5 – Facebook
6 – Telegram
7 – Voz
8 – Instagram
9 – Viber
Int
ChannelDescriptionDescrição do CanalString
StartAtData e Hora de início da campanhaDatetime
SizeQuantidade de mensagens a serem enviadasInt
MessageTemplate enviado na campanhaString
HoursToDiscardQuantidade de horas definida, para caso o contato já esteja sendo atendido através de outros canais para ser removido da campanha da campanha realizadaInt
TypeCampaignCodeCódigo interno do tipo de campanha
• “EM” – E-mail
• “SL” – SMS Long
• “SS” – SMS Short
• “VW” – Voz Way
• “WB” – Whatsapp Broadcast
• “WE” – WhatsApp Oficial Exclusivo
• “WP” – Whastapp Prospect Convencional
• “WO” ou “WC” – Whatsapp Oficial Compartilhado
String
TypeCampaignDescriptionDescrição do tipo de Campanha
[1-SMS; 2- WhatsApp; 3- Email; 4- Voz]
String
SplitSendPercentagePercentual de intervalo para processar o número total de contatos no público selecionadoDouble
SplitSendMinutesIntervalo de minutos para envio das mensagensInt
MailingDescriptionDescrição do mailingString
MailingImportedAtData e hora da importação do mailingDatetime
MailingImportedByUsuário responsável pela importação do mailingString
MailingSizeQuantidade de registros no mailingInt
MailingWalletClientCodeCódigo da carteira do mailingString
TotalSentQuantidade total de mensagens enviadasInt
CampaignLastSentAtData e Hora da última mensagem enviadaDatetime
CampaignStatusCodeCódigo do status da campanha
“C” – Cancelada
“E” – Campanha não enviada
“F” – Finalizada
“I” – Iniciada
“P” – Aguardando Processamento
String
CampaignDescriptionDescrição do tipo de campanhaString
Tabela Template #
CampoDescriçãoTipo
IdId do TemplateLong
NameNome do TemplateString
EventStatus da ação realizada ao template: Updated, CreatedString
EventAtData e Hora inclusão/alteraçãoDatetime
StatusStatus do template na Meta
[Approved; Reject; Deleted; Disabled]
String
QualityQualidade do template na Meta:
[Green; Yellow; Red; Deleted; Disabled]
String
CategoryInforma a categoria do template na Meta
[Utility; Marketing; Service; Authentication]
String
LanguageIdioma do templateString
Tabela Protocol #
CampoDescriçãoTipo
EventStatus da ação realizada ao protocolo
[Updated; Created]
String
EventAtData e Hora inclusão do protocoloDatetime
IdId do protocoloLong
NumberNúmero do protocoloString
GeneratedAtData e Hora geração do protocoloDatetime
GenerationChannelDescriptionDescrição do Canal do protocolo geradoString
GenerationWalletNameNome do segmento do protocolo geradoString
GenerationWalletCodeCódigo do segmento do protocolo geradoString
GenerationWalletIdId do segmento geradoLong
SegmentIdId do SegmentoLong
SegmentNameNome do SegmentoString
ContactProtocolIdId do protocolo do contatoString
ContactProtocolRobbuIdId do protocolo na RobbuLong
FirstMessageIdrAtData e Hora primeira mensagem IDRDatetime
LastMessageIdrAtData e Hora última mensagem IDRDatetime
IdrClosedAtData e Hora encerramento do atendimento na IDRDatetime
LastMessageContactIdrAtData e Hora última mensagem do contato enviada a IDRDatetime
FirstMessageFromHumanAttendanceAtData e Hora primeira mensagem da OperaçãoDatetime
IdrMessagesCountA soma total de mensagens enviada pela IDRLong
HumanAttendanceMessagesCountA soma total de mensagens trocadas por atendentes no protocoloLong
IncomingMessagesCountA soma total de mensagens recebidas no protocoloLong
HumanAttendanceAnswersCountA soma total de respostas de atendentes no protocoloLong
ContactAnswersCountA soma total de respostas do contato no protocoloLong
HumanAttendanceAnswersTotalTimeInSecondsA soma total em segundos das respostas da operação no protocoloLong
ContactAnswersTotalTimeInSecondsA soma total em segundos das respostas do contato no protocoloLong
IdrAnswersTotalTimeInSecondsA soma total em segundos das respostas da IDRLong
IdrAnswersCountA soma total de respostas da Idr no protocoloLong
ClosedAtData e Hora encerramento do protocoloDatetime
ClosingUserInfoNome do usuário encerramento do protocoloString
ClosingEventIdId do evento encerramentoLong
ClosingEventNameNome do evento encerramentoString
ClosingEventCodeCódigo do evento encerramentoString
AbandonedAtData e Hora abandono protocoloDatetime
Tabela User #
CampoDescriçãoTipo
IdId do usuárioLong
NameNome do usuárioString
EventStatus da ação realizada ao usuário [Updated; Created]String
EventAtData e Hora criação/edição do usuárioDatetime
CompletenameNome completo do usuárioString
AcessGroupGrupo de acesso do usuárioString
AcessGroupDescriptionDescrição do grupo de acesso do usuárioString
EmailAddressEndereço de email do usuárioString
LastLoginAtData e Hora do último login do usuárioDatetime
IsActiveInforma se o usuário esta ativo ou inativo na plataformaBool
LastQueueUpdateAtData e Hora da última atualização da fila de atendimentoDatetime
LastPasswordChangeATData e Hora da última troca de senha do usuárioDatetime
IsLoggedInforma se o usuário esta logado na plataformaBool
Tabela Wallet #
CampoDescriçãoTipo
IdId do segmentoLong
NameNome do segmentoString
CodeCódigo do segmentoString
EventStatus da ação realizada ao segmento
[Updated; Created; Deleted]
String
EventAtData e Hora da criação/edição do segmentoDatetime
DistributionMethodMétodo de distribuição de contatos do segmentoString
DistributionMethodDescriptionDescrição do metodo de distribuiçãoString
Tabela WhatsApp Numbers #
CampoDescriçãoTipo
EventStatus da ação realizada a linha de WhatsApp
[Created; Updated]
String
EventAtData e Hora inclusão/alteração da linha WhatsAppDatetime
IdId da linha WhatsAppLong
WalletIdId do segmentoLong
StatusQualidade da linha WhatsApp na Meta
[Green; Yellow; Red; Unknown]
String
CountryCodeCódigo do paísString
AreaCodeCódigo de AreaString
PhoneNumberNúmero de telefone da linha WhatsAppString
IsActiveInforma se a linha WhatsApp está ativaBool
BroadCastLimitPerDayLimite de envios diário por dia (Informação recebida da Meta)Int
CanSendHsmInforma se a linha está habilitada para envio de HSMBool
Tabela Status #
CampoDescriçãoTipo
MessageStatusIdId do status da mensagemLong
SourceStatusSenderRemetente do status de origemString
MessageStatusSentToProviderAtData e Hora do envio da mensagem ao provedorDatetime
MessageStatusDeliveredAtData e Hora da entrega da mensagemDatetime
MessageStatusReadAtData e Hora da leitura da mensagemDatetime
MessageStatusSentAtData e Hora envio da mensagemDatetime
MessageStatusFailedAtData e Hora da falha do envio da mensagemDatetime
MessageStatusDigitalPostmanInforma se a mensagem é do tipo de envio Carteiro DigitalBool
MessageStatusErrorCodeCódigo de erro da mensagemString
MessageStatusErrorMessageDescrição do erro da mensagem enviadaString
ContactStatusRobbuIdId do status do contato na RobbuLong

Mensagem de entrada – Exemplo de json #

[{
	"message": {
		"receivedAt": "2020-01-31T02:01:03",
		"direction": "incoming",
		"id": 13232322244444,
		"channel": 3,
		"text": "Olá, teste whats!",
		"source": {
			"countryCode": 55,
			"phoneNumber": 11999999992
		},
		"destination": {
			"countryCode": 55,
			"phoneNumber": 11944497777
		},
		"location": {
			"latitude": -23.5535317,
			"longitude": -46.6631181
		},
		"file": {
			"url": "http://s.robbu.com.br/arquivo?hash=ROBBU",
			"name": "robbu",
			"extension": "pdf"
		},
		"contact": {
			"robbuid": 11111111111,
			"name": "TESTE ROBBU",
			"customCode": "1372511",
			"id": "00000000000",
			"mainWhatsapp": {
				"countryCode": 55,
				"phoneNumber": 11999999992
			},
			"mainSMS": {
				"countryCode": 55,
				"phoneNumber": 11999999992
			},
			"mainEmail": "teste@robbu.global"
		}
	}
}]

Mensagem de Saida- Exemplo de json #

[{
	"message": {
		"sentAt": "2020-01-31T02:05:21.2900000",
		"direction": "outgoing",
		"id": 1323232224455555,
		"channel": 3,
		"type": "",
		"text": "Teste envio whats!",
		"campaignId": 1234,
		"source": {
			"countryCode": 55,
			"phoneNumber": 11944497777,
			"sender": ""
		},
		"destination": {
			"countryCode": 55,
			"phoneNumber": 11999999992
		},
		"file": {
			"url": "http://s.robbu.com.br/arquivo?hash=ROBBU",
			"name": "robbu",
			"extension": "pdf"
		},
		"contact": {
			"robbuid": 11111111111,
			"name": "TESTE ROBBU",
			"customCode": "1372511",
			"id": "00000000000",
			"mainWhatsapp": {
				"countryCode": 55,
				"phoneNumber": 11999999992
			},
			"mainSMS": {
				"countryCode": 55,
				"phoneNumber": 11999999992
			},
			"mainEmail": "teste@robbu.global",
			"queue": {
				"waitingSince": "2021-03-08 12:00:00",
				"firstAnswerAt": "2021-03-08 11:30:00"
			}
		}
	}
}]

Status de Mensagem – Exemplo de json #

[{
	"status": {
		"message": {
			"id": 1323232224455555,
			"source": {
				"sender": "User1"
			},
			"sentToProviderAt": "2020-01-31T15:50:39.9312405",
			"deliveredAt": "2020-01-31T15:51:52.9707831",
			"readAt": "2020-01-31T15:53:14.6399299"
		}
	}
}]

Eventos – Exemplo de json #

[{
	"event": {
		"createdAt": "2020-01-31T02:05:21.0566667",
		"id": 13232322244599998,
		"description": "[CR] Saudacao Final",
		"note": "Saudacao Final",
		"customCode": "298",
		"finalized": false,
		"sender": "",
		"type": "Neutro",
		"contact": {
			"robbuid": 11111111111,
			"name": "TESTE ROBBU",
			"customCode": "1372511",
			"id": "00000000000",
			"mainWhatsapp": {
				"countryCode": 55,
				"phoneNumber": 11999999992
			},
			"mainSMS": {
				"countryCode": 55,
				"phoneNumber": 11999999992
			},
			"mainEmail": "teste@robbu.global"
		}
	}
}]

Campanha – Exemplo de json #

[{
	"campaign": {
		"createdAt": "2020-01-27T22:01:12.2766667",
		"createdBy": "User Robbu",
		"id": 994545,
		"channel": 1,
		"startAt": "2020-01-27T21:59:00",
		"size": 3102,
		"message": "<html><body>Envio campanha email!<\/body><\/html>",
		"hoursToDiscard": 0,
		"type": {
			"code": "EM",
			"description": "EMAIL"
		},
		"splitSend": {
			"percentage": 100.00,
			"minutes": 0
		},
		"mailing": {
			"description": "disparo_email",
			"importedAt": "2020-01-27T21:54:16.5500000",
			"importedBy": "User Robbu",
			"size": 3102,
			"walletClientCode": "1000"
		}
	}
}]

Campanha status – Exemplo de json #

[{
	"status": {
		"campaign": {
			"id": 994545,
			"totalSent": 91,
			"lastSentAt": "2020-01-31T16:10:12.0633333",
			"statusCode": "F"
		}
	}
}]