Stripe API с PHP должен предоставить источник или клиент - PullRequest
0 голосов
/ 04 июля 2018

Функция контроллера в Laravel:

public function postCheckout(Request $request) {
    if(! Session::has('cart')){
        return redirect()->route('product.shoppingCart');
    }
    $oldCart = Session::get('cart');
    $cart = new Cart($oldCart);
    Stripe::setApiKey('XXXXXXXXXXXX');
    //dd($request->input());
    try {
        Charge::create(array(
            "amount" => $cart->totalPrice*100 ,
            "currency" => "cad",
            "source" => $request->input('stripeToken'), // obtained with Stripe.js
            "description" => "Test charge..."
        ));
    } catch (\Exception $e) {
        return redirect()->route('checkout')->with('error', $e->getMessage() );
    }
    Session::forget('cart');
    return redirect()->route('welcome')->with('success','Successfully purchased products !');
}

Код JavaScript в виде:

var stripe = Stripe('YYYYYYYYYYYY');
var elements = stripe.elements();
var card = elements.create('card');

card.mount('#card-element');
card.addEventListener('change', function(event) {
  var displayError = document.getElementById('charge-error');
  if (event.error) {
    displayError.textContent = event.error.message;
  } else {
    displayError.textContent = '';
  }
});

var form = document.getElementById('checkout-form');

form.addEventListener('click', function() {
  // event.preventDefault();
  stripe.createToken(card).then(function(result) {
    if (result.error) {
      // Inform the customer that there was an error.
      var errorElement = document.getElementById('charge-error');
      errorElement.textContent = result.error.message;
    } else {
      stripeTokenHandler(result.token);
    }
  });
});

Эта функция создает скрытый ввод для отправки данных на сервер, вставляет идентификатор токена в форму и отправляет его на сервер:

function stripeTokenHandler(token) {
  var form = document.getElementById('checkout-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();
}

HTML-форма:

<form action="{{ route('checkout.post') }}" method="post" id="checkout-form">
  <label for="card-element">Credit or debit card</label>
  <div id="card-element"></div>
  {{ csrf_field() }}
  <button class="btn btn-success">Submit</button>
</form>

Ответ должен предоставить источник или клиент.

...