Métodos de pagamento são implementados na forma de plugins no nopCommerce. Nós recomendamos que você veja a primeira parte de nosso tutorial de criação de plugins, antes de você seguir com esse tutorial.

Um plugin de pagamento precisa implementar a interface IPaymentMethod (disponível na namespace Nop.Services.Payments). Essa interface possui alguns métodos específicos e necessários para o fluxo de pagamento de um pedido, como ProcessPayment() e GetAdditionalHandlingFee(). Vamos começar? Então adicione um novo projeto do tipo class library em sua solution para criarmos o nosso plugin de pagamento.

Controllers, views, models

A primeira coisa que você precisa criar é um Controller. Ele será responsável por processar as requisições feitas contra o website ASP.NET MVC.

1. Para os plugins de pagamento, o controller deve herdar da classe abstrata BaseNopPaymentController. Algumas formas de pagamento precisam que o cliente informe alguns dados no momento do checkout, como por exemplo os dados do cartão de crédito. É por esse motivo que a classe BaseNopPaymentController exige que você implemente dois métodos que são usados para fazer o parse e a validação dos dados informados pelo cliente durante o processo de checkout.
a. ValidatePaymentForm: é usado pelo site da loja para validar os dados informados pelo usuário. O método retorna uma lista de warnings (avisos), como por exemplo, um aviso quando o cliente não informar a data de validade de seu cartão de crédito. Se o seu plugin de pagamento não precisar que o cliente entre com nenhuma informação, então o método ValidatePaymentForm deve retornar uma lista vazia, conforme exibido abaixo.

[NonAction]
public override IList ValidatePaymentForm(FormCollection form)
{
	var warnings = new List();             
	return warnings;         
}

b. GetPaymentInfo: método usado pela loja para fazer o parse dos dados inseridos pelo cliente, como o número do seu cartão de crédito. Esse método retorna um objeto do tipo ProcessPaymentRequest, com as informações inseridas pelo cliente (como por exemplo, a data de validade do cartão). Se o seu método de pagamento não precisa que o cliente informe nenhum dado, então esse método deve retornar um objeto do tipo ProcessPaymentRequest vazio, conforme o código abaixo.

[NonAction]
public override ProcessPaymentRequest GetPaymentInfo(FormCollection form)
{
	var paymentInfo = new ProcessPaymentRequest();
	return paymentInfo;
}

2. Você também precisa implementar o método Configure, que é usado para fazer a configuração do seu plugin pelo administrador da loja. Assim como você também precisa criar a view de configuração para o plugin. Esse método e sua view irão definir como o administrador da loja visualiza e altera as opções de configuração de seu plugin através do painel de administração da loja (System > Configuration > Payment methods).

3. E por fim, o último passo é criar o método PaymentInfo em seu controller. Você também precisa criar uma view, que será utilizada para que os clientes vejam e informem os dados de pagamento durante o processo de checkout.

Payment processing

Agora você precisa criar uma classe que implemente a interface IPaymentMethod. Essa é a classe que irá fazer todo o trabalho do pagamento, como por exemplo a comunicação com um gateway de pagamento. Quando alguém faz um pedido na loja, o método ProcessPayment ou PostProcessPayment de sua classe será chamado. Veja aqui como a classe CashOnDeliveryPaymentProcessor (classe do método de pagamento “Cash on delivery” disponível no nopCommerce) é declarada:

public class CashOnDeliveryPaymentProcessor : BasePlugin, IPaymentMethod

A interface IPaymentMethod possui uma série de métodos e propriedades que devem ser implementados:

  • ProcessPayment: esse método é sempre chamado antes do cliente concluir a criação do pedido. Utilize quando você precisa processar um pagamento antes que o pedido seja gravado no banco de dados do nopCommerce. Por exemplo, para capturar ou autorizar uma transação no cartão de crédito. Normalmente esse método é utilizado quando o cliente não é redirecionado para o site do gateway de pagamento, e todo o controle do pagamento é gerenciado pela sua loja. O PayPal Direct utiliza esse método.
  • PostProcessPayment: esse método é chamado logo após o cliente concluir o seu pedido. Normalmente esse método é utilizado para redirecionar o cliente para a página do gateway de pagamento, para que ele possa concluir o pagamento do pedido. O PayPal Standard utiliza esse método, assim como plugins para o PagSeguro e bCash.
  • HidePaymentMethod: nesse método você pode colocar qualquer lógica que desejar para que o método de pagamento não seja exibido para o cliente. Por exemplo, não exibir o método de pagamento se o valor total do pedido for menor que R$ 100,00. Ou então, não exibir se o cliente for estrangeiro.
  • GetAdditionalHandlingFee: nesse método você pode retornar uma taxa adicional que deve ser acrescentada ao valor total do pedido.
  • Capture: alguns gateways de pagamento, permitem que você trabalhe com pré-autorização do pagamento, e faça a captura (o débito do cartão por exemplo) em um momento posterior. Para esses casos, você irá apenas pré-autorizar o pagamento usando o método ProcessPayment ou PostProcessPayment e depois você irá confirmar o débito usando o método Capture. Para esses casos, um botão Capture será exibido na página de detalhes do pedido na página de administração da loja. Importante lembrar que para isso, o pedido precisa já estar pré-autorizado, e a propriedade SupportCapture deve retornar verdadeiro (true).
  • Refund: esse método permite que você faça o estorno ou devolução do valor pago pelo cliente. Para poder utilizar esse método, a propriedade SupportRefund ou SupportPartiallyRefund devem retornar verdadeiro (true). Quando isso ocorrer, um botão Refund será exibido na página de detalhes do pedido na página de administração da loja.
  • Void: esse método permite você cancelar um pagamento pré-autorizado, que ainda não foi capturado. Para esse caso, um botão Void será exibido na página de detalhes do pedido na página de administração da loja. Para que o botão seja habilitado, é necessário que a propriedade SupportVoid retorne true.
  • ProcessRecurringPayment: utilize esse método para pagamentos recorrentes, como por exemplo assinatura de serviços.
  • CancelRecurringPayment: método que deve ser utilizado para cancelar um pagamento que está agendado de forma recorrente.
  • CanRePostProcessPayment: método normalmente utilizado para redirecionar o cliente para a página de um gateway de pagamento para que ele possa concluir o pagamento que ele não conseguiu concluir anteriormente por alguma razão. Dessa forma o cliente pode fazer uma nova tentativa de pagamento sem precisar fazer um novo pedido. Para habilitar esse recurso, a propriedade CanRePostProcessPayment deve retornar true.
  • GetConfigurationRoute: esse método deve retornar a informação da rota para configuração do plugin. Por exemplo:
            public void GetConfigurationRoute(out string actionName, 
                out string controllerName, 
                out RouteValueDictionary routeValues)
            {
                actionName = "Configure";
                controllerName = "PaymentCashOnDelivery";
                routeValues = new RouteValueDictionary()
                {
                    { "Namespaces", "Nop.Plugin.Payments.CashOnDelivery.Controllers" }, 
                    { "area", null }
                };
            }
    
  • GetPaymentInfoRoute: esse método deve retornar a rota para o método PaymentInfo do controller criado anteriormente. Por exemplo:
            public void GetPaymentInfoRoute(out string actionName, 
                out string controllerName, 
                out RouteValueDictionary routeValues)
            {
                actionName = "PaymentInfo";
                controllerName = "PaymentCashOnDelivery";
                routeValues = new RouteValueDictionary()
                {
                    { "Namespaces", "Nop.Plugin.Payments.CashOnDelivery.Controllers" }, 
                    { "area", null }
                };
            }
    
  • GetControllerType: esse método deve retornar o tipo do controller criado anteriormente.
  • SupportCapture, SupportPartiallyRefund, SupportRefund, SupportVoid: essas propriedades indicam quais funcionalidades do plugin de pagamento são suportadas.
  • RecurringPaymentType: essa propriedade indica se pagamentos recorrentes são suportados pelo plugin.
  • PaymentMethodType: essa propriedade indica o tipo do método de pagamento. Atualmente existem três tipos. Standard, que é usado para pagamentos que são gerenciados pela sua loja e não fazem redirecionamento do cliente para outro site. Redirection, que é usado quando o cliente é redirecionado para outro site para concluir o pagamento de seu pedido. Button, que é similar ao Redirection, sendo a única diferença a exibição de um botão na página de carrinho da loja. O plugin do Google Checkout utiliza essa opção.