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
1composer require notchpay/notchpay-php1composer 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
1php artisan make:controller PaymentController --invokable1php artisan make:controller PaymentController --invokable
Et nous allons rajouter le contrôleur dans notre fichier de routing web.php
1use App\Http\Controllers\PaymentController;2....34Route::middleware(['auth', 'verified'])->group(function () {5 Route::get('/dashboard', [ProductController::class, 'index'])6 ->name('dashboard');7 Route::get('payment/{product}', PaymentController::class)->name('payment');8});1use App\Http\Controllers\PaymentController;2....34Route::middleware(['auth', 'verified'])->group(function () {5 Route::get('/dashboard', [ProductController::class, 'index'])6 ->name('dashboard');7 Route::get('payment/{product}', PaymentController::class)->name('payment');8});
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

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:
1<?php23namespace App\Http\Controllers;45use App\Models\Product;6use Illuminate\Http\RedirectResponse;7use Illuminate\Support\Facades\Auth;8use NotchPay\NotchPay;9use NotchPay\Payment;1011class PaymentController extends Controller12{13 public function __invoke(Product $product): RedirectResponse14 {15 NotchPay::setApiKey('sb.LudOJsz7kuivrDHaW86KCiKPYCXGc8HL');1617 try {18 $payload = Payment::initialize([19 'amount' => $product->price,20 'email' => Auth::user()->email,21 'name' => Auth::user()->name,22 'currency' => 'XAF',23 'reference' => Auth::id() . '-' . uniqid(),24 'callback' => route('notchpay-callback'),25 'description' => $product->description,26 ]);2728 return redirect($payload->authorization_url);29 } catch (NotchPay\Exception\ApiException $e) {30 session()->flash('error', __('Impossible de procéder au paiement, veuillez recommencer plus tard. Merci'));3132 return back();33 }34 }35}1<?php23namespace App\Http\Controllers;45use App\Models\Product;6use Illuminate\Http\RedirectResponse;7use Illuminate\Support\Facades\Auth;8use NotchPay\NotchPay;9use NotchPay\Payment;1011class PaymentController extends Controller12{13 public function __invoke(Product $product): RedirectResponse14 {15 NotchPay::setApiKey('sb.LudOJsz7kuivrDHaW86KCiKPYCXGc8HL');1617 try {18 $payload = Payment::initialize([19 'amount' => $product->price,20 'email' => Auth::user()->email,21 'name' => Auth::user()->name,22 'currency' => 'XAF',23 'reference' => Auth::id() . '-' . uniqid(),24 'callback' => route('notchpay-callback'),25 'description' => $product->description,26 ]);2728 return redirect($payload->authorization_url);29 } catch (NotchPay\Exception\ApiException $e) {30 session()->flash('error', __('Impossible de procéder au paiement, veuillez recommencer plus tard. Merci'));3132 return back();33 }34 }35}
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
1use App\Http\Controllers\NotchPayCallBackController;23...4Route::get('callback-payment', NotchPayCallBackController::class)->name('notchpay-callback');1use App\Http\Controllers\NotchPayCallBackController;23...4Route::get('callback-payment', NotchPayCallBackController::class)->name('notchpay-callback');
Et dans notre NotchPayCallBackController nous allons mettre le contenu suivant
1<?php23namespace App\Http\Controllers;45use Illuminate\Http\RedirectResponse;6use Illuminate\Http\Request;7use NotchPay\NotchPay;8use NotchPay\Payment;910class NotchPayCallBackController extends Controller11{12 public function __invoke(Request $request): RedirectResponse13 {14 // @ToDO Mis a jour de la commande dans votre base de données15 NotchPay::setApiKey('votre-clé-api');16 $verifyTransaction = Payment::verify($request->get('reference'));171819 if ($verifyTransaction->transaction->status === 'canceled') {20 session()->flash('error', __('Votre achat a été annulé veuillez relancer si vous souhaitez payer votre produit, Merci.'));21 } else {22 // @ToDO Envoie de mail de remerciement pour l'achat' de l'utilisateur qui est dans la base de données2324 session()->flash('status', __('Votre achat a été effectué avec succès, Merci pour votre confiance.'));25 }262728 return redirect(route('dashboard'));29 }30}1<?php23namespace App\Http\Controllers;45use Illuminate\Http\RedirectResponse;6use Illuminate\Http\Request;7use NotchPay\NotchPay;8use NotchPay\Payment;910class NotchPayCallBackController extends Controller11{12 public function __invoke(Request $request): RedirectResponse13 {14 // @ToDO Mis a jour de la commande dans votre base de données15 NotchPay::setApiKey('votre-clé-api');16 $verifyTransaction = Payment::verify($request->get('reference'));171819 if ($verifyTransaction->transaction->status === 'canceled') {20 session()->flash('error', __('Votre achat a été annulé veuillez relancer si vous souhaitez payer votre produit, Merci.'));21 } else {22 // @ToDO Envoie de mail de remerciement pour l'achat' de l'utilisateur qui est dans la base de données2324 session()->flash('status', __('Votre achat a été effectué avec succès, Merci pour votre confiance.'));25 }262728 return redirect(route('dashboard'));29 }30}
Et quand notre utilisateur va cliquer sur notre bouton Acheter il sera redirigé vers la page de NotchPay suivante

Étant en mode
Sanboxvous 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

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