Pix Gerar QRCode

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Pix Gerar QRCode

Mensagem por Alexandre Silva »

Alguem ja teve de gerar qrcode de um pix com um determinado valor ?

A ideia é somente gerar na tela o qrcode (com chave e o valor) para o cliente do meu usuario poder pagar,
nao sendo necessario integracao com o banco (sem verificar se teve o deposito)
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

Pix Gerar QRCode

Mensagem por Fernando queiroz »

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
METHOD Pix_String( ) CLASS PIXClass
************************************************************************************************************************************************************************************************************************
LOCAL cString

    cString := ""
    cString += get_p_value('00', '01')
//   cString += get_p_value('01', '11')
    cString += get_p_account_information(::cPIX_KEY, ::cPIX_RECEIVER, ::pix_url)
    cString += get_p_value('52', '0000')
    cString += get_p_value('53', '986')
    cString += get_p_value('54', ::nPIX_AMOUNT)
    cString += get_p_value('58', 'BR')
    cString += get_p_value('59', SUBSTR(::cPIX_DESCRIPTION,1,25))
    cString += get_p_value('60', ::cPIX_CITY)
    ** cString += get_p_value('61', '')
    cString += get_p_additional_data_field(::cPIX_IDENTIFICATION)
    cString += "6304"
    cString += hb_numtohex(hb_crcct(cString, 0xFFFF, 0x11021))

    ::qrcode := cString

return Nil
************************************************************************************************************************************************************************************************************************
STATIC function get_p_value(identify, value)
************************************************************************************************************************************************************************************************************************
Value := AllTrim( Value )
return identify + StrZero( Len( value ), 2 ) + value
//return trim(identify + strzero(len(alltrim(value)), 2) + value)
************************************************************************************************************************************************************************************************************************
STATIC function get_p_account_information(key, description, url)
************************************************************************************************************************************************************************************************************************
Local base_pix := get_p_value('00', 'br.gov.bcb.pix')
Local info_string := ''

    if key != Nil
        info_string += get_p_value('01', key)
    elseif url != Nil
        info_string += get_p_value('25', url)
    endif

    info_string += get_p_value('02', description)

return get_p_value('26', base_pix + info_string)
************************************************************************************************************************************************************************************************************************
STATIC function get_p_additional_data_field(identification)
************************************************************************************************************************************************************************************************************************

    if identification != Nil
        return get_p_value('62', get_p_value('05', identification))
    endif

return get_p_value('62', get_p_value('05', '***'))

************************************************************************************************************************************************************************************************************************
FUNCTION create_Txid(  ) 
************************************************************************************************************************************************************************************************************************
Local cRetorno:="";
    , nCont;
    , equivalente:= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',;
                    '0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y',;
                    'Z','0','1','2','3','4','5','6','7','8','9'}

    For nCont:=1 to 32
        cRetorno += equivalente[HB_RandomInt(1, 62)]
    next

return cRetorno
******************************************************************************************************************************
METHOD PDF_QRCode( ) CLASS  PIXClass
******************************************************************************************************************************
LOCAL h1, iPDF, sPDF, hPDF, cFileName;

        h1:=::qrcodeImage
        iPDF:= Array( 1, 1 )
        iPDF[1, 1] := h1
        sPDF:= hb_base64Decode( iPDF[1, 1] ) 
        cFileName:="C:\filesold\report\PIX_" + strzero(HB_RandomInt(1, 99999999),8,0) +'.PDF'
        hPDF := FCreate(cFileName, 0) 
        FWrite(hPDF, sPDF)                                           
        FClose(hPDF)
        WAPI_ShellExecute( NIL, "OPEN", cFileName  ,"",NIL,5 )	

RETURN Nil
************************************************************************************************************************************************************************************************************************
METHOD PrintQRCode( ) CLASS PIXClass
************************************************************************************************************************************************************************************************************************
LOCAL oPDF;
    //    , nTamValor;   
    
        if ::erro_status = WS_OK
            oPDF := PDFClass()
            IF oPDF == NIL
                hwg_msginfo("Falha da criação do objeto PDF","ATENÇÃO!!!")
                RETURN .F.
            ENDIF
            oPDF:cFileName 	:= ::cFileName
            oPDF:SetType( PDFCLASS_ROLLS )
            oPDF:nPageHeight := 150
            oPDF:Begin()
            oPDF:AddPage()
    //        nTamValor := (38 - (len("Valor do PIX: " + LTRIM(TRANSFORM(::nPIX_AMOUNT,"@E 999,999,999.99" ))))) /2
    
            oPDF:DrawText( 0 , 8, "Leia o QR Code Pix e pague" , Nil, 8, "Helvetica-Bold", Nil, Nil )
            oPDF:DrawText( 0.7, 5, "utilizando o aplicativo do seu banco." , Nil, 8, "Helvetica-Bold", Nil, Nil )
    
            oPDF:DrawBarcodeQRCode( 1, 4.5, 0.22, ::qrcode  )
            oPDF:DrawText( 11.3 , 30, ::cPDF_Linha1, Nil, 6, "Helvetica-Bold", 90, Nil ) 
            oPDF:DrawText( 11.3 , 31 , ::cPDF_Linha2, Nil, 6, "Helvetica-Bold", 90, Nil )
            oPDF:DrawText( 11.3 , 32 , "PIX: R$ " + LTRIM(TRANSFORM(VAL(::nPIX_AMOUNT),"@E 999,999,999.99" )), Nil, 6, "Helvetica-Bold", 90, Nil ) 
    //        oPDF:DrawLine( 10, 0, 10, 38, 3 )
            oPDF:End(  )
            oPDF:PrintPreview( )
        ENDIF
    
    RETURN NIL
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Pix Gerar QRCode

Mensagem por alxsts »

Olá!

Eu vi este tópico com a rotina do Fernando Queiroz e ia sugerir ao Alexandre Silva. Só não o fiz porque consta na assinatura do mesmo que ele ainda utiliza Clipper. Obviamente este código não servirá.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Pix Gerar QRCode

Mensagem por Alexandre Silva »

Mas isso ai é harbour nao é ?
Uso o MRBOLETO, que tambem usa CLASS e Method
Penso que tambem daria pra fazer usando funcoes em vez de metodos

Tem coisas que nao entendo, desculpem se parecem basicas, quero aprender

Por exemplo essa funcao create_Txid( ) que nao é chamada pode tirar ?

ou essa referencia h1:=::qrcodeImage , esse qrcodeimage nao aparece em outro lugar, entao como funciona isso ?

Preciso saber os #include e se tem algum #define ou algo a acrescentar na compilacao
para essas funcoes por exemplo :

hb_numtohex(hb_crcct(cString, 0xFFFF, 0x11021))

hb_base64Decode( iPDF[1, 1] )

oPDF := PDFClass()
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

Pix Gerar QRCode

Mensagem por Fernando queiroz »

bom eu enviei somente a parte de gerar o PIX, a classe não foi completa justamente por isso, a TXId é usada somente para casos de integracao com bancos que utilizam esse recurso, mas o que tem no que mandei serve para o que ele quer fazer, só trocar o METHOD por FUNCTION e as variáveis utilizadas na classe por variáveis nas funções
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pix Gerar QRCode

Mensagem por JoséQuintas »

Mas quando o pix tem valor definido, não é obrigatório registrar primeiro ?
Se for isso, o que ele quer não existe.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

Pix Gerar QRCode

Mensagem por Fernando queiroz »

JoséQuintas escreveu:Mas quando o pix tem valor definido, não é obrigatório registrar primeiro ?
Se for isso, o que ele quer não existe.

Não precisa, eu coloco valor e numero do pedido no PIX mesmo não tendo ele registrado, e esses dados ficam no recebimento,

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
METHOD qrCode( oDlg ) CLASS Pagamento  
************************************************************************************************************************************************************************************************************************
LOCAL cSQL;
    , oSQL;
    , oSQL_FLAG;
    , h1, h4, tamanho;  

    IF ! ::PIX_IMPRESSO
        cSQL:="SELECT "
        cSQL+="DATABASE() AS FILIAL, "
        cSQL+="pedidospagamento.PEDIDOS_ID, "
        cSQL+="pedidospagamento.VALOR "
        cSQL+="FROM pedidospagamento "
        cSQL+="WHERE pedidospagamento.PEDIDOS_ID = '" + STRZERO(::nPEDIDOS_ID,11,0)  + "' AND pedidospagamento.TIPPGTO_ID = '17' "
        oSQL:= Connections():ExecuteSQL(::oServer, cSQL)

        IF ! oSQL:eof( )
            cSQL:="SELECT  "
            cSQL+="flag.PIX_ENVIROMENT, "
            cSQL+="flag.PIX_BANCO, "
            cSQL+="flag.PIX_CHAVE, "
            cSQL+="flag.PIX_RECEBEDOR, "
            cSQL+="flag.PIX_CIDADE, "
            cSQL+="flag.PIX_CERTIFICADO, "       
            cSQL+="flag.PIX_CLIENT_ID, "   
            cSQL+="flag.PIX_CLIENT_SECRET, "                   
            cSQL+="flag.NOMEUSUARIO "
            cSQL+="FROM flag WHERE flag.FLAG_Id = 1 "
            oSQL_FLAG := Connections():ExecuteSQL(::oServer, cSQL)

            IF ! EMPTY(oSQL_FLAG:Fields( "PIX_CHAVE" ):Value )
                ::oPIX := PIXClass( ):New( )
                ::oPIX:Setup(oSQL_FLAG:Fields( "PIX_BANCO" ):Value, ;   //  METHOD Setup(sBanco, nEnviroment, sCertificado, sClient_Id, sClient_Secret, sPIX_Key, sPIX_Receive, sPIX_City, sPIX_Amount, sPIX_Description, sPIX_Identification, sPDF_Linha1, sPDF_linha2)
                           oSQL_FLAG:Fields( "PIX_ENVIROMENT" ):Value, ;
                           oSQL_FLAG:Fields( "PIX_CERTIFICADO" ):Value, ;
                           oSQL_FLAG:Fields( "PIX_CLIENT_ID" ):Value, ;
                           oSQL_FLAG:Fields( "PIX_CLIENT_SECRET" ):Value, ;
                           oSQL_FLAG:Fields( "PIX_CHAVE" ):Value, ;
                           oSQL_FLAG:Fields( "PIX_RECEBEDOR" ):Value, ;
                           oSQL_FLAG:Fields( "PIX_CIDADE" ):Value, ;
                           LTRIM(STR(oSQL:Fields( "VALOR" ):Value,10,2)), ;
                           RTRIM(UPPER(oSQL:Fields( "FILIAL" ):Value)) , ;
                           LTRIM(TRANSFORM(oSQL:Fields( "PEDIDOS_ID" ):Value,"99999999999" )), ;
                           oSQL_FLAG:Fields( "NOMEUSUARIO" ):Value, ;
                           "Pedido: " + LTRIM(TRANSFORM(oSQL:Fields( "PEDIDOS_ID" ):Value,"99999999999" )))
                ::oPIX:Execute( )
                if ::oPIX:erro_status = 200
                    ::PIX_IMPRESSO := .T.
                    h1 := FOpen(::oPIX:cFileName)        // abre o arquivo de imagem para leitura
                    tamanho := FSeek(h1, 0, 2)           // move o ponteiro pelo arquivo até o fim para pegar o tamanho
                    FSeek(h1, 0, 0)                      // volta para o início
                    h4 := Space(tamanho)                 // declara variável para receber o conteúdo do arquivo
                    FRead(h1, @h4, tamanho)              // faz a leitura do conteúdo do arquivo jogando-a na variável de memória
                    FClose(h1)                           // fecha o arquivo
                    h4 := hb_base64Encode(h4, tamanho)   // converte o conteúdo do arquivo em base64
                    cSQL:="UPDATE pedidospagamento SET "
                    cSQL+="pedidospagamento.PIX_ID = '"  + STRZERO(::oPIX:id,10,0) + "', "
                    cSQL+="pedidospagamento.PIX_TXID = '"  + ::oPIX:txid + "', "
                    if ! empty(::oPIX:location)
                        cSQL+="pedidospagamento.PIX_LOCATION = '"  + ::oPIX:location + "', "
                    endif
                    cSQL+="pedidospagamento.PIX_QRCODE = '"  + ::oPIX:qrcode + "', "
                    cSQL+="pedidospagamento.PIX_QRCODEIMAGE = '"  + h4 + "' "
                    cSQL+="WHERE pedidospagamento.PEDIDOS_ID = '" + STRZERO(::nPEDIDOS_ID,11,0)  + "' AND pedidospagamento.TIPPGTO_ID = '17' "
                    Connections():ExecuteSQL(::oServer, cSQL)
//                    HB_GTINFO( HB_GTI_CLIPBOARDDATA, ::oPIX:cFileName)
                    ::ativarTimer( oDlg )
                else
                    hwg_MsgInfo("REMOVA A FORMA DE PAGAMENTO"+ HB_EOL() + ;
                                "E INCLUA NOVAMENTE PARA REPETIR"+ HB_EOL() + ;
                                "A OPERAÇÃO"+ HB_EOL() + HB_EOL() + ::oPIX:erro_mensagem, "OPERAÇÃO NÃO EFETUADA!!!")
                endif
            ENDIF
        endif
    ENDIF

RETURN NIL
neste mthodo eu chamo aquela class passando os parametros somente para gerar o QRCode e mostrar na tela via SUMATRA

algusn parametros que uso sao utilizados somente quando tem interface com instituições financeiras
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pix Gerar QRCode

Mensagem por JoséQuintas »

Legal isso.
Dá pra inventar um boleto como se o cliente fosse o próprio banco, pra pagar por pix.
Não sabia que isso era possível.
Posso acrescentar na boletoclass.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Alexandre Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 376
Registrado em: 26 Mar 2007 00:16
Localização: Itapema - SC

Pix Gerar QRCode

Mensagem por Alexandre Silva »

Código: Selecionar todos

******************************************************************************************************************************
METHOD PDF_QRCode( ) CLASS  PIXClass
******************************************************************************************************************************
LOCAL h1, iPDF, sPDF, hPDF, cFileName;

        h1:=::qrcodeImage
        iPDF:= Array( 1, 1 )
        iPDF[1, 1] := h1
        sPDF:= hb_base64Decode( iPDF[1, 1] ) 
        cFileName:="C:\filesold\report\PIX_" + strzero(HB_RandomInt(1, 99999999),8,0) +'.PDF'
        hPDF := FCreate(cFileName, 0) 
        FWrite(hPDF, sPDF)                                           
        FClose(hPDF)
        WAPI_ShellExecute( NIL, "OPEN", cFileName  ,"",NIL,5 )   

RETURN Nil
Pra mim, nao ficou claro qual o conteudo dessa variavel ::qrcodeImage
Na primeita parte ok o ::qrcode recebe cString, mas esse ::qrcodeImage nao entendi
Alguem pode me esclarecer ?
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Responder