Como enviar mensagens para WhatsApp usando AdvPL/TL++

Hoje começo uma nova série de artigos no Terminal, voltado a integração com WhatsApp com a API da NETiZAP, então aproveite XD.

A NETiZAP disponibilizou uma linha de testes para o Terminal de Informação e para os alunos aqui testarem em suas respectivas bases.

Então durante as próximas semanas iremos demonstrar como fazer algumas coisas bem bacanas com a API da NETiZAP.

As informações para testes são:

  • Linha: 5521986855299
  • Porta: 13155
  • Chave de Acesso: fUzanE5ncxlTAWBjMO30

Essas 3 informações iremos cadastrar nos respectivos parâmetros MV_X_ZAPLI, MV_X_ZAPPO e MV_X_ZAPCH.

Depois disso, é necessário fazermos o download da excelente classe NETiZAP.prw disponibilizada pelo grande Júlio Wittwer – clique aqui para fazer o download no GitHub. Inclusive, recomendo também a leitura do artigo redigido por ele no blog Tudo em AdvPL (clique aqui para ler).

Agora vamos desenvolver uma função genérica, que irá receber o telefone e a mensagem, e irá realizar o envio de forma bem simples. Abaixo o código desenvolvido:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zZapSend
Função que dispara uma mensagem para um smartphone com o aplicativo do WhatsApp
@type  Function
@author Atilio
@since 05/08/2021
@version version
@param cTelDestin, Caractere, Telefone de destino com o país 55 e o ddd - por exemplo 5514999998888
@param cMensagem,  Caractere, Mensagem que será enviada para esse WhatsApp
@return aRet, Array, Posição 1 define se deu certo o envio com .T. ou .F. e a Posição 2 é o JSON obtido como resposta do envio com o protocolo
@obs É necessário baixar a classe NETiZAP desenvolvida pelo grande Júlio Wittwer
    disponível em https://github.com/siga0984/NETiZAP/blob/master/NETiZAP.prw
/*/

User Function zZapSend(cTelDestin, cMensagem)
    Local aArea  := GetArea()
    Local cLinha := SuperGetMV("MV_X_ZAPLI", .F., "5521986855299")
    Local nPorta := SuperGetMV("MV_X_ZAPPO", .F., 13155)
    Local cChave := SuperGetMV("MV_X_ZAPCH", .F., "fUzanE5ncxlTAWBjMO30")
    Local aRet   := {.F., ""}
    Local oZap
    Default cTelDestin := ""
    Default cMensagem  := ""

    //Retira caracteres em branco dos lados
    cTelDestin := Alltrim(cTelDestin)
    cMensagem  := Alltrim(cMensagem)

    //Transforma o texto em UTF-8
    cMensagem := EncodeUTF8(cMensagem)

    //Retira caracteres especiais do telefone por exemplo +55 (14) 9 9999-8888
    cTelDestin := StrTran(cTelDestin, " ", "")
    cTelDestin := StrTran(cTelDestin, "+", "")
    cTelDestin := StrTran(cTelDestin, "(", "")
    cTelDestin := StrTran(cTelDestin, ")", "")
    cTelDestin := StrTran(cTelDestin, "-", "")

    //Se houver telefone, mensagem, o número for menor que 12 caracteres (551400000000) e não iniciar com 55 não irá enviar a mensagem
    If Empty(cTelDestin) .And. Empty(cMensagem) .And. Len(cTelDestin) < 12 .And. SubStr(cTelDestin, 1, 2) != "55"
        aRet[1] := .F.
        aRet[2] := '[{"error":"Parametro(s) enviado(s) para zZapSend, invalido(s)"}]'
    Else
        
        //Instancia a classe, e passa os parametros da NETiZAP
        oZap := NETiZAP():New(cLinha, cChave, nPorta)

        //Define o destino e a mensagem de envio
        oZap:SetDestiny(cTelDestin)
        oZap:SetText(cMensagem)

        //Atualiza o retorno conforme se a mensagem foi enviada ou houve falha
        If oZap:MessageSend()
            aRet[1] := .T.
            aRet[2] := oZap:GetResponse()
        Else
            aRet[1] := .F.
            aRet[2] := oZap:GetLastError()
        EndIf
    EndIf

    RestArea(aArea)
Return aRet

E abaixo um fonte de teste para enviar a mensagem ao destinatário:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zZapTest
Função de teste para envio de mensagens para o WhatsApp
@type  Function
@author Atilio
@since 05/08/2021
@version version
/*/

User Function zZapTest()
    Local aArea := GetArea()
    Local aZap  := {}

    //Faz o teste de envio
    aZap := u_zZapSend("5514999998888", "Olá Daniel, essa é uma mensagem de teste!")

    //Se houve falha, mostra a mensagem de erro
    If ! aZap[1]
        MsgStop(aZap[2], "Falha no envio")
    EndIf

    RestArea(aArea)
Return

E o resultado como ficou no WhatsApp:

Resultado do envio pelo Protheus

Obs.: Os códigos desenvolvidos nessa série do WhatsApp, estão dentro do nosso GitHub, o link é https://github.com/dan-atilio/AdvPL.

Lembrando também pessoal, se tiverem interesse em adquirir uma licença da API, entrem em contato com o pessoal da NETiZAP clicando aqui, e digam que conhecem o Atilio do Terminal de Informação.

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

2 Responses

  1. WANDERSON FERNANDES DE SOUZA disse:

    Bom dia Atílio,

    Gostei e muito deste post, parabéns.

Deixe uma resposta