sunuid-sdk 1.0.36 → 1.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,602 +1,273 @@
1
- # 🔐 SunuID SDK
1
+ # SunuID PHP SDK
2
2
 
3
- [![npm version](https://badge.fury.io/js/sunuid-sdk.svg)](https://badge.fury.io/js/sunuid-sdk)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Build Status](https://github.com/sunuid/sunuid-sdk/workflows/Build/badge.svg)](https://github.com/sunuid/sunuid-sdk/actions)
6
-
7
- SDK JavaScript officiel pour intégrer facilement les QR codes d'authentification et KYC SunuID dans vos applications web.
8
-
9
- ## ✨ Fonctionnalités
10
-
11
- - 🔐 **Authentification QR Code** - Connexion sécurisée avec SunuID
12
- - 📋 **Vérification KYC** - Collecte et validation d'identité
13
- - 🔒 **Mode Sécurisé** - Initialisation via PHP pour masquer les credentials
14
- - 🌐 **WebSocket en Temps Réel** - Connexion automatique pour les mises à jour
15
- - 🎨 **Thèmes personnalisables** - Support des thèmes clair et sombre
16
- - 🔄 **Actualisation automatique** - QR codes qui se renouvellent automatiquement
17
- - 📱 **Responsive design** - Compatible mobile et desktop
18
- - 🌍 **Multi-langue** - Support français, anglais, arabe
19
- - 🛡️ **Sécurisé** - Authentification par clés API avec validation renforcée
20
- - 🔢 **Types de services** - Support des types 1 (KYC), 2 (AUTH), 3 (SIGNATURE)
21
- - 🎯 **Affichage progressif** - Loader et animations fluides
22
- - 📊 **Logs de sécurité** - Monitoring et debugging avancés
3
+ SDK PHP officiel pour l'intégration des QR codes d'authentification et KYC SunuID.
23
4
 
24
5
  ## 🚀 Installation
25
6
 
26
- ### Via NPM
7
+ ### Via Composer (recommandé)
27
8
 
28
9
  ```bash
29
- npm install sunuid-sdk
10
+ composer require sunuid/php-sdk
30
11
  ```
31
12
 
32
- ### Via CDN
13
+ ### Installation manuelle
33
14
 
34
- ```html
35
- <!-- Socket.IO requis pour WebSocket -->
36
- <script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
37
-
38
- <!-- CSS -->
39
- <link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.css">
40
-
41
- <!-- JavaScript -->
42
- <script src="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.js"></script>
43
- ```
44
-
45
- ## 📖 Utilisation Rapide
46
-
47
- > **🚀 [Démarrage en 30 secondes](GET_STARTED.md)** | **🌍 [Intégration Universelle](INTEGRATION_UNIVERSAL.md)** | **⚡ [Démarrage en 2 minutes](QUICKSTART.md)** | **💡 [Intégration simplifiée](INTEGRATION_SIMPLE.md)** | **🔒 [Intégration PHP complète](PHP_INTEGRATION.md)** | **🏭 [Migration Production](MIGRATION_PRODUCTION.md)**
48
-
49
- ### 1. Mode Classique (Credentials visibles)
50
-
51
- ```javascript
52
- const sunuid = initSunuID({
53
- apiUrl: 'https://api.sunuid.fayma.sn',
54
- clientId: 'VOTRE_CLIENT_ID',
55
- secretId: 'VOTRE_SECRET_ID',
56
- type: 2, // 1 = KYC, 2 = AUTH, 3 = SIGNATURE
57
- theme: 'light',
58
- onSuccess: function(data) {
59
- console.log('Authentification réussie:', data);
60
- },
61
- onError: function(error) {
62
- console.error('Erreur:', error);
63
- },
64
- onStatusUpdate: function(data) {
65
- console.log('Mise à jour statut:', data);
66
- },
67
- onExpired: function(data) {
68
- console.log('QR expiré:', data);
69
- }
70
- });
71
- ```
72
-
73
- ### 2. Mode Sécurisé (Credentials masqués)
74
-
75
- ```javascript
76
- const sunuid = initSunuID({
77
- apiUrl: 'https://api.sunuid.fayma.sn',
78
- type: 2, // 1 = KYC, 2 = AUTH, 3 = SIGNATURE
79
- secureInit: true, // Active le mode sécurisé
80
- secureInitUrl: 'https://votre-serveur.com/secure-init.php',
81
- theme: 'light',
82
- partnerName: 'Votre Entreprise',
83
- onSuccess: function(data) {
84
- console.log('Authentification réussie:', data);
85
- },
86
- onError: function(error) {
87
- console.error('Erreur:', error);
88
- }
89
- });
15
+ ```bash
16
+ git clone https://github.com/sunuid/php-sdk.git
17
+ cd php-sdk
18
+ composer install
90
19
  ```
91
20
 
92
- ### 3. Génération QR avec WebSocket
21
+ ## 📋 Prérequis
93
22
 
94
- ```html
95
- <div id="qr-container"></div>
96
- ```
23
+ - PHP >= 7.4
24
+ - Composer
25
+ - Extensions PHP : `curl`, `json`, `openssl`
97
26
 
98
- ```javascript
99
- // Génère QR et émet automatiquement un événement WebSocket
100
- const result = await sunuid.generateQR('qr-container', {
101
- metadata: {
102
- customData: 'votre-donnée'
103
- }
104
- });
105
-
106
- console.log('QR généré:', result.qrCodeUrl);
107
- console.log('Service ID:', result.service_id);
108
- ```
27
+ ## 🔧 Configuration
109
28
 
110
- ### 4. Écoute des événements WebSocket
29
+ ### Configuration de base
111
30
 
112
- ```javascript
113
- // Le SDK se connecte automatiquement au WebSocket
114
- // Événements disponibles :
115
- // - qr_status_update : Mise à jour du statut
116
- // - qr_scan_success : Scan réussi
117
- // - qr_expired : QR expiré
31
+ ```php
32
+ use SunuID\SunuID;
118
33
 
119
- // Émettre un événement personnalisé
120
- sunuid.emitWebSocketEvent('custom_event', {
121
- message: 'Hello WebSocket!',
122
- timestamp: Date.now()
123
- });
34
+ $config = [
35
+ 'client_id' => 'VOTRE_CLIENT_ID',
36
+ 'secret_id' => 'VOTRE_SECRET_ID',
37
+ 'type' => 2, // 1=KYC, 2=AUTH, 3=SIGNATURE
38
+ 'enable_logs' => true,
39
+ 'log_file' => 'sunuid.log'
40
+ ];
124
41
 
125
- // Vérifier le statut WebSocket
126
- const status = sunuid.getWebSocketStatus(); // 'connected', 'disconnected', 'not_initialized'
42
+ $sunuid = new SunuID($config);
43
+ $sunuid->init();
127
44
  ```
128
45
 
129
- ## 🔒 Mode Sécurisé
130
-
131
- ### Configuration PHP
46
+ ### Options de configuration
132
47
 
133
- Créez un endpoint PHP pour l'initialisation sécurisée :
48
+ | Option | Type | Défaut | Description |
49
+ |--------|------|--------|-------------|
50
+ | `client_id` | string | null | ID client fourni par SunuID |
51
+ | `secret_id` | string | null | Secret ID fourni par SunuID |
52
+ | `type` | int | 2 | Type de service (1=KYC, 2=AUTH, 3=SIGNATURE) |
53
+ | `api_url` | string | https://api.sunuid.fayma.sn | URL de l'API SunuID |
54
+ | `enable_logs` | bool | true | Activer les logs |
55
+ | `log_file` | string | sunuid.log | Fichier de log |
56
+ | `request_timeout` | int | 10 | Timeout des requêtes en secondes |
57
+ | `max_retries` | int | 3 | Nombre de tentatives en cas d'échec |
58
+ | `secure_init` | bool | false | Utiliser l'initialisation sécurisée |
134
59
 
135
- ```php
136
- <?php
137
- // secure-init.php
138
- header('Access-Control-Allow-Origin: *');
139
- header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
140
- header('Access-Control-Allow-Headers: Content-Type');
141
- header('Content-Type: application/json');
60
+ ## 📖 Utilisation
142
61
 
143
- $SUNUID_CONFIG = [
144
- 'client_id' => 'VOTRE_CLIENT_ID',
145
- 'secret_id' => 'VOTRE_SECRET_ID',
146
- 'api_url' => 'https://api.sunuid.fayma.sn',
147
- 'token_expiry' => 3600,
148
- 'max_requests_per_token' => 100
149
- ];
62
+ ### Génération d'un QR code
150
63
 
151
- if ($_SERVER['REQUEST_METHOD'] === 'POST') {
152
- $input = json_decode(file_get_contents('php://input'), true);
153
-
154
- // Validation des paramètres
155
- if (!isset($input['type']) || !in_array($input['type'], [1, 2, 3])) {
156
- echo json_encode(['success' => false, 'error' => 'Type invalide']);
157
- exit;
158
- }
64
+ ```php
65
+ try {
66
+ $sunuid = new SunuID($config);
67
+ $sunuid->init();
159
68
 
160
- // Génération du token sécurisé
161
- $payload = [
162
- 'client_id' => $SUNUID_CONFIG['client_id'],
163
- 'secret_id' => $SUNUID_CONFIG['secret_id'],
164
- 'api_url' => $SUNUID_CONFIG['api_url'],
165
- 'type' => $input['type'],
166
- 'partner_name' => $input['partnerName'] ?? 'SunuID',
167
- 'theme' => $input['theme'] ?? 'light',
168
- 'exp' => time() + $SUNUID_CONFIG['token_expiry'],
169
- 'iat' => time(),
170
- 'jti' => uniqid('sunuid_', true)
171
- ];
69
+ // Générer un QR code
70
+ $qrResult = $sunuid->generateQR();
172
71
 
173
- $token = base64_encode(json_encode($payload));
72
+ echo "QR Code URL: " . $qrResult['qr_code_url'] . "\n";
73
+ echo "Session ID: " . $qrResult['session_id'] . "\n";
74
+ echo "Contenu: " . $qrResult['content'] . "\n";
174
75
 
175
- echo json_encode([
176
- 'success' => true,
177
- 'data' => [
178
- 'token' => $token,
179
- 'expires_in' => $SUNUID_CONFIG['token_expiry'],
180
- 'api_url' => $SUNUID_CONFIG['api_url'],
181
- 'type' => $input['type'],
182
- 'partner_name' => $input['partnerName'] ?? 'SunuID',
183
- 'theme' => $input['theme'] ?? 'light',
184
- 'max_requests' => $SUNUID_CONFIG['max_requests_per_token']
185
- ],
186
- 'message' => 'Token généré avec succès'
187
- ]);
76
+ } catch (Exception $e) {
77
+ echo "Erreur: " . $e->getMessage() . "\n";
188
78
  }
189
- ?>
190
79
  ```
191
80
 
192
- ### Avantages du Mode Sécurisé
193
-
194
- - 🔐 **Credentials masqués** - Non visibles dans le code client
195
- - ⏰ **Tokens temporaires** - Expiration automatique
196
- - 📊 **Limite de requêtes** - Contrôle d'usage
197
- - 🛡️ **Validation côté serveur** - Sécurité renforcée
81
+ ### Génération d'un QR code local
198
82
 
199
- ## 🎨 Exemples
83
+ ```php
84
+ // Générer un QR code sans API (local)
85
+ $content = "AUTH_" . time() . "_" . bin2hex(random_bytes(8));
86
+ $qrResult = $sunuid->generateQRLocal($content, [
87
+ 'size' => 300,
88
+ 'margin' => 10,
89
+ 'label' => 'Authentification SunuID'
90
+ ]);
91
+
92
+ // L'image est retournée en base64
93
+ $imageData = base64_decode(str_replace('data:image/png;base64,', '', $qrResult['qr_code_url']));
94
+ file_put_contents('qr-code.png', $imageData);
95
+ ```
200
96
 
201
- ### Exemples Universels
97
+ ### Vérification du statut
202
98
 
203
- - **[Connexion Universelle](examples/universal-login.html)** - Copier-coller en 30 secondes
204
- - **[KYC Universel](examples/universal-kyc.html)** - Vérification d'identité simple
205
- - **[Guide d'intégration universelle](INTEGRATION_UNIVERSAL.md)** - Pour tous les niveaux
99
+ ```php
100
+ // Vérifier le statut d'un QR code
101
+ $status = $sunuid->checkQRStatus($sessionId);
102
+ echo "Statut: " . json_encode($status, JSON_PRETTY_PRINT) . "\n";
103
+ ```
206
104
 
207
- ### Exemples Simples
105
+ ### Intégration web
208
106
 
209
- - **[Connexion Simple](examples/simple-login.html)** - Page de connexion basique
210
- - **[KYC Simple](examples/simple-kyc.html)** - Page de vérification KYC basique
211
- - **[Guide d'intégration rapide](INTEGRATION_SIMPLE.md)** - Intégration en 3 étapes
107
+ ```php
108
+ <?php
109
+ require_once 'vendor/autoload.php';
212
110
 
213
- ### Intégration Côté Serveur
111
+ use SunuID\SunuID;
214
112
 
215
- - **[Intégration PHP complète](PHP_INTEGRATION.md)** - Gestion entièrement côté serveur
216
- - **Credentials sécurisés** - Jamais exposés côté client
217
- - **Validation serveur** - Contrôle total des requêtes
218
- - **Webhooks** - Notifications en temps réel
219
- - **Gestion des sessions** - Intégration avec votre système
113
+ $config = [
114
+ 'client_id' => 'VOTRE_CLIENT_ID',
115
+ 'secret_id' => 'VOTRE_SECRET_ID',
116
+ 'type' => 2
117
+ ];
220
118
 
221
- ### Page de Connexion avec Mode Sécurisé
119
+ try {
120
+ $sunuid = new SunuID($config);
121
+ $sunuid->init();
122
+ $qrData = $sunuid->generateQR();
123
+ } catch (Exception $e) {
124
+ $error = $e->getMessage();
125
+ }
126
+ ?>
222
127
 
223
- ```html
224
128
  <!DOCTYPE html>
225
- <html lang="fr">
129
+ <html>
226
130
  <head>
227
- <meta charset="UTF-8">
228
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
229
- <title>Connexion - Mon Application</title>
230
- <link rel="stylesheet" href="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.css">
231
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
131
+ <title>SunuID QR Code</title>
232
132
  </head>
233
133
  <body>
234
- <div class="login-container">
235
- <h1>Connexion Sécurisée</h1>
236
- <p>Scannez le QR code avec l'application SunuID</p>
237
-
238
- <div id="qr-container"></div>
239
-
240
- <div class="login-footer">
241
- <p>Pas encore d'application SunuID ?</p>
242
- <a href="https://sunuid.sn/download" target="_blank">Télécharger</a>
243
- </div>
244
- </div>
245
-
246
- <!-- Socket.IO requis -->
247
- <script src="https://cdn.socket.io/4.7.0/socket.io.min.js"></script>
248
-
249
- <!-- SDK SunuID -->
250
- <script src="https://unpkg.com/sunuid-sdk@1.0.25/dist/sunuid-sdk.js"></script>
251
-
252
- <script>
253
- const sunuid = initSunuID({
254
- apiUrl: 'https://api.sunuid.fayma.sn',
255
- type: 2, // AUTH
256
- secureInit: true, // Mode sécurisé
257
- secureInitUrl: 'https://votre-serveur.com/secure-init.php',
258
- theme: 'light',
259
- partnerName: 'Mon Application',
260
- onSuccess: function(data) {
261
- console.log('✅ Authentification réussie:', data);
262
- window.location.href = '/dashboard?token=' + data.token;
263
- },
264
- onError: function(error) {
265
- console.error('❌ Erreur:', error);
266
- alert('Erreur de connexion: ' + error.message);
267
- },
268
- onStatusUpdate: function(data) {
269
- console.log('📱 Mise à jour statut:', data);
270
- },
271
- onExpired: function(data) {
272
- console.log('⏰ QR expiré:', data);
273
- }
274
- });
275
-
276
- // Générer le QR code (WebSocket se connecte automatiquement)
277
- sunuid.generateQR('qr-container');
278
- </script>
134
+ <?php if (isset($qrData)): ?>
135
+ <h1>QR Code SunuID</h1>
136
+ <img src="<?php echo htmlspecialchars($qrData['qr_code_url']); ?>"
137
+ alt="QR Code SunuID" />
138
+ <p>Session ID: <?php echo htmlspecialchars($qrData['session_id']); ?></p>
139
+ <?php else: ?>
140
+ <p>Erreur: <?php echo htmlspecialchars($error); ?></p>
141
+ <?php endif; ?>
279
142
  </body>
280
143
  </html>
281
144
  ```
282
145
 
283
- ## 🔧 Configuration
284
-
285
- ### Options disponibles
286
-
287
- | Option | Type | Défaut | Description |
288
- |--------|------|--------|-------------|
289
- | `apiUrl` | string | `'https://api.sunuid.fayma.sn'` | URL de l'API SunuID |
290
- | `clientId` | string | - | Clé client (requise en mode classique) |
291
- | `secretId` | string | - | Clé secrète (requise en mode classique) |
292
- | `type` | number | `2` | Type de service: `1` (KYC), `2` (AUTH), `3` (SIGNATURE) |
293
- | `theme` | string | `'light'` | Thème: `'light'` ou `'dark'` |
294
- | `language` | string | `'fr'` | Langue: `'fr'`, `'en'`, `'ar'` |
295
- | `autoRefresh` | boolean | `true` | Actualisation automatique |
296
- | `refreshInterval` | number | `30000` | Intervalle en millisecondes |
297
- | `secureInit` | boolean | `false` | Active le mode sécurisé |
298
- | `secureInitUrl` | string | `'https://api.sunuid.fayma.sn/secure-init.php'` | URL de l'endpoint sécurisé |
299
- | `partnerName` | string | `'SunuID'` | Nom du partenaire |
300
- | `enableSecurityLogs` | boolean | `true` | Active les logs de sécurité |
301
- | `validateInputs` | boolean | `true` | Validation des entrées |
302
- | `maxRetries` | number | `3` | Nombre max de tentatives API |
303
- | `requestTimeout` | number | `10000` | Timeout des requêtes (ms) |
304
- | `onSuccess` | function | - | Callback en cas de succès |
305
- | `onError` | function | - | Callback en cas d'erreur |
306
- | `onStatusUpdate` | function | - | Callback pour mises à jour WebSocket |
307
- | `onExpired` | function | - | Callback quand le QR expire |
308
-
309
- ### Types de Services
310
-
311
- | Type | Nom | Description |
312
- |------|-----|-------------|
313
- | `1` | **KYC** | Vérification d'identité et conformité |
314
- | `2` | **AUTH** | Authentification utilisateur |
315
- | `3` | **SIGNATURE** | Signature électronique (non supporté par l'API) |
316
-
317
- ### Événements WebSocket
318
-
319
- ```javascript
320
- const sunuid = initSunuID({
321
- // ... configuration
322
- onSuccess: function(data) {
323
- console.log('✅ Authentification réussie:', data);
324
- // data contient: token, user, service_id, etc.
325
- },
326
- onError: function(error) {
327
- console.error('❌ Erreur:', error);
328
- // error contient: message, code, details
329
- },
330
- onStatusUpdate: function(data) {
331
- console.log('📱 Mise à jour statut:', data);
332
- // Mise à jour reçue via WebSocket
333
- },
334
- onExpired: function(data) {
335
- console.log('⏰ QR expiré:', data);
336
- // QR expiré, actualisation automatique
337
- }
338
- });
339
- ```
340
-
341
- ## 📱 API Référence
342
-
343
- ### Méthodes principales
344
-
345
- #### `generateQR(containerId, options)`
346
- Génère un QR code avec le type configuré et émet un événement WebSocket.
146
+ ## 🔍 Gestion des erreurs
347
147
 
348
- ```javascript
349
- const result = await sunuid.generateQR('container-id', {
350
- metadata: {
351
- customData: 'votre-donnée',
352
- timestamp: Date.now()
353
- }
354
- });
148
+ Le SDK utilise des exceptions spécifiques :
355
149
 
356
- console.log('QR généré:', result.qrCodeUrl);
357
- console.log('Service ID:', result.service_id);
358
- ```
359
-
360
- #### `generateKYCQR(containerId, options)` (Alias)
361
- Génère un QR code KYC (type 1).
150
+ ```php
151
+ use SunuID\Exception\SunuIDException;
362
152
 
363
- ```javascript
364
- sunuid.generateKYCQR('container-id', {
365
- theme: 'light',
366
- kycType: 'full', // 'basic' ou 'full'
367
- requiredFields: ['identity', 'address', 'phone'],
368
- redirectUrl: 'https://votre-site.com/kyc-complete'
369
- });
153
+ try {
154
+ $sunuid = new SunuID($config);
155
+ $sunuid->init();
156
+ $qrResult = $sunuid->generateQR();
157
+
158
+ } catch (SunuIDException $e) {
159
+ echo "Erreur SunuID: " . $e->getMessage() . "\n";
160
+ echo "Code d'erreur: " . $e->getErrorCode() . "\n";
161
+ echo "Contexte: " . json_encode($e->getContext()) . "\n";
162
+
163
+ } catch (Exception $e) {
164
+ echo "Erreur générale: " . $e->getMessage() . "\n";
165
+ }
370
166
  ```
371
167
 
372
- #### `generateAuthQR(containerId, options)` (Alias)
373
- Génère un QR code d'authentification (type 2).
168
+ ### Types d'exceptions
374
169
 
375
- ```javascript
376
- sunuid.generateAuthQR('container-id', {
377
- theme: 'light',
378
- redirectUrl: 'https://votre-site.com/dashboard',
379
- customData: { /* données personnalisées */ }
380
- });
381
- ```
170
+ - `SunuIDException::invalidConfig()` - Configuration invalide
171
+ - `SunuIDException::initializationFailed()` - Échec d'initialisation
172
+ - `SunuIDException::apiError()` - Erreur API
173
+ - `SunuIDException::qrCodeError()` - Erreur QR code
174
+ - `SunuIDException::authenticationError()` - Erreur d'authentification
175
+ - `SunuIDException::networkError()` - Erreur réseau
382
176
 
383
- #### `generateSignatureQR(containerId, options)` (Alias)
384
- Génère un QR code de signature (type 3) - **Non supporté par l'API**.
177
+ ## 📊 Logging
385
178
 
386
- ```javascript
387
- sunuid.generateSignatureQR('container-id', {
388
- theme: 'dark',
389
- documentId: 'doc-123',
390
- signatureType: 'electronic'
391
- });
392
- ```
393
-
394
- #### `checkQRStatus(serviceId)`
395
- Vérifie le statut d'un QR code.
179
+ Le SDK utilise Monolog pour les logs :
396
180
 
397
- ```javascript
398
- const status = await sunuid.checkQRStatus('service-id-123');
399
- console.log('Statut:', status);
400
- ```
401
-
402
- #### `refreshQR(containerId, options)`
403
- Actualise un QR code.
181
+ ```php
182
+ // Accéder au logger
183
+ $logger = $sunuid->getLogger();
404
184
 
405
- ```javascript
406
- sunuid.refreshQR('container-id', { theme: 'light' });
185
+ // Les logs sont automatiquement écrits dans le fichier configuré
186
+ // Niveau de log configurable : DEBUG, INFO, WARNING, ERROR
407
187
  ```
408
188
 
409
- ### Méthodes WebSocket
410
-
411
- #### `getWebSocketStatus()`
412
- Retourne le statut de la connexion WebSocket.
413
-
414
- ```javascript
415
- const status = sunuid.getWebSocketStatus();
416
- // 'connected', 'disconnected', 'not_initialized'
417
- ```
189
+ ## 🧪 Tests
418
190
 
419
- #### `emitWebSocketEvent(event, data)`
420
- Émet un événement WebSocket personnalisé.
191
+ ### Exécuter les tests
421
192
 
422
- ```javascript
423
- sunuid.emitWebSocketEvent('custom_event', {
424
- message: 'Hello WebSocket!',
425
- timestamp: Date.now(),
426
- serviceId: 'service-id'
427
- });
193
+ ```bash
194
+ composer test
428
195
  ```
429
196
 
430
- #### `forceWebSocketInit()`
431
- Force l'initialisation WebSocket si Socket.IO devient disponible plus tard.
197
+ ### Exemples d'utilisation
432
198
 
433
- ```javascript
434
- sunuid.forceWebSocketInit();
435
- ```
436
-
437
- ### Méthodes de Sécurité
199
+ ```bash
200
+ # Exemple basique
201
+ php examples/basic-usage.php
438
202
 
439
- #### `getSecurityLogs()`
440
- Récupère les logs de sécurité.
203
+ # Exemple QR local
204
+ php examples/local-qr.php
441
205
 
442
- ```javascript
443
- const logs = sunuid.getSecurityLogs();
444
- console.log('Logs de sécurité:', logs);
206
+ # Exemple web
207
+ php -S localhost:8000 examples/web-integration.php
445
208
  ```
446
209
 
447
- #### `clearSecurityLogs()`
448
- Efface les logs de sécurité.
210
+ ## 📚 API Reference
449
211
 
450
- ```javascript
451
- sunuid.clearSecurityLogs();
452
- ```
212
+ ### Méthodes principales
453
213
 
454
- #### `destroy()`
455
- Nettoie les ressources du SDK et ferme la connexion WebSocket.
214
+ #### `__construct(array $config = [])`
215
+ Constructeur du SDK.
456
216
 
457
- ```javascript
458
- sunuid.destroy();
459
- ```
217
+ #### `init(): bool`
218
+ Initialise le SDK. Doit être appelé avant toute autre méthode.
460
219
 
461
- ## 🌐 WebSocket
462
-
463
- ### Connexion Automatique
464
- Le SDK se connecte automatiquement au WebSocket lors de l'initialisation :
465
- - **Serveur :** `wss://samasocket.fayma.sn:9443`
466
- - **Paramètres :** token, type: 'web', userId, username
467
-
468
- ### Événements Reçus
469
- - `qr_status_update` - Mise à jour du statut QR
470
- - `qr_scan_success` - Scan QR réussi
471
- - `qr_expired` - QR expiré
472
-
473
- ### Événements Émis
474
- - `qr_generated` - QR généré (automatique)
475
- - `custom_event` - Événements personnalisés
476
-
477
- ### Gestion des Erreurs
478
- - Tentatives limitées (5 max) si Socket.IO non disponible
479
- - Désactivation automatique après échec
480
- - Logs détaillés pour le debugging
481
-
482
- ## 🛡️ Sécurité
483
-
484
- ### Authentification
485
- Le SDK utilise les clés API pour s'authentifier :
486
- - `clientId` et `secretId` dans le corps des requêtes
487
- - Connexion WebSocket sécurisée avec token
488
- - Mode sécurisé avec tokens temporaires
489
-
490
- ### Validation
491
- - Vérification des paramètres requis
492
- - Validation des URLs de redirection
493
- - Protection contre les attaques CSRF
494
- - Types numériques pour éviter les injections
495
- - Sanitisation des entrées utilisateur
496
- - Logs de sécurité avec obfuscation des credentials
497
-
498
- ### Mode Sécurisé
499
- - Tokens temporaires avec expiration
500
- - Limite de requêtes par token
501
- - Validation côté serveur
502
- - Credentials masqués du code client
503
-
504
- ## 🌐 Compatibilité
505
-
506
- - **Navigateurs** : Chrome 60+, Firefox 55+, Safari 12+, Edge 79+
507
- - **Mobile** : iOS Safari 12+, Chrome Mobile 60+
508
- - **Node.js** : 14.0.0+
509
- - **WebSocket** : Socket.IO 4.7.0+
510
-
511
- ## 📊 Monitoring
512
-
513
- ### Logs
514
- Le SDK génère des logs pour le debugging :
515
- ```javascript
516
- console.log('SunuID SDK initialisé avec succès');
517
- console.log('🌐 WebSocket connecté avec succès');
518
- console.log('📤 Événement WebSocket émis: qr_generated');
519
- console.error('❌ Erreur connexion WebSocket:', error);
520
- ```
220
+ #### `generateQR(string $content = null, array $options = []): array`
221
+ Génère un QR code via l'API SunuID.
521
222
 
522
- ### Logs de Sécurité
523
- ```javascript
524
- // Logs automatiques avec obfuscation
525
- 🔒 [SECURITY] SDK_INIT_START
526
- 🔒 [SECURITY] SECURE_INIT_SUCCESS
527
- 🔒 [SECURITY] API_REQUEST_START
528
- 🔒 [SECURITY] API_REQUEST_SUCCESS
529
- ```
223
+ #### `generateQRLocal(string $content, array $options = []): array`
224
+ Génère un QR code local sans API.
530
225
 
531
- ### Métriques
532
- Les partenaires peuvent suivre :
533
- - Nombre de QR codes générés
534
- - Taux de succès d'authentification
535
- - Temps de réponse de l'API
536
- - Statut des connexions WebSocket
537
- - Utilisation du mode sécurisé
538
-
539
- ## 🆘 Support
540
-
541
- ### Documentation
542
- - [Guide d'intégration](https://docs.sunuid.sn)
543
- - [API Reference](https://api.sunuid.sn/docs)
544
- - [Exemples](https://github.com/sunuid/sdk-examples)
545
- - [Guide de sécurité](SECURITY_GUIDE.md)
546
- - [Guide d'initialisation sécurisée](SECURE_INIT_GUIDE.md)
547
-
548
- ### Support technique
549
- - Email : support@sunuid.sn
550
- - Chat : https://chat.sunuid.sn
551
- - Documentation : https://docs.sunuid.sn
552
-
553
- ### Communauté
554
- - [GitHub Issues](https://github.com/sunuid/sunuid-sdk/issues)
555
- - [Discussions](https://github.com/sunuid/sunuid-sdk/discussions)
556
- - [Stack Overflow](https://stackoverflow.com/questions/tagged/sunuid)
226
+ #### `checkQRStatus(string $sessionId): array`
227
+ Vérifie le statut d'un QR code.
557
228
 
558
- ## 🤝 Contribution
229
+ ### Méthodes utilitaires
559
230
 
560
- Les contributions sont les bienvenues ! Consultez notre [guide de contribution](CONTRIBUTING.md).
231
+ #### `getConfig(): array`
232
+ Retourne la configuration actuelle.
561
233
 
562
- ### Développement
234
+ #### `getPartnerInfo(): array`
235
+ Retourne les informations du partenaire.
563
236
 
564
- ```bash
565
- # Cloner le repository
566
- git clone https://github.com/sunuid/sunuid-sdk.git
567
- cd sunuid-sdk
237
+ #### `isInitialized(): bool`
238
+ Vérifie si le SDK est initialisé.
568
239
 
569
- # Installer les dépendances
570
- npm install
240
+ #### `getLogger(): Logger`
241
+ Retourne l'instance du logger.
571
242
 
572
- # Démarrer le mode développement
573
- npm run dev
243
+ ## 🔒 Sécurité
574
244
 
575
- # Construire pour la production
576
- npm run build
245
+ - Les credentials sont automatiquement obfusqués dans les logs
246
+ - Validation stricte des paramètres d'entrée
247
+ - Support de l'initialisation sécurisée
248
+ - Gestion des timeouts et retry automatique
249
+ - Protection contre les injections
577
250
 
578
- # Lancer les tests
579
- npm test
251
+ ## 🌐 Support
580
252
 
581
- # Démarrer le serveur de démonstration
582
- npm run serve
583
- npm run demo
584
- ```
253
+ - **Documentation** : https://docs.sunuid.sn
254
+ - **Issues** : https://github.com/sunuid/php-sdk/issues
255
+ - **Email** : dev@sunuid.sn
585
256
 
586
257
  ## 📄 Licence
587
258
 
588
- Ce projet est distribué sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
259
+ Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
589
260
 
590
- ## 🙏 Remerciements
261
+ ## 🤝 Contribution
591
262
 
592
- - [FontAwesome](https://fontawesome.com/) pour les icônes
593
- - [Inter](https://rsms.me/inter/) pour la typographie
594
- - [Rollup](https://rollupjs.org/) pour le bundling
595
- - [Socket.IO](https://socket.io/) pour les WebSockets
596
- - [Endroid QR Code](https://github.com/endroid/qr-code) pour la génération QR
263
+ Les contributions sont les bienvenues ! Veuillez :
597
264
 
598
- ---
265
+ 1. Fork le projet
266
+ 2. Créer une branche pour votre fonctionnalité
267
+ 3. Commiter vos changements
268
+ 4. Pousser vers la branche
269
+ 5. Ouvrir une Pull Request
599
270
 
600
- **Développé avec ❤️ par l'équipe SunuID**
271
+ ## 📋 Changelog
601
272
 
602
- [![SunuID](https://sunuid.sn/logo.png)](https://sunuid.sn)
273
+ Voir le fichier [CHANGELOG.md](CHANGELOG.md) pour l'historique des versions.