flitty/subscription

There is no license information available for the latest version (dev-master) of this package.

Simple subscription wrap

dev-master 2018-10-27 15:55 UTC

This package is auto-updated.

Last update: 2024-03-28 03:55:41 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();