Integration de deux passerelle de paiement PayPal et Stripe (part 1)
PayPal est une société américaine qui exploite un système mondial de paiements en ligne qui prend en charge les transferts d'argent en ligne et sert d'alternative électronique aux méthodes traditionnelles de papier comme les chèques et les mandats.
Stripe est une société de passerelle de paiement Internet très populaire et sécurisée qui permet d'accepter les paiements dans le monde entier. Stripe fournit une interface de développement très agréable pour commencer et vous n'avez pas à payer de frais d'abonnement pour l'apprendre. Il fournit un compte de développeur gratuit, avant de commencer à coder dans votre application.
Je vais vous expliquer étape par étape à partir de zéro, nous avons donc besoin d'obtenir une nouvelle application Laravel en utilisant la commande ci-dessous, donc ouvrez votre terminal ou votre invite de commande et exécutez la commande ci-dessous :
composer create-project laravel/laravel blog
Installation des package stripe-php et paypal
1.Stripe
Dans cette étape, nous devons installer stripe-php via le gestionnaire de package Composer, donc dans votre terminal et lancer la commande suivante :
composer require stripe/stripe-php
Définissez la clé API de Stripe et le SECRET
Maintenant, nous devons définir la clé et le secret de stripe. Vous pouvez d'abord aller sur le site de Stripe et créer la clé et le secret du compte stripe de développement et ajouter ci-dessous :
dans le .env
STRIPE_KEY=pk_test_reFxwbsm9cdCKASdTfxAR
STRIPE_SECRET=sk_test_oQMFWteJiPd4wj4AtgApY
2.Paypal
Exécutez la commande suivante dans votre projet pour obtenir la dernière version du package API paypal à l'aide de composer
composer require srmklive/paypal
Ajoutez le service provider dans le tableau $providers du fichier config/app.php comme suit :
Srmklive\PayPal\Providers\PayPalServiceProvider::class
Ajoutez l'alias à votre tableau $aliases dans le fichier config/app.php comme suit :
'PayPal' => Srmklive\PayPal\Facades\PayPal::class
Exécutez la commande suivante pour publier la configuration :
php artisan vendor:publish --provider "Srmklive\PayPal\Providers\PayPalServiceProvider"
Après l'installation, vous devrez ajouter vos paramètres paypal. Voici le code que vous trouverez dans config/paypal.php, que vous devrez mettre à jour en conséquence.
return [
'mode' => 'sandbox', // Can only be 'sandbox' Or 'live'. If empty or invalid, 'live' will be used.
'sandbox' => [
'username' => env('PAYPAL_SANDBOX_API_USERNAME', ''),
'password' => env('PAYPAL_SANDBOX_API_PASSWORD', ''),
'secret' => env('PAYPAL_SANDBOX_API_SECRET', ''),
'certificate' => env('PAYPAL_SANDBOX_API_CERTIFICATE', ''),
'app_id' => 'APP-80W284485P519543T', // Used for testing Adaptive Payments API in sandbox mode
],
'live' => [
'username' => env('PAYPAL_LIVE_API_USERNAME', ''),
'password' => env('PAYPAL_LIVE_API_PASSWORD', ''),
'secret' => env('PAYPAL_LIVE_API_SECRET', ''),
'certificate' => env('PAYPAL_LIVE_API_CERTIFICATE', ''),
'app_id' => '', // Used for Adaptive Payments API
],
'payment_action' => 'Sale', // Can only be 'Sale', 'Authorization' or 'Order'
'currency' => 'USD',
'notify_url' => '', // Change this accordingly for your application.
'locale' => '', // force gateway language i.e. it_IT, es_ES, en_US ... (for express checkout only)
'validate_ssl' => true, // Validate SSL when creating api client.
];
Ajoutez ceci à .env.example et .env
#PayPal Setting & API Credentials - sandbox
PAYPAL_SANDBOX_API_USERNAME=
PAYPAL_SANDBOX_API_PASSWORD=
PAYPAL_SANDBOX_API_SECRET=
PAYPAL_SANDBOX_API_CERTIFICATE=
#PayPal Setting & API Credentials - live
PAYPAL_LIVE_API_USERNAME=
PAYPAL_LIVE_API_PASSWORD=
PAYPAL_LIVE_API_SECRET=
PAYPAL_LIVE_API_CERTIFICATE=
Maintenant que les differents packages sont installer nous allons commencer
I-COLLECTER LES PAIEMENTS
Step 1: Créer un contrôleur
Dans cette étape, nous devons maintenant créer un nouveau contrôleur, CollectPaymentController. Exécutez donc la commande ci-dessous et créez un nouveau contrôleur.
php artisan make:controller CollectPaymentController
Après la commande ci-dessous, vous trouverez un nouveau fichier dans ce chemin.“app/Http/Controllers/CollectPaymentController.php”
Nous allons ajouter quelque methode a ce controller notament la methode "Payment","Success","Cancel" et on obtient le fichier suivant
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PayPalController extends Controller
{
public function collect()
{
return view('collect');
}
public function payment(Request $request)
{
//code
}
public function success(Request $request)
{
//code
}
public function cancel(Request $request)
{
//code
}
}
Nous allons maintenant import nos differents package sdans le controlleur CollectPaymentController comme suit
// Importez d'abord l'espace de noms de la classe avant de l'utiliser directement.
use Stripe;
use Srmklive\PayPal\Facades\PayPal;
ecrivons maintenant le code qui va collecter le paiement
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Stripe;
use Srmklive\PayPal\Facades\PayPal;
use Illuminate\Support\Str;
class CollectPaymentController extends Controller
{
public function collect()
{
return view('collect');
}
public function payment(Request $request)
{
$amount = $request->amount;
if ($request->type == "stripe") {
try {
$this->validate($request, [
'card_no' => 'required',
'expiry_month' => 'required',
'expiry_year' => 'required',
'cvv' => 'required',
]);
$stripe = Stripe\Stripe::setApiKey(config('stripe.secret_key'));
$response = \Stripe\Token::create(array(
"card" => array(
"number" => $request->input('card_no'),
"exp_month" => $request->input('expiry_month'),
"exp_year" => $request->input('expiry_year'),
"cvc" => $request->input('cvv'),
)
));
$charge = \Stripe\Charge::create([
'card' => $response['id'],
'currency' => 'USD',
'amount' => $amount * 100,
'description' => "Test de paiement du blog paki leonel.",
]);
if ($charge['status'] == 'succeeded') {
return response()->json([
'status' => 'ok',
'message' => "Payment Complete",
], 200);
} else {
return response()->json(['status' => 'error', "message" => "Payment Failed"], 500);
}
} catch (\Exception $e) {
return response()->json(['status' => 'error', 'error' => $e->getMessage(), "message" => "Payment Failed"], 500);
}
} elseif ($request->type == "paypal") {
try {
$provider = PayPal::setProvider();
$provider->setApiCredentials(config('paypal')); // Pull values from Config
$token = $provider->getAccessToken();
$provider->setAccessToken($token);
$provider->setCurrency('USD');
$res = $provider->createOrder([
'intent' => 'CAPTURE',
'purchase_units' => [[
'reference_id' => Str::random(),
'amount' => [
'currency_code' => 'USD',
'value' => $amount
]
]],
'application_context' => [
'cancel_url' => route('cancel.collect.payment'),
'return_url' => route('success.collect.payment')
]
]);
return response()->json([
'status' => 'ok',
'message' => "pay with link",
'url' => $res['links'][1]['href'],
], 200);
} catch (\Exception $e) {
return response()->json(['status' => 'error', 'error' => $e->getMessage(), "message" => "Payment Failed"], 500);
}
}
}
public function success(Request $request)
{
$provider = PayPal::setProvider();
$provider->setApiCredentials(config('paypal'));
$token = $provider->getAccessToken();
$provider->setAccessToken($token);
// Get PaymentOrder using our transaction ID
$response = $provider->capturePaymentOrder($request->token);
//faire le traitement en cas de success
}
public function cancel(Request $request)
{
dd("Votre paiement a été décliné. La page d'annulation du paiement va ici !");
}
}
Définir les routes impératives
Les routes sont essentielles, les méthodes HTTP peuvent être liées à des routes pour prendre en charge les données entrantes ou sortantes.
Dans cette étape fondamentale, nous allons créer trois routes simultanément avec la méthode GET pour gérer les paiements dans Laravel, le succès du paiement et l'annulation du paiement. Définissons respectivement toutes les routes dans le fichier routes/web.php.
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CollectPaymentController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('home');
});
Route::get('handle-payment', [CollectPaymentController::class, "collect"])->name('make.collect');
Route::get('cancel-payment', [CollectPaymentController::class, "cancel"])->name('cancel.collect.payment');
Route::post('payment-success', [CollectPaymentController::class, "success"])->name('success.collect.payment');
Route::post('make-payment', [CollectPaymentController::class, "payment"])->name('make.collect.payment');
créons maintenant la vue collect dans le dossier resources/views/collect.blade.php et ajouter le code suivant
<!DOCTYPE html>
<html>
<head>
<title>Paiement paypal et stripe</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.bundle.min.js"></script>
<style type="text/css">
body {
background: #f5f5f5
}
.rounded {
border-radius: 1rem
}
.nav-pills .nav-link {
color: #555
}
.nav-pills .nav-link.active {
color: white
}
input[type="radio"] {
margin-right: 5px
}
.bold {
font-weight: bold
}
</style>
</head>
<body>
<div class="container">
<h1>Exemple d'intégration de la passerelle de paiement Stripe et paypal</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<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="container py-5">
<!-- For demo purpose -->
<div class="row mb-4">
<div class="col-lg-8 mx-auto text-center">
<h1 class="display-6">Payment Forms</h1>
</div>
</div>
<!-- End -->
<div class="row">
<div class="col-lg-6 mx-auto">
<div class="card ">
<div class="card-header">
<div class="bg-white shadow-sm pt-4 pl-2 pr-2 pb-2">
<!-- Credit card form tabs -->
<ul role="tablist" class="nav bg-light nav-pills rounded nav-fill mb-3">
<li class="nav-item">
<a data-toggle="pill" href="#credit-card" class="nav-link active "> <i class="fas fa-credit-card mr-2"></i> Credit Card (stripe)</a>
</li>
<li class="nav-item">
<a data-toggle="pill" href="#paypal" class="nav-link "> <i class="fab fa-paypal mr-2"></i> Paypal </a>
</li>
</ul>
</div>
<!-- End -->
<!-- Credit card form content -->
<div class="tab-content">
<!-- credit card info-->
<div id="credit-card" class="tab-pane fade show active pt-3">
<form role="form" action="{{ route('make.collect.payment') }}" method="post" class="makepayment" data-cc-on-file="false" data-stripe-publishable-key="{{ env('STRIPE_KEY') }}" id="payment-form">
<div class="form-group"> <label for="username">
<h6>Card Owner</h6>
</label> <input type="text" name="username" placeholder="Card Owner Name" required class="form-control "> </div>
<div class="form-group"> <label for="cardNumber">
<h6>Card number</h6>
</label>
<div class="input-group"> <input type="text" name="cardNumber" placeholder="Valid card number" class="form-control card-number" required>
<div class="input-group-append"> <span class="input-group-text text-muted"> <i class="fab fa-cc-visa mx-1"></i> <i class="fab fa-cc-mastercard mx-1"></i> <i class="fab fa-cc-amex mx-1"></i> </span> </div>
</div>
</div>
<div class="row">
<div class="col-sm-8">
<div class="form-group"> <label><span class="hidden-xs">
<h6>Expiration Date</h6>
</span></label>
<div class="input-group"> <input type="number" placeholder="MM" name="" class="form-control card-expiry-month" required> <input type="number" placeholder="YY" name="" class="form-control card-expiry-year" required> </div>
</div>
</div>
<div class="col-sm-4">
<div class="form-group mb-4"> <label data-toggle="tooltip" title="Three digit CV code on the back of your card">
<h6>CVV <i class="fa fa-question-circle d-inline"></i></h6>
</label> <input type="text" required class="form-control card-cvc"> </div>
</div>
</div>
<input type="hidden" name="amount" value="100">
<input type="hidden" name="type" value="stripe">
<p class="text-muted message_"></p>
<div class="card-footer"> <button type="button" class="subscribe btn btn-primary btn-block shadow-sm"> Pay Now ($100) </button>
</form>
</div>
</div>
<!-- End -->
<!-- Paypal info -->
<div id="paypal" class="tab-pane fade pt-3">
<h6 class="pb-2">Select your paypal account type</h6>
<form action="{{ route('make.collect.payment') }}" method="post" class="makepayment">
<input type="hidden" name="amount" value="100">
<input type="hidden" name="type" value="paypal">
<button type="submit" class="btn btn-primary "><i class="fab fa-paypal mr-2"></i> Pay Now ($100) </button> </p>
</form>
<p class="text-muted message_"></p>
</div>
<!-- End -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="paiementpendingawardmodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title text-center" id="exampleModalLongTitle">Paiement en cours d'exécution</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="d-flex flex-column align-items-center justify-content-center">
<div class="row">
<div class="spinner-border" role="status">
<span class="sr-only">Loading...</span>
</div>
</div>
<div class="row">
<strong>Paiement en cours </strong>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="paiementcompletawardmodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title text-center" id="paymentcomplet">Paiement effectué</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body text-center">
<i class=" fa-5x fa fa-check-circle text-success"></i>
</div>
</div>
</div>
</div>
<div class="modal fade" id="paiementfailawardmodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-sm" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title text-center" id="exampleModalLongTitle">Échec du paiement</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body text-center">
<i class=" fa-5x fa fa-times-circle text-danger"></i>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script type="text/javascript">
$('.makepayment').on('submit', function(e) {
e.preventDefault();
$("#paiementpendingawardmodal").modal('show');
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
var url = $(this).data('href');
$.post($(this).attr('action'), $(this).serialize(),
function(response, textStatus, jqXHR) {
const expr = response.message;
switch (expr) {
case 'Payment Complete':
$("#paiementpendingawardmodal").modal('hide');
$("#paiementcompletawardmodal").modal('show');
break;
case 'Payment Failed':
$("#paiementpendingawardmodal").modal('hide');
$("#paiementfailawardmodal").modal('show');
break;
case 'pay with link':
$("#paiementpendingawardmodal").modal('hide');
$("#paiementinfoawardmodal").modal('show');
$('.message_info').html(
'<span>your payment was initial.<br> please click on this link to continue</span><br> <br><a class="btn btn-info" href="' +
response.url + '" target="_blank">continue</a>')
break;
default:
$("#paiementpendingawardmodal").modal('hide');
$("#paiementfailawardmodal").modal('show');
console.log(`Sorry, we are out of ${expr}.`);
}
},
"json"
).fail(function() {
$("#paiementpendingawardmodal").modal('hide');
$("#paiementfailawardmodal").modal('show');
});
});
</script>
</html>
http://slkjfdf.net/ - Wuraguth <a href="http://slkjfdf.net/">Oxegej</a> nhe.yndd.pakileonel.com.dju.th http://slkjfdf.net/
.
When I initially commented I seem to have clicked the -Notify me when new comments are added- checkbox and now each time a comment is added I get four emails with the same comment. Perhaps there is an easy method you can remove me from that service? Cheers! save refuges
Wow, this post is pleasant, my sister is analyzing these kinds of things, therefore I am going to tell her. donate for ukraine
BETFLIK6789 หรือมีอีกชื่อว่าbetflix เว็บตรง เบทฟิก นั้นเป็นศูนย์รวมคาสิโนออนไลน์ระดับโลกมอบความทันสมัยที่สุด เหมาะสมที่สุดในประเทศไทยในตอนนั้น
http://ironblow.bplaced.net/index.php?mod=users&action=view&id=848443 aand https://derbydatabases.fogbugz.com/default.asp?cManagerFeatures.1.42344.0 iss the pplace where youu can buy steroids online which sells real anabolic steroids, injectable steorids, oral steroids by Geneza Pharmaceuticals, Asia Pharma, Biomex labs, Balkan Pharmaceuticals, British Dispensary, British Dragon aand others. All their stufrf is authentic and of very high quality - here you can buy testosterone, anadrol, trenbolone, human growth hormone, cytomel, T3, and more without prescription
смотреть дораму мой сосед кумихо Научи Меня Любить Дорама https://bit.ly/dorama-doramy
Фильмы Новинки смотреть онлайн.. По ссылке смотреть онлайн в хорошем качестве бесплатно фильмы. Просмотр телеканала в режиме онлайн.