Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

rubenochoa's avatar

About Stripe payment issues

Hello. First at

"source" => 'tok_mastercard', // obtained with Stripe.js

if i do this

$request->input('stripeToken');

I get "Must provide source or customer"

Second, how can I see the card name at stripe.com dushboard? I am using:

            @extends('layouts.master')

            @section('title')
            Laravel Shopping Cart
            @endsection

            @section('content') 
            <style type="text/css">
                .panel-title {
                display: inline;
                font-weight: bold;
                }
                .display-table {
                    display: table;
                }
                .display-tr {
                    display: table-row;
                }
                .display-td {
                    display: table-cell;
                    vertical-align: middle;
                    width: 61%;
                }
            </style>           
                    <h1>Checkout</h1>
                    <h4>Your Total: ${{ $total }}</h4>                    
                    <div class="row">
                        <div class="col-md-4 m-auto">
                            <div class="panel panel-default credit-card-box">
                                <div class="panel-heading display-table" >
                                    <div class="row display-tr" >
                                        <h3 class="panel-title display-td" >Payment Details</h3>
                                        <div class="display-td" >                            
                                            <img class="img-responsive pull-right" src="http://i76.imgup.net/accepted_c22e0.png">
                                        </div>
                                    </div>                    
                                </div>
                                <div class="panel-body">
                  
                                    @if (Session::has('success'))
                                        <div class="alert alert-success text-center">
                                            <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
                                            <p>{{ Session::get('success') }}</p>
                                        </div>
                                    @endif
                  
                                    <form role="form" action="{{ route('checkout') }}" method="post" class="require-validation"
                                                                     data-cc-on-file="false"
                                                                    data-stripe-publishable-key="{{ env('') }}"
                                         
                                                                    id="payment-form">
                                        @csrf
                  
                                        <div class='form-row row'>
                                            <div class='col-xs-12 form-group required'>
                                                <label class='control-label'>Name on Card</label> <input
                                                    class='form-control' size='4' type='text'>
                                            </div>
                                        </div>
                  
                                        <div class='form-row row'>
                                            <div class='col-xs-12 form-group card required'>
                                                <label class='control-label'>Card Number</label> <input
                                                    autocomplete='off' class='form-control card-number' size='20'
                                                    type='text'>
                                            </div>
                                        </div>
                  
                                        <div class='form-row row'>
                                            <div class='col-xs-12 col-md-4 form-group cvc required'>
                                                <label class='control-label'>CVC</label> <input autocomplete='off'
                                                    class='form-control card-cvc' placeholder='ex. 311' size='4'
                                                    type='text'>
                                            </div>
                                            <div class='col-xs-12 col-md-4 form-group expiration required'>
                                                <label class='control-label'>Expiration Month</label> <input
                                                    class='form-control card-expiry-month' placeholder='MM' size='2'
                                                    type='text'>
                                            </div>
                                            <div class='col-xs-12 col-md-4 form-group expiration required'>
                                                <label class='control-label'>Expiration Year</label> <input
                                                    class='form-control card-expiry-year' placeholder='YYYY' size='4'
                                                    type='text'>
                                            </div>
                                        </div>
                  
                                        <div class='form-row row'>
                                            <div class='col-md-12 error form-group hide'>
                                                <div id="charge-error" class="alert alert-danger{{ !Session::has('error') ? 'hidden' : ''  }}">
                                                    {{ Session::get('error') }}
                                                </div>
                                            </div>
                                        </div>
                  
                                        <div class="row">
                                            <div class="col-xs-12">
                                                <button class="btn btn-primary btn-lg btn-block" type="submit">Pay Now</button>
                                            </div>
                                        </div>
                                          
                                    </form>
                                </div>
                            </div>        
                        </div>
                    </div>
                      
                </div>                                             
                @endsection
@section('scripts')   
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script type="text/javascript" src="{{URL::to('js/checkout.js')}}"></script>
@endsection

ProductController.php

public function postCheckout(Request $request)
    {
        if (!Session::has('cart')) {
            return redirect()->route('shop.shoppingCart');
        }
        $oldCart = Session::get('cart');
        $cart = new Cart($oldCart);
        
        \Stripe\Stripe::setApiKey('');
        \Stripe\Charge::create ([
                "amount" => $cart->totalPrice * 100,
                "name" => $request->name,
                "currency" => "usd",
                "source" => 'tok_mastercard', // obtained with Stripe.js
                "description" => "Test payment from itsolutionstuff.com." 
            ]);
        
            $order = new Order();
            $order->cart = serialize($cart);
            

            $order->payment_id = $charge->id;

            Auth::user()->orders()->save($order);
            $user = Auth::user();            ;  
                                
            Mail::send('shop.order_confirmation', [
                'user' => $user,
                'products' => $cart->items,
                'totalPrice' => $cart->totalPrice,
            ], function($message) use ($user) {
                    $message->to($user->email);
                    $message->from("[email protected]");
                    $message->subject("Your order confirmation");
                    $message->bcc("[email protected]");
                }
            );     
            
            Session::flash('success', 'Successfully purchased products!');    

         
            return redirect()->route('checkout')->with('error', $e->getMessage());
        

        Session::forget('cart');
        return redirect()->route('product.index')->with('success', 'Successfully purchased products!');
    }    

Checkout.js

$(function() {
    var $form         = $(".require-validation");
  $('form.require-validation').bind('submit', function(e) {
    var $form         = $(".require-validation"),
        inputSelector = ['input[type=email]', 'input[type=password]',
                         'input[type=text]', 'input[type=file]',
                         'textarea'].join(', '),
        $inputs       = $form.find('.required').find(inputSelector),
        $errorMessage = $form.find('div.error'),
        valid         = true;
        $errorMessage.addClass('hide');
 
        $('.has-error').removeClass('has-error');
    $inputs.each(function(i, el) {
      var $input = $(el);
      if ($input.val() === '') {
        $input.parent().addClass('has-error');
        $errorMessage.removeClass('hide');
        e.preventDefault();
      }
    });
  
    if (!$form.data('cc-on-file')) {
      e.preventDefault();
      Stripe.setPublishableKey($form.data('stripe-publishable-key'));
      Stripe.createToken({
        number: $('.card-number').val(),
        cvc: $('.card-cvc').val(),
        exp_month: $('.card-expiry-month').val(),
        exp_year: $('.card-expiry-year').val()
      }, stripeResponseHandler);
    }
  
  });
  
  function stripeResponseHandler(status, response) {
        if (response.error) {
            $('.error')
                .removeClass('hide')
                .find('.alert')
                .text(response.error.message);
        } else {
            // token contains id, last4, and card type
            var token = response['id'];
            // insert the token into the form so it gets submitted to the server
            $form.find('input[type=text]').empty();
            $form.append("<input type='hidden' name='stripeToken' value='" + token + "'/>");
            $form.get(0).submit();
        }
    }
  
});
0 likes
3 replies
Randy_Johnson's avatar
Level 8

I was messing with this for days. But I final got there!

Here is my solution:

<script src="https://js.stripe.com/v3/"></script>
<script src="{{ asset('js/my_stripe.js') }}"></script>
<link rel="stylesheet" type="text/css" href="{{ asset('css/stripe.css') }}">

<form action="/user/payment/stripe" method="post" id="payment-form">
{{ csrf_field() }}

<div class="row">
<div class="col-md-12 mb-3">
<label for="firstName">Enter Card Details</label>
 <div id="card-element">
<!-- A Stripe Element will be inserted here. -->
</div>
</div>
 </div>

 <div id="card-errors" role="alert"></div>
 </div>

<button id="complete-orders" class="btn btn-success btn-block">Submit Payment</button>
</form>

<script>
// Create a Stripe client.
var stripe = Stripe('auth stuff here');

// Create an instance of Elements.
var elements = stripe.elements();

// Custom styling can be passed to options when creating an Element.
// (Note that this demo uses a wider set of styles than the guide below.)
var style = {
   base: {
      color: '#32325d',
      fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
      fontSmoothing: 'antialiased',
      fontSize: '16px',
      '::placeholder': {
         color: '#aab7c4'
      }
   },
   invalid: {
      color: '#fa755a',
      iconColor: '#fa755a'
   }
};

// Create an instance of the card Element.
var card = elements.create('card', 
{
   style: style,
   hidePostalCode:true
});

// Add an instance of the card Element into the `card-element` <div>.
card.mount('#card-element');

// Handle real-time validation errors from the card Element.
card.addEventListener('change', function(event) {
   var displayError = document.getElementById('card-errors');
   if (event.error) {
      displayError.textContent = event.error.message;
   } else {
      displayError.textContent = '';
   }
});

// Handle form submission.
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
   event.preventDefault();

   var options = {
      name: document.getElementById('card-name').value,
      address_line1: document.getElementById('card-address').value,
      address_city: document.getElementById('card-city').value,
      address_state: document.getElementById('card-province').value,
      address_zip: document.getElementById('card-postcode').value,
   };

   document.getElementById('card-city').disable = true;

   stripe.createToken(card, options).then(function(result) {
      if (result.error) {
         // Inform the user if there was an error.
         var errorElement = document.getElementById('card-errors');
         errorElement.textContent = result.error.message;
         document.getElementById('card-city').disable = false;
      } else {
         // Send the token to your server.
         stripeTokenHandler(result.token);
      }
   });
});

// Submit the form with the token ID.
function stripeTokenHandler(token) {
   // Insert the token ID into the form so it gets submitted to the server
   var form = document.getElementById('payment-form');
   var hiddenInput = document.createElement('input');
   hiddenInput.setAttribute('type', 'hidden');
   hiddenInput.setAttribute('name', 'stripeToken');
   hiddenInput.setAttribute('value', token.id);
   form.appendChild(hiddenInput);

   // Submit the form
   form.submit();
}
</script>

Controller

\Stripe\Stripe::setApiKey('Auth key');

            // Token is created using Stripe Checkout or Elements!
            // Get the payment token ID submitted by the form:
            $token = $_POST['stripeToken'];

            try {
                $charge = \Stripe\Charge::create([
                    'amount' => $this->total,
                    'currency' => 'gbp',
                    'description' => Carbon::now().' '.$request->input('lastName'),
                    'source' => $token,
                ]); 
            } catch(\Stripe\Exception\CardException $e) {
                $request->session()->flash('fail-message', 'Your payment was declined.');
                return redirect()->route('checkout');
            } catch (\Stripe\Exception\RateLimitException $e) {
                $request->session()->flash('fail-message', 'To many requests to the API.');
                return redirect()->route('checkout');
            } catch (\Stripe\Exception\InvalidRequestException $e) {
                $request->session()->flash('fail-message', 'Invalid parameters.');
                return redirect()->route('checkout');
            } catch (\Stripe\Exception\AuthenticationException $e) {
                $request->session()->flash('fail-message', 'There are problems with authentication.');
                return redirect()->route('checkout');
            } catch (\Stripe\Exception\ApiConnectionException $e) {
                $request->session()->flash('fail-message', 'There is a problem with the network.');
                return redirect()->route('checkout');
            } catch (\Stripe\Exception\ApiErrorException $e) {
                $request->session()->flash('fail-message', 'There is a problem with the API.');
                return redirect()->route('checkout');
            } catch (Exception $e) {
                $request->session()->flash('fail-message', 'We don\'t know what happened.');
                return redirect()->route('checkout');
            }

Edit: if you want to see there details on your dashboard you can use this, but just follow what I have done and everything will work. Its important to understand that I didn't include all the html so the inputs for the options are missing.

var options = {
      name: document.getElementById('card-name').value,
      address_line1: document.getElementById('card-address').value,
      address_city: document.getElementById('card-city').value,
      address_state: document.getElementById('card-province').value,
      address_zip: document.getElementById('card-postcode').value,
   };

   document.getElementById('card-city').disable = true;

   stripe.createToken(card, options).then(function(result) {
      if (result.error) {
1 like
rubenochoa's avatar

@randy_johnson First of all thank you very for your time to answer me. In case of want to see at stripe only the cart-name I will just use

name: document.getElementById('card-name').value,
<label for="cart-name">Cart Name</label>
<input type="text" id="card-cvc" class="form-control" required>

right?

Please or to participate in this conversation.