Nesta seção você irá aprender mais sobre os detalhes de cada funcionalidade do SDK .NET para mPOS, como fazer o download e instalação do pacote, configurar as bibliotecas básicas que seguem o protocolo ABECS, além de ver o fluxo de criação de uma transação. Vamos lá!

Download do SDK

O SDK .NET pode ser instalado através do pacote PagarMe.Mpos no nuget.

Configurando o ambiente

Para que o SDK .NET funcione, os seguintes passos são necessários:

Instalação dos componentes nativos do SDK mpos.dll e tms.dll, que devem ser colocados no diretório de binários do seu projeto (e.g. a pasta bin).

Para a integração da Pagar.Me.Mpos 2.0.0, use:

Para versões anteriores do SDK, use:

Instalação dos componentes nativos do SQLite3. Componentes sqlite3_32.dll e sqlite3_64.dll adequados devem ser colocados exatamente no diretório de binários do seu projeto (e.g. a pasta bin), e você pode usar também o Bibliotecas. Existem outras possibilidades de download desses componentes, variando com versão do Windows, por exemplo. Possível download do SQLite

Criando uma transação

O código abaixo demonstra um fluxo completo que poderia ser usado pela sua aplicação
para capturar os dado do cartão, gerar o card_hash e usá-lo para criar uma transação com
a API Pagar.Me. Este exemplo usa também o SDK para a criação de transações em nosso [NuGet] (https://www.nuget.org/packages/Pagar.me/). No entanto, caso esteja construindo um app mobile, recomendamos que envie o card_hash para um servidor externo e crie a transação a partir de lá.

using System;
using System.IO.Ports;
using System.Threading.Tasks;

using PagarMe;
using PagarMe.Mpos;

namespace PagarMeCSharpLibPoCs
{
	public class PaymentProcessor
	{
		private readonly SerialPort _port;
		private readonly Mpos _mpos;

		public PaymentProcessor(string device)
		{
			_port = new SerialPort(device, 140000, Parity.None, 8, StopBits.One);
			_port.Open();
      
      /* Guardamos arquivos de cache no diretório C:\\Storage\\. É *obrigatório* colocar a última barra ao final do path! */      
			_mpos = new Mpos(_port.BaseStream, "SUA ENCRYPTION KEY", "C:\\Storage\\");

      /* Os eventos abaixo podem ser usados para controlar o fluxo de 
         sua aplicação
      */
			_mpos.NotificationReceived += (sender, e) => Console.WriteLine("Status: {0}", e);
			_mpos.TableUpdated += (sender, e) => Console.WriteLine("LOADED: {0}", e);
			_mpos.Errored += (sender, e) => Console.WriteLine("I GOT ERROR {0}", e);
			_mpos.PaymentProcessed += (sender, e) => Console.WriteLine("HEY CARD HASH " + e.CardHash);
			_mpos.FinishedTransaction += (sender, e) => Console.WriteLine("FINISHED TRANSACTION!");

		}


		public async Task Initialize()
		{
			await _mpos.Initialize();
       
      // Você pode solicitar o download das tableas EMV neste momento
			await _mpos.SynchronizeTables(false);
		}



		public async Task Pay(int amount)
		{
			var result = await _mpos.ProcessPayment(amount, null, PagarMe.Mpos.PaymentMethod.Credit);
   
			Console.WriteLine("CARD HASH = " + result.CardHash);
      
			var transaction = new Transaction
			{
				CardHash = result.CardHash,
				Amount = amount
			};

			await transaction.SaveAsync();

			Console.WriteLine("Transaction ARC = " + transaction.AcquirerResponseCode + ", Id = " + transaction.Id);
			Console.WriteLine("ACQUIRER RESPONSE CODE = " + transaction.AcquirerResponseCode);
			Console.WriteLine("EMV RESPONSE = " + transaction["card_emv_response"]);

			int x = Int32.Parse(transaction.AcquirerResponseCode);
			object obj = transaction["card_emv_response"];
			string response = obj == null ? null : obj.ToString();
			await _mpos.FinishTransaction(true, x, (string)obj);
			await _mpos.Close();
		}
	}
}

Atualizando tabelas EMV

Para as diferentes aplicações de cartão de crédito (diferentes bandeiras, crédito/débito) existem um conjunto de especificações de como o pinpad deve se comportar, assim como certificados que permitem lidar com elas. Este conjunto é denominado tabelas EMV e pode ser obtido junto à Pagar.me via SDK.

Para baixar as tabelas EMV, as seguintes operações são realizadas:

  1. Download das tabelas EMV pela API Pagar.me;
  2. Transferência das tabelas baixadas para o PinPad.

A API Pagar.me fornece as tabelas EMV e então as bibliotecas, como no exemplo abaixo, fazem a instalação no PinPad:

bool force = false; // Define o comportamento da atualização de tabelas
await mpos.SynchronizeTables(force);

O valor booleano force dos exemplos especifica o comportamento de atualização de tabelas no PinPad. Caso esteja setado como true, faz o download instala as tabelas baixadas no PinPad. Caso esteja como false, instala as tabelas no PinPad somente se a versão no PinPad for diferente da versão das tabelas na API Pagar.me, evitando instalações de forma redundante.

O parâmetro loaded nos eventos lançados por ocasião do término de atualização de tabelas indica, se true, que foram instaladas tabelas no pinpad; se false, que essa instalação não foi necessária.

Processando os dados de cartão

Para processar e obter um card_hash — que deverá ser enviado à API Pagar.me para que a transação seja criada — o seguinte código pode ser utilizado:

var result = await _mpos.ProcessPayment(amount, null, PagarMe.Mpos.PaymentMethod.Credit);

A função de processamento ProcessPayment aceita os seguintes parâmetros: amount, applications e magstripePaymentMethod.

O primeiro é um inteiro representando a quantia a ser cobrada em centavos (no caso dos exemplos, 100 = R$1,00). Segue detalhe de cada opção:

ParâmetroSignificado
amountQuantia a ser cobrada em centavos (ex. 100 = R$1,00)
applicationsUm conjunto de EMVApplication que sua aplicação deseja selecionar. Uma EMVApplication consiste da combinação bandeira e método de pagamento (ex. Visa Crédito, Master Débito, Amex Crédito). Em caso de valor nulo, a escolha de possíveis aplicações é feita pelo PinPad.
magstripePaymentMethodA tarja magnética não permite seleção de método de pagamento no PinPad, o que requer sempre que a aplicação o defina.

Caso o conjunto de aplicações especificado não seja suportado pelo cartão inserido (ex. applications contém Visa Crédito e o cartão é Master Crédito), o PinPad retorna o erro 70.

Finalizando uma transação

Após a obtenção de um card_hash por meio do processamento no SDK, e do seu envio à API Pagar.me para criação de uma transação, é necessário finalizar o procedimento como um todo. Para tal, o seguinte código deve ser usado:

await _mpos.FinishTransaction(true, x, (string)obj);
await _mpos.Close();

Logo, considere a seguinte assinatura para o método FinishTransaction:

FinishTransaction(bool success, int responseCode, string emvData)

Começando com o parâmetro success, ele define se a conexão com a API Pagar.me foi bem-sucedida, e os demais podem ser encontrados no response da API Pagar.me para seu servidor:

{
  "card_pin_mode": "online",
  "acquirer_response_code": "0000",
  "card_emv_response": "124046c481.ca8c"
}

Sendo:

ParâmetroCorrespondência no objeto transaction
responseCodeacquirer_response_code, diz respeito ao código de retorno do adquirente Pagar.me para sua aplicação.
emvDatacard_emv_response: String responsável por finalizar a comunicação entre PinPad e cartão, e usada somente quando a autenticação foi Pin Online, veja a seguir.

card_pin_mode

Você deve usar este parâmetro para validar se é necessário executar o FinishTransaction. Sempre que o retorno estiver como online, é necessário finalizar a transação, caso contrário apenas o fechamento da conexão com o PinPad.

🚧

Vale ressaltar

Caso não tenha sido possível conexão com a API Pagar.me para inicializar uma transação (e o parâmetro success seja false), responseCode deve ser 0 e emvData deve ser null.


Próximo

Excelente! Você aprendeu como integrar sua aplicação com nosso SDK para mPOS, mas caso encontre algum erro ao longo do caminho, a seguinte tabela pode te ajudar na resolução, segue: