Mettre en place des paiements avec NotchPay sur Laravel - Partie 2
Arthur Monney
@mckenziearts
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
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
É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
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
Arthur Monney
@mckenziearts
Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs