Jump to content
Fivewin Brasil

sygecom

Membros
  • Posts

    814
  • Joined

  • Last visited

  • Days Won

    15

Posts posted by sygecom

  1. Eu sei que muda isso no MY.INI / MY.CNF que fica dentro da instalação do Mysql, mas não lembro o parâmetro.

    Entre tanto olha a dica do chatgpt:

    No MySQL, você pode ajustar o parâmetro wait_timeout para controlar o tempo que uma conexão ociosa pode permanecer aberta antes de ser fechada pelo servidor. Este parâmetro especifica o número de segundos de inatividade após os quais uma conexão será fechada automaticamente.
    
    Para definir um valor para wait_timeout, você pode executar uma consulta SQL como esta:
    
    SET GLOBAL wait_timeout = 300; -- Define o tempo limite de espera para 300 segundos (5 minutos)
    
    Isso definirá o tempo limite de espera globalmente para todas as conexões no servidor. Você também pode definir isso no arquivo de configuração do MySQL (por exemplo, my.cnf ou my.ini) para que ele persista entre reinicializações do servidor.
    
    Lembre-se de que ajustar esse valor pode afetar o comportamento do seu aplicativo, especialmente se você tiver conexões de longa duração. Certifique-se de ajustá-lo de acordo com as necessidades do seu sistema.

     

  2. Eu uso xharbour 1.2.3

    Geralmente eu transformo o JSON em HASH e depois procuro no Hash

    hHash     := Hash()
    
    cJSON:='{'+;
                    '"message": "Segue documento para assinatura.",'+;
                    '"skip_email": "0",'+;
                    '"workflow": "1"'+;      
                 '}'
    
    hb_jsondecode( cJSON, @hHash ) // aqui transforma o JSON em HASH
    
    IF HHasKey( hHash, 'workflow' )   
    
    ? 'EXISTE'
    
    ELSE
    
    ? 'NÃO EXISTE'
    
    ENDIF

     

  3. Visualmente parece que seu JSON está faltando virgulas, tente gerar o JSON e valida nesse site: https://jsonlint.com/

     

    cTexto := '{ '
          cTexto += '"id_client": '  + pCpf +","
          cTexto += '"id_company": ' + pCnpj+","
          cTexto += '"Id_employee": ' + pNome+","
          cTexto += '"File": '       + pArquivo
          cTexto += ' }'
  4. Bom dia Alê,

    Lembro de você em um evento do Fivewin que aconteceu em Minas, acho que no SESC, foi top aquele evento, por aqui tudo corrido e por ai ? tudo bem ?

     

    Segue abaixo o exemplo, como eu disse não está 100% mas da para partir dai para fazer algo bem legal.

    FUNCTION MyManualReport( cTXT2FR3 )
    /*
    Recebe por parâmetro o arquivo .txt ou .prn para mostrar na tela do fastreport
     exemplo: c:\syg_temp\relatorio.txt
    */
    local oFrPrn
    
    IF !FILE(cTXT2FR3)
       ShowMsg("Erro ao localizar o arquivo para impressão " +cTXT2FR3 )
       RETURN(.F.)
    ENDIF   
    
    oFrPrn := frReportManager():new()
    
    //oFrPrn:LoadLangRes(PEGA_ARQUIVO_SAGI(1,.T.)) // aqui é o icone da tela
    oFrPrn:PreviewOptions:SetShowCaptions(.T.)
    oFrPrn:SetIcon(1001)
    oFrPrn:SetTitle("Visualizador de Relatórios do Sistema.")
    
    oFrPrn:StartManualBuild( { || MyManualReport2(oFrPrn,cTXT2FR3) }, FR_LANDSCAPE, , FR_PIXELS )
    
    oFrPrn:PrepareReport()
    oFrPrn:ShowPreparedReport()
    
    oFrPrn:Clear()
    oFrPrn:DestroyFR()     // detona com o fastreporte e a dll da memoria.
    oFrPrn:=nil
    
    RETURN(.t.)
    
    FUNCTION MyManualReport2(oFrPrn,cTXT2FR3)
    /*
    Exemplo de uso sem arquivo .FR3
    */
    local tmp_Name:='', cText_ARQ:='', nLINES:=0, nA:=0, nINIT_LINE:=0, cIMPTEXT:=''
    //local cLOGO:=ARQUIVOLOGOMARCA() // pega o logotipo do cliente para mostrar no relatorio
    local cLOGO:=''
    
       oFrPrn:SetDefaultFontProperty( "Name", "Arial" )
       oFrPrn:SetDefaultFontProperty( "Size", 10 )
    
       IF !EMPTY(cLOGO)
          oFrPrn:PictureAt( cLOGO , 30, 200, 150, 150 )
          nINIT_LINE:=300
       ENDIF
       
       cText_ARQ := memoread( cTXT2FR3 ) // carrega o TXT
    
       nLINES := mlcount( cText_ARQ, 250 ) // total de linhas
       FOR nA := 1 to nLINES
          cLINE := MEMOLINE( cText_ARQ, 250, nA, 1, .F., .T. )
          
          IF Left(AllTrim( cLine ), 1 ) == Chr( 15 ) .or. Left( AllTrim(cLine), 1 ) == Chr( 18 )
             loop
          ENDIF
    
          If Left(AllTrim(cLine),1)==Chr(12) //SALTO DA PAGINA
             LOOP
             //oFrPrn:NewPage()
          ENDIF
          
          IF AT('[',cLine)>0 .OR. AT(']',cLine)>0
             cLine:=Stuff(cLine, AT('[',cLine),1,'-')
             cLine:=Stuff(cLine, AT(']',cLine),1,'-')
          ENDIF
          
          IF !EMPTY(ALLTRIM(cLINE)) 
    
             //oFrPrn:MemoAt(cLINE, 100, (nA*100)+nINIT_LINE, 350, 50 )
             nINIT_LINE:=0
             cIMPTEXT:=cIMPTEXT+cLINE+CR_LF
             //MemoAt(cStr, nLeft, nTop, nWidth, nHeight)
          ENDIF   
       NEXT
       oFrPrn:MemoAt(cIMPTEXT, 10, 350, 1500, 1500 )
    
       
    *   tmp_Name := oFrPrn:MemoAt( "Some memo with bottom frame ...", 30, 30, 300, 50 )
    *   oFrPrn:SetManualObjProperty( tmp_Name + ".Frame", "Typ", "[ftBottom]" )
    
    //   oFrPrn:LineAt( 30, 200, 100, 100 )
    //   oFrPrn:MemoAt( "<-- It's a some line ...", 200, 250, 350, 50 )
    
    
    //   oFrPrn:NewPage()
    
     //  oFrPrn:MemoAt( "It's a second page..................", 30, 30, 100, 1000 )
    
    RETURN(.T.)

     

  5. FUNCTION WIN32_64BITS
       if ISWOW64()
          ShowMsg( "Windows 64 bits" )
       else
          ShowMsg( "Windows 32 bits" )
       endif
    return nil
    
    #pragma BEGINDUMP
    
    #include <windows.h>
    #include <hbapi.h>
    
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    
    LPFN_ISWOW64PROCESS fnIsWow64Process;
    
    HB_FUNC( ISWOW64 )
    {
        BOOL bIsWow64 = FALSE;
    
        fnIsWow64Process = ( LPFN_ISWOW64PROCESS )
                           GetProcAddress( GetModuleHandle( TEXT( "kernel32" ) ), "IsWow64Process" );
    
        if( fnIsWow64Process )
            bIsWow64 = ! fnIsWow64Process( GetCurrentProcess(), &bIsWow64 );
    
        hb_retl( bIsWow64 );
    }
    
    #pragma ENDDUMP

     

  6. @Marca

    Acredito que precisa avaliar isso, que citou, crie boas ideias/soluções no seu software que justifique o cliente investir, na integração da MEGA tem um WEBHOOK, que você consegue deixar o cara inclusive falando no chat do sistema como se tivesse no whatsapp. Ainda acho que vale a pena

  7. Sobre jogar os DBF, veja esse app de exemplo abaixo que consegue fazer isso para você.

    http://www.pctoledo.com.br/forum/filebase.php?d=1&id=158&searchword=sql&what=s&page=1

    Sobre MARIADB vs MYSQL, eu ficaria com MARIADB por causa da licença de uso do MYSQL, até onde eu sei, pode ser usado desde que o projeto seja de código aberto.

    Sobre SQLRDD, fuja dele o quanto antes, vai ficar preso no xHarbour e, isso é um tiro no pé, o Harbour está mais evoluído.

  8. Isso está no meio do sistema e e, posso postar aqui, mas não sei se vai ajudar ou atrapalhar, mas segue em anexo para ver se ajuda.

    Nota: o colega João Alpande que desenvolveu tudo.

     

    #include "hwgui_sagi.ch"
    
    **********************
    #DEFINE httpGet  1
    #DEFINE httpPost 2
    **********************
    /* 
      MEGAAPI API WHATSAPP
      Manual: https://documenter.getpostman.com/view/7432615/Tzedh4uW#intro
      
      Acesso do painel:
      https://megaapi-painel.com.br/sec_Login/
    
    */
    CLASS TWhatsapp_MegaAPI
    
    		DATA cToken     INIT GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.)
    		DATA cEndPoint  INIT GET_PARAMETRO('SYG_URL_WHATSAPP',.T.)
           
    		DATA cRet           INIT ''
    		DATA hHash          INIT Hash()
    		DATA cValue_qrcode  INIT ''
    		DATA cFile_qrcode   INIT ''
    
      METHOD New(nIDUSER) CONSTRUCTOR
            METHOD PegaConfAPI(lMsg,nNr_Enviou)
    		METHOD ComunicaAPI(oObj,cUrl, nMetodo, cContato, cMsg, cFilename,cTipo_Arq,cNomeArq)
    		METHOD Status(oObj)
    		METHOD OBTER_QRCODE(oObj)
    		METHOD VerSeContatotemWhats(oObj)
    		METHOD Reiniciar(oObj)
    		METHOD Desconectar(oObj)
    		METHOD EnviarMsg(oObj,cContato, cMsg, cFilename,lLink,lMsg,cNomeArq)
    
    		Method End() INLINE Self := Nil
    EndClass
    
    **************************************
    METHOD New(nIDUSER) CLASS TWhatsapp_MegaAPI
    **************************************
    LOCAL aSQL:={}
    
    nIDUSER:=IF(nIDUSER=Nil,_pnIDUSER(),nIDUSER)
    
       ::cRet  := ''
       ::hHash := Hash()
       ::cToken     := GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.)
       ::cEndPoint  := GET_PARAMETRO('SYG_URL_WHATSAPP',.T.)
               
       aSQL:=ES("select usa_api_whatsapp,   "+;
                 "       syg_url_whatsapp,   "+;
                 "       syg_token_whatsapp, "+;
                 "       syg_numero_whatsapp "+;
                 "from sagi_whatsapp_usuario "+;
                 "where id_usuario="+CS(nIDUSER)+ " limit 1 ")
       IF LEN(aSQL) > 0
          IF ALLTRIM(aSQL[1,1]) <> 'DESABILITADO'
             ::cEndPoint:= aSQL[1,2]
             ::cToken   := aSQL[1,3]
          ENDIF
       ENDIF
     
    return self
    
    ***********************************************************
    METHOD PegaConfAPI(lMsg,nNr_Enviou) CLASS TWhatsapp_MegaAPI
    ***********************************************************
    LOCAL aSQL:={}, lRET:=.F., lSemAPI:=.F.
    
    lMsg:=IF(lMsg=Nil,.T.,lMsg)
    nNr_Enviou:=IF(nNr_Enviou=Nil,'',nNr_Enviou)
    
    aSQL:=ES("select usa_api_whatsapp,   "+;
              "       syg_url_whatsapp,   "+;
              "       syg_token_whatsapp, "+;
              "       syg_numero_whatsapp "+;
              "from sagi_whatsapp_usuario "+;
              "where id_usuario="+CS(_pnIDUSER())+ " limit 1 ")
    IF LEN(aSQL) > 0
       IF ALLTRIM(aSQL[1,1]) <> 'DESABILITADO' .AND.  ALLTRIM(aSQL[1,2])<>'' .AND. ALLTRIM(aSQL[1,3])<>''  
          lRET:=.T. 
          nNr_Enviou:=aSQL[1,4]
       ENDIF
       IF ALLTRIM(aSQL[1,1]) = 'DESABILITADO'
          IF !EMPTY(GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.)) .AND. !EMPTY(GET_PARAMETRO('SYG_URL_WHATSAPP',.T.))
             lRET:=.T.
          ENDIF
       ENDIF
    ELSE
       IF !EMPTY(GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.)) .AND. !EMPTY(GET_PARAMETRO('SYG_URL_WHATSAPP',.T.))
          lRET:=.T.
       ENDIF   
    ENDIF
    IF !lRET .AND. lMsg
       ShowMsg("Favor preencher os parâmetros do sistema ou no Usuário com o token e endereço URL para uso do WhatsApp, "+ HB_OsNewLine()+;
               "caso ainda não tenha contratado o serviço, favor entrar em contato com a Sygecom.")
    ENDIF 
          
    Return(lRET)
    
    ****************************************
    METHOD Status(oObj) Class TWhatsapp_MegaAPI
    ****************************************
    LOCAL lRET:=.T., cFileQRCode:='', lQrCode:=.F., lConectado:=.F.
    
    IF !::PegaConfAPI()
       RETURN(.T.)
    ENDIF 
                        
    ::ComunicaAPI(oObj,"/status", httpGet) 
    
    IF VALTYPE(::hHash) != 'H'
       RETURN(.T.)
    ENDIF
    
    IF HHasKey( ::hHash, 'accountStatus' )
       IF ::hHash['accountStatus'] = .F.
          lRET:=.F.
          IF ALLTRIM(::hHash['state'])  = 'disconnected'  .OR. ALLTRIM(::hHash['state'])  = 'connecting'
             lQrCode:=.T.
          ENDIF
       ELSE
          IF ALLTRIM(::hHash['state'])  = 'connected'  .OR. ALLTRIM(::hHash['state'])  = 'connecting'
             lConectado:=.T.
          ENDIF                  
       ENDIF 
       
       IF lConectado
          cFileQRCode:=PEGA_ARQUIVO_SAGI(1075,.T.)
       ENDIF
       
       IF lQrCode
          cFileQRCode:=PEGA_ARQUIVO_SAGI(1076,.T.)
       ENDIF
       ::cFile_qrcode :=cFileQRCode  
       IF oObj <> Nil      
          oObj:oBitmap1:Hide()     
          IF lConectado .OR. lQrCode
             oObj:oBitmap1:nStretch:= 0
             oObj:oBitmap1:ReplaceBitmap( cFileQRCode , .F. )
          ENDIF
          oObj:oBitmap1:REFRESH()
          oObj:oBitmap1:SHOW()
       ENDIF
    ENDIF               
    
          
    Return(lRET)  
    
    ********************************************************
    METHOD OBTER_QRCODE(oObj) Class TWhatsapp_MegaAPI
    ********************************************************
    LOCAL cFileQRCode:='', lRET:=.T. , cQrCodeBase64:=''
    
    IF !::PegaConfAPI()
       RETURN(.T.)
    ENDIF
    
    oObj:oRetorno:SETTEXT("Obtendo QRCode...")
    oObj:oRetorno:REFRESH()
      
    IF ::ComunicaAPI(oObj,'/qrcode', httpGet)=.F.
       lRET:=.F.
    ENDIF   
    
    IF lRET
    
       IF 'connected' = ALLTRIM(::hHash['state'])
          oObj:oRetorno:SETTEXT("Já existe um celular conectado à API. Use Desconectar para sair")
          oObj:oRetorno:REFRESH()   
          lRET:=.F.
       
       ELSEIF 'disconnected'= ALLTRIM(::hHash['state'])
          cQrCodeBase64:= STRTRAN(::hHash['qrCode'], "data:image/png;base64,")
           
          cFileQRCode:= SYG_GERAFILE()+".png"   
          MemoWrit( cFileQRCode , SYG_BASE64DECODE(cQrCodeBase64), .F. )
          ::cFile_qrcode :=cFileQRCode
       ELSE
          oObj:oRetorno:SETTEXT("Erro ao gerar QR CODE")
          oObj:oRetorno:REFRESH()   
          lRET:=.F.
       ENDIF
    ENDIF  
    
    Return(lRET)  
    
    *******************************************************************
    METHOD EnviarMsg(oObj,cContato, cMsg, cFilename,lLink,lMsg,cNomeArq) Class TWhatsapp_MegaAPI
    *******************************************************************
    LOCAL cUrl, lRET:=.T., nNr_Enviou:=''
    LOCAL cRetErro:='',cTipoArq:='' , cExtensao:=''
    
    DEFAULT cMsg      TO ''
    DEFAULT cFilename TO ''
    
    IF !::PegaConfAPI(lMsg,@nNr_Enviou)
       RETURN(.T.)
    ENDIF
    
    nNr_Enviou:=IF( ALLTRIM(nNr_Enviou)='' , GET_PARAMETRO('SYG_NUMERO_WHATSAPP',.T.) ,nNr_Enviou) 
     
    lLink:=IF(lLink=Nil,.F.,lLink) 
    lMsg :=IF(lMsg =Nil,.T.,lMsg )
    cNomeArq:=IF(cNomeArq =Nil,'',cNomeArq )
    
    IF EMPTY(cFilename) .AND. EMPTY(cMsg)
       IF lMsg
          showmsg('Digite Mensagem ou selecione arquivo para enviar.')
       ENDIF   
       RETURN(.F.)  
    ENDIF
    
    IF EMPTY(cFilename)
       IF lMsg
    	  sygDialogo("Enviando mensagem de texto...")
       ENDIF
       cUrl := "/sendmessage"
    ELSE
       cExtensao:= UPPER(Subs(cFilename,RAT(".",cFilename)+1))
       IF cExtensao= 'PDF'
          cTipoArq:='PDF'
       ELSEIF cExtensao='MP3'
          cTipoArq:='AUDIO'
       ELSEIF cExtensao='MP4'
          cTipoArq:='VIDEO'   
       ELSEIF cExtensao='PNG' .OR. cExtensao='BMP' .OR. cExtensao='JPG' .OR. cExtensao='JPEG'
          cTipoArq:='IMAGEM'
       ELSE
          cTipoArq:='LINK'
       ENDIF
       IF lMsg
    	  sygDialogo("Enviando arquivo...")
       ENDIF
       cUrl := IF(lLInk ,"/sendfile", "/sendfilebase64")
    ENDIF
    
    IF ::ComunicaAPI(oObj,cUrl, httpPost, cContato, cMsg, cFilename,cTipoArq,cNomeArq,@cRetErro) = .F.
       lRET:=.F.
       IF lMsg
          Showmsg_Edit("Não Enviou a Mensagem."+hb_osnewline()+ALLTRIM(cRetErro) )
       ENDIF   
    ELSE
       IF oObj = Nil // se não é na tela de teste dos parâmetros
          IF !EMPTY(cFilename)
             cMsg:='Enviou arquivo ' + cMsg
          ENDIF
          cMsg:= STRTRAN( cMsg , '\n' ,' ') 
          SYG_BEGINTRANSACTION()
           ES( " insert into sagi_log_whatsapp( nr_enviou, nr_recebeu, mensagem, data, hora, usuario, empresa) " + ;
               "      values ( " + CS( nNr_Enviou)  + "," + ;
                                   CS( cContato)    + "," + ;
                                   CS( cMsg )       + "," + ;
                                   CS( My_Date() )  + "," + ;
                                   CS( Time() )     + "," + ;
                                   CS( _Usuario() ) + "," + ;
                                   CS( _Filial() )  + ")"  )
           SYG_ENDTRANSACTION()
        ENDIF   
    ENDIF  
    
    IF lMsg
       sygDialogo()
    ENDIF   
    Return(lRET)  
       
    ********************************************
    METHOD VerSeContatotemWhats(oObj) Class TWhatsapp_MegaAPI
    ********************************************
    LOCAL cContato:='',cMsg:='',cFilename:='', lRET:=.T.
    
    IF !::PegaConfAPI()
       RETURN(.T.)
    ENDIF
    
    WITH OBJECT oObj
         cContato:=  ALLTRIM(:oTel:VARGET())
         cMsg:=      ALLTRIM(:oTexto:VARGET())
         cFilename:= ALLTRIM(:oArq:VARGET())
    END
    
    IF ::ComunicaAPI(oObj, "/checknumber", httpPost, '55'+cContato,cMsg,cFilename) = .F.
       lRET:=.F.
    ENDIF
    
    Return(.t.)    
    
    *****************************************
    METHOD Reiniciar(oObj) Class TWhatsapp_MegaAPI
    *****************************************
    LOCAL lRET:=.T.
    
    IF !::PegaConfAPI()
       RETURN(.T.)
    ENDIF
    
    IF ::ComunicaAPI(oObj,"/takeover", httpGet ) = .F.
       lRET:=.F.
    ENDIF
    IF lRET 
       oObj:oRetorno:SETTEXT("Desconectado")
       oObj:oRetorno:REFRESH()
       oOBJ:oBitmap1:Hide()
       oOBJ:oBitmap1:nStretch:= 0
       oOBJ:oBitmap1:ReplaceBitmap( PEGA_ARQUIVO_SAGI(1076,.T.) , .F. )
       oOBJ:oBitmap1:REFRESH()
       oOBJ:oBitmap1:SHOW()
    ENDIF
     
    Return(.t.)    
    
    *******************************************
    METHOD Desconectar(oObj) Class TWhatsapp_MegaAPI
    *******************************************
    LOCAL lRET:=.T.
    
    IF !::PegaConfAPI()
       RETURN(.T.)
    ENDIF
    
    IF !::ComunicaAPI(oObj,"/logout", httpGet)
       lRET:=.F.
    ENDIF
    IF lRET  
       oObj:oRetorno:SETTEXT("Desconectado")  
       oObj:oRetorno:REFRESH()
       oOBJ:oBitmap1:Hide()
       oOBJ:oBitmap1:nStretch:= 0
       oOBJ:oBitmap1:ReplaceBitmap( PEGA_ARQUIVO_SAGI(1076,.T.) , .F. )
       oOBJ:oBitmap1:REFRESH()
       oOBJ:oBitmap1:SHOW()
    ENDIF   
    
    Return(lRET)    
    
    ***********************************************************************************************************************
    METHOD ComunicaAPI(oObj,cUrl, nMetodo, cContato, cMsg, cFilename, cTipo_Arq,cNomeArq,cRetErro) Class TWhatsapp_MegaAPI
    ************************************************************************************************************************
    LOCAL cMetodo, oWeb, sContent := '', lRET:=.T., cRETLINK:='' , cJSON:='', cRetorno:=''
    LOCAL cExtensao:='' ,  lVerSeTemWhats:=.F. , lQrCode:=.F.
    
    IF !::PegaConfAPI()
       RETURN(.T.)
    ENDIF
    
    cRetErro:=IF(cRetErro=Nil,'',cRetErro)
    cNomeArq:=IF(cNomeArq=Nil,'',cNomeArq)
    cTipo_Arq:=IF(cTipo_Arq=Nil,'PDF',cTipo_Arq)
    IF oObj<> NIl
       cTipo_Arq:=ALLTRIM(oObj:oTipo_Arq:VARGET())
    ENDIF
    
    TRY
       oWeb := xhb_CreateObject("MSXML2.ServerXMLHTTP.6.0")
    CATCH
       // NAO FAZ NADA
    END
    
    if oWeb=nil
       ShowMsg('Erro ao tentar realizar a consulta, favor verificar se as DLL usada para NFe está registradas')
       RETURN(.F.)
    endif
    
    IF EMPTY(cContato) .AND. nMetodo = httpPost  
      	showmsg("Falta telefone de destino")
      	RETURN(.F.)
    ENDif
    
    IF !EMPTY(GET_CONFIG_INI('Proxy','url',''))
       oWeb:SetProxy( 2, GET_CONFIG_INI('Proxy','url','')+":"+ALLTRIM(STR(GET_CONFIG_INI('Proxy','porta',0))))
       IF !EMPTY(GET_CONFIG_INI('Proxy','user',''))
          oWeb:setProxyCredentials(GET_CONFIG_INI('Proxy','url','')+"\\"+GET_CONFIG_INI('Proxy','user',''), GET_CONFIG_INI('Proxy','pass',''))
       ENDIF
    ENDIF
    
    IF cUrl = "/checknumber"
       lVerSeTemWhats:=.T.
    ENDIF
    IF ALLTRIM(cUrl) = '/qrcode'
       lQrCode:=.T.
    ENDIF
    
    cUrl    := ALLTRIM(::cEndPoint)  + ALLTRIM(cUrl)  +"?token=" + ALLTRIM(::cToken)
    cMetodo := IIF( nMetodo == httpGet, 'GET', 'POST')
    
    IF _SemSenha()='N' 
       showmsg_edit(cUrl)
    ENDIF
    
    TRY     
       //https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms760403(v%3Dvs.85)
       oWeb:setTimeouts(1000*60, 1000*60, 0, 0)  // PARAMETRO ZERO É INFINITO    
       oWeb:Open( cMetodo, cUrl,  .F.)  // True = pra vir o ResponseBody
       
    CATCH
       ShowMSG('ERRO : Não conseguiu abrir o Web Service :'+Ole2TxtError() )
       RETURN(.F.)
    END
     
    IF nMetodo = httpPost
       oWeb:setRequestHeader( "Content-Type", "application/json" )
       IF lVerSeTemWhats
          cJSON:='{'+;
                    '"phone": "' +ALLTRIM(cContato)+'"'+;
                 '}'
       ELSE
          IF !EMPTY(cFilename)
             
             IF cTipo_Arq <> 'LINK'           
                sContent := MemoRead(cFilename)
             	sContent := SYG_BASE64ENCODE(sContent)
                sContent := Syg_Limpa(  ALLTRIM( sContent ) )
             ENDIF  
             cJSON:='{'+;
                    '"phone": "' +ALLTRIM(cContato)+'",'
    
             cExtensao:= STRTRAN( LOWER(Subs(cFilename,RAT(".",cFilename)+1)), 'jpg' ,'jpeg')  
                     
             IF !EMPTY(cNomeArq)
                cNomeArq:= ALLTRIM(cNomeArq)+'.' 
             ELSE
                cNomeArq:= 'arquivo.'
             ENDIF  
             cNomeArq+= cExtensao
    
             IF cTipo_Arq = 'PDF'
                cJSON+= '"body": "'  +'data:application/pdf;base64,'+ALLTRIM(sContent)+'",'
             ELSEIF cTipo_Arq = 'IMAGEM'     
                cJSON+= '"body": "'  +'data:image/'+cExtensao+';base64,'+ALLTRIM(sContent)+'",'
             ELSEIF cTipo_Arq = 'AUDIO' 
                cJSON+= '"body": "'  +'data:audio/mpeg;base64,'+ALLTRIM(sContent)+'",'
             ELSEIF cTipo_Arq = 'VIDEO' 
                cJSON+= '"body": "'  +'data:video/mp4;base64,'+ALLTRIM(sContent)+'",' 
             ELSEIF cTipo_Arq = 'LINK'
                cJSON+= '"body": "'  +ALLTRIM(cFilename)+'",'             
             ENDIF     
             cJSON+=   '"filename":"'+ ALLTRIM(cNomeArq) +'",'+;
    	            '"caption":"' +ALLTRIM(cMsg)+'"'+;
                       '}' 
        	ELSE
    	      IF !EMPTY(cMsg)
                cJSON:='{'+;
                       '"phone": "' +ALLTRIM(cContato)+'",'+;
                       '"body": "'  +ALLTRIM(cMsg)+'"'+;
                       '}'
               
        	  ENDIF
          ENDIF
       ENDIF
    ENDIF
    
    TRY
       IF EMPTY(cJSON)
    	  oWeb:Send()  
       ELSE
    	  oWeb:Send( cJSON )  
       ENDIF
    CATCH
       lRET:=.F.
    END
    
    IF _SemSenha()='N' .AND. !EMPTY(cJSON) 
       showmsg_edit('JSON: ' + cJSON)
    ENDIF
    
    IF lRET 
       DO WHILE oWeb:readyState <> 4
          millisec(500)
       ENDDO
       cRETLINK := oWeb:responseText
    ENDIF
    
    IF _SemSenha()='N' 
       showmsg_edit('RESPOSTA: ' + cRETLINK)
    ENDIF
    
    IF !EMPTY(cRETLINK)
       ::cRet := cRETLINK 
       hb_jsondecode( ::cRet, @::hHash )
                
       IF VALTYPE(::hHash) != 'H'
          cRetorno:='Algo deu errado, verifique Endereço/token da API'
          IF oObj<>Nil
             oObj:oRetorno:SETTEXT(cRetorno)
             oObj:oRetorno:REFRESH() 
          ENDIF        
          RETURN(.F.)
       ENDIF 
       
       IF len(::hHash)<0
          cRetorno:='Algo deu errado, verifique Endereço/token da API ou retorno vazio, tente novamente'
          IF oObj<>Nil
             oObj:oRetorno:SETTEXT(cRetorno)
             oObj:oRetorno:REFRESH() 
          ENDIF        
          RETURN(.F.)
       ENDIF 
    
       IF HHasKey( ::hHash, 'error' )
          cRetorno:="ERRO: "+ALLTRIM(::hHash['error']) 
          cRetErro:="ERRO: "+ALLTRIM(::hHash['error']) 
          lRET:=.F.
       ENDIF 
       IF !lQrCode
          IF HHasKey( ::hHash, 'accountStatus' )
             IF ::hHash['accountStatus']
                lRET:=.T.
             ELSE
                lRET:=.F.
                cRetErro:="ERRO: "+IF(HHasKey( ::hHash, 'message' ) ,  ALLTRIM(::hHash['message']),'')
             ENDIF  
          ENDIF
       ENDIF            
       IF lRET   
       
          cRetorno:= IF(HHasKey( ::hHash, 'state' )   ,  ALLTRIM(::hHash['state']),'') + ' ' +;  
                     IF(HHasKey( ::hHash, 'message' ) ,  ALLTRIM(::hHash['message']),'')
       ENDIF
    ELSE
       RETURN(.F.)
    ENDIF
    
    IF oObj<>Nil
       oObj:oRetorno:SETTEXT(cRetorno)
       oObj:oRetorno:REFRESH()
    ELSE
     //  showmsg_edit(cRetorno)
    ENDIF
    
    oWeb:=NIL
    
    RETURN(lRET)
    
    
    
      

     

  9. 4 horas atrás, SISCO disse:

    Bom dia todos

    Não sei se seria aqui que deveria tocar neste assunto ou criar um novo topico.

    Como ficaria em relação a segurançã de dados nas nuvens?

     

    Na Amazon, tem vários recursos voltado a segurança.

    Você pode inclusive gerar um link com acesso a mult-fator de acesso, vale a pena estudar muito os recursos da Amazon.

    Proteção de dados noAWSStorage Gateway - AWS Storage Gateway (amazon.com)

     

×
×
  • Create New...