1-A primeira coisa que você precisa fazer é criar um novo projeto do tipo “Class Library” na solution do nopCommerce. Além de ser uma boa prática, é recomendado que todos os plugins que você criar sejam criados na pasta “\Plugins” que fica na pasta raiz da solution (não confunda com o sub-diretório “\Plugins” que fica localizado dentro do diretório “\Nop.Web” que é usado para os plugins compilados). Também é uma boa prática colocar todos os projetos de plugins que você criar em uma pasta chamada “Plugins” existente na solution do nopCommerce (mais detalhes sobre o uso de pastas em solutions podem ser encontrados clicando aqui).

plugin.1

Um bom padrão de nome para o projeto de seu plugin é “Nop.Plugin.{Group}.{Name}”. {Group} é o grupo do seu plugin (por exemplo “Payment“, “Shipping“, “Misc“). {Name} é o nome de seu plugin (por exemplo “Correios”, “PagSeguro”). Por exemplo, um plugin de integração com o PagSeguro deverá ter o nome Nop.Plugin.Payments.PagSeguro.

2-Após a criação do projeto, é necessário atualizar o “build output path” de seu projeto, ou seja, o caminho onde os arquivos compilados de seu projeto serão colocados. Defina para “..\..\Presentation\Nop.Web\Plugins\{Group}.{Name}\”. De acordo com nosso exemplo do plugin para o PagSeguro, teríamos o seguinte output path: “..\..\Presentation\Nop.Web\Plugins\Payments.PagSeguro\”. Após essa etapa, as DLLs do plugin serão automaticamente copiadas para “\Presentation\Nop.Web\Plugins\”, que é o diretório onde o nopCommerce core procura por plugins válidos.

plugin.2
-No menu “Project”, clique em “Properties”
-Clique na aba “Build”
-Clique no botão “Browse” e escolha o novo caminho onde os arquivos compilados serão copiados
Você precisa seguir os passos acima para todas as configurações existentes (“Debug” e “Release”).

3-Agora é necessário criar um arquivo chamado “Description.txt”, esse arquivo é necessário em cada plugin. É nele que estão as informações que descrevem o plugin. Você pode copiar esse arquivo de algum outro plugin, e alterar os dados para os valores do seu plugin. Por exemplo, para o plugin do PagSeguro que citamos acima, o arquivo ficaria assim:

Group: Payment methods
FriendlyName: Integração PagSeguro
SystemName: Payments.PagSeguro
Version: 1.00
SupportedVersions: 3.50, 3.60
Author: nopCommerce Brasil
DisplayOrder: 1
FileName: Nop.Plugin.Payments.PagSeguro.dll

Todos os campos são auto-explicativos, mas tem alguns pontos importantes. SystemName deve ser único. Version é a versão do seu plugin, e você pode colocar qualquer valor que desejar. SupportedVersions deve conter uma lista das versões do nopCommerce que são suportadas pelo seu plugin. A lista deve ser separada por vírgulas, conforme o exemplo acima. O nopCommerce só carrega os plugins que suportem a versão que está rodando, por exemplo, se sua versão do nopCommerce for a 3.50, ele só carregará os plugins que tiverem essa versão definida no campo SupportedVersions. FileName deve possuir o formato Nop.Plugin.{Group}.{Name}.dll, esse campo é o nome do assembly de seu plugin. Garanta que a propriedade “Copy to Output Directory” desse arquivo esteja definida para “Copy if newer”.
plugin.3

4-Você também precisa criar um arquivo web.config e garantir que ele está sendo copiado para a pasta de arquivos compilados definida acima. Apenas copie esse arquivo de qualquer outro plugin.

5-O último passo necessário é criar uma classe que implemente a interface IPlugin (localizada na namespace Nop.Core.Plugins). O nopCommerce possui a classe BasePlugin que implementa alguns métodos da interface IPlugin, o que facilita nosso trabalho, e evita que código duplicado seja criado. Além disso, o nop disponibiliza algumas interfaces específicas que são filhas de IPlugin. Por exemplo, existe uma interface chamada “IPaymentMethod”, que é usada na criação de plugins de pagamento, como o PagSeguro. Ela contém alguns métodos que são específicos apenas para plugins de pagamento, como ProcessPayment() e GetAdditionalHandlingFee(). Atualmente o nop possui as seguintes interfaces para plugins:
-IExternalAuthenticationMethod: usada para criação de métodos de autenticação externa, como por exemplo Facebook, OpenID, Twitter, etc.
-IWidgetPlugin: permite que você crie widgets, que são componentes que são renderizados em algumas partes do site. Por exemplo, você pode criar um banner de propaganda para ser exibido na coluna esquerda de sua loja.
-IExchangeRateProvider: usado para criar plugins que buscam taxas de câmbio para as moedas utilizadas na loja virtual.
-IDiscountRequirementRule: permite que você crie novas regras de aplicação de descontos, como por exemplo, conceder 10% de desconto se o endereço de entrega ficar no estado de São Paulo.
-IPaymentMethod: plugins usados para processamento de pagamentos, como PagSeguro e bCash.
-IShippingRateComputationMethod: plugins usados para cálculo de prazo e valor de entrega, como por exemplo um plguin dos Correios.
-ITaxProvider: usada para criar plugins que façam cálculo de impostos.

Se seu plugin não se encaixar em nenhuma dessas interfaces, então você deve usar a interface IMiscPlugin. Por exemplo, se você está fazendo um plugin que envia uma mensagem SMS para o cliente toda vez que ele conclui um pedido, então, é essa interface que você deve usar.

Importante: após cada build que você fizer em seu projeto, faça um clean na solution antes de fazer alterações. Alguns recursos são colocados em cache, e podem levar levar um desenvolvedor à insanidade.