Quem está começando a fazer a integração de sua loja virtual com o Komerci e está lendo o manual da versão Integrada, se deparou com a parte da geração do código de verificação. Eles disponibilizam uma classe Java denominada CodVer.class. Daí você pensa: "Para eles disponibilizarem uma classe específica em Java deve ser porque é algo muito específico ou cabuloso!". Mas não é... Não sei porque no próprio manual eles não colocam um pseudo-algoritmo ou diagramas que possam facilitar para a elaboração nas demais linguagens. No mesmo manual eles dizem que disponibilizam um ActiveX para quem usa ASP Clássico. É de dar risada! Bem, o código é bem simples. Já converti do Java para C# e, para quem está familiarizado com C/Java, vai entender o algoritmo rapidinho e elaborar o seu também:
public string GeraCodigoVerificao(string _numfil, string _valor)
{
// Início da codificação
string codigo = string.Empty;
// Número da filiação
int numfil = 0;
numfil = int.Parse(_numfil);
// Total
int total = 0;
string parteInteira = _valor.Substring(0, _valor.IndexOf('.'));
total = int.Parse(parteInteira);
// Codificação a hora
int segundosAgora = DateTime.Now.Second;
int segundosAgoraCodificados = 0;
switch (segundosAgora)
{
case 0:
segundosAgoraCodificados = 11;
break;
case 1:
segundosAgoraCodificados = 17;
break;
case 2:
segundosAgoraCodificados = 21;
break;
case 3:
segundosAgoraCodificados = 31;
break;
case 4:
segundosAgoraCodificados = 56;
break;
case 5:
segundosAgoraCodificados = 34;
break;
case 6:
segundosAgoraCodificados = 42;
break;
case 7:
segundosAgoraCodificados = 3;
break;
case 8:
segundosAgoraCodificados = 18;
break;
case 9:
segundosAgoraCodificados = 13;
break;
case 10:
segundosAgoraCodificados = 12;
break;
case 11:
segundosAgoraCodificados = 18;
break;
case 12:
segundosAgoraCodificados = 22;
break;
case 13:
segundosAgoraCodificados = 32;
break;
case 14:
segundosAgoraCodificados = 57;
break;
case 15:
segundosAgoraCodificados = 35;
break;
case 16:
segundosAgoraCodificados = 43;
break;
case 17:
segundosAgoraCodificados = 4;
break;
case 18:
segundosAgoraCodificados = 19;
break;
case 19:
segundosAgoraCodificados = 14;
break;
case 20:
segundosAgoraCodificados = 9;
break;
case 21:
segundosAgoraCodificados = 20;
break;
case 22:
segundosAgoraCodificados = 23;
break;
case 23:
segundosAgoraCodificados = 33;
break;
case 24:
segundosAgoraCodificados = 58;
break;
case 25:
segundosAgoraCodificados = 36;
break;
case 26:
segundosAgoraCodificados = 44;
break;
case 27:
segundosAgoraCodificados = 5;
break;
case 28:
segundosAgoraCodificados = 24;
break;
case 29:
segundosAgoraCodificados = 15;
break;
case 30:
segundosAgoraCodificados = 62;
break;
case 31:
segundosAgoraCodificados = 25;
break;
case 32:
segundosAgoraCodificados = 34;
break;
case 33:
segundosAgoraCodificados = 59;
break;
case 34:
segundosAgoraCodificados = 37;
break;
case 35:
segundosAgoraCodificados = 45;
break;
case 36:
segundosAgoraCodificados = 6;
break;
case 37:
segundosAgoraCodificados = 25;
break;
case 38:
segundosAgoraCodificados = 16;
break;
case 39:
segundosAgoraCodificados = 27;
break;
case 40:
segundosAgoraCodificados = 63;
break;
case 41:
segundosAgoraCodificados = 26;
break;
case 42:
segundosAgoraCodificados = 35;
break;
case 43:
segundosAgoraCodificados = 60;
break;
case 44:
segundosAgoraCodificados = 38;
break;
case 45:
segundosAgoraCodificados = 46;
break;
case 46:
segundosAgoraCodificados = 7;
break;
case 47:
segundosAgoraCodificados = 26;
break;
case 48:
segundosAgoraCodificados = 17;
break;
case 49:
segundosAgoraCodificados = 28;
break;
case 50:
segundosAgoraCodificados = 14;
break;
case 51:
segundosAgoraCodificados = 36;
break;
case 52:
segundosAgoraCodificados = 2;
break;
case 53:
segundosAgoraCodificados = 39;
break;
case 54:
segundosAgoraCodificados = 47;
break;
case 55:
segundosAgoraCodificados = 8;
break;
case 56:
segundosAgoraCodificados = 29;
break;
case 57:
segundosAgoraCodificados = 22;
break;
case 58:
segundosAgoraCodificados = 55;
break;
case 59:
segundosAgoraCodificados = 33;
break;
}
// Cálculos e atribuições
segundosAgora = segundosAgoraCodificados;
string pad = string.Empty;
if (segundosAgora < 10)
pad = "0";
else
pad = "";
string ipremoto = Request.ServerVariables["REMOTE_ADDR"];
int tamIP = ipremoto.Length;
int i_5_ = total + segundosAgora;
int i_6_ = segundosAgora + tamIP;
int i_7_ = segundosAgora * numfil;
int i_8_ = i_7_.ToString().Length;
// Monta o código
codigo = i_7_.ToString() + i_5_.ToString() + i_6_.ToString() + "-" + i_8_.ToString() + pad + segundosAgora.ToString();
// Retorna
return codigo;
}
Dar POST em um Form e Redirecionar para Página Externa com ASP.NET
Recentemente estava programando o envio de informações de pagamento para o Komerci (estrutura de pagamentos da Redecard) e em certo momento precisaria realizar um POST a um endereço passando parâmetros/variáveis a ela. Antes de partir para a solução, vou revisar aqui alguns conceitos básicos que podem ser usados para esse tipo de envio:
Agora vamos criar um método que irá criar os inputs com atributo hidden e seus respectivos valores, montar um JavaScript que força o POST e "startar" o processo:
private void PostRedirectAspNet()
{
StringBuilder formulario = new StringBuilder();
// Adiciono todos os campos e seus valores que devem ser passados via POST
formulario.Append("<input type=\"hidden\" name=\"TRANSACAO\" value=\"04\">");
// Crio um JavaScript para forçar o POST na página corrente
formulario.Append("<script language=\"javascript\">");
formulario.Append("var theForm = document.forms['formAsp']; if (!theForm) { theForm = document.formAsp; } ");
formulario.Append("theForm.action = \"http://thiagomarcal.blogspot.com\";");
formulario.Append("theForm.method = \"post\";");
formulario.Append("theForm.submit();");
formulario.Append("</script>");
// Aplica o script gerado no Literal para iniciar o processo
FormularioPost.Text = formulario.ToString();
}
Assim, basta chamá-lo onde quiser que ele irá gerar as tags HTML contendo as informações desejadas, realizará o POST e, consequentemente, seu redirecionamento. Bem simples, não? Esse método (de fazer) pode ser aproveitado para quaisquer linguagem de programação (PHP, Java, ASP, .NET, CodFusion, etc). O importante é como providenciar seu funcionamento de acordo com a lógica.
- Responde.Redirect: Por esse método só podemos passar os parêmetros via GET;
- Server.Transfer: Por esse método podemos usar o POST mas se o destino estiver no mesmo domínio da aplicação;
- HttpWebRequest: Por esse método você pode fazer uma requisição através de uma conversão dos dados em bytes passando via POST/GET, contudo não há como fazer um redirecionamento;
- WebClient: Por esse método pode-se realizar a passagem de parâmetros, mas também não consegue fazer o redirecionamento após o envio.
Agora vamos criar um método que irá criar os inputs com atributo hidden e seus respectivos valores, montar um JavaScript que força o POST e "startar" o processo:
private void PostRedirectAspNet()
{
StringBuilder formulario = new StringBuilder();
// Adiciono todos os campos e seus valores que devem ser passados via POST
formulario.Append("<input type=\"hidden\" name=\"TRANSACAO\" value=\"04\">");
// Crio um JavaScript para forçar o POST na página corrente
formulario.Append("<script language=\"javascript\">");
formulario.Append("var theForm = document.forms['formAsp']; if (!theForm) { theForm = document.formAsp; } ");
formulario.Append("theForm.action = \"http://thiagomarcal.blogspot.com\";");
formulario.Append("theForm.method = \"post\";");
formulario.Append("theForm.submit();");
formulario.Append("</script>");
// Aplica o script gerado no Literal para iniciar o processo
FormularioPost.Text = formulario.ToString();
}
Assim, basta chamá-lo onde quiser que ele irá gerar as tags HTML contendo as informações desejadas, realizará o POST e, consequentemente, seu redirecionamento. Bem simples, não? Esse método (de fazer) pode ser aproveitado para quaisquer linguagem de programação (PHP, Java, ASP, .NET, CodFusion, etc). O importante é como providenciar seu funcionamento de acordo com a lógica.
NfseUtil - Utilitário e Código-fonte de Aplicativo que Assina e Envia os XMLs para emissão da Nota Fiscal Eletrônica
Postado por
Thiago Marçal
on quinta-feira, 1 de julho de 2010
/
Marcadores:
nfe,
nota fiscal eletrônica,
salvador,
xml
/
Comments: (18)
Depois de nos matarmos para entender o funcionamento, noites em claro para testes e mais testes, a SEFAZ - Salvador disponibilizou uma DLL e um conjunto de códigos-fonte para realizar todo o processo de assinatura e envio. Agora é mão na roda para quem irá começar a implementar. Para quem já passou por esse sofrimento agora é só descanço... Para mais informações acesse aqui. Abaixo tem os links dos principais arquivos para o utilitário, documentos e XMLs de exemplo:
Usando Certificado Digital para Nota Fiscal Eletrônica no Windows Server 2003/2008
Postado por
Thiago Marçal
/
Marcadores:
certificado digital,
linux,
nfe,
nota fiscal eletrônica,
salvador,
windows,
xml
/
Comments: (2)
Desde que lançaram a nota fiscal eletrônica, nós programadores ficamos com receio do uso das leitoras e cartões nos sistemas operacionais para a assinatura do XML usando o certificado digital. Geralmente os servidores usufruem de alguma versão do Windows Server para acomodar as aplicações web (que realizam o processo de assinatura) além de proporcionar mais robustez e qualidade diante dos trabalhos. Mas as leitoras e cartões simplesmente não funcionam como deveriam! Incompatibilidade... dizem.
Enfim... como fazer? Simplesmente é só usar outro sistema operacional!
"Mas como vou usar se meu servidor é Windows Server e não posso instalar outro SO?" (Você se perguntando)
Resposta: Use os dois através de uma máquina virtual! Há vários tipos e para vários gostos ficando a critério do que você for utilizar. Recomendo o VMware! Ele dispõe de duas versões (há outras que você pode optar também) que são ótimas para uso: Player e Server. Em resumo, a Player é limitada pois seu uso é simples mas não deixa de ser útil.
Vamos ao processo que será bem simples:
Enfim... como fazer? Simplesmente é só usar outro sistema operacional!
"Mas como vou usar se meu servidor é Windows Server e não posso instalar outro SO?" (Você se perguntando)
Resposta: Use os dois através de uma máquina virtual! Há vários tipos e para vários gostos ficando a critério do que você for utilizar. Recomendo o VMware! Ele dispõe de duas versões (há outras que você pode optar também) que são ótimas para uso: Player e Server. Em resumo, a Player é limitada pois seu uso é simples mas não deixa de ser útil.
Vamos ao processo que será bem simples:
- Instale uma das versões do VMware;
- Instale um Windows 2000/XP/Vista nela contanto que seja compatível com sua leitora/cartão (a instalação é bem simples e sem dificuldades - é mais fácil do que quando vai instalar no computador "de verdade" bastando seguir o Wizard dela);
- Agora conecte a leitora do cartão no PC. Note que no Windows Server não acontecerá nada, mas no Windows interno começará a instalação;
- Em seguida espete o cartão na leitora;
- Abra o utilitário da leitora (através do Windows da máquina virtual) e verá que o cartão foi lido corretamente.
Corrigindo o problema do "Server Application Unavailable"
Esses dias me deparei com esse problema. Bem, há diversas causas que podem levar a isso e algumas soluções podem ser facilmente encontradas pela net mostrando problemas:
E inúmeros artigos/helps contendo outras soluções/causas... Mas também há um caso devido ao Application Pool. Resumo: o Application Pool gerencia a memória que é utilizada pelas aplicações no IIS. Não vou entrar em detalhes e serei bem direto na solução.
E inúmeros artigos/helps contendo outras soluções/causas... Mas também há um caso devido ao Application Pool. Resumo: o Application Pool gerencia a memória que é utilizada pelas aplicações no IIS. Não vou entrar em detalhes e serei bem direto na solução.
Bem, se você deu de cara com o problema do Server Application Unavailable e já não sabe mais o que fazer (já criou e recriou inúmeras vezes o site e deu na mesma), verifique todas as configurações (novamente), veja se o Application Pool trabalhado está ativo e funcionando sobre a mesma versão do Framework .NET da aplicação. Revise também a sua configuração ou crie um novo e altere na configuração do Web Site para o que foi criado. Isso deve resolver o problema...
Redirecionando o endereço para SSL no Global.asax
Post rápido para redirecionar seu endereço caso um usuário, ao digitar http://thiagomarcal.blogspot.com/, seja redirecionado automaticamente para https://thiagomarcal.blogspot.com/. Adicione um arquivo Global.asax e aplique o seguinte método:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (!Request.IsSecureConnection)
{
string endereco = string.Format("https{0}", Request.Url.AbsoluteUri.Substring(4));
Response.Redirect(endereco);
}
}
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (!Request.IsSecureConnection)
{
string endereco = string.Format("https{0}", Request.Url.AbsoluteUri.Substring(4));
Response.Redirect(endereco);
}
}
Ler código de barras através de um leitor óptico com ASP.NET
Não há nenhum segredo ou driver específico para realizar a leitura. Basicamente o leitor óptico lê o código de barras, converte para string e retorna para o buffer de entrada do computador. Ou seja, é como se fosse digitar no teclado! Acabou o mistério...
Há várias formas de codificação do código de barras e quem é responsável por essa codificação/decoficação pode ser tanto a leitora quanto a aplicação. Irei considerar em nosso exemplo que o que a leitora lê e irei utilizar não me importando o que seja. Supondo e para fins ilustrativos que nosso código de barras seja essa aí de cima, o valor de entrada seria 3805565154 (frisando novamente, apenas supondo). A leitora irá passar para nossa aplicação a seguinte entrada 3805565154 ENTER. A maioria das leitoras já facilitam sua vida forçando o ENTER ao terminar de ler o conteúdo. Então fica fácil! Vamos por a mão na massa.
Crie uma tela com apenas um TextBox. Criei essa bonitinha aqui:
Com isso, ao digitar qualquer valor no TextBox, irá disparar esse evento. Mas como queremos ler apenas o valor completo, adicionamos uma determinada condição para começar a analisar apenas quando pressionar/entrar o ENTER, logo nosso código ficaria da seguinte forma:
private void txtNumero_KeyDown(object sender, KeyEventArgs e)
{if (e.KeyCode == Keys.Enter)
{
string entrada = txtNumero.Text;
txtNumero.Text = "";
}
}
Ou seja, a cada entrada de caracteres, ativo o evento mas só iniciarei a análise quando a entrada for um ENTER. Ao final, zero o conteúdo do TextBox para que possa dar uma nova entrada. Daí você pode adicionar outras instruções no meio para fazer o que quiser. Eu complementei a aplicação fazendo uma consulta em um banco de dados e analisando se existe ou não um determinado cupom. Vamos aos testes...
A leitora que usei é plugada diretamente na entrada PS/2 do teclado. A depender de sua leitora pode ser na USB, na PS/2 ou utilizar algum adaptador específico. Depois de conectado, inicie sua aplicação. Posicione o leitor sobre o código de barras e pressione o botão para realizar a leitura e voilá... Sua aplicação irá ler a entrada e realizar o processo que desejar.
Minha aplicação leu um cupom cujo número codificado era 1000909. Bem fácil e útil...
Quem quiser saber mais informações como tipos de codificações, como gerar/codificar/decodificar strings para código de barras no Access, acessem esse artigo da MSDN que é bem interessante e explicativo.
ASP.NET com Banco Firebird
Postado por
Thiago Marçal
on domingo, 20 de junho de 2010
/
Marcadores:
banco de dados,
firebird
/
Comments: (0)
Semelhantemente com o post do MySQL, irei demonstrar como conectar a um banco Firebird usando o Framework (DLL) que eles disponilizam e que pode ser obtido aqui. Vou resumir o processo pois é bem parecido, daí é só dar uma olhadinha rápida no post anterior.
Basicamente incorpore a DLL no projeto e crie uma nova classe chamada Firebird. Adicione o namespace FirebirdSql.Data.FirebirdClient e adicione o seguinte código para consulta:
FbConnection conexao = new FbConnection("String Conexão Firebird");
FbCommand comando = new FbCommand();
FbDataReader datareader = null;
try
{
conexao.Open();
try
{
FbTransaction transacao = conexao.BeginTransaction();
comando.Connection = conexao;
comando.CommandText = "SELECT * FROM Tabela";
datareader = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
transacao.Commit();
}
catch (FbException erro) { }
}
catch (FbException erro) { }
Bem semelhante... nada de novo! Daí pode-se gerar os demais métodos de conexão a partir desse.
Vi em alguns tópicos pela NET que o pessoal encontra alguns problemas ao tentar conectar ao Firebird. O principal erro é: "Your user name and password are not defined. Ask your database administrator to set up a Firebird login."
Novamente, vi soluções muito loucas e esdrúxulas mas que foram tentativas de ajudar e de boa vontade do pessoal. Bem, mesmo que seu login e senha estejam certos (e tenha certeza disso antes de reclamar), o Firebird, em comunicação com a DLL, não dão muita transparência e ajuda ao usuário. O problema, basicamente, é a string de conexão. Basta usar essa:
Problema resolvido!
Basicamente incorpore a DLL no projeto e crie uma nova classe chamada Firebird. Adicione o namespace FirebirdSql.Data.FirebirdClient e adicione o seguinte código para consulta:
FbConnection conexao = new FbConnection("String Conexão Firebird");
FbCommand comando = new FbCommand();
FbDataReader datareader = null;
try
{
conexao.Open();
try
{
FbTransaction transacao = conexao.BeginTransaction();
comando.Connection = conexao;
comando.CommandText = "SELECT * FROM Tabela";
datareader = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
transacao.Commit();
}
catch (FbException erro) { }
}
catch (FbException erro) { }
Bem semelhante... nada de novo! Daí pode-se gerar os demais métodos de conexão a partir desse.
Vi em alguns tópicos pela NET que o pessoal encontra alguns problemas ao tentar conectar ao Firebird. O principal erro é: "Your user name and password are not defined. Ask your database administrator to set up a Firebird login."
Novamente, vi soluções muito loucas e esdrúxulas mas que foram tentativas de ajudar e de boa vontade do pessoal. Bem, mesmo que seu login e senha estejam certos (e tenha certeza disso antes de reclamar), o Firebird, em comunicação com a DLL, não dão muita transparência e ajuda ao usuário. O problema, basicamente, é a string de conexão. Basta usar essa:
User=SYSDBA; Password=masterkey; Database=C:\Bancos\Firebird\Thiago.fdb; DataSource=localhost; Port=3050; Dialect=3; Charset=NONE; Role=; Connection lifetime=15; Pooling=true; MinPoolSize=0; MaxPoolSize=50; Packet Size=8192; ServerType=0;Ou
User=SYSDBA; Password=masterkey; Database=C:\Bancos\Firebird\Thiago.fdb; Server=localhost;
Problema resolvido!
Processo de Assinatura de Rps/Lote - Nota Fiscal Eletrônica
Lendo aquele bolo de especificação da ABRASF muitos devem perguntar: "Certo, sei quais campos colocar no XML mas qual a ordem do processo de assinatura?". A documentação não fica claro realmente como e qual a melhor forma de assinar. Realize a seguinte ordem:
Para fazer a assinatura dos XMLs, utilize a função abaixo:
private XmlDocument AplicaAssinatura(string xml, string uri)
{
try
{
// Obtem o certificado
X509Certificate2 X509Cert = ObtemCertificado();
// Cria um documento XML para carregar o XML
XmlDocument docXML = new XmlDocument();
docXML.PreserveWhitespace = true;
// Carrega o documento XML
docXML.LoadXml(xml);
// Cria o objeto XML assinado
SignedXml signedXml = new SignedXml(docXML);
// Assina com a chave privada
signedXml.SigningKey = X509Cert.PrivateKey;
// Atribui o método de canonização
signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
// Atribui o método para assinatura
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";
// Cria a referencia
Reference reference = new Reference();
// Pega a URI para ser assinada
XmlAttributeCollection _Uri = docXML.GetElementsByTagName(uri).Item(0).Attributes;
foreach (XmlAttribute _atributo in _Uri)
{
if (_atributo.Name == "id")
reference.Uri = "#" + _atributo.InnerText;
}
// Adiciona o envelope à referência
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Atribui o método do Hash
reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#sha1";
// Adiciona a referencia ao XML assinado
signedXml.AddReference(reference);
// Cria o objeto keyInfo
KeyInfo keyInfo = new KeyInfo();
// Carrega a informação da KeyInfo
KeyInfoClause rsaKeyVal = new RSAKeyValue((System.Security.Cryptography.RSA)X509Cert.PrivateKey);
KeyInfoX509Data x509Data = new KeyInfoX509Data(X509Cert);
x509Data.AddSubjectName(X509Cert.SubjectName.Name.ToString());
keyInfo.AddClause(x509Data);
keyInfo.AddClause(rsaKeyVal);
// Adiciona a KeyInfo
signedXml.KeyInfo = keyInfo;
// Atribui uma ID à assinatura
signedXml.Signature.Id = "Assigned" + uri;
// Efetiva a assinatura
signedXml.ComputeSignature();
// Obtem o XML assinado
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Adiciona o elemento assinado ao XML
docXML.DocumentElement.AppendChild(docXML.ImportNode(xmlDigitalSignature, true));
// Retorna o XML
return docXML;
}
catch (Exception erro) { throw erro; }
}
O parâmetro URI é o nome da tag geral que deve ser assinada de um XML, no caso deverá assinar as tags InfRps (cada uma) e LoteRps. A função ObtemCertificado já foi exibida aqui em um tópico anterior que serve para captura do certificado digital.
- Gere o XML da Rps e assine;
- Se for enviar mais de uma Rps em um mesmo lote, repita o passo 1 para cada Rps;
- Anexe todas as Rps já assinadas no XML do Lote;
- Assine o Lote e faça o envio.
Para fazer a assinatura dos XMLs, utilize a função abaixo:
private XmlDocument AplicaAssinatura(string xml, string uri)
{
try
{
// Obtem o certificado
X509Certificate2 X509Cert = ObtemCertificado();
// Cria um documento XML para carregar o XML
XmlDocument docXML = new XmlDocument();
docXML.PreserveWhitespace = true;
// Carrega o documento XML
docXML.LoadXml(xml);
// Cria o objeto XML assinado
SignedXml signedXml = new SignedXml(docXML);
// Assina com a chave privada
signedXml.SigningKey = X509Cert.PrivateKey;
// Atribui o método de canonização
signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
// Atribui o método para assinatura
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";
// Cria a referencia
Reference reference = new Reference();
// Pega a URI para ser assinada
XmlAttributeCollection _Uri = docXML.GetElementsByTagName(uri).Item(0).Attributes;
foreach (XmlAttribute _atributo in _Uri)
{
if (_atributo.Name == "id")
reference.Uri = "#" + _atributo.InnerText;
}
// Adiciona o envelope à referência
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Atribui o método do Hash
reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#sha1";
// Adiciona a referencia ao XML assinado
signedXml.AddReference(reference);
// Cria o objeto keyInfo
KeyInfo keyInfo = new KeyInfo();
// Carrega a informação da KeyInfo
KeyInfoClause rsaKeyVal = new RSAKeyValue((System.Security.Cryptography.RSA)X509Cert.PrivateKey);
KeyInfoX509Data x509Data = new KeyInfoX509Data(X509Cert);
x509Data.AddSubjectName(X509Cert.SubjectName.Name.ToString());
keyInfo.AddClause(x509Data);
keyInfo.AddClause(rsaKeyVal);
// Adiciona a KeyInfo
signedXml.KeyInfo = keyInfo;
// Atribui uma ID à assinatura
signedXml.Signature.Id = "Assigned" + uri;
// Efetiva a assinatura
signedXml.ComputeSignature();
// Obtem o XML assinado
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Adiciona o elemento assinado ao XML
docXML.DocumentElement.AppendChild(docXML.ImportNode(xmlDigitalSignature, true));
// Retorna o XML
return docXML;
}
catch (Exception erro) { throw erro; }
}
O parâmetro URI é o nome da tag geral que deve ser assinada de um XML, no caso deverá assinar as tags InfRps (cada uma) e LoteRps. A função ObtemCertificado já foi exibida aqui em um tópico anterior que serve para captura do certificado digital.
Criar RSS
Depois de muito tempo voltei a escrever alguns artigos. Pouco tempo disponível e algumas prioridades... Bem, esse tópico, apesar de simples, é de bem ajuda para que desejar gerar RSS dinamicamente. O código é bem simples: apenas Response!
Crie uma página que irá exibir o RSS e coloque o seguinte código no Page_Load:
StringBuilder rss = new StringBuilder();
rss.AppendLine("<rss version="2.0">");
rss.AppendLine("<channel>");
rss.AppendLine("<title>Thiago Marçal</title>");
rss.AppendLine("<link>http://thiagomarcal.blogspot.com/</link>");
rss.AppendLine("<description>Blog que compartilha idéias e código-fontes à comunidade.</description>");
rss.AppendLine("<language>pt-br</language>");
SqlDataReader dr = consulta("SELECT * ");
while (dr.Read())
{
rss.AppendLine("<item>");
rss.AppendLine("<title>" + Funcoes.RemoveHTML(Server.HtmlDecode(dr["titulo"].ToString())) + "</title>");
rss.AppendLine("<description>" + Funcoes.RemoveHTML(Server.HtmlDecode(dr["texto"].ToString())) + "</description>");
rss.AppendLine("<link>" + dr["link"].ToString() + "</link>");
rss.AppendLine("<pubDate>" + DateTime.Parse(dr["data"].ToString()).ToString("dd/MM/yyyy HH:mm:ss") + "</pubDate>");
rss.AppendLine("</item>");
}
rss.AppendLine("</channel>");
rss.AppendLine("</rss>");
dr.Close();
Response.ContentType = "text/xml";
Response.Write(rss.ToString());
Bem simples, não? O método Funcoes.RemoveHTML remove qualquer tag HTML que contenha na string. Eu criei uma bem simples baseada em expressão regular. Você pode criar a seu gosto...
Crie uma página que irá exibir o RSS e coloque o seguinte código no Page_Load:
StringBuilder rss = new StringBuilder();
rss.AppendLine("<rss version="2.0">");
rss.AppendLine("<channel>");
rss.AppendLine("<title>Thiago Marçal</title>");
rss.AppendLine("<link>http://thiagomarcal.blogspot.com/</link>");
rss.AppendLine("<description>Blog que compartilha idéias e código-fontes à comunidade.</description>");
rss.AppendLine("<language>pt-br</language>");
SqlDataReader dr = consulta("SELECT * ");
while (dr.Read())
{
rss.AppendLine("<item>");
rss.AppendLine("<title>" + Funcoes.RemoveHTML(Server.HtmlDecode(dr["titulo"].ToString())) + "</title>");
rss.AppendLine("<description>" + Funcoes.RemoveHTML(Server.HtmlDecode(dr["texto"].ToString())) + "</description>");
rss.AppendLine("<link>" + dr["link"].ToString() + "</link>");
rss.AppendLine("<pubDate>" + DateTime.Parse(dr["data"].ToString()).ToString("dd/MM/yyyy HH:mm:ss") + "</pubDate>");
rss.AppendLine("</item>");
}
rss.AppendLine("</channel>");
rss.AppendLine("</rss>");
dr.Close();
Response.ContentType = "text/xml";
Response.Write(rss.ToString());
Bem simples, não? O método Funcoes.RemoveHTML remove qualquer tag HTML que contenha na string. Eu criei uma bem simples baseada em expressão regular. Você pode criar a seu gosto...







