Wellington Vieira Posted August 29, 2023 Report Share Posted August 29, 2023 Para o desenvolvimento do boleto bancário SICOOB. 1º) - Acessar a plataforma developer's SICOOB. "https://developers.sicoob.com.br/portal/", assim que acessar a plataforma irá solicitar que você escolha um certificado digital que esteja instalado em sua máquina para que você possa criar uma conta, escolha o certificado digital para a empresa que você irá liberar a solução, ou seja toda vez que você for liberar a solução para algum cliente, sempre escolher o certificado digital pertencente a esse cliente. 2º) - Criar uma conta para este cliente que você deseja liberar a solução. Após criar a conta solicitar a recuperação de senha para criar uma senha para este cliente. 3º) - É preciso ter em mãos o arquivo do certificado digital no formato ".pfx" e a partir dele gerar os certificados no formato ".pem" e ".key", para isso utilize o "openssl.exe", que pode ser baixado em "https://www.openssl.org/" ou pode se utilizar o do "cygwin64", ou qualquer um que tenha o openssl que é uma implementação de código aberto dos protocolos SSL e TLS. Usa os comandos abaixo para criar o ".pem" e o ".key". openssl pkcs12 -in [arquivo.pfx] -nokeys -out [arquivo].pem openssl pkcs12 -in [arquivo].pfx -nocerts -out [arquivo].key 4º) - Na plataforma "https://developers.sicoob.com.br/portal/", você poderá criar o(s) aplicativos para cada um dos seus cliente(s), indo no menu "MEUS APLICATIVOS". O arquivo do certificado digital que deve-se subir na criação do aplicativo é o ".pem" que você gerou a partir do ".pfx". Após a criação do aplicativo no portal você poderá acessar o aplicativo no portal e pegar a informação do "CLIENT ID" para se usar nas solicitações do TOKEN e do envio do arquivo JSON para o boleto. ( Nesta criação do aplicativo, seguir as orientações solicitadas, pois será necessário a confirmação por um código enviado ao aplicativo do SICOOB no celular do cliente, então o mesmo deverá acompanhar a a criação). Na programação eu criei 02 arquivo em "PHP", um que irá solicitar o "token" e o outro que irá enviar o "json" para o SICOOB, você poderá faze-los via programação em fivewin, eu fiz assim pois acho mais fácil com estes pequenos em PHP e o restante em programação fivewin. SOLICITAÇÃO DO TOKEN EM PHP, que fica em um ftp meu e o meu software acessa este pequeno PHP. <?php $Client_ID_envia = $_GET['Client_ID_envia']; $Client_certificado_pem = $_GET['Client_certificado_pem']; $Client_certificado_key = $_GET['Client_certificado_key']; $Client_senha = $_GET['Client_senha']; $Client_scope = $_GET['Client_scope']; $url_path = "https://auth.sicoob.com.br/auth/realms/cooperado/protocol/openid-connect/token"; $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $url_path, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_SSLCERT => $Client_certificado_pem, CURLOPT_SSLKEY => $Client_certificado_key, CURLOPT_SSLKEYPASSWD => $Client_senha, CURLOPT_HTTPHEADER => array( "Accept: application/json", "Content-Type: application/x-www-form-urlencoded"), CURLOPT_POSTFIELDS => "grant_type=client_credentials&client_id={$Client_ID_envia}&scope=cobranca_boletos_consultar%20cobranca_boletos_incluir%20cobranca_boletos_pagador%20cobranca_boletos_segunda_via%20cobranca_boletos_descontos%20cobranca_boletos_abatimentos%20cobranca_boletos_valor_nominal%20cobranca_boletos_seu_numero%20cobranca_boletos_especie_documento%20cobranca_boletos_baixa" )); $response = curl_exec($ch); $info =curl_errno($ch)>0 ? array("curl_error_".curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch); echo("<pre>"); print_r($info); curl_close($ch); echo $response; echo("</pre>"); ?> ENVIO DAS INFORMAÇÕES EM PHP, que fica em um ftp meu e o meu software acessa este pequeno PHP. <?php $Client_certificado_pem = $_GET['Client_certificado_pem']; $Client_certificado_key = $_GET['Client_certificado_key']; $Client_senha = $_GET['Client_senha']; $Cliente_Token = $_GET['Cliente_Token']; $Client_ID_envia = $_GET['Client_ID_envia']; $Cliente_Field = $_GET['Cliente_Field']; $Client_scope = $_GET['Client_scope']; $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => 'https://api.sicoob.com.br/cobranca-bancaria/v2/boletos', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_SSLCERT => $Client_certificado_pem, CURLOPT_SSLKEY => $Client_certificado_key, CURLOPT_SSLKEYPASSWD => $Client_senha, CURLOPT_POSTFIELDS =>$Cliente_Field, CURLOPT_HTTPHEADER => array( "Content-Type: application/json", "Authorization: Bearer $Cliente_Token", "Accept: application/json", "client_id: $Client_ID_envia" ), )); $response = curl_exec($ch); $info =curl_errno($ch)>0 ? array("curl_error_".curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch); echo("<pre>"); print_r($info); curl_close($ch); echo $response; echo("</pre>"); ?> CÓDIGO DE PROGRAMAÇÃO EM FIVEWIN. if alltrim(xnbanco) = "756 - Sicoob Uberlandia" if empty(xnMclient_id) msgstop("ID do cliente para o Sicoob não informado.","Atenção") exit endif _Client_ID = alltrim(xnMclient_id) if empty(xnMnomecertif) msgstop("Nome do certificado para o Sicoob não informado.","Atenção") exit endif _Client_certificado_pem = alltrim(xnMnomecertif) + ".pem" _Client_certificado_key = alltrim(xnMnomecertif) + ".key" _Client_certificado_crt = alltrim(xnMnomecertif) + ".crt" if empty(xnMsenhacertif) msgstop("Senha do certificado para o Sicoob não informado.","Atenção") exit endif _Client_senha = alltrim(xnMsenhacertif) _Client_scope = "cobranca_boletos_incluir" cSignatureValue = "" nlocaliza_registro_1 = "" nlocaliza_registro_2 = "" _nret_access_token = "" _nArquivo_enviar = "http://www.wsiscom.com.br/sicoob/acess_token_sicoob.php?Client_ID_envia=" + _Client_ID +; "&Client_certificado_key=" + _Client_certificado_key +; "&Client_certificado_pem=" + _Client_certificado_pem +; "&Client_senha=" + _Client_senha +; "&Client_scope=" + _Client_scope try _oserver := CreateObject( "MSXML2.XMLHTTP" ) _oserver:Open( "GET",_nArquivo_enviar, .F. ) _oserver:SetRequestHeader("Content-Type","application/json") _oserver:Send(_nArquivo_enviar) WHILE _oserver:readyState != 4 _oserver:WaitForResponse( 500 ) end cSignatureValue = _oserver:responseText catch msgstop("1 - Erro na geração do arquivo para o sicoob.","Erro Atenção") exit end if empty(cSignatureValue) msgstop("2 - Sem resposta do acess_token_sicoob.php.","Erro Atenção") exit endif if cSignatureValue = nil msgstop("3- Sem resposta do acess_token_sicoob.php.","Erro Atenção") exit endif //lh := 00 //mdire = "json_token.txt" //oPrn := TDosPrn():New(mdire) //oPrn:StartPage() //oPrn:lZeraBuffer:=.T. //oPrn:Say(lh,000,cSignatureValue) //oPrn:EndPage() //oPrn:End() nlocaliza_registro_1 := At( '[http_code] =>', cSignatureValue ) if !empty(nlocaliza_registro_1) if substr(cSignatureValue,nlocaliza_registro_1,18) != "[http_code] => 200" msgstop(substr(cSignatureValue,nlocaliza_registro_1,18),"Erro") exit endif else msgstop("Não foi possível localizar o retorno do token","Atenção") exit endif nlocaliza_registro_1 := At( '{"access_token":"', cSignatureValue ) nlocaliza_registro_2 := At( '","expires_in":300', cSignatureValue ) if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2) _nret_access_token = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1)) _nret_access_token = substr(_nret_access_token,18,5000) else msgstop("Não foi possível localizar o registro (access_token) ","Atenção") exit endif narquivoJSON := '[' + CRLF narquivoJSON += '{' + CRLF narquivoJSON += '"numeroContrato": ' + alltrim(xnnumerocliente) + ',' + CRLF narquivoJSON += '"modalidade": 1,' + CRLF narquivoJSON += '"numeroContaCorrente": ' + alltrim(xnconta) + alltrim(xndconta) + ',' + CRLF narquivoJSON += '"especieDocumento": "DM",' + CRLF narquivoJSON += '"dataEmissao": "' + substr(dtos(ldate),1,4) + '-' + substr(dtos(ldate),5,2) + '-' + substr(dtos(ldate),7,2) narquivoJSON += 'T' + alltrim(time()) if zfathorariodeverao = 1 narquivoJSON += '-02:00",' else narquivoJSON += '-03:00",' + CRLF endif _nandup = "" for ttqq = 1 to len(andup) if substr(andup,ttqq,1) = "0" .or. substr(andup,ttqq,1) = "1" .or. substr(andup,ttqq,1) = "2" .or.; substr(andup,ttqq,1) = "3" .or. substr(andup,ttqq,1) = "4" .or. substr(andup,ttqq,1) = "5" .or.; substr(andup,ttqq,1) = "6" .or. substr(andup,ttqq,1) = "7" .or. substr(andup,ttqq,1) = "8" .or.; substr(andup,ttqq,1) = "9" _nandup = _nandup + substr(andup,ttqq,1) endif next narquivoJSON += '"seuNumero": "' + alltrim(andup) + '",' + CRLF narquivoJSON += '"identificacaoEmissaoBoleto": 1,' + CRLF narquivoJSON += '"identificacaoDistribuicaoBoleto": 1,' + CRLF _ntamanho = len(alltrim(str(int(avdup * 100)))) narquivoJSON += '"valor": ' + substr(alltrim(str(int(avdup * 100))),1,(_ntamanho - 2)) + '.' + substr(alltrim(str(int(avdup * 100))),((_ntamanho - 2) + 1),2) + ',' + CRLF narquivoJSON += '"dataVencimento": "' + substr(dtos(advenc),1,4) + '-' + substr(dtos(advenc),5,2) + '-' + substr(dtos(advenc),7,2) narquivoJSON += 'T' + alltrim(time()) if zfathorariodeverao = 1 narquivoJSON += '-02:00",' else narquivoJSON += '-03:00",' + CRLF endif advenc_1 = advenc + 1 narquivoJSON += '"tipoDesconto": 0,' + CRLF if !empty(zfinmultaatraso) narquivoJSON += '"tipoMulta": 2,' + CRLF narquivoJSON += '"dataMulta": "' + substr(dtos(advenc_1),1,4) + '-' + substr(dtos(advenc_1),5,2) + '-' + substr(dtos(advenc_1),7,2) narquivoJSON += 'T' + alltrim(time()) if zfathorariodeverao = 1 narquivoJSON += '-02:00",' else narquivoJSON += '-03:00",' + CRLF endif _ntamanho = len(alltrim(str(int(zfinmultaatraso * 100)))) narquivoJSON += '"valorMulta": ' + substr(alltrim(str(int(zfinmultaatraso * 100))),1,(_ntamanho - 2)) + '.' + substr(alltrim(str(int(zfinmultaatraso * 100))),((_ntamanho - 2) + 1),2) + ',' + CRLF //narquivoJSON += '"valorMulta": ' + alltrim(str(int(zfinmultaatraso))) + ',' + CRLF else narquivoJSON += '"tipoMulta": 0,' + CRLF endif if !empty(zfintaxajurosmensal) narquivoJSON += '"tipoJurosMora": 2,' + CRLF narquivoJSON += '"dataJurosMora": "' + substr(dtos(advenc_1),1,4) + '-' + substr(dtos(advenc_1),5,2) + '-' + substr(dtos(advenc_1),7,2) narquivoJSON += 'T' + alltrim(time()) if zfathorariodeverao = 1 narquivoJSON += '-02:00",' else narquivoJSON += '-03:00",' + CRLF endif zfintaxajurosdias = zfintaxajurosmensal if zfintaxajurosdias < 1 narquivoJSON += '"valorJurosMora": ' + '0.' + alltrim(str(int(zfintaxajurosdias * 100))) + ',' + CRLF else _ntamanho = len(alltrim(str(int(zfintaxajurosdias * 100)))) narquivoJSON += '"valorJurosMora": ' + substr(alltrim(str(int(zfintaxajurosdias * 100))),1,(_ntamanho - 2)) + '.' + substr(alltrim(str(int(zfintaxajurosdias * 100))),((_ntamanho - 2) + 1),2) + ',' + CRLF //narquivoJSON += '"valorJurosMora": ' + alltrim(str(int(zfintaxajurosdias))) + ',' + CRLF endif else narquivoJSON += '"tipoJurosMora": 3,' + CRLF endif // aqui .... narquivoJSON += '"numeroParcela": ' + alltrim(str(nsequenciatitulo)) + ',' + CRLF narquivoJSON += '"aceite": ' + iif(xnaceite = 'N','false','true') + ',' + CRLF narquivoJSON += '"codigoProtesto": 1,' + CRLF narquivoJSON += '"numeroDiasProtesto": 30,' + CRLF narquivoJSON += '"pagador": {' + CRLF narquivoJSON += '"numeroCpfCnpj": "' + alltrim(rcnpjcpf) + '",' + CRLF narquivoJSON += '"nome": "' + substr(alltrim(rrazaosocial),1,50) + '",' + CRLF narquivoJSON += '"endereco": "' + substr(alltrim(rendereco) + ' ' + alltrim(rnumero),1,40) + '",' + CRLF narquivoJSON += '"bairro": "' + substr(alltrim(rbairro),1,30) + '",' + CRLF narquivoJSON += '"cidade": "' + substr(alltrim(rcidade),1,40) + '",' + CRLF narquivoJSON += '"cep": "' + alltrim(rcep) + '",' + CRLF narquivoJSON += '"uf": "' + ruf if !empty(remail) narquivoJSON += '",' + CRLF narquivoJSON += '"email": [' + CRLF narquivoJSON += '"' + alltrim(remail) + '"' + CRLF narquivoJSON += ']' + CRLF else narquivoJSON += '"' + CRLF endif narquivoJSON += '},' + CRLF narquivoJSON += '"beneficiarioFinal": {' + CRLF narquivoJSON += '"numeroCpfCnpj": "' + aaloja + '",' + CRLF //zempresa //znumerodocumentonacional narquivoJSON += '"nome": "' + alltrim(substr(abloja,1,50)) + '"' + CRLF narquivoJSON += '},' + CRLF if !empty(zfinmultaatraso) .or. !empty(zfintaxajurosmensal) narquivoJSON += '"mensagensInstrucao": {' + CRLF narquivoJSON += '"tipoInstrucao": 1,' + CRLF narquivoJSON += '"mensagens": [' + CRLF if !empty(zfinmultaatraso) narquivoJSON += '"Multa por atraso de ' + alltrim(transform(zfinmultaatraso,"@e 99,99")) + ' porcento' if !empty(zfintaxajurosmensal) narquivoJSON += '",' + CRLF else narquivoJSON += '"' + CRLF endif endif if !empty(zfintaxajurosmensal) zfintaxajurosdias = zfintaxajurosmensal / val(pega_ultimo_dia_numero(advenc)) zvalordiaJuros = ((avdup * zfintaxajurosdias)/100) narquivoJSON += '"Juro de R$ ' + alltrim(transform(zvalordiaJuros,"@e 999,999.99")) + ' por dia de atraso."' + CRLF endif narquivoJSON += ']' + CRLF narquivoJSON += '},' + CRLF endif narquivoJSON += '"gerarPdf": true,' + CRLF narquivoJSON += '"codigoCadastrarPIX": 0' + CRLF narquivoJSON += '}' + CRLF narquivoJSON += ']' lh := 00 mdire = "json_envia.txt" oPrn := TDosPrn():New(mdire) oPrn:StartPage() oPrn:lZeraBuffer:=.T. oPrn:Say(lh,000,narquivoJSON) oPrn:EndPage() oPrn:End() cSignatureValue = "" _nArquivo_enviar = "http://www.wsiscom.com.br/sicoob/envia_boleto_sicoob.php?Client_certificado_pem=" + _Client_certificado_pem +; "&Client_certificado_key=" + _Client_certificado_key +; "&Client_senha=" + _Client_senha +; "&Cliente_Token=" + _nret_access_token +; "&Client_ID_envia=" + _Client_ID +; "&Cliente_Field=" + narquivoJSON+; "&Client_scope=" + _Client_scope //lh := 00 //mdire = "jsonEnviaboleto" + ".txt" //oPrn := TDosPrn():New(mdire) //oPrn:StartPage() //oPrn:lZeraBuffer:=.T. //oPrn:Say(lh,000,_nArquivo_enviar) //oPrn:EndPage() //oPrn:End() try _oserver := CreateObject( "MSXML2.XMLHTTP" ) _oserver:Open( "GET",_nArquivo_enviar, .F. ) _oserver:SetRequestHeader("Content-Type","application/json") _oserver:Send(_nArquivo_enviar) WHILE _oserver:readyState != 4 _oserver:WaitForResponse( 500 ) end cSignatureValue = _oserver:responseText catch msgstop("1 - Erro na geração do arquivo para o sicoob. www.wsiscom.com.br/sicoob/envia_boleto_sicoob.php","Erro Atenção") exit end if empty(cSignatureValue) msgstop("2 - Sem resposta do envia_boleto.php.","Erro Atenção") exit endif if cSignatureValue = nil msgstop("3- Sem resposta do envia_boleto.php.","Erro Atenção") exit endif lh := 00 mdire = "jsonretornoboleto.txt" oPrn := TDosPrn():New(mdire) oPrn:StartPage() oPrn:lZeraBuffer:=.T. oPrn:Say(lh,000,cSignatureValue) oPrn:EndPage() oPrn:End() //cSignatureValue := MemoRead("jsonretornoboleto.txt") nlocaliza_registro_1 := At( '{"resultado":[{"status":{"codigo":200}', cSignatureValue ) if !empty(nlocaliza_registro_1) if substr(cSignatureValue,nlocaliza_registro_1,38) != '{"resultado":[{"status":{"codigo":200}' msgstop(cSignatureValue,"Erro") exit endif else msgstop(cSignatureValue,"Erro") exit endif _nxgravarnumeroPego = "" _nxcodigodebarras = "" _nxgravarlinhadigitavel = "" nlocaliza_registro_1 := At( '"nossoNumero":', cSignatureValue ) nposicaocolunaInicia := nlocaliza_registro_1 + len('"nossoNumero":') for ttqq = nposicaocolunaInicia to (nposicaocolunaInicia + 100) if substr(cSignatureValue,nposicaocolunaInicia,1) = "0" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "1" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "2" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "3" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "4" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "5" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "6" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "7" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "8" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "9" _nxgravarnumeroPego = _nxgravarnumeroPego + substr(cSignatureValue,nposicaocolunaInicia,1) else exit endif ++nposicaocolunaInicia next nlocaliza_registro_1 := At( '"codigoBarras":"', cSignatureValue ) nposicaocolunaInicia := nlocaliza_registro_1 + len('"codigoBarras":"') for ttqq = nposicaocolunaInicia to (nposicaocolunaInicia + 100) if substr(cSignatureValue,nposicaocolunaInicia,1) = "0" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "1" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "2" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "3" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "4" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "5" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "6" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "7" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "8" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "9" _nxcodigodebarras = _nxcodigodebarras + substr(cSignatureValue,nposicaocolunaInicia,1) else exit endif ++nposicaocolunaInicia next nlocaliza_registro_1 := At( '"linhaDigitavel":"', cSignatureValue ) nposicaocolunaInicia := nlocaliza_registro_1 + len('"linhaDigitavel":"') for ttqq = nposicaocolunaInicia to (nposicaocolunaInicia + 100) if substr(cSignatureValue,nposicaocolunaInicia,1) = "0" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "1" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "2" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "3" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "4" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "5" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "6" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "7" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "8" .or.; substr(cSignatureValue,nposicaocolunaInicia,1) = "9" _nxgravarlinhadigitavel = _nxgravarlinhadigitavel + substr(cSignatureValue,nposicaocolunaInicia,1) else exit endif ++nposicaocolunaInicia next cData = "" nlocaliza_registro_1 = At( '"pdfBoleto":"', cSignatureValue ) + len('"pdfBoleto":"') nlocaliza_registro_2 = At( '"}}]}', cSignatureValue ) nlocaliza_registro_2 = nlocaliza_registro_2 - nlocaliza_registro_1 cData = substr(cSignatureValue,nlocaliza_registro_1,nlocaliza_registro_2) cBase64 := HB_base64Decode(cData) lh := 00 cFileSicoob = "" if objetboleto = "Nfe" cFileSicoob = cFileSic + "sicoob_ret_NFe_" + nNumerodocumento_sicoob + "_" + alltrim(rfantasia) + "_" + alltrim(str(nsequenciatitulo)) + ".pdf" elseif objetboleto = "Ped" cFileSicoob = cFileSic + "sicoob_ret_Ped_" + nNumerodocumento_sicoob + "_" + alltrim(rfantasia) + "_" + alltrim(str(nsequenciatitulo)) + ".pdf" endif oPrn := TDosPrn():New(cFileSicoob) oPrn:StartPage() oPrn:lZeraBuffer:=.T. oPrn:Say(lh,000,cBase64) oPrn:EndPage() oPrn:End() endif SEGUE ABAIXO OS LINK'S PARA OS MANUAIS PARA TIRAR DÚVIDAS E OS E-MAIL'S PARA SUPORTE. Manual: "https://documenter.getpostman.com/view/20565799/Uzs6yNhe#1bcf3134-afbd-4cf3-ba49-9cdf5ea2c224" SUPORTE. SICOOB BELO HORIZONTE (CECREMGE) samuel.lopes@cecremge.org.br gabriel.ferreira@cecremge.org.br BRASILIA. dev@sicoob.com.br Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted August 29, 2023 Author Report Share Posted August 29, 2023 OBSERVAÇÃO.. NA CRIAÇÃO DO APLICATIVO NA PLATAFORMA, VOCÊ PODERÁ MARCAR A OPÇÃO "PIX", ALÉM DO BOLETO BANCÁRIO E UTILIZAR O ENVIO DO PIX VIA SISTEMA E AGUARDAR O RECEBIMENTO NA TELA DO SEU PDV. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.