Página 1 de 1

Pix Gerar QRCode

Enviado: 17 Jun 2025 15:00
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)

Pix Gerar QRCode

Enviado: 17 Jun 2025 19:16
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

Pix Gerar QRCode

Enviado: 17 Jun 2025 20:09
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á.

Pix Gerar QRCode

Enviado: 18 Jun 2025 09:52
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()

Pix Gerar QRCode

Enviado: 18 Jun 2025 12:03
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

Pix Gerar QRCode

Enviado: 18 Jun 2025 14:03
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.

Pix Gerar QRCode

Enviado: 18 Jun 2025 15:44
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

Pix Gerar QRCode

Enviado: 18 Jun 2025 17:21
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.

Pix Gerar QRCode

Enviado: 14 Jul 2025 18:48
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 ?