Laravel Tutoriel Packages
4 min de lecture 903 vues

Mettre en place des paiements avec NotchPay sur Laravel - Partie 2

mckenziearts

Arthur Monney

@mckenziearts

Mettre en place des paiements avec NotchPay sur Laravel - Partie 2

Dans la première partie de ce tutoriel, nous avons créé et configuré un projet de zéro , installer Laravel Breeze, rajouter une entité produit avec sa migration, son modèle, sa factory et son contrôleur.

Dans cette 2e partie nous allons entrer dans le vif du sujet à savoir la mise en place de la solution NotchPay pour permettre à notre utilisateur d'acheter dans notre site.

Installation de NotchPay

Dans le cadre de ce tutoriel nous allons utiliser le SDK PHP disponible sur Github. Pour l'installer nous allons éxécuter la commande

composer require notchpay/notchpay-php

Une fois le package installé nous allons créer une route qui va nous permettre d'effectuer le paiement. Pour cela nous allons créer un controller invokable avec la commande

php artisan make:controller PaymentController --invokable

Et nous allons rajouter le contrôleur dans notre fichier de routing web.php

use App\Http\Controllers\PaymentController;
....
 
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/dashboard', [ProductController::class, 'index'])
->name('dashboard');
Route::get('payment/{product}', PaymentController::class)->name('payment');
});

Configuration du paiement

En s'inspiration de ce qui est dans le README du SDK nous devons avoir une PUBLIC_KEY pour pouvoir communiquer avec l'API de NotchPay. Pour avoir cette clé il faut créer un compte sur l'espace business une fois le compte créer vous allez le valider et une fois que cela est fait vous cliquez sur Settings > Developer pour avoir les infos de votre sandbox

Vous allez avoir l'interface suivante n5.png

Avec à droite les infos de tests (compte bancaire, numéro Mobile Money) et en bas à gauche vous avez une Public Key (Sandbox) que vous allez utilisé pour communiquer avec l'API

Mis en place du paiement

Dans notre contrôleur App/Http/Controllers/PaymentController nous allons mettre en place le paiement de la manière suivante:

<?php
 
namespace App\Http\Controllers;
 
use App\Models\Product;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;
use NotchPay\NotchPay;
use NotchPay\Payment;
 
class PaymentController extends Controller
{
public function __invoke(Product $product): RedirectResponse
{
NotchPay::setApiKey('sb.LudOJsz7kuivrDHaW86KCiKPYCXGc8HL');
 
try {
$payload = Payment::initialize([
'amount' => $product->price,
'email' => Auth::user()->email,
'name' => Auth::user()->name,
'currency' => 'XAF',
'reference' => Auth::id() . '-' . uniqid(),
'callback' => route('notchpay-callback'),
'description' => $product->description,
]);
 
return redirect($payload->authorization_url);
} catch (NotchPay\Exception\ApiException $e) {
session()->flash('error', __('Impossible de procéder au paiement, veuillez recommencer plus tard. Merci'));
 
return back();
}
}
}

Vous l'avez sûrement remarqué notre route route('notchpay-callback') qui représente notre callback. Cette callback c'est l'url de notre site sur laquelle NotchPay va envoyer les retours du paiement et vous pouvez faire différent traitement dans cette route.

J'ai créé un nouveau contrôleur NotchPayCallBackController qui va nous permettre de traiter le retour de la commande effectué par notre client

Dans le fichier routes/web.php on rajoute la ligne après avoir créé le contrôleur

use App\Http\Controllers\NotchPayCallBackController;
 
...
Route::get('callback-payment', NotchPayCallBackController::class)->name('notchpay-callback');

Et dans notre NotchPayCallBackController nous allons mettre le contenu suivant

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use NotchPay\NotchPay;
use NotchPay\Payment;
 
class NotchPayCallBackController extends Controller
{
public function __invoke(Request $request): RedirectResponse
{
// @ToDO Mis a jour de la commande dans votre base de données
NotchPay::setApiKey('votre-clé-api');
$verifyTransaction = Payment::verify($request->get('reference'));
 
 
if ($verifyTransaction->transaction->status === 'canceled') {
session()->flash('error', __('Votre achat a été annulé veuillez relancer si vous souhaitez payer votre produit, Merci.'));
} else {
// @ToDO Envoie de mail de remerciement pour l'achat' de l'utilisateur qui est dans la base de données
 
session()->flash('status', __('Votre achat a été effectué avec succès, Merci pour votre confiance.'));
}
 
 
return redirect(route('dashboard'));
}
}

Et quand notre utilisateur va cliquer sur notre bouton Acheter il sera redirigé vers la page de NotchPay suivante n6.png

Étant en mode Sanbox vous avez des numéros de test dans la partie Setting de votre dashboard.

Une fois le numéro rensigné vous allez effectué le paiement et vous serez redirigé vers votre URL de callback que vous avez mentionné lors de l'initialisation de l'achat. Dans notre cas nous avons le résultat suivant

n7.png

Ceci est une implémentation très simple de la solution de paiement NotchPay sur Laravel. Vous pouvez améliorer grandement ce code pour le faire fonctionner selon votre besoin.

L'ensemble du code est disponible sur le github de Laravel Cameroun https://github.com/laravelcm/notchpay-integration

J'espère que ce tutoriel vous a été utile. Prenez soin de vous. Shalom

mckenziearts

Arthur Monney

@mckenziearts

Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs

Vous aimez cet article ? Faite le savoir en partageant