WebServices Cielo (VisaNet)

30/8/2011 18:49:00 - Fábio Ferreira de Souza
Integrar sistemas é trabalhoso, e fazer da forma certa mais ainda, por isso estou desenvolvendo um componente para integrar a Cielo (Visanet) a qualquer site.

A integração com a Cielo (VisaNet) é feita via troca de XML, como se fosse um "WebServices", mas na minha opinião está longe de ser um WebServices pois não há um WSDL, ou qualquer geração de código automatizada pela plataforma cliente, por isso tive que criar várias estruturas auxiliares para "componentizar" as chamadas, e assim é possível fazer as chamadas a Cielo de forma mais fácil.

Minha meta é fornecer para o programador final, uma código eficiente e fácil que possa fazer tudo em 1 linha, veja o exemplo abaixo:

CieloTransacao trans = Cielo.Transacao(
   "1006993069", "25fbb99741c739dd84d7b06ec78c9bac718838630f30b112d033ce2e621b34f3",
   "4012001037141112", "201501", "585",
   5, 123, DateTime.Now, CieloBandeiras.Visa, CieloProdutos.Parcelado, 3, true);

Aqui é enviado todos os parâmetros de forma que é retornado em um objeto "trans" todos os dados que podem ser facilmente interpretados, pois estão estruturados de acordo com o diagrama abaixo:

Estrutura de Transação Cielo.

Mas para isso estou fazendo todas as abstrações do XML de retorno assim:

   1:  try
   2:  {
   3:      XmlDocument xml = new XmlDocument();
4: xml.LoadXml(XML);
   5:      if (xml.DocumentElement.Name == "erro")
6: {
   7:          ErroCodigo = Int32.Parse(xml.DocumentElement.SelectSingleNode("codigo").InnerText);
8: ErroMensagem = xml.DocumentElement.SelectSingleNode("mensagem").InnerText;
   9:  // códigos removidos
  10:      }
  11:  else
  12:      {
  13:          TID = xml.DocumentElement.SelectSingleNode("tid").InnerText;
14: PAN = xml.DocumentElement.SelectSingleNode("pan").InnerText;
  15:          UrlAutenticacao = xml.DocumentElement.SelectSingleNode("url-autenticacao").InnerText;
16: Pedido = new CieloPedido(xml.DocumentElement.SelectSingleNode("dados-pedido"));
  17:          Pagamento = new CieloPagamento(xml.DocumentElement.SelectSingleNode("forma-pagamento"));
18: Status = (CieloStatus)Int32.Parse(xml.DocumentElement.SelectSingleNode("status").InnerText);
  19:          Autenticacao = new CieloAutenticacao(xml.DocumentElement.SelectSingleNode("autenticacao"));
20: Autorizacao = new CieloAutorizacao(xml.DocumentElement.SelectSingleNode("autorizacao"));
  21:          Captura = new CieloCaptura(xml.DocumentElement.SelectSingleNode("captura"));
22: }
  23:      ErroCodigo = 0;
24: ErroMensagem = "OK";
  25:  }

Cada construtora recebe o nó XML respectivo para se criar, por exemplo:

   1:  public CieloAutorizacao(XmlNode node)
2: {
   3:  if (node == null)
4: {
   5:          XML = null;
6: Codigo = 0;
   7:  // Códigos removidos
   8:      }
   9:  else
  10:      {
  11:          XML = node.InnerXml;
12: Codigo = Int32.Parse(node.SelectSingleNode("codigo").InnerText);
  13:          Mensagem = node.SelectSingleNode("codigo").InnerText;
14: DataHora = DateTime.Parse(node.SelectSingleNode("data-hora").InnerText);
  15:          Valor = Int32.Parse(node.SelectSingleNode("valor").InnerText) / 100;
16: LR = node.SelectSingleNode("lr").InnerText;
  17:          ARP = Int32.Parse(node.SelectSingleNode("arp").InnerText);
18: NSU = Int32.Parse(node.SelectSingleNode("nsu").InnerText);
  19:      }
20: }

E para gerar o XML de cada estrutura fiz via propriedade assim:

   1:  public string XML
2: {
   3:      get
4: {
   5:          return
   6:          " \r\n" +
   7:          "  " + NumeroPedido + "\r\n" +
8: " " + Int32.Parse((Valor * 100).ToString()) + "\r\n" +
   9:          "  " + Moeda + "\r\n" +
10: " " + DataHora.ToString("yyyy-MM-ddTHH:mm:ss") + "\r\n" +
  11:          "  " + Idioma + "\r\n" +
12: " \r\n";
  13:      }
14: }

Em breve este componente estará pronto e a venda em meu site: www.boletoasp.com.br