Guide
Guide Symfony pour appeler le flux YKNPG depuis un contrôleur.
Guide Symfony pour appeler le flux YKNPG depuis un contrôleur.
Pré-requis
- PHP 8.1+, Composer, Symfony CLI optionnelle.
.env.localstockantYKNPG_API_TOKEN.
- Créer le projet
composer create-project symfony/skeleton demo-symfonycd demo-symfonycomposer require symfony/http-client symfony/framework-bundle symfony/runtime symfony/console
- Configurer l'environnement
- Fichier :
.env.local
YKNPG_API_TOKEN=remplacez-par-votre-jeton
YKNPG_BASE_URL=https://yknpg.ngoul.com/api/v1
- Créer le contrôleur
- Fichier :
src/Controller/PaymentController.php
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class PaymentController extends AbstractController
{
#[Route('/pay', name: 'app_pay', methods: ['POST'])]
public function pay(Request $request, HttpClientInterface $client): JsonResponse
{
$data = json_decode($request->getContent(), true) ?? [];
if (!isset($data['phone'], $data['amount'])) {
return $this->json(['error' => 'phone and amount required'], 400);
}
$token = $_ENV['YKNPG_API_TOKEN'];
$base = $_ENV['YKNPG_BASE_URL'] ?? 'https://yknpg.ngoul.com/api/v1';
$http = $client->withOptions([
'base_uri' => $base,
'headers' => ['Authorization' => "Bearer $token"],
'timeout' => 10,
]);
$payload = [
'amount' => (int) $data['amount'],
'provider' => 'ORANGE_MONEY',
'user_infos' => ['number' => $data['phone']],
'callback_url' => 'http://example.com',
'callback_method' => 'POST',
'your_message' => 'pay this',
'your_order_ref' => 'demo-1',
'provider_fees_on_customer' => true,
];
$created = $http->request('POST', '/transactions/', ['json' => $payload])->toArray();
$paid = $http->request('POST', "/transactions/{$created['uuid']}/pay/")->toArray();
$status = $paid['status'] ?? 'new';
while (in_array($status, ['new', 'paying'])) {
sleep(5);
$resp = $http->request('GET', "/transactions/{$created['uuid']}/")->toArray();
$status = $resp['status'] ?? $status;
}
return $this->json([
'instructions' => $created['instructions'] ?? null,
'post_pay_instructions' => $paid['instructions'] ?? null,
'final_status' => $status,
]);
}
}
- Enregistrer la route
- Fichier :
config/routes.yaml
app_pay:
path: /pay
controller: App\Controller\PaymentController::pay
methods: [POST]
- Exécuter
symfony serve -douphp -S 127.0.0.1:8000 -t public- POST
{"phone": "...", "amount": 1000}vershttp://127.0.0.1:8000/pay.
Remarques
- Gardez le jeton hors du navigateur ; réutilisez la logique de contrôleur dans des messageries/files si besoin.