Skip to content

Commit c85d590

Browse files
Merge pull request #3 from marivaldojr/master
Documentação
2 parents c886e52 + 8b05881 commit c85d590

14 files changed

+365
-97
lines changed

README.md

Lines changed: 227 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,230 @@ Instale esse pacote pelo composer:
1010

1111
```
1212
composer require potelo/mo-payment
13-
```
13+
```
14+
15+
Se você não utiliza o [auto-discovery](https://laravel.com/docs/5.7/packages#package-discovery), Adicione o ServiceProvider em config/app.php
16+
17+
```php
18+
Potelo\MoPayment\MoPaymentServiceProvider::class,
19+
```
20+
21+
Agora, configure as variáveis utilizadas pelo GuPayment no seu .env:
22+
23+
```
24+
MOIP_ENV=sandbox
25+
MOIP_MODEL=App\User
26+
MOIP_WEBHOOK_AUTHORIZATION=seu_webhook_authorization
27+
MOIP_APITOKEN=seu_api_token
28+
MOIP_APIKEY=seu_api_key
29+
MOPAYMENT_SIGNATURE_TABLE=subscriptions
30+
MOIP_MODEL_FOREIGN_KEY=user_id
31+
MOIP_USER_MODEL_COLUMN=moip_id
32+
MOIP_SUBSCRIPTION_MODEL_ID_COLUMN=moip_id
33+
MOIP_SUBSCRIPTION_MODEL_PLAN_COLUMN=moip_plan
34+
```
35+
36+
Antes de usar o MoPayment você precisa preparar o banco de dados. Primeiro você tem que publicar o migration.
37+
38+
```
39+
php artisan vendor:publish --tag=migrations
40+
```
41+
42+
Caso precise modificar ou acrescentar colunas na tabela de assinatura, basta editar os migrations publicados. Depois, basta rodar o comando php artisan migrate.
43+
44+
```php
45+
use Potelo\MoPayment\MoPaymentTrait;
46+
47+
class User extends Authenticatable
48+
{
49+
use MoPaymentTrait;
50+
}
51+
```
52+
53+
Agora vamos adicionar em config/services.php duas configurações. A classe do usuário, sua chave de api que o Iugu fornece
54+
e o nome da tabela utilizada para gerenciar as assinaturas, a mesma escolhida na criação do migration.
55+
56+
```php
57+
'moip' => [
58+
'model' => App\User::class,
59+
'webhook_authorization' => env('MOIP_WEBHOOK_AUTHORIZATION'),
60+
'token' => env('MOIP_APITOKEN'),
61+
'key' => env('MOIP_APIKEY'),
62+
'signature_table' => env('MOPAYMENT_SIGNATURE_TABLE'),
63+
'env' => env('MOIP_ENV'),
64+
'model_foreign_key' => env('MOIP_MODEL_FOREIGN_KEY'),
65+
'subscription_model_id_column' => env('MOIP_SUBSCRIPTION_MODEL_ID_COLUMN'),
66+
'subscription_model_plan_column' => env('MOIP_SUBSCRIPTION_MODEL_PLAN_COLUMN'),
67+
],
68+
```
69+
70+
### Criar assinatura
71+
72+
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:
73+
74+
```php
75+
$user = User::find(1);
76+
77+
$user->newSubscription('main',
78+
'plan_code',
79+
'CREDIT_CARD'
80+
)->create();
81+
```
82+
83+
### Sobrescrever valor do plano
84+
85+
Caso deseje sobrescrever o valor do plano, utilize o método `amount`. Ex: R$ 20,90 deve ser informado como "2090"
86+
87+
```php
88+
$user = User::find(1);
89+
90+
$user->newSubscription('main',
91+
'plan_code',
92+
'CREDIT_CARD'
93+
)->amount(2090)
94+
->create();
95+
```
96+
97+
### Cupom de desconto
98+
99+
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`.
100+
101+
```php
102+
$user = User::find(1);
103+
104+
$user->newSubscription('main',
105+
'plan_code',
106+
'CREDIT_CARD'
107+
)->coupon('codigo_cupom')
108+
->create();
109+
```
110+
111+
### Checar status da assinatura
112+
113+
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:
114+
115+
```php
116+
if ($user->subscribed('main')) {
117+
//
118+
}
119+
```
120+
121+
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:
122+
123+
```php
124+
if ($user->subscription('main')->onTrial()) {
125+
//
126+
}
127+
```
128+
129+
Para saber se uma assinatura foi suspensa, basta usar o método `suspended` na assinatura:
130+
131+
```php
132+
if ($user->subscription('main')->suspended()) {
133+
//
134+
}
135+
```
136+
137+
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`:
138+
139+
```php
140+
if ($user->subscription('main')->onGracePeriod()) {
141+
//
142+
}
143+
```
144+
145+
### Cancelar assinatura
146+
Para cancelar uma assinatura, basta chamar o método `suspend` na assinatura do usuário:
147+
148+
```php
149+
$user->subscription('main')->suspend();
150+
```
151+
152+
### Reativar assinatura
153+
Se um usuário tem uma assinatura suspensa e gostaria de reativá-la, basta utilizar o método `resume`.
154+
```php
155+
$user->subscription('main')->resume();
156+
```
157+
158+
### Faturas
159+
Você pode facilmente pegar as faturas de um usuário através do método `invoices`:
160+
161+
```php
162+
$invoices = $user->invoices('subscription_code');
163+
```
164+
165+
166+
### Assinantes
167+
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`.
168+
```php
169+
$options = [
170+
'fullname' => 'Joao Silva',
171+
'email' => '[email protected]',
172+
'phone_area_code' => '11',
173+
'phone_number' => '999887766',
174+
'cpf' => '01234567891',
175+
'birthdate_day' => '2',
176+
'birthdate_month' => '2',
177+
'birthdate_year' => '2000',
178+
'address' => [
179+
'street' => 'Rua de Cima',
180+
'number' => '1000',
181+
'complement' => 'Casa',
182+
'district' => 'Bairro Azul',
183+
'city' => 'São Paulo',
184+
'state' => 'SP',
185+
'country' => 'BRA',
186+
'zipcode' => '05015010',
187+
],
188+
'billing_info' => [
189+
'credit_card' => [
190+
'holder_name' => 'Joao Silva',
191+
'number' => '4111111111111111',
192+
'expiration_month' => '08',
193+
'expiration_year' => '20'
194+
]
195+
]
196+
];
197+
198+
// Criar assinante no Moip
199+
$user->createAsMoipCustomer($options);
200+
```
201+
202+
## Webhooks
203+
204+
[Webhooks](https://dev.moip.com.br/v1.5/reference#webhooks-1) 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:
205+
```php
206+
Route::post('webhook', '\Potelo\MoPayment\Http\Controllers\WebhookController@handleWebhook');
207+
```
208+
209+
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.
210+
Lembrando que você precisa desativar a [proteção CRSF](https://laravel.com/docs/5.7/csrf#csrf-excluding-uris) para essa rota. Você pode colocar a URL em `except` no middleware `VerifyCsrfToken`:
211+
```php
212+
protected $except = [
213+
'webhook',
214+
];
215+
```
216+
217+
### Outros webhooks
218+
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`.
219+
```php
220+
Route::post('webhook', 'MeuWebhookController@handleWebhook');
221+
```
222+
223+
```php
224+
<?php
225+
226+
namespace App\Http\Controllers;
227+
228+
use Potelo\GuPayment\Http\Controllers\WebhookController;
229+
230+
class MeuWebhookController extends WebhookController {
231+
232+
public function handleInvoiceCreated(array $payload)
233+
{
234+
return 'Fatura criada: ' . $payload['resource']['id'];
235+
}
236+
}
237+
```
238+
239+
Caso queira testar os webhooks em ambiente local, você pode utilizar o [ngrok](https://ngrok.com/).

src/Http/Controllers/WebhookController.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99

1010
class WebhookController extends Controller
1111
{
12+
protected $moipSubscriptionModelIdColumn;
13+
14+
public function __construct()
15+
{
16+
$this->moipSubscriptionModelIdColumn = getenv('MOIP_SUBSCRIPTION_MODEL_ID_COLUMN') ?: config('services.moip.subscription_model_id_column', 'moip_id');
17+
}
18+
1219
/**
1320
* Handle a Moip webhook call.
1421
*
@@ -36,7 +43,7 @@ public function handleWebhook(Request $request)
3643
*/
3744
protected function handleSubscriptionSuspended(array $payload)
3845
{
39-
$subscription = Subscription::where('moip_id', $payload['resource']['code'])->first();
46+
$subscription = Subscription::where($this->moipSubscriptionModelIdColumn, $payload['resource']['code'])->first();
4047

4148
$subscription->markAsCancelled();
4249

src/MoPaymentTrait.php

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,26 @@ trait MoPaymentTrait
1818
* @var string
1919
*/
2020

21-
protected static $api_token;
21+
protected static $apiToken;
2222

2323
/**
2424
* The Moip API key.
2525
*
2626
* @var string
2727
*/
28-
protected static $api_key;
28+
protected static $apiKey;
2929

3030
/**
3131
* Begin creating a new subscription.
3232
*
33-
* @param string $subscription_name
33+
* @param string $subscriptionName
3434
* @param string $plan_code
3535
* @param string $payment_mode
36-
* @param string $amount
37-
* @param string $coupon_code
38-
* @param array $table_fields
3936
* @return \Potelo\MoPayment\SubscriptionBuilder
4037
*/
41-
public function newSubscription($subscription_name, $plan_code, $payment_mode, $amount = null, $coupon_code = null, $table_fields = [])
38+
public function newSubscription($subscriptionName, $plan_code, $payment_mode)
4239
{
43-
return new SubscriptionBuilder($this, $subscription_name, $plan_code, $payment_mode, $amount, $coupon_code, $table_fields);
40+
return new SubscriptionBuilder($this, $subscriptionName, $plan_code, $payment_mode);
4441
}
4542

4643
/**
@@ -91,8 +88,8 @@ public function asMoipCustomer()
9188
*/
9289
public static function getApiKey()
9390
{
94-
if (static::$api_key = getenv('MOIP_APIKEY')) {
95-
return static::$api_key;
91+
if (static::$apiKey = getenv('MOIP_APIKEY')) {
92+
return static::$apiKey;
9693
}
9794

9895
return config('services.moip.key');
@@ -105,8 +102,8 @@ public static function getApiKey()
105102
*/
106103
public static function getApiToken()
107104
{
108-
if (static::$api_token = getenv('MOIP_APITOKEN')) {
109-
return static::$api_token;
105+
if (static::$apiToken = getenv('MOIP_APITOKEN')) {
106+
return static::$apiToken;
110107
}
111108

112109
return config('services.moip.token');

src/Moip/ApiResource.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
*/
1212
abstract class ApiResource extends MoipObject
1313
{
14-
protected static function create($params, $query_data = null)
14+
protected static function create($params, $queryData = null)
1515
{
16-
$query = $query_data ? '?' . http_build_query($query_data) : '';
16+
$query = $queryData ? '?' . http_build_query($queryData) : '';
1717

18-
$endpoint = Moip::getEndpoint() . static::$resource_path . $query;
18+
$endpoint = Moip::getEndpoint() . static::$resourcePath . $query;
1919

2020
$response = self::request('POST', $endpoint, $params);
2121

@@ -26,7 +26,7 @@ protected static function create($params, $query_data = null)
2626

2727
protected static function get($code)
2828
{
29-
$endpoint = Moip::getEndpoint() . static::$resource_path . '/' . $code;
29+
$endpoint = Moip::getEndpoint() . static::$resourcePath . '/' . $code;
3030

3131
$response = self::request('GET', $endpoint);
3232

@@ -37,7 +37,7 @@ protected static function get($code)
3737

3838
protected static function update($code, $params)
3939
{
40-
$endpoint = Moip::getEndpoint() . static::$resource_path . '/' . $code;
40+
$endpoint = Moip::getEndpoint() . static::$resourcePath . '/' . $code;
4141

4242
self::request('PUT', $endpoint, $params);
4343

@@ -46,7 +46,7 @@ protected static function update($code, $params)
4646

4747
protected static function all()
4848
{
49-
$endpoint = Moip::getEndpoint() . static::$resource_path;
49+
$endpoint = Moip::getEndpoint() . static::$resourcePath;
5050

5151
$response = self::request('GET', $endpoint);
5252

src/Moip/Customer.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@
55

66
class Customer extends ApiResource
77
{
8-
protected static $resource_path = '/customers';
8+
protected static $resourcePath = '/customers';
99

1010
/**
1111
* @param array $params
12-
* @param array $query_data
12+
* @param array $queryData
1313
*
1414
* @return \Potelo\MoPayment\Moip\Customer
1515
*/
16-
public static function create($params, $query_data = null)
16+
public static function create($params, $queryData = null)
1717
{
18-
$query_data = [
18+
$queryData = [
1919
'new_vault' => key_exists('billing_info', $params) ? 'true' : 'false'
2020
];
2121

22-
$query = $query_data ? '?' . http_build_query($query_data) : '';
22+
$query = $queryData ? '?' . http_build_query($queryData) : '';
2323

24-
$endpoint = Moip::getEndpoint() . static::$resource_path . $query;
24+
$endpoint = Moip::getEndpoint() . static::$resourcePath . $query;
2525

2626
self::request('POST', $endpoint, $params);
2727

@@ -50,7 +50,7 @@ public static function all()
5050

5151
public static function updateCard($code, $params)
5252
{
53-
$endpoint = Moip::getEndpoint() . static::$resource_path . '/' . $code . '/billing_infos';
53+
$endpoint = Moip::getEndpoint() . static::$resourcePath . '/' . $code . '/billing_infos';
5454

5555
parent::request('PUT', $endpoint, $params);
5656

0 commit comments

Comments
 (0)