Где воздух гор - там тишина снегов, молчание камней и дремлет сила

Программирование Web

Интеграция Stripe и Laravel

2021-01-27 19:13:59








Платежная система Stripe очень популярная и легко может быть интегрирована во фреймворк Laravel. Опишем пошагово как это делается:

1. Сначала зарегистрируемся в сервисе Stripe по этому адресу https://dashboard.stripe.com/register. Там мы получим публичный и секретные ключи, которые нам понадобятся. Потом поместим в файл .env:

STRIPE_PUBLISHABLE_KEY=PASTE_PUBLISHABLE_KEY
STRIPE_SECRET_KEY=PASTE_SECRET_KEY
STRIPE_CURRENCY=USD

2. Затем мы установим необходимую библиотеку:

sudo composer require stripe/stripe-php


3. После этого создадим пути в файле роутера:


Route::get('/getStripe', [PaymentController::class, 'getStripe'])>name('getStripe');;
Route::post('/makePayment', [PaymentController::class, 'makePayment'])→name('makePayment');


4. Теперь нам необходим новый контроллер:

sudo php artisan make:controller PaymentController


5. Далее отредактируем файл, нам здесь нужны методы для оплаты:

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Stripe;
use Session;

class PaymentController extends Controller
{
/**
* отображение формы для оплаты
*/
public function stripe()
{
return view('stripe');
}

/**
* метод оплаты
*/
public function makePayment(Request $request)
{
Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
Stripe\Charge::create ([
"amount" => 100 * 150,
"currency" => "inr",
"source" => $request->stripeToken,
"description" => "Testing payment."
]);

Session::flash('success', 'Payment has been successfully processed.');

return back();
}
}


Первый метод контроллера отображает форму Stripe, другой метод производит платеж.

6. Осталось добавить вид stripe.blade.php, в котором у нас есть Javascript валидация:

<!DOCTYPE html>
<html>
<head>
<title>Stripe Payment</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<style type="text/css">
.container {
margin-top: 40px;
}
.panel-heading {
display: inline;
font-weight: bold;
}
.flex-table {
display: table;
}
.display-tr {
display: table-row;
}
.display-td {
display: table-cell;
vertical-align: middle;
width: 55%;
}
</style>
</head>
<body>

<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-default">
<div class="panel-heading">
<div class="row text-center">
<h3 class="panel-heading">Payment Details</h3>
</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('stripe.payment') }}" method="post" class="validation"
data-cc-on-file="false"
data-stripe-publishable-key="{{ env('STRIPE_KEY') }}"
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-num' 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='e.g 415' 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 hide error form-group'>
<div class='alert-danger alert'>Fix the errors before you begin.</div>
</div>
</div>

<div class="row">
<div class="col-xs-12">
<button class="btn btn-danger btn-lg btn-block" type="submit">Pay Now (₹100)</button>
</div>
</div>

</form>
</div>
</div>
</div>
</div>
</div>

</body>

<script type="text/javascript" src="https://js.stripe.com/v2/"></script>

<script type="text/javascript">
$(function() {
var $form = $(".validation");
$('form.validation').bind('submit', function(e) {
var $form = $(".validation"),
inputVal = ['input[type=email]', 'input[type=password]',
'input[type=text]', 'input[type=file]',
'textarea'].join(', '),
$inputs = $form.find('.required').find(inputVal),
$errorStatus = $form.find('div.error'),
valid = true;
$errorStatus.addClass('hide');

$('.has-error').removeClass('has-error');
$inputs.each(function(i, el) {
var $input = $(el);
if ($input.val() === '') {
$input.parent().addClass('has-error');
$errorStatus.removeClass('hide');
e.preventDefault();
}
});

if (!$form.data('cc-on-file')) {
e.preventDefault();
Stripe.setPublishableKey($form.data('stripe-publishable-key'));
Stripe.createToken({
number: $('.card-num').val(),
cvc: $('.card-cvc').val(),
exp_month: $('.card-expiry-month').val(),
exp_year: $('.card-expiry-year').val()
}, stripeHandleResponse);
}

});

function stripeHandleResponse(status, response) {
if (response.error) {
$('.error')
.removeClass('hide')
.find('.alert')
.text(response.error.message);
} else {
var token = response['id'];
$form.find('input[type=text]').empty();
$form.append("<input type='hidden' name='stripeToken' value='" + token + "'/>");
$form.get(0).submit();
}
}

});
</script>
</html>

На этом все. Так выглядит самая простая интеграция Laravel и Stripe.

Здесь нет комментариев


Новый комментарий:
























Яндекс.Метрика