sunuid-sdk 1.0.35 → 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/LICENSE +1 -1
- package/README.md +183 -512
- package/dist/sunuid-sdk.esm.js +36 -11
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +36 -11
- package/dist/sunuid-sdk.js.map +1 -1
- package/dist/sunuid-sdk.min.js +1 -1
- package/dist/sunuid-sdk.min.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,602 +1,273 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SunuID PHP SDK
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](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
|
|
7
|
+
### Via Composer (recommandé)
|
|
27
8
|
|
|
28
9
|
```bash
|
|
29
|
-
|
|
10
|
+
composer require sunuid/php-sdk
|
|
30
11
|
```
|
|
31
12
|
|
|
32
|
-
###
|
|
13
|
+
### Installation manuelle
|
|
33
14
|
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
21
|
+
## 📋 Prérequis
|
|
93
22
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
23
|
+
- PHP >= 7.4
|
|
24
|
+
- Composer
|
|
25
|
+
- Extensions PHP : `curl`, `json`, `openssl`
|
|
97
26
|
|
|
98
|
-
|
|
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
|
-
###
|
|
29
|
+
### Configuration de base
|
|
111
30
|
|
|
112
|
-
```
|
|
113
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
126
|
-
|
|
42
|
+
$sunuid = new SunuID($config);
|
|
43
|
+
$sunuid->init();
|
|
127
44
|
```
|
|
128
45
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
### Configuration PHP
|
|
46
|
+
### Options de configuration
|
|
132
47
|
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
//
|
|
161
|
-
$
|
|
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
|
-
$
|
|
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
|
-
|
|
176
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
###
|
|
97
|
+
### Vérification du statut
|
|
202
98
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
###
|
|
105
|
+
### Intégration web
|
|
208
106
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
107
|
+
```php
|
|
108
|
+
<?php
|
|
109
|
+
require_once 'vendor/autoload.php';
|
|
212
110
|
|
|
213
|
-
|
|
111
|
+
use SunuID\SunuID;
|
|
214
112
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
113
|
+
$config = [
|
|
114
|
+
'client_id' => 'VOTRE_CLIENT_ID',
|
|
115
|
+
'secret_id' => 'VOTRE_SECRET_ID',
|
|
116
|
+
'type' => 2
|
|
117
|
+
];
|
|
220
118
|
|
|
221
|
-
|
|
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
|
|
129
|
+
<html>
|
|
226
130
|
<head>
|
|
227
|
-
<
|
|
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
|
-
|
|
235
|
-
<h1>
|
|
236
|
-
<
|
|
237
|
-
|
|
238
|
-
<
|
|
239
|
-
|
|
240
|
-
<
|
|
241
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
357
|
-
|
|
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
|
-
|
|
364
|
-
sunuid
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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
|
-
|
|
373
|
-
Génère un QR code d'authentification (type 2).
|
|
168
|
+
### Types d'exceptions
|
|
374
169
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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
|
-
|
|
384
|
-
Génère un QR code de signature (type 3) - **Non supporté par l'API**.
|
|
177
|
+
## 📊 Logging
|
|
385
178
|
|
|
386
|
-
|
|
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
|
-
```
|
|
398
|
-
|
|
399
|
-
|
|
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
|
-
|
|
406
|
-
|
|
185
|
+
// Les logs sont automatiquement écrits dans le fichier configuré
|
|
186
|
+
// Niveau de log configurable : DEBUG, INFO, WARNING, ERROR
|
|
407
187
|
```
|
|
408
188
|
|
|
409
|
-
|
|
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
|
-
|
|
420
|
-
Émet un événement WebSocket personnalisé.
|
|
191
|
+
### Exécuter les tests
|
|
421
192
|
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
message: 'Hello WebSocket!',
|
|
425
|
-
timestamp: Date.now(),
|
|
426
|
-
serviceId: 'service-id'
|
|
427
|
-
});
|
|
193
|
+
```bash
|
|
194
|
+
composer test
|
|
428
195
|
```
|
|
429
196
|
|
|
430
|
-
|
|
431
|
-
Force l'initialisation WebSocket si Socket.IO devient disponible plus tard.
|
|
197
|
+
### Exemples d'utilisation
|
|
432
198
|
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
### Méthodes de Sécurité
|
|
199
|
+
```bash
|
|
200
|
+
# Exemple basique
|
|
201
|
+
php examples/basic-usage.php
|
|
438
202
|
|
|
439
|
-
|
|
440
|
-
|
|
203
|
+
# Exemple QR local
|
|
204
|
+
php examples/local-qr.php
|
|
441
205
|
|
|
442
|
-
|
|
443
|
-
|
|
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
|
-
|
|
448
|
-
Efface les logs de sécurité.
|
|
210
|
+
## 📚 API Reference
|
|
449
211
|
|
|
450
|
-
|
|
451
|
-
sunuid.clearSecurityLogs();
|
|
452
|
-
```
|
|
212
|
+
### Méthodes principales
|
|
453
213
|
|
|
454
|
-
#### `
|
|
455
|
-
|
|
214
|
+
#### `__construct(array $config = [])`
|
|
215
|
+
Constructeur du SDK.
|
|
456
216
|
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
```
|
|
217
|
+
#### `init(): bool`
|
|
218
|
+
Initialise le SDK. Doit être appelé avant toute autre méthode.
|
|
460
219
|
|
|
461
|
-
|
|
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
|
-
|
|
523
|
-
|
|
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
|
-
|
|
532
|
-
|
|
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
|
-
|
|
229
|
+
### Méthodes utilitaires
|
|
559
230
|
|
|
560
|
-
|
|
231
|
+
#### `getConfig(): array`
|
|
232
|
+
Retourne la configuration actuelle.
|
|
561
233
|
|
|
562
|
-
|
|
234
|
+
#### `getPartnerInfo(): array`
|
|
235
|
+
Retourne les informations du partenaire.
|
|
563
236
|
|
|
564
|
-
|
|
565
|
-
|
|
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
|
-
|
|
570
|
-
|
|
240
|
+
#### `getLogger(): Logger`
|
|
241
|
+
Retourne l'instance du logger.
|
|
571
242
|
|
|
572
|
-
|
|
573
|
-
npm run dev
|
|
243
|
+
## 🔒 Sécurité
|
|
574
244
|
|
|
575
|
-
|
|
576
|
-
|
|
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
|
-
|
|
579
|
-
npm test
|
|
251
|
+
## 🌐 Support
|
|
580
252
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
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
|
|
259
|
+
Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
|
|
589
260
|
|
|
590
|
-
##
|
|
261
|
+
## 🤝 Contribution
|
|
591
262
|
|
|
592
|
-
|
|
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
|
-
|
|
271
|
+
## 📋 Changelog
|
|
601
272
|
|
|
602
|
-
[
|
|
273
|
+
Voir le fichier [CHANGELOG.md](CHANGELOG.md) pour l'historique des versions.
|