Faça download da última versão do plugin, descompacte e adiciona ao diretório app/Plugin/MoipAssinaturas/
No diretório raiz do projeto
git submodule add https://github.com/fabiowlima/moip-assinaturas-cakephp.git app/Plugin/MoipAssinaturas/
No arquivo app/Config/bootstrap.php adicione o suporte ao plugin: CakePlugin::load('MoipAssinaturas');
ou CakePlugin::loadAll();
Você precisa ter uma conta no Moip criada e ter em mãos seu token e chave de acesso, com isso em mãos adicione as seguintes configurações ainda no arquivo bootstrap.php
Configure::write('MoipAssinaturas', array(
'token' => 'Insira-seu-token-aqui',
'key' => 'Insira-sua-chave-de-acesso-aqui',
'isProd' => false,
'tokenNasp' => null,
'activeWebhook' => false,
));
Explicação rápida
Token: É o token de acesso fornecido pelo Moip
Key: É a chave de acesso fornecida pelo Moip
isProd: Se vai usar o plugin em ambiente de produção use (true), se é no Sandbox (false)
tokenNasp: Esse token é diferente do primeiro. Esse é utilizado quando o Moip enviar uma notificação através do Webhook, com ele o plugin autentica a origem da requisição para garantir a integridade e segurança dos dados. Essa informações está disponível no link configurações no painel do Moip Assinaturas.
activeWebhook: (true or false) Se você quer ou não utilizar os recursos do Webhook. Saiba mais sobre Webhook.
Nesse plugin você terá as seguintes APIs do Moip Assinaturas, através dos respectivos Components.
API | Component |
---|---|
Planos | MoipAssinaturas.Plans |
Clientes | MoipAssinaturas.Customers |
Assinaturas | MoipAssinaturas.Subscriptions |
Faturas | MoipAssinaturas.Invoices |
Pagamentos | MoipAssinaturas.Payments |
Retentativas | MoipAssinaturas.Retries |
Preferências | MoipAssinaturas.Preferences |
A seguir os métodos disponíveis para cada Component:
Criar novo plano
Plans::create(plan_attributes)
Atualizar plano
Plans::update(plan_code, plan_attributes)
Listas todos os planos
Plans::listAll()
Detalhes de um plano específico
Plans::details(plan_code)
Ativar um plano
Plans::activate(plan_code)
Desativar um plano
Plans::inactivate(plan_code)
Criar novo cliente. Notar o parametro new_vault
, que deve ser true | false
, isso serve para criar um cliente com dados de cartão de crédito ou não. Se esse parâmentro for true, deverá fornecer os dados de cartão obrigatóriamente.
Customers::create(new_vault, customer_attributes)
Atualizar cliente
Customers::update(customer_code, customer_attributes)
Listas todos os clientes
Customers::listAll()
Detalhes de um cliente específico
Customers::details(customer_code)
Atualizar dados do cartão do cliente
Customers::updateBillingInfos(customer_code, customer_attributes)
Criar nova assinatura, atentar para o parametro new_customer
, as opções que devem ser fornecidas são true | false
, passando true você pode criar uma assinatura junto com o cliente de uma vez só.
Subscriptions::create(new_customer, subscription_attributes)
Atualizar assinatura
Subscriptions::update(subscription_code, subscription_attributes)
Listas todas as assinaturas
Subscriptions::listAll()
Detalhes de uma assinatura específica
Subscriptions::details(subscription_code)
Suspender uma assinatura
Subscriptions::suspend(subscription_code)
Ativar uma assinatura
Subscriptions::activate(subscription_code)
Cancelar uma assinatura
Subscriptions::cancel(subscription_code)
Listas todas faturas de uma assinatura
Invoices::listAll(subscription_code)
Detalhes de uma fatura específica
Plans::details(invoice_id)
Listas todos pagamentos de uma fatura
Payments::listAll(invoice_id)
Detalhes de um pagamento específico
Payments::details(payment_id)
Retenta a cobrança de uma fatura
Payments::retry(invoice_id)
Atualiza regras de retentativas
Payments::rules(rules_attributes)
Atualiza preferências
Preferences::set(preferences_attributes)
Nota Importante: No Controller onde você deseja utilizar o plugin carregue o componente conforme sua necessidade, o componente MoipAssinaturas.Moip
é obrigatório sempre.
Exemplo carregando plugin e componente de planos
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Plans');
Exemplo de utilização planos - Documentação planos
Primeiro carregue o componente
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Plans');
Métodos de Exemplo utilizados no teste do plugin, para testar crie um controller e adicione esses métodos, depois acesse via browser.
public function createPlan() {
$this->autoRender = false;
$data = '{
"code": "plano02",
"name": "Plano Especial",
"description": "Descrição do Plano Especial",
"amount": 990,
"setup_fee": 500,
"max_qty": 1,
"status": "ACTIVE",
"interval": {
"length": 1,
"unit": "MONTH"
},
"billing_cycles": 12,
"trial": {
"days": 30,
"enabled": true,
"hold_setup_fee": true
}
}';
$result = $this->Plans->create($data);
pr($result);
}
public function updatePlan($code) {
$this->autoRender = false;
$data = '{
"code": "plano02",
"name": "Plano Especial Alterado",
"description": "Descrição do Plano Especial",
"amount": 990,
"setup_fee": 500,
"max_qty": 1,
"status": "ACTIVE",
"interval": {
"length": 1,
"unit": "MONTH"
},
"billing_cycles": 12,
"trial": {
"days": 30,
"enabled": true,
"hold_setup_fee": true
}
}';
$result = $this->Plans->update($code, $data);
pr($result);
}
public function listPlans() {
$this->autoRender = false;
$result = $this->Plans->listAll();
pr($result);
}
public function detailsPlan($code = 0) {
$this->autoRender = false;
$result = $this->Plans->details($code);
pr($result);
}
public function activatePlan($code) {
$this->autoRender = false;
$result = $this->Plans->activate($code);
pr($result);
}
public function inactivatePlan($code) {
$this->autoRender = false;
$result = $this->Plans->inactivate($code);
pr($result);
}
Exemplo de utilização clientes - Documentação clientes
Primeiro carregue o componente
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Customers');
Métodos de Exemplo utilizados no teste do plugin, para testar crie um controller e adicione esses métodos, depois acesse via browser.
public function createCustomer() {
$this->autoRender = false;
$data = '{
"code": "cliente05",
"email": "[email protected]",
"fullname": "Nome Sobrenome",
"cpf": "22222222222",
"phone_area_code": "11",
"phone_number": "934343434",
"birthdate_day": "26",
"birthdate_month": "04",
"birthdate_year": "1980",
"address": {
"street": "Rua Nome da Rua",
"number": "100",
"complement": "Casa",
"district": "Nome do Bairro",
"city": "São Paulo",
"state": "SP",
"country": "BRA",
"zipcode": "05015010"
},
"billing_info": {
"credit_card": {
"holder_name": "Nome Completo",
"number": "4111111111111111",
"expiration_month": "04",
"expiration_year": "15"
}
}
}';
$new_vault = true;
$result = $this->Customers->create($new_vault, $data);
pr($result);
}
public function updateCustomer($code) {
$this->autoRender = false;
$data = '{
"code": "cliente05",
"email": "[email protected]",
"fullname": "Nome Sobrenome Alterado",
"cpf": "22222222222",
"phone_number": "934343434",
"phone_area_code": "11",
"birthdate_day": "26",
"birthdate_month": "04",
"birthdate_year": "1986",
"address": {
"street": "Rua nome da Rua",
"number": "170",
"complement": "Casa",
"district": "Bairro",
"city": "São Paulo",
"state": "SP",
"country": "BRA",
"zipcode": "00000-000"
}
}';
$result = $this->Customers->update($code, $data);
pr($result);
}
public function updateBillingInfos($code) {
$this->autoRender = false;
$data = '{
"credit_card": {
"holder_name": "Novo nome",
"number": "5555666677778884",
"expiration_month": "04",
"expiration_year": "15"
}
}';
$result = $this->Customers->updateBillingInfos($code, $data);
pr($result);
}
public function listCustomers() {
$this->autoRender = false;
$result = $this->Customers->listAll();
pr($result);
}
public function detailsCustomer($code = 0) {
$this->autoRender = false;
$result = $this->Customers->details($code);
pr($result);
}
Exemplo de utilização assinaturas - Documentação assinaturas
Primeiro carregue o componente
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Subscriptions');
Métodos de Exemplo utilizados no teste do plugin, para testar crie um controller e adicione esses métodos, depois acesse via browser.
public function createSubscription() {
$this->autoRender = false;
$data = '{
"code": "assinatura05",
"amount": "9990",
"plan" : {
"code" : "PlanoGuitarpediaAnual"
},
"customer" : {
"code" : "cliente05"
}
}';
$new_client = false;
$result = $this->Subscriptions->create($new_client, $data);
pr($result);
}
public function createSubscriptionNewUser() {
$this->autoRender = false;
$data = '{
"code": "assinatura06",
"amount": "9990",
"plan": {
"code": "PlanoGuitarpediaAnual"
},
"customer": {
"code": "cliente04",
"email": "[email protected]",
"fullname": "Nome Sobrenome",
"cpf": "22222222222",
"phone_number": "934343434",
"phone_area_code": "11",
"birthdate_day": "26",
"birthdate_month": "04",
"birthdate_year": "1986",
"address": {
"street": "Rua nome da Rua",
"number": "170",
"complement": "Casa",
"district": "Bairro",
"city": "São Paulo",
"state": "SP",
"country": "BRA",
"zipcode": "00000000"
},
"billing_info": {
"credit_card": {
"holder_name": "Nome Completo",
"number": "4111111111111111",
"expiration_month": "04",
"expiration_year": "15"
}
}
}
}';
$new_client = true;
$result = $this->Subscriptions->create($new_client, $data);
pr($result);
}
public function updateSubscription($code) {
$this->autoRender = false;
$data = '{
"plan": {
"code": "mensal"
},
"amount": "9990",
"next_invoice_date": {
"day": "06",
"month": "02",
"year": "2015"
}
}';
$result = $this->Subscriptions->update($code, $data);
pr($result);
}
public function listSubscriptions() {
$this->autoRender = false;
$result = $this->Subscriptions->listAll();
pr($result);
}
public function detailsSubscriptions($code = 0) {
$this->autoRender = false;
$result = $this->Subscriptions->details($code);
pr($result);
}
public function suspendSubscriptions($code = 0) {
$this->autoRender = false;
$result = $this->Subscriptions->suspend($code);
pr($result);
}
public function activateSubscriptions($code = 0) {
$this->autoRender = false;
$result = $this->Subscriptions->activate($code);
pr($result);
}
public function cancelSubscriptions($code = 0) {
$this->autoRender = false;
$result = $this->Subscriptions->cancel($code);
pr($result);
}
Exemplo de utilização faturas - Documentação faturas
Primeiro carregue o componente
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Invoices');
Métodos de Exemplo utilizados no teste do plugin, para testar crie um controller e adicione esses métodos, depois acesse via browser.
public function listInvoices($code = 0) {
$this->autoRender = false;
$result = $this->Invoices->listAll($code);
pr($result);
}
public function detailsInvoice($id = 0) {
$this->autoRender = false;
$result = $this->Invoices->details($id);
pr($result);
}
Exemplo de utilização pagamentos - Documentação pagamentos
Primeiro carregue o componente
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Payments');
Métodos de Exemplo utilizados no teste do plugin, para testar crie um controller e adicione esses métodos, depois acesse via browser.
public function listPayments($code = 0) {
$this->autoRender = false;
$result = $this->Payments->listAll($code);
pr($result);
}
public function detailsPayment($id = 0) {
$this->autoRender = false;
$result = $this->Payments->details($id);
pr($result);
}
Exemplo de utilização retentativas - Documentação retentativas
Primeiro carregue o componente
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Retries');
Métodos de Exemplo utilizados no teste do plugin, para testar crie um controller e adicione esses métodos, depois acesse via browser.
public function retry($id = 0) {
$this->autoRender = false;
$result = $this->Retries->retry($id);
pr($result);
}
public function setRules() {
$this->autoRender = false;
$data = '{
"first_try": 1,
"second_try": 3,
"third_try": 5,
"finally": "cancel"
}';
$result = $this->Retries->rules($data);
pr($result);
}
Exemplo de utilização preferências - Documentação preferências
Primeiro carregue o componente
public $components = array('MoipAssinaturas.Moip', 'MoipAssinaturas.Preferences');
Métodos de Exemplo utilizados no teste do plugin, para testar crie um controller e adicione esses métodos, depois acesse via browser.
public function preferences() {
$this->autoRender = false;
$data = '{
"notification": {
"webhook": {
"url": "http://exemploldeurl.com.br/assinaturas"
},
"email": {
"merchant": {
"enabled": true
},
"customer": {
"enabled": true
}
}
}
}';
$result = $this->Preferences->set($data);
pr($result);
}
Webhooks - Documentação do Webhooks
Conforme descrição do Moip: O Moip Assinaturas utiliza webhooks para notificar a sua aplicação em tempo real sobre os eventos que afetam os recursos da sua conta, como clientes, assinaturas, faturas e pagamentos.
Com esse plugin, ele torna sua vida mais fácil para receber as notificações do Moip (NASP).
A primeira coisa a fazer é configurar o tokenNasp
e o activeWebhook
para habilitar seu funcionamento.
Exemplo:
Configure::write('MoipAssinaturas', array(
'token' => 'Insira-seu-token-aqui',
'key' => 'Insira-sua-chave-de-acesso-aqui',
'isProd' => false,
'tokenNasp' => 'Seu-token-aqui',
'activeWebhook' => true,
));
Você também precisa configurar a URL de notificação para receber os webhooks no painel do Moip ou através do componente MoipAssinaturas::Preferences, a URL que deve ser informada é
http://seu-dominio/diretorio-seu-projeto/moip_assinaturas/webhooks
Todas as notificações que chegarem nesse endereço passarão por 3 verificações
- Se o Webhook está ativado nas configurações
- Se o Token do Nasp foi Configurado
- Se o Token da Configurações é o mesmo do Header da Notificação
Se algum desse falhar vai gerar uma Exception.
Para utilizar os dados será necessário criar um Controller onde você poderá customizar ou tomar ações baseados nessas notificações, como por exemplo disparar um e-mail para o cliente ou gravar os dados no banco, baseado nos tipos das notificações. Veja aqui os tipos
Nota Importante: O controller você deverá criar no diretório app/Controller da sua aplicação e deverá ter o nome NaspController
e possuir pelo menos um método que deverá se chamar process
Exemplo para NaspController onde o método process grava as informações recebidas no banco de dados.
<?php
App::uses('AppController', 'Controller');
class NaspController extends AppController {
/**
* This controller does not use a model
*
* @var array
*/
public $uses = array('Log');
/**
* This controller has component
*
* @var array
*/
public $components = array();
public function process($data){
$this->request->data['Log']['log'] = json_encode($data);
if ($this->Log->save($this->request->data)) {
echo 'Dados salvos com sucesso';
} else {
echo 'Ocorreu um erro ao salvar os dados';
}
}
}
Abra uma issue https://github.com/fabiowlima/moip-assinaturas-cakephp/issues/new
Contribuições são bem vindas
- Fork it
- Crie um novo branch (
git checkout -b my-new-feature
) - Commit suas features (
git commit -am 'Add some feature'
) - Push (
git push origin my-new-feature
) - Crie um novo Pull Request
MIT License. See http://www.opensource.org/licenses/mit-license.php
Fábio Lima - Bendit - [email protected]