potelo / mo-payment
MoPayment为moip.com.br上的支付提供接口
Requires
- php: >=5.6.4
- guzzlehttp/guzzle: ^7.0.1
README
简介
MoPayment基于Laravel Cashier,为moip.com.br提供控制订阅的接口
安装Laravel 5.x
使用Composer安装此包
composer require potelo/mo-payment
如果您不使用自动发现,请将ServiceProvider添加到config/app.php中
Potelo\MoPayment\MoPaymentServiceProvider::class,
现在,配置GuPayment使用的.env中的变量
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
在开始使用MoPayment之前,您需要准备数据库。首先,您需要发布迁移。
php artisan vendor:publish --tag=migrations
如果需要修改或添加订阅表中的列,只需编辑已发布的迁移。然后,只需运行php artisan migrate命令。
use Potelo\MoPayment\MoPaymentTrait; class User extends Authenticatable { use MoPaymentTrait; }
现在,我们在config/services.php中添加两个配置。用户类、Iugu提供的API密钥和用于管理订阅的表名,这是在创建迁移时选择的。
'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'), ],
创建订阅
要创建订阅,首先您需要有一个扩展MoPaymentTrait的用户实例。然后,您应该使用newSubscription方法来创建订阅
$user = User::find(1); $user->newSubscription('main', 'plan_code', 'CREDIT_CARD' )->create();
覆盖计划值
如果您想覆盖计划值,请使用amount方法。例如,R$ 20.90应表示为"2090"。
$user = User::find(1); $user->newSubscription('main', 'plan_code', 'CREDIT_CARD' )->amount(2090) ->create();
折扣券
如果需要,您可以关联折扣券以提供给您的计划订阅者。要在创建订阅时提供折扣券,请使用coupon方法。
$user = User::find(1); $user->newSubscription('main', 'plan_code', 'CREDIT_CARD' )->coupon('codigo_cupom') ->create();
检查订阅状态
一旦用户在您的应用程序中订阅了计划,您可以通过一些方法来检查此订阅的状态。subscribed方法如果用户有活动的订阅(即使在试用期),则返回true。
if ($user->subscribed('main')) { // }
如果您需要知道一个用户的订阅是否在试用期,您可以使用onTrial方法。此方法对于通知用户他们正在测试期很有用,例如。
if ($user->subscription('main')->onTrial()) { // }
要检查订阅是否已暂停,请使用suspended方法在订阅上。
if ($user->subscription('main')->suspended()) { // }
您还可以检查一个订阅是否已暂停,但用户仍然处于"宽限期"。例如,如果用户在3月5日取消订阅,但到期日是3月10日,则他们将在此宽限期内直到3月10日。要检查这一点,请使用onGracePeriod方法。
if ($user->subscription('main')->onGracePeriod()) { // }
取消订阅
要取消订阅,只需在用户订阅上调用suspend方法。
$user->subscription('main')->suspend();
重新激活订阅
如果用户有一个已暂停的订阅并希望重新激活它,请使用resume方法。
$user->subscription('main')->resume();
账单
您可以通过invoices方法轻松获取用户的账单。
$invoices = $user->invoices('subscription_code');
订阅者
当您使用newSubscription方法时,客户会自动创建。但是,要手动创建客户,您可以使用createAsMoipCustomer方法。
$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是Moip触发通知的地址(URL),这些通知是与您账户中发生的一些事件相关的。要使用它,您需要为handleWebhook方法配置一个路由,这是您在Moip面板上配置的同一路由。
Route::post('webhook', '\Potelo\MoPayment\Http\Controllers\WebhookController@handleWebhook');
MoPayment 提供了方法来更新数据库,以防订阅被暂停。指向该方法的路径,这将自动执行。请记住,您需要禁用该路由的 CRSF 保护。您可以在 VerifyCsrfToken
中间件的 except
中放置该 URL
protected $except = [ 'webhook', ];
其他 webhooks
Moip 还拥有多个其他 webhooks,要为其他事件创建,只需扩展 WebhookController
。您的方法应与 handle 加上 "camelCase" 中的事件名称相对应。例如,当创建新账单时,Moip 发送一个触发器,事件为 invoice.created
,因此只需创建一个名为 handleInvoiceCreated
的方法即可。
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']; } }
如果想要在本地环境中测试 webhooks,可以使用 ngrok。