flitty / subscription
Simple subscription wrap
Requires
- php: >=7.1
- laravel/framework: >=5.4
- srmklive/paypal: ~1.0
Requires (Dev)
- mockery/mockery: ~1.0
- phpunit/phpunit: ~6.0
This package is auto-updated.
Last update: 2025-02-28 05:58:29 UTC
README
Installation
1. Require package in your progect
composer require flitty/subscription
2. Register package service provider in your app (app.providers)
Flitty\Subscription\Providers\SubscriptionServiceProvider::class
3. Puplish migrations and the package config file
php artisan vendor:publish --provider=SubscriptionServiceProvider
4. Create tables
php artisan migrate
5. Configure callback link in config file. Default value is:
'express-checkout-success' => '/subscription/express-checkout-success?driver=pay-pal-subscription',
5. Add Your subscription types into `subscription_types` table
6. Set up subscriber entity
Register Subscriber trait and contract into Users Model
use Flitty\Subscription\Traits\Subscriber;
implement Flitty\Subscription\Contracts\SubscriberContract
7. Set up subscription entity
Register Subscription entity trait and contract into subscription entity Model
use Flitty\Subscription\Traits\Subscribable;
implement Flitty\Subscription\Contracts\SubscribableEntityContract
Subscription entity should has `subscription_type_id` (you can change field name in config 'subscription.type.foreign')
8. You can add coupones in `subscription_coupons` table
9. Register middlewares. Update your 'app/Http/Kernel.php' class. Add the following line to $routeMiddleware
'subscribed' => HasSubscriptionMiddleware::class,
Usage
In controller
Your controller should has at less 3 methods
public function expressCheckout(ExpressCheckoutRequest $request) { try { $response = Auth::user()->subscribeEntity( $request->get('subscriptionTypeId'), $request->get('coupon'), $request->get('driver') ); } catch (UserAlreadyHasTheSubscription $e) { Session::flash('error', $e->getMessage()); $response = redirect()->route('subscription-route-name'); } catch (SubscriptionRedirectHasBeenFailedException $e) { Session::flash('error', $e->getMessage()); $response = redirect()->route('subscription-route-name'); } return $response; }
public function expressCheckoutSuccess(Request $request) { try { app($request->get('driver'))->subscriptionCallback($request->get('token')); Session::flash('notice', Message::getMessageData(Message::SUBSCRIBED_SUCCESSFULLY)); } catch (SubscriptionCallbackHasBeenFailedException $e) { Session::flash('error', $e->getMessage()); } return redirect()->route('subscription-route-name'); }
public function payPalCallback(Request $request) { $requestData = $request->all(); try { app(SubscriptionServiceProvider::PAY_PAL_DRIVER)->cmdCallback($requestData); $message = 'User has been updated his subscription'; } catch (SubscriptionHasNotBeenFoundException $e) { $message = $e->getMessage(); } catch (InvalidResponseException $e) { $message = $e->getMessage(); } logger()->info($message, $requestData); return response()->json(['message' => $message]); }
Optional methods:
public function cancelSubscription(CancelSubscriptionRequest $request) { $type = 'error'; try { Auth::user()->cancelSubscription($request->get('subscriptionTypeId'), $request->get('driver')); $message = 'User has been canceled subscription successfully'; $type = 'notice'; } catch (UserHasNoSubscriptionException $e) { $message = $e->getMessage(); } catch (CancelSubscriptionHasBeenFailed $e) { $message = $e->getMessage(); } Session::flash($type, $message); return redirect()->route('settings'); }
public function suspendSubscription(SuspendSubscriptionRequest $request) { $type = 'error'; try { Auth::user()->suspendSubscription($request->get('subscriptionTypeId'), $request->get('driver')); $message = 'User has been suspended subscription successfully'; $type = 'notice'; } catch (UserHasNoSubscriptionException $e) { $message = $e->getMessage(); } catch (CancelSubscriptionHasBeenFailed $e) { $message = $e->getMessage(); } Session::flash($type, $message); return redirect()->route('settings'); }
public function reactivateSubscription(ReactivateSubscriptionRequest $request) { $type = 'error'; try { Auth::user()->reactivateSubscription($request->get('subscriptionTypeId'), $request->get('driver')); $message = 'User has been reactivated subscription successfully'; $type = 'notice'; } catch (UserHasNoSubscriptionException $e) { $message = $e->getMessage(); } catch (CancelSubscriptionHasBeenFailed $e) { $message = $e->getMessage(); } Session::flash($type, $message); return redirect()->route('settings'); }
Get subscription entities
Get all entities of authentificated user
$subscriber = Auth::user(); $entities = Entity::subscribable($subscriber)->get();
Middleware&Routing
You can limit the access to routes by using middlewares
Route::get('subscription-entities', 'EntityController@index')->middleware('subscribed:{id of the subscription type}');
Get Subscriber subscriptions
Get authentificated user subscription type
$subscriber = Auth::user(); $subscriber->getTypeSubscription($subscriptionTypeId);
Get all authentificated user subscriptions
$subscriber = Auth::user(); $subscriber->getSubscriptions();