Search code examples
laravel-5laravel-cashier

How to use cashier package in laravel 5.2?


I am creating a user subscription plan, For this I am using cashier package in laravel 5.2. I am following the exact way in provided in the tutorial given in laravel document https://laravel.com/docs/5.2/billing. But I am getting the error

ErrorException in FacebookScraperController.php line 1767: 
Undefined variable: creditCardToken

my controller code:

$user = User::find(2);
$res = $user->newSubscription('main', 'monthly')->create($creditCardToken);
dd($res);

What should I pass the value inside the $creditCardToken variable. I tried to give the card details inside this variable. But getting error. Please help me out.


Solution

  • You will need to pass the subscription plan here with the token generated at the time of card entry. Here is the step you can follow. create a view page:

    <form action="/subscription" method="POST" id="payment-form">
        <span class="payment-errors"></span>
    
        <div class="form-row">
            <label>
                <span>Card Number</span>
                <input type="text" size="20" data-stripe="number">
            </label>
        </div>
    
        <div class="form-row">
            <label>
                <span>Expiration (MM/YY)</span>
                <input type="text" size="2" data-stripe="exp_month">
            </label>
            <span> / </span>
            <input type="text" size="2" data-stripe="exp_year">
        </div>
    
        <div class="form-row">
            <label>
                <span>CVC</span>
                <input type="text" size="4" data-stripe="cvc">
            </label>
        </div>
    
    
        <input type="submit" class="submit" value="Submit Payment">
    </form>
    <script src="//code.jquery.com/jquery-1.9.1.js"></script>
    <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js"></script>
    <script type="text/javascript" src="https://js.stripe.com/v2/"></script>
    <script type="text/javascript">
        Stripe.setPublishableKey('pk_test_TSGgkchoa9iQU4ZQ628a8Auz');
    </script>
    <script>
        $(function() {
            var $form = $('#payment-form');
            $form.submit(function(event) {
                // Disable the submit button to prevent repeated clicks:
                $form.find('.submit').prop('disabled', true);
    
                // Request a token from Stripe:
                Stripe.card.createToken($form, stripeResponseHandler);
    
                // Prevent the form from being submitted:
                return false;
            });
        });
        function stripeResponseHandler(status, response) {
            // Grab the form:
            var $form = $('#payment-form');
    
            if (response.error) { // Problem!
    
                // Show the errors on the form:
                $form.find('.payment-errors').text(response.error.message);
                $form.find('.submit').prop('disabled', false); // Re-enable submission
    
            } else { // Token was created!
    
                // Get the token ID:
                var token = response.id;
    
                // Insert the token ID into the form so it gets submitted to the server:
                $form.append($('<input type="hidden" name="stripeToken">').val(token));
    
                // Submit the form:
                $form.get(0).submit();
            }
        };
    </script>
    

    and in your controller:

    public function subscription(Request $request)
        {
            $user = User::find(1);
            $creditCardToken = $request->stripeToken;
            $res = $user->newSubscription('main', 'pro')
                ->trialDays(30)
                ->create($creditCardToken, [
                'plan' => 'pro',
                'email' => $user->email,
    
            ]);
    
        }