IMPRESSORA PARA AUTENTICA?ÃO DE BOLETOS

JCM0867 30/06/2016 13:06:40
#464332
Olá pessoal
Seguinte, um cliente comprou uma impressora para autenticar boletos, aquelas pequenas.
O sistema vai levar informações para a impressora autenticar.
Como isso funciona. A secretária faz a baixa com data, valor pago, etc. E aí?
é gerado um arquivo com dados do boletos? preciso enviar um protocolo?
nunca fiz isso. Não sei por onde começar. E como posso testar sem ter a impressora?
podem me dar algumas dicas?

Grato
www.cjsystem.com.br
FFCOUTO 30/06/2016 16:20:59
#464337
Resposta escolhida
JCM, acho que a maneira mais prática é você pegar as informações criticas desse registro (data do pagamento, valor, usuário, ip, n.° doc, etc), agrupar em uma sequência de texto e gerar uma hash com alguma criptografia. Após isso, salvar esse hash num campo de sua tabela. E ai quando vc precisar conferir se o registro é autêntico bastaria refazer o processo e comparar com o resultado no banco.

Abaixo um modelo bem simples que fiz a tempos atrás:

public string GerarNumeroAutenticacao(string nroDoc, DateTime dataPagto, decimal valorPago, int formaPgto)
{
// define as variáveis da autenticação
string dpg = string.Format([Ô]{0:ddMMMyyyy}[Ô], dataPagto).ToUpper();
string nn = string.Format([Ô]{0,11}[Ô], nroDoc);
string vr = string.Format([Ô]{0:###,###,##0.00}[Ô], valorPago).Replace([Ô] [Ô], [Ô]*[Ô]);
string fpg = new string[] { [Ô][Ô], [Ô]DN[Ô], [Ô]CH[Ô] }[formaPgto];
string empr = string.Format([Ô]{0:000}[Ô], wks.EmpresaAtiva?.Codigo);

// gera a autendicação em MD5
var md5 = MD5.Create();
byte[] inputBytes = Encoding.ASCII.GetBytes(nn);
byte[] hash = md5.ComputeHash(inputBytes);

var sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
sb.Append(hash[i].ToString([Ô]X2[Ô]));

// obtém os dados da autenticação
string auth = sb.ToString().ToUpper().Substring(0, 16);

// AUT 31DEZ9999 0000000000000000 ********0,00RDN001
return string.Format([Ô]AUT {0} {1} {3}R{4}{5}[Ô], dpg, auth, vr, fpg, empr);
}


JCM0867 13/07/2016 21:17:05
#464799
Bom, por enquanto vou deixar a cryptografia de lado.
O cliente me mandou a impressora
O problema está nas configurações do tipo de caracter, local da impressão (bobina ou na folha só para autenticar), etc.
Não sei como programo isso no VB net são inúmeros códigos
podem me ajudar?
Uso o crystal, não sei se ajuda em algo.
A impressora é uma Perto Printer Autenticadora
Se precisar eu tiro umas fotos do manual, não achei o manual completo na internet para postar aqui
www.perto.com.br
http://mlb-d1-p.mlstatic.com/impressora-termica-perto-printer-com-autenticador-740621-MLB20805176509_072016-O.webp?square=false


Coloquei um texto no word só para testar imprimiu caracteres especiais na bobina

Grato




FFCOUTO 14/07/2016 09:17:18
#464806
JCM, pelo que li do manual, ela aceita impressão via comandos ESC/POS, igual as antigas EPSON LX 300. Abaixo segue um pequeno exemplo:

Classe RawPrinterHelper, utlizada para envio dos comandos diretamente para impressora
public class RawPrinterHelper
{
// Structure and API declarations:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOCINFOA
{
[MarshalAs(UnmanagedType.LPStr)]
public string pDocName;

[MarshalAs(UnmanagedType.LPStr)]
public string pOutputFile;

[MarshalAs(UnmanagedType.LPStr)]
public string pDataType;
}

[DllImport([Ô]winspool.Drv[Ô], EntryPoint = [Ô]OpenPrinterA[Ô], SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, ref IntPtr hPrinter, IntPtr pd);

[DllImport([Ô]winspool.Drv[Ô], EntryPoint = [Ô]ClosePrinter[Ô], SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);

[DllImport([Ô]winspool.Drv[Ô], EntryPoint = [Ô]StartDocPrinterA[Ô], SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In(), MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

[DllImport([Ô]winspool.Drv[Ô], EntryPoint = [Ô]EndDocPrinter[Ô], SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);

[DllImport([Ô]winspool.Drv[Ô], EntryPoint = [Ô]StartPagePrinter[Ô], SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);

[DllImport([Ô]winspool.Drv[Ô], EntryPoint = [Ô]EndPagePrinter[Ô], SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);

[DllImport([Ô]winspool.Drv[Ô], EntryPoint = [Ô]WritePrinter[Ô], SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, ref Int32 dwWritten);

private IntPtr hPrinter = new IntPtr(0);
private DOCINFOA di = new DOCINFOA();
private bool PrinterOpen = false;

public bool PrinterIsOpen
{
get { return PrinterOpen; }
}

public bool OpenPrint(string szPrinterName)
{
if (!PrinterOpen)
{
di.pDocName = [Ô].NET RAW Document[Ô];
di.pDataType = [Ô]RAW[Ô];

if (OpenPrinter(szPrinterName.Normalize(), ref hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
if (StartPagePrinter(hPrinter))
PrinterOpen = true;
}
}
}

return PrinterOpen;
}

public void ClosePrint()
{
if (PrinterOpen)
{
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
PrinterOpen = false;
}
}

public bool SendStringToPrinter(string szPrinterName, string szString)
{
if (PrinterOpen)
{
Int32 dwWritten = 0;
Int32 dwCount = szString.Length;
var pBytes = Marshal.StringToCoTaskMemAnsi(szString);

bool ret = WritePrinter(hPrinter, pBytes, dwCount, ref dwWritten);
Marshal.FreeCoTaskMem(pBytes);
return ret;
}
else
{
return false;
}
}
}


Método para impressão:

void ImprimirAutenticacaoRaw(string nro)
{
// create ESC/POS commands
string ESC = ((char)27).ToString(); // ESC byte
string NewLine = ((char)10).ToString(); // LF byte

string cmds = ESC + [Ô]@[Ô]; //Initializes the printer (ESC @)
cmds += ESC + [Ô]![Ô] + ((char)0).ToString(); //Character font A selected (ESC ! 0)
cmds += ESC + ((char)80).ToString();
cmds += ESC + ((char)15).ToString();
cmds += ESC + ((char)79).ToString();
cmds += nro;
cmds += NewLine;

// realiza a impressão
var prn = new RawPrinterHelper();
prn.OpenPrint([Ô]LPT1:[Ô]);
if (prn.PrinterIsOpen) prn.SendStringToPrinter([Ô]LPT1:[Ô], cmds);
prn.ClosePrint();
}


Faça uma pesquisa sobre os comandos ESC/POS para configuração de outros valores como fonte em negrito, tamanho duplo, etc.
Qualquer dúvida é só avisar.
JCM0867 14/07/2016 12:18:37
#464814
Descobri uma coisa bem triste falando com o suporte da PERTO
Essa impressora ha anos não é mais comercializada, alguém empurrou para meu cliente um estoque encalhado.
Disseram eles que ela só funciona no windows XP 32 bits pois não existe driver para windows recente.
Disseram que não funcionará com o drive da EPSON LX 300.

Consegui instalar com outro drive, na página de teste imprimiu só caracteres especiais.
será que tem solução?
Meu cliente está com o windows 8.1 32bits com processador 64bits

Grato
JCM0867 14/07/2016 17:43:41
#464826
Está quase,
Um suporte me disse para por impressora generic que funcionou na bobina termica
e nas propriedade da impressora em Comandos da impressora pediram para por:
<1B><7E><01> // Liga Autenticadora
<1B><7E><00> // Desiga Autenticadora

Só que continuou imprimindo só na Bobina termica

O que falta será?
JCM0867 15/07/2016 20:17:12
#464841
Bom, como a impressora é antiga sem suporte a windows recente e só funciona na impressora generic
O cliente aceitou fazer a impressora imprimir dois recibos e serão grampeado nas duas vias dos Boletos.

Grato
Tópico encerrado , respostas não são mais permitidas