cinetpay-seamless 0.1.2 → 0.1.3
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 +49 -1
- package/dist/checkout.d.ts +16 -0
- package/dist/checkout.d.ts.map +1 -1
- package/dist/cinetpay-seamless.js +253 -176
- package/dist/cinetpay-seamless.js.map +1 -1
- package/dist/cinetpay-seamless.umd.cjs +2 -2
- package/dist/cinetpay-seamless.umd.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -152,6 +152,9 @@ Ouvre la popup de paiement CinetPay.
|
|
|
152
152
|
| Option | Type | Default | Description |
|
|
153
153
|
|---|---|---|---|
|
|
154
154
|
| `paymentToken` | `string` | **requis** | Token obtenu via votre backend (`POST /v1/payment`) |
|
|
155
|
+
| `statusUrl` | `string \| (ctx) => string` | - | Endpoint de votre backend pour vérifier le statut canonique |
|
|
156
|
+
| `checkStatus` | `(ctx) => Promise<object>` | - | Fonction personnalisée de vérification statut |
|
|
157
|
+
| `statusPollInterval` | `number` | `3000` | Intervalle de vérification statut en ms |
|
|
155
158
|
| `debug` | `boolean` | `false` | Logs console `[CinetPay Seamless]` |
|
|
156
159
|
| `onReady` | `() => void` | - | Iframe chargée |
|
|
157
160
|
| `onPaymentSuccess` | `(data) => void` | - | Paiement accepté |
|
|
@@ -190,6 +193,8 @@ Ferme la popup et l'overlay.
|
|
|
190
193
|
amount: number
|
|
191
194
|
currency: string
|
|
192
195
|
status: 'ACCEPTED' | 'REFUSED' | 'PENDING' | 'INITIATED' | 'EXPIRED' | 'UNKNOWN'
|
|
196
|
+
rawStatus?: string
|
|
197
|
+
apiCode?: number
|
|
193
198
|
paymentMethod: string
|
|
194
199
|
description: string
|
|
195
200
|
transactionId: string
|
|
@@ -199,6 +204,46 @@ Ferme la popup et l'overlay.
|
|
|
199
204
|
}
|
|
200
205
|
```
|
|
201
206
|
|
|
207
|
+
### Vérification statut recommandée
|
|
208
|
+
|
|
209
|
+
Le checkout CinetPay peut finaliser le paiement sans envoyer de `postMessage`
|
|
210
|
+
au parent navigateur. Pour fiabiliser `onPaymentSuccess` et `onPaymentFailed`,
|
|
211
|
+
fournissez un endpoint backend qui vérifie le statut canonique auprès de CinetPay.
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
CinetPaySeamless.open({
|
|
215
|
+
paymentToken,
|
|
216
|
+
statusUrl: `/api/cinetpay/status?transactionId=${merchantTransactionId}`,
|
|
217
|
+
statusPollInterval: 3000,
|
|
218
|
+
onPaymentSuccess: (data) => {
|
|
219
|
+
console.log('Paiement accepté', data.transactionId)
|
|
220
|
+
},
|
|
221
|
+
onPaymentFailed: (data) => {
|
|
222
|
+
console.log('Paiement refusé', data.rawStatus)
|
|
223
|
+
},
|
|
224
|
+
})
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Votre endpoint backend doit appeler `GET /v1/payment/{merchant_transaction_id}`
|
|
228
|
+
avec vos clés CinetPay, puis renvoyer la réponse JSON au frontend :
|
|
229
|
+
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"code": 100,
|
|
233
|
+
"status": "SUCCESS",
|
|
234
|
+
"merchant_transaction_id": "ORDER-123",
|
|
235
|
+
"transaction_id": "27ba5590f3ae4c6f9585ae1e4f5265dd"
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Le SDK normalise automatiquement :
|
|
240
|
+
|
|
241
|
+
| Statut CinetPay | Event Seamless |
|
|
242
|
+
|---|---|
|
|
243
|
+
| `SUCCESS` / code `100` | `payment.success` |
|
|
244
|
+
| `FAILED` / `INSUFFICIENT_BALANCE` / code `2010` / `2005` | `payment.failed` |
|
|
245
|
+
| `INITIATED` / `PENDING` / `EXPIRED` | `payment.pending` |
|
|
246
|
+
|
|
202
247
|
## Exemples d'intégration
|
|
203
248
|
|
|
204
249
|
> Le Seamless a besoin d'un `paymentToken` obtenu côté serveur. Les exemples ci-dessous
|
|
@@ -639,12 +684,15 @@ flowchart LR
|
|
|
639
684
|
B -->|"paymentToken"| F
|
|
640
685
|
F -->|"popup"| D["CinetPay Checkout"]
|
|
641
686
|
D -->|"webhook"| B
|
|
642
|
-
D -->|"postMessage"| F
|
|
687
|
+
D -->|"postMessage si disponible"| F
|
|
688
|
+
F -->|"GET /api/cinetpay/status"| B
|
|
689
|
+
B -->|"GET /v1/payment/{id}"| C
|
|
643
690
|
```
|
|
644
691
|
|
|
645
692
|
### Autres protections
|
|
646
693
|
|
|
647
694
|
- **postMessage** : whitelist stricte des domaines CinetPay (bloque les domaines lookalike)
|
|
695
|
+
- **statusUrl recommandé** : vérification canonique via votre backend si `postMessage` final absent
|
|
648
696
|
- **paymentToken validé** : regex `[a-zA-Z0-9_-]{10,128}` avant injection dans l'URL
|
|
649
697
|
- **Popup bloquée** : détection et callback `onError` avec code `POPUP_BLOCKED`
|
|
650
698
|
- **Zero dépendance** runtime — aucun risque supply chain
|
package/dist/checkout.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { PaymentResponse, PaymentError } from './types';
|
|
2
2
|
import { Logger } from './logger';
|
|
3
3
|
import { EventEmitter } from './emitter';
|
|
4
|
+
type StatusChecker = () => Promise<unknown>;
|
|
4
5
|
/** @internal Options du constructeur Checkout */
|
|
5
6
|
export interface CheckoutOptions {
|
|
6
7
|
onReady?: () => void;
|
|
@@ -11,6 +12,8 @@ export interface CheckoutOptions {
|
|
|
11
12
|
status: string;
|
|
12
13
|
}) => void;
|
|
13
14
|
onError?: (error: PaymentError) => void;
|
|
15
|
+
statusChecker?: StatusChecker;
|
|
16
|
+
statusPollInterval?: number;
|
|
14
17
|
logger: Logger;
|
|
15
18
|
emitter: EventEmitter;
|
|
16
19
|
}
|
|
@@ -30,9 +33,14 @@ export declare class Checkout {
|
|
|
30
33
|
private overlay;
|
|
31
34
|
private popup;
|
|
32
35
|
private pollTimer;
|
|
36
|
+
private statusTimer;
|
|
33
37
|
private closeTimer;
|
|
34
38
|
private messageHandler;
|
|
35
39
|
private lastStatus;
|
|
40
|
+
private lastDispatchKey;
|
|
41
|
+
private finalStatusDispatched;
|
|
42
|
+
private statusCheckInFlight;
|
|
43
|
+
private isClosing;
|
|
36
44
|
private previousBodyOverflow;
|
|
37
45
|
private onReadyCallback?;
|
|
38
46
|
private onPaymentSuccessCallback?;
|
|
@@ -40,6 +48,8 @@ export declare class Checkout {
|
|
|
40
48
|
private onPaymentPendingCallback?;
|
|
41
49
|
private onCloseCallback?;
|
|
42
50
|
private onErrorCallback?;
|
|
51
|
+
private statusChecker?;
|
|
52
|
+
private statusPollInterval;
|
|
43
53
|
private logger;
|
|
44
54
|
private emitter;
|
|
45
55
|
constructor(options: CheckoutOptions);
|
|
@@ -53,6 +63,7 @@ export declare class Checkout {
|
|
|
53
63
|
* Ferme la popup et l'overlay.
|
|
54
64
|
*/
|
|
55
65
|
close(): void;
|
|
66
|
+
private finishClose;
|
|
56
67
|
private static isRecord;
|
|
57
68
|
private static childRecords;
|
|
58
69
|
private static findValue;
|
|
@@ -60,6 +71,7 @@ export declare class Checkout {
|
|
|
60
71
|
private static asNumber;
|
|
61
72
|
private static asOptionalNumber;
|
|
62
73
|
private static normalizeStatus;
|
|
74
|
+
private static isFinalStatus;
|
|
63
75
|
private static buildPaymentResponse;
|
|
64
76
|
/** Dispatche la réponse vers le bon callback selon le statut. */
|
|
65
77
|
private dispatchResponse;
|
|
@@ -75,9 +87,13 @@ export declare class Checkout {
|
|
|
75
87
|
*/
|
|
76
88
|
private startPolling;
|
|
77
89
|
private stopPolling;
|
|
90
|
+
private startStatusPolling;
|
|
91
|
+
private stopStatusPolling;
|
|
92
|
+
private checkStatus;
|
|
78
93
|
/** Origines autorisées pour les messages postMessage */
|
|
79
94
|
private static readonly ALLOWED_ORIGINS;
|
|
80
95
|
/** Écoute les messages postMessage de la popup CinetPay. */
|
|
81
96
|
private listenForMessages;
|
|
82
97
|
}
|
|
98
|
+
export {};
|
|
83
99
|
//# sourceMappingURL=checkout.d.ts.map
|
package/dist/checkout.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../src/checkout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAiB,MAAM,SAAS,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,YAAY,CAAA;CACtB;
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../src/checkout.ts"],"names":[],"mappings":"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"}
|