MoPayment
Introdução
MoPayment Ă© baseado no Laravel Cashier e fornece uma interface para controlar assinaturas do moip.com.br, (*1)
Instalação Laravel 5.x
Instale esse pacote pelo composer:, (*2)
composer require potelo/mo-payment
Se vocĂȘ nĂŁo utiliza o auto-discovery, Adicione o ServiceProvider em config/app.php, (*3)
Potelo\MoPayment\MoPaymentServiceProvider::class,
Agora, configure as variĂĄveis utilizadas pelo GuPayment no seu .env:, (*4)
MOIP_ENV=sandbox
MOIP_MODEL=App\User
MOIP_WEBHOOK_AUTHORIZATION=seu_webhook_authorization
MOIP_APITOKEN=seu_api_token
MOIP_APIKEY=seu_api_key
MOPAYMENT_SIGNATURE_TABLE=subscriptions
MOIP_MODEL_FOREIGN_KEY=user_id
MOIP_USER_MODEL_COLUMN=moip_id
MOIP_SUBSCRIPTION_MODEL_ID_COLUMN=moip_id
MOIP_SUBSCRIPTION_MODEL_PLAN_COLUMN=moip_plan
Antes de usar o MoPayment vocĂȘ precisa preparar o banco de dados. Primeiro vocĂȘ tem que publicar o migration., (*5)
php artisan vendor:publish --tag=migrations
Caso precise modificar ou acrescentar colunas na tabela de assinatura, basta editar os migrations publicados. Depois, basta rodar o comando php artisan migrate., (*6)
use Potelo\MoPayment\MoPaymentTrait;
class User extends Authenticatable
{
use MoPaymentTrait;
}
Agora vamos adicionar em config/services.php duas configuraçÔes. A classe do usuårio, sua chave de api que o Iugu fornece
e o nome da tabela utilizada para gerenciar as assinaturas, a mesma escolhida na criação do migration., (*7)
'moip' => [
'model' => App\User::class,
'webhook_authorization' => env('MOIP_WEBHOOK_AUTHORIZATION'),
'token' => env('MOIP_APITOKEN'),
'key' => env('MOIP_APIKEY'),
'signature_table' => env('MOPAYMENT_SIGNATURE_TABLE'),
'env' => env('MOIP_ENV'),
'model_foreign_key' => env('MOIP_MODEL_FOREIGN_KEY'),
'subscription_model_id_column' => env('MOIP_SUBSCRIPTION_MODEL_ID_COLUMN'),
'subscription_model_plan_column' => env('MOIP_SUBSCRIPTION_MODEL_PLAN_COLUMN'),
],
Criar assinatura
Para criar uma assinatura, primeiro vocĂȘ precisa ter uma instĂąncia de um usuĂĄrio que extende o MoPaymentTrait. VocĂȘ entĂŁo deve usar o mĂ©todo newSubscription para criar uma assinatura:, (*8)
$user = User::find(1);
$user->newSubscription('main',
'plan_code',
'CREDIT_CARD'
)->create();
Sobrescrever valor do plano
Caso deseje sobrescrever o valor do plano, utilize o método amount. Ex: R$ 20,90 deve ser informado como "2090", (*9)
$user = User::find(1);
$user->newSubscription('main',
'plan_code',
'CREDIT_CARD'
)->amount(2090)
->create();
Cupom de desconto
Se necessĂĄrio, vocĂȘ pode associar cupons de descontos para oferecer aos assinantes do seus planos. Para informar um cupom de desconto ao criar uma assinatura utilize o mĂ©todo coupon., (*10)
$user = User::find(1);
$user->newSubscription('main',
'plan_code',
'CREDIT_CARD'
)->coupon('codigo_cupom')
->create();
Checar status da assinatura
Uma vez que o usuĂĄrio assine um plano na sua aplicação, vocĂȘ pode verificar o status dessa assinatura atravĂ©s de alguns mĂ©todos. O mĂ©todo subscribed retorna true se o usuĂĄrio possui uma assinatura ativa, mesmo se estiver no perĂodo trial:, (*11)
if ($user->subscribed('main')) {
//
}
Se vocĂȘ precisa saber se um a assinatura de um usuĂĄrio estĂĄ no perĂodo trial, vocĂȘ pode usar o mĂ©todo onTrial. Esse mĂ©todo pode ser Ăștil para informar ao usuĂĄrio que ele estĂĄ no perĂodo de testes, por exemplo:, (*12)
if ($user->subscription('main')->onTrial()) {
//
}
Para saber se uma assinatura foi suspensa, basta usar o método suspended na assinatura:, (*13)
if ($user->subscription('main')->suspended()) {
//
}
VocĂȘ tambĂ©m pode checar se uma assinatura foi suspensa mas o usuĂĄrio ainda se encontra no "perĂodo de carĂȘncia". Por exemplo, se um usuĂĄrio cancelar a assinatura no dia 5 de Março mas a data de vencimento Ă© apenas no dia 10, ele estĂĄ nesse perĂodo de carĂȘncia atĂ© o dia 10. Para saber basta utilizar o mĂ©todo onGracePeriod:, (*14)
if ($user->subscription('main')->onGracePeriod()) {
//
}
Cancelar assinatura
Para cancelar uma assinatura, basta chamar o método suspend na assinatura do usuårio:, (*15)
$user->subscription('main')->suspend();
Reativar assinatura
Se um usuårio tem uma assinatura suspensa e gostaria de reativå-la, basta utilizar o método resume., (*16)
$user->subscription('main')->resume();
Faturas
VocĂȘ pode facilmente pegar as faturas de um usuĂĄrio atravĂ©s do mĂ©todo invoices:, (*17)
$invoices = $user->invoices('subscription_code');
Assinantes
Quando vocĂȘ utiliza o mĂ©todo newSubscription o cliente Ă© criado automaticamente. PorĂ©m para criar um cliente manualmente, vocĂȘ pode utilizar o mĂ©todo createAsMoipCustomer., (*18)
$options = [
'fullname' => 'Joao Silva',
'email' => 'joao_silva@example.com',
'phone_area_code' => '11',
'phone_number' => '999887766',
'cpf' => '01234567891',
'birthdate_day' => '2',
'birthdate_month' => '2',
'birthdate_year' => '2000',
'address' => [
'street' => 'Rua de Cima',
'number' => '1000',
'complement' => 'Casa',
'district' => 'Bairro Azul',
'city' => 'SĂŁo Paulo',
'state' => 'SP',
'country' => 'BRA',
'zipcode' => '05015010',
],
'billing_info' => [
'credit_card' => [
'holder_name' => 'Joao Silva',
'number' => '4111111111111111',
'expiration_month' => '08',
'expiration_year' => '20'
]
]
];
// Criar assinante no Moip
$user->createAsMoipCustomer($options);
Webhooks
Webhooks sĂŁo endereços (URLs) para onde o Moip dispara notificaçÔes para certos eventos que ocorrem na sua conta. Para utilizar vocĂȘ precisa configurar uma rota para o mĂ©todo handleWebhook, a mesma rota que vocĂȘ configurou no seu painel do Moip:, (*19)
Route::post('webhook', '\Potelo\MoPayment\Http\Controllers\WebhookController@handleWebhook');
O MoPayment tem métodos para atualizar o seu banco de dados caso uma assinatura seja suspensa. Apontando a rota para esse método, isso ocorrerå de forma automåtica.
Lembrando que vocĂȘ precisa desativar a proteção CRSF para essa rota. VocĂȘ pode colocar a URL em except no middleware VerifyCsrfToken:, (*20)
protected $except = [
'webhook',
];
Outros webhooks
O Moip possui vĂĄrios outros webhooks e para vocĂȘ criar para outros eventos basta estender o WebhookController. Seus mĂ©todos devem corresponder a handle + o nome do evento em "camelCase". Por exemplo, ao criar uma nova fatura, o Moip envia um gatilho com o seguinte evento: invoice.created, entĂŁo basta vocĂȘ criar um mĂ©todo chamado handleInvoiceCreated., (*21)
Route::post('webhook', 'MeuWebhookController@handleWebhook');
<?php
namespace App\Http\Controllers;
use Potelo\GuPayment\Http\Controllers\WebhookController;
class MeuWebhookController extends WebhookController {
public function handleInvoiceCreated(array $payload)
{
return 'Fatura criada: ' . $payload['resource']['id'];
}
}
Caso queira testar os webhooks em ambiente local, vocĂȘ pode utilizar o ngrok., (*22)