@mostajs/payment 0.5.3 → 0.7.0
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 +45 -0
- package/dist/core/abstract-provider.d.ts +22 -0
- package/dist/core/abstract-provider.d.ts.map +1 -0
- package/dist/core/abstract-provider.js +54 -0
- package/dist/core/abstract-provider.js.map +1 -0
- package/dist/core/auto-register.d.ts +28 -0
- package/dist/core/auto-register.d.ts.map +1 -0
- package/dist/core/auto-register.js +99 -0
- package/dist/core/auto-register.js.map +1 -0
- package/dist/core/checkout-service.d.ts +70 -0
- package/dist/core/checkout-service.d.ts.map +1 -0
- package/dist/core/checkout-service.js +107 -0
- package/dist/core/checkout-service.js.map +1 -0
- package/dist/lib/webhook-helpers.d.ts +1 -1
- package/dist/lib/webhook-helpers.d.ts.map +1 -1
- package/dist/lib/webhook-helpers.js +10 -1
- package/dist/lib/webhook-helpers.js.map +1 -1
- package/dist/providers/chargily.provider.d.ts +5 -4
- package/dist/providers/chargily.provider.d.ts.map +1 -1
- package/dist/providers/chargily.provider.js +5 -3
- package/dist/providers/chargily.provider.js.map +1 -1
- package/dist/providers/guiddini.provider.d.ts +38 -0
- package/dist/providers/guiddini.provider.d.ts.map +1 -0
- package/dist/providers/guiddini.provider.js +126 -0
- package/dist/providers/guiddini.provider.js.map +1 -0
- package/dist/providers/manual.provider.d.ts +5 -4
- package/dist/providers/manual.provider.d.ts.map +1 -1
- package/dist/providers/manual.provider.js +14 -4
- package/dist/providers/manual.provider.js.map +1 -1
- package/dist/providers/paypal.provider.d.ts +5 -4
- package/dist/providers/paypal.provider.d.ts.map +1 -1
- package/dist/providers/paypal.provider.js +5 -3
- package/dist/providers/paypal.provider.js.map +1 -1
- package/dist/providers/satim.provider.d.ts +17 -4
- package/dist/providers/satim.provider.d.ts.map +1 -1
- package/dist/providers/satim.provider.js +82 -14
- package/dist/providers/satim.provider.js.map +1 -1
- package/dist/providers/slickpay.provider.d.ts +37 -0
- package/dist/providers/slickpay.provider.d.ts.map +1 -0
- package/dist/providers/slickpay.provider.js +121 -0
- package/dist/providers/slickpay.provider.js.map +1 -0
- package/dist/providers/stripe.provider.d.ts +5 -4
- package/dist/providers/stripe.provider.d.ts.map +1 -1
- package/dist/providers/stripe.provider.js +5 -3
- package/dist/providers/stripe.provider.js.map +1 -1
- package/dist/schemas/payment.schema.d.ts.map +1 -1
- package/dist/schemas/payment.schema.js +5 -0
- package/dist/schemas/payment.schema.js.map +1 -1
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/llms.txt +118 -0
- package/package.json +3 -2
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { CheckoutParams, CheckoutResult, WebhookEvent } from '../core/provider.interface.js';
|
|
2
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
3
|
+
export interface SlickPayConfig {
|
|
4
|
+
publicKey: string;
|
|
5
|
+
testMode?: boolean;
|
|
6
|
+
/** Base API (sans slash final). Défaut test/prod v2. */
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
/** Chemin de création d'invoice. Défaut '/users/invoices'. */
|
|
9
|
+
invoicePath?: string;
|
|
10
|
+
/** URL de retour par défaut si non fournie au checkout. */
|
|
11
|
+
returnUrl?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class SlickPayProvider extends AbstractPaymentProvider {
|
|
14
|
+
private config;
|
|
15
|
+
readonly name = "slickpay";
|
|
16
|
+
readonly supportedCurrencies: string[];
|
|
17
|
+
readonly supportedMethods: string[];
|
|
18
|
+
private baseUrl;
|
|
19
|
+
private invoicePath;
|
|
20
|
+
constructor(config: SlickPayConfig);
|
|
21
|
+
private headers;
|
|
22
|
+
/** URL de retour avec orderId propagé (matching au retour). */
|
|
23
|
+
private returnWithOrder;
|
|
24
|
+
protected doCheckout(params: CheckoutParams): Promise<CheckoutResult>;
|
|
25
|
+
/** Statut d'une invoice par id (confirmation serveur). */
|
|
26
|
+
getInvoice(id: string): Promise<Record<string, unknown>>;
|
|
27
|
+
/** Mappe un statut SlickPay vers un type d'event normalisé (pur, testable). */
|
|
28
|
+
static mapStatus(raw: Record<string, any>): string;
|
|
29
|
+
protected doVerifyWebhook(body: string, _signature: string): Promise<WebhookEvent>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Crée un provider SlickPay depuis l'environnement (cascade @mostajs/config).
|
|
33
|
+
* Env : SLICKPAY_PUBLIC_KEY, SLICKPAY_TEST_MODE, SLICKPAY_BASE_URL,
|
|
34
|
+
* SLICKPAY_INVOICE_PATH, SLICKPAY_RETURN_URL.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createSlickPayProvider(config?: Partial<SlickPayConfig>): SlickPayProvider;
|
|
37
|
+
//# sourceMappingURL=slickpay.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slickpay.provider.d.ts","sourceRoot":"","sources":["../../src/providers/slickpay.provider.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGtE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,gBAAiB,SAAQ,uBAAuB;IAQ/C,OAAO,CAAC,MAAM;IAP1B,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,mBAAmB,WAAU;IACtC,QAAQ,CAAC,gBAAgB,WAAsB;IAE/C,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAQ;gBAEP,MAAM,EAAE,cAAc;IAQ1C,OAAO,CAAC,OAAO;IAQf,+DAA+D;IAC/D,OAAO,CAAC,eAAe;cAKP,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAqB3E,0DAA0D;IACpD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM9D,+EAA+E;IAC/E,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;cASlC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAyBzF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,gBAAgB,CAQzF"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// @mostajs/payment — SlickPay provider (agrégateur Algérie : CIB + EDAHABIA via SATIM)
|
|
2
|
+
// Author: Dr Hamid MADANI <drmdh@msn.com>
|
|
3
|
+
// Ref: https://developers.slick-pay.com/ · SDK npm @slick-pay-algeria/slickpay-npm
|
|
4
|
+
//
|
|
5
|
+
// API v2 : auth par clé publique (Bearer), création d'« invoice » qui redirige le
|
|
6
|
+
// payeur vers la page de paiement, puis confirmation par interrogation du statut.
|
|
7
|
+
// Les chemins/URL sont PILOTABLES PAR ENV (corrigeables sans toucher au code, §10)
|
|
8
|
+
// — valeurs par défaut conformes à la doc v2, à confirmer en certification GIE.
|
|
9
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
10
|
+
import { getEnv } from '@mostajs/config';
|
|
11
|
+
export class SlickPayProvider extends AbstractPaymentProvider {
|
|
12
|
+
config;
|
|
13
|
+
name = 'slickpay';
|
|
14
|
+
supportedCurrencies = ['DZD'];
|
|
15
|
+
supportedMethods = ['cib', 'edahabia'];
|
|
16
|
+
baseUrl;
|
|
17
|
+
invoicePath;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
super();
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.baseUrl = config.baseUrl ?? (config.testMode
|
|
22
|
+
? 'https://devapi.slick-pay.com/api/v2'
|
|
23
|
+
: 'https://prodapi.slick-pay.com/api/v2');
|
|
24
|
+
this.invoicePath = config.invoicePath ?? '/users/invoices';
|
|
25
|
+
}
|
|
26
|
+
headers() {
|
|
27
|
+
return {
|
|
28
|
+
'Authorization': `Bearer ${this.config.publicKey}`,
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
'Accept': 'application/json',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** URL de retour avec orderId propagé (matching au retour). */
|
|
34
|
+
returnWithOrder(url, orderId) {
|
|
35
|
+
const sep = url.includes('?') ? '&' : '?';
|
|
36
|
+
return `${url}${sep}orderId=${encodeURIComponent(orderId)}`;
|
|
37
|
+
}
|
|
38
|
+
async doCheckout(params) {
|
|
39
|
+
const url = this.returnWithOrder(params.successUrl ?? this.config.returnUrl ?? '/', params.orderId);
|
|
40
|
+
const res = await fetch(`${this.baseUrl}${this.invoicePath}`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: this.headers(),
|
|
43
|
+
body: JSON.stringify({
|
|
44
|
+
amount: params.amount, // DZD (montant réel, pas centimes)
|
|
45
|
+
url, // retour navigateur après paiement
|
|
46
|
+
webhook_url: params.webhookUrl, // notification serveur (si supporté)
|
|
47
|
+
note: params.description ?? `Commande ${params.orderId}`,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
if (!res.ok) {
|
|
51
|
+
const err = await res.json().catch(() => ({}));
|
|
52
|
+
throw new Error(`[slickpay] Checkout failed: ${err.message ?? res.statusText}`);
|
|
53
|
+
}
|
|
54
|
+
const data = await res.json();
|
|
55
|
+
// v2 : { success, url|redirect_url, id }
|
|
56
|
+
return { url: data.url ?? data.redirect_url ?? null, sessionId: String(data.id ?? data.uuid ?? '') };
|
|
57
|
+
}
|
|
58
|
+
/** Statut d'une invoice par id (confirmation serveur). */
|
|
59
|
+
async getInvoice(id) {
|
|
60
|
+
const res = await fetch(`${this.baseUrl}${this.invoicePath}/${id}`, { headers: this.headers() });
|
|
61
|
+
if (!res.ok)
|
|
62
|
+
throw new Error(`[slickpay] Get invoice failed: ${res.statusText}`);
|
|
63
|
+
return res.json();
|
|
64
|
+
}
|
|
65
|
+
/** Mappe un statut SlickPay vers un type d'event normalisé (pur, testable). */
|
|
66
|
+
static mapStatus(raw) {
|
|
67
|
+
const v = raw?.completed ?? raw?.status ?? raw?.state;
|
|
68
|
+
const s = String(v).toLowerCase();
|
|
69
|
+
if (v === 1 || v === true || s === 'completed' || s === 'paid' || s === 'success')
|
|
70
|
+
return 'payment.success';
|
|
71
|
+
if (s === 'failed' || s === 'cancelled' || s === 'canceled' || s === 'declined')
|
|
72
|
+
return 'payment.failed';
|
|
73
|
+
if (s === 'refunded')
|
|
74
|
+
return 'payment.refunded';
|
|
75
|
+
return 'payment.pending';
|
|
76
|
+
}
|
|
77
|
+
async doVerifyWebhook(body, _signature) {
|
|
78
|
+
// SlickPay : confirmation par retour + interrogation statut (pas de HMAC).
|
|
79
|
+
// Accepte un JSON déjà résolu ({orderId,status/completed} — testable hors-ligne)
|
|
80
|
+
// ou un JSON {id} → interrogation API.
|
|
81
|
+
let raw = {};
|
|
82
|
+
try {
|
|
83
|
+
raw = JSON.parse(body);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
raw = Object.fromEntries(new URLSearchParams(body));
|
|
87
|
+
}
|
|
88
|
+
let status = raw;
|
|
89
|
+
const id = raw.id ?? raw.invoice ?? raw.uuid;
|
|
90
|
+
if (raw.completed === undefined && raw.status === undefined && raw.state === undefined && id) {
|
|
91
|
+
status = await this.getInvoice(String(id));
|
|
92
|
+
status = status.data ?? status;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
type: SlickPayProvider.mapStatus(status),
|
|
96
|
+
data: {
|
|
97
|
+
orderId: raw.orderId ?? status.orderId ?? status.merchant_order_id,
|
|
98
|
+
invoiceId: id ?? status.id,
|
|
99
|
+
amount: status.amount,
|
|
100
|
+
currency: 'DZD',
|
|
101
|
+
status: status.completed ?? status.status ?? status.state,
|
|
102
|
+
},
|
|
103
|
+
raw: status,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Crée un provider SlickPay depuis l'environnement (cascade @mostajs/config).
|
|
109
|
+
* Env : SLICKPAY_PUBLIC_KEY, SLICKPAY_TEST_MODE, SLICKPAY_BASE_URL,
|
|
110
|
+
* SLICKPAY_INVOICE_PATH, SLICKPAY_RETURN_URL.
|
|
111
|
+
*/
|
|
112
|
+
export function createSlickPayProvider(config) {
|
|
113
|
+
return new SlickPayProvider({
|
|
114
|
+
publicKey: config?.publicKey ?? getEnv('SLICKPAY_PUBLIC_KEY', ''),
|
|
115
|
+
testMode: config?.testMode ?? getEnv('SLICKPAY_TEST_MODE') !== 'false',
|
|
116
|
+
baseUrl: config?.baseUrl ?? getEnv('SLICKPAY_BASE_URL'),
|
|
117
|
+
invoicePath: config?.invoicePath ?? getEnv('SLICKPAY_INVOICE_PATH'),
|
|
118
|
+
returnUrl: config?.returnUrl ?? getEnv('SLICKPAY_RETURN_URL', '/payment/success'),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=slickpay.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slickpay.provider.js","sourceRoot":"","sources":["../../src/providers/slickpay.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import Stripe from 'stripe';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CheckoutParams, CheckoutResult, CustomerParams, SubscriptionParams, SubscriptionResult, RefundParams, RefundResult, InvoiceResult, WebhookEvent } from '../core/provider.interface.js';
|
|
3
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
3
4
|
export interface StripeConfig {
|
|
4
5
|
secretKey: string;
|
|
5
6
|
webhookSecret?: string;
|
|
6
7
|
}
|
|
7
|
-
export declare class StripeProvider
|
|
8
|
+
export declare class StripeProvider extends AbstractPaymentProvider {
|
|
8
9
|
private config;
|
|
9
10
|
readonly name = "stripe";
|
|
10
11
|
readonly supportedCurrencies: string[];
|
|
11
12
|
readonly supportedMethods: string[];
|
|
12
13
|
stripe: Stripe;
|
|
13
14
|
constructor(config: StripeConfig);
|
|
14
|
-
|
|
15
|
+
protected doCheckout(params: CheckoutParams): Promise<CheckoutResult>;
|
|
15
16
|
createCustomer(params: CustomerParams): Promise<string>;
|
|
16
17
|
getCustomer(customerId: string): Promise<Record<string, unknown>>;
|
|
17
18
|
updateCustomer(customerId: string, params: Partial<CustomerParams>): Promise<Record<string, unknown>>;
|
|
@@ -27,7 +28,7 @@ export declare class StripeProvider implements PaymentProvider {
|
|
|
27
28
|
createPortal(customerId: string, returnUrl: string): Promise<{
|
|
28
29
|
url: string;
|
|
29
30
|
}>;
|
|
30
|
-
|
|
31
|
+
protected doVerifyWebhook(body: string, signature: string): Promise<WebhookEvent>;
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
34
|
* Create a Stripe provider from environment variables.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripe.provider.d.ts","sourceRoot":"","sources":["../../src/providers/stripe.provider.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"stripe.provider.d.ts","sourceRoot":"","sources":["../../src/providers/stripe.provider.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,OAAO,KAAK,EACV,cAAc,EAAE,cAAc,EAAE,cAAc,EAC9C,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAClE,aAAa,EAAE,YAAY,EAC5B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAEtE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,cAAe,SAAQ,uBAAuB;IAO7C,OAAO,CAAC,MAAM;IAN1B,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,mBAAmB,WAAQ;IACpC,QAAQ,CAAC,gBAAgB,WAAW;IAE7B,MAAM,EAAE,MAAM,CAAA;gBAED,MAAM,EAAE,YAAY;cAQxB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAsCrE,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IASvD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKjE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAWrG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAe3E,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAUpE,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9E,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAa3F,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAezD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAY1E,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgBrE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;cAUnE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAmBxF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,cAAc,CAKnF"}
|
|
@@ -2,20 +2,22 @@
|
|
|
2
2
|
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
3
3
|
import Stripe from 'stripe';
|
|
4
4
|
import { getEnv } from '@mostajs/config';
|
|
5
|
-
|
|
5
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
6
|
+
export class StripeProvider extends AbstractPaymentProvider {
|
|
6
7
|
config;
|
|
7
8
|
name = 'stripe';
|
|
8
9
|
supportedCurrencies = ['*']; // all currencies
|
|
9
10
|
supportedMethods = ['card'];
|
|
10
11
|
stripe;
|
|
11
12
|
constructor(config) {
|
|
13
|
+
super();
|
|
12
14
|
this.config = config;
|
|
13
15
|
if (!config.secretKey)
|
|
14
16
|
throw new Error('[stripe] secretKey is required');
|
|
15
17
|
this.stripe = new Stripe(config.secretKey);
|
|
16
18
|
}
|
|
17
19
|
// ─── Checkout ─────────────────────────────────
|
|
18
|
-
async
|
|
20
|
+
async doCheckout(params) {
|
|
19
21
|
if (params.priceId && params.customerId) {
|
|
20
22
|
// Subscription billing
|
|
21
23
|
const sessionParams = {
|
|
@@ -173,7 +175,7 @@ export class StripeProvider {
|
|
|
173
175
|
return { url: session.url };
|
|
174
176
|
}
|
|
175
177
|
// ─── Webhooks ─────────────────────────────────
|
|
176
|
-
async
|
|
178
|
+
async doVerifyWebhook(body, signature) {
|
|
177
179
|
if (!this.config.webhookSecret)
|
|
178
180
|
throw new Error('[stripe] webhookSecret required for webhook verification');
|
|
179
181
|
const event = this.stripe.webhooks.constructEvent(body, signature, this.config.webhookSecret);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripe.provider.js","sourceRoot":"","sources":["../../src/providers/stripe.provider.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,wCAAwC;AAExC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"stripe.provider.js","sourceRoot":"","sources":["../../src/providers/stripe.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/payment.schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"payment.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/payment.schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,YAAY,CA0Df;AAED,yDAAyD;AACzD,eAAO,MAAM,aAAa,cAAwB,CAAA"}
|
|
@@ -19,10 +19,15 @@ export function createPaymentSchema(options) {
|
|
|
19
19
|
status: { type: 'string', enum: ['pending', 'paid', 'refunded', 'failed'], default: 'pending' },
|
|
20
20
|
transactionRef: { type: 'string' },
|
|
21
21
|
paidAt: { type: 'date' },
|
|
22
|
+
// ── Orchestration v0.6 (createPaymentCheckout / settlePaymentFromWebhook) ──
|
|
23
|
+
orderId: { type: 'string' }, // clé de matching app ↔ webhook
|
|
24
|
+
provider: { type: 'string' }, // dialecte ayant émis le checkout (stripe/chargily/…)
|
|
25
|
+
metadata: { type: 'json' }, // contexte métier (campaignId, planSlug, …)
|
|
22
26
|
},
|
|
23
27
|
relations: {},
|
|
24
28
|
indexes: [
|
|
25
29
|
{ fields: { status: 'asc' } },
|
|
30
|
+
{ fields: { orderId: 'asc' } },
|
|
26
31
|
],
|
|
27
32
|
};
|
|
28
33
|
if (options?.relationTarget) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment.schema.js","sourceRoot":"","sources":["../../src/schemas/payment.schema.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAMnC;IACC,MAAM,MAAM,GAAiB;QAC3B,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE,IAAI;QAEhB,MAAM,EAAE;YACN,MAAM,EAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAClD,QAAQ,EAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE;YACvE,MAAM,EAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;YAC7E,MAAM,EAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE;YACvG,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAClC,MAAM,EAAU,EAAE,IAAI,EAAE,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"payment.schema.js","sourceRoot":"","sources":["../../src/schemas/payment.schema.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export type { PaymentProvider, CheckoutParams, CheckoutResult, CustomerParams, SubscriptionParams, SubscriptionResult, RefundParams, RefundResult, InvoiceResult, WebhookEvent, } from './core/provider.interface.js';
|
|
2
2
|
export { registerProvider, setDefaultProvider, getProvider, listProviders, getProviderForCurrency, resetProviders, } from './core/payment-engine.js';
|
|
3
|
+
export { AbstractPaymentProvider } from './core/abstract-provider.js';
|
|
4
|
+
export { createPaymentCheckout, settlePaymentFromWebhook, } from './core/checkout-service.js';
|
|
5
|
+
export type { CreateCheckoutInput, CreateCheckoutOutput, SettleWebhookInput, SettleWebhookOutput, } from './core/checkout-service.js';
|
|
6
|
+
export { registerProvidersFromEnv, ensureProvidersFromEnv, resetEnsuredProviders, } from './core/auto-register.js';
|
|
7
|
+
export type { AutoRegisterOptions } from './core/auto-register.js';
|
|
3
8
|
export { SatimProvider, createSatimProvider } from './providers/satim.provider.js';
|
|
4
9
|
export type { SatimConfig } from './providers/satim.provider.js';
|
|
5
10
|
export { ChargilyProvider, createChargilyProvider } from './providers/chargily.provider.js';
|
|
@@ -10,6 +15,10 @@ export { StripeProvider, createStripeProvider } from './providers/stripe.provide
|
|
|
10
15
|
export type { StripeConfig } from './providers/stripe.provider.js';
|
|
11
16
|
export { ManualProvider, createManualProvider } from './providers/manual.provider.js';
|
|
12
17
|
export type { ManualConfig } from './providers/manual.provider.js';
|
|
18
|
+
export { SlickPayProvider, createSlickPayProvider } from './providers/slickpay.provider.js';
|
|
19
|
+
export type { SlickPayConfig } from './providers/slickpay.provider.js';
|
|
20
|
+
export { GuiddiniProvider, createGuiddiniProvider } from './providers/guiddini.provider.js';
|
|
21
|
+
export type { GuiddiniConfig } from './providers/guiddini.provider.js';
|
|
13
22
|
export { createStripeClient, createCheckoutSession, handleWebhook, createBillingSession, createPortalSession, handleBillingWebhook, } from './lib/stripe.js';
|
|
14
23
|
export type { WebhookHandlers } from './lib/stripe.js';
|
|
15
24
|
export { getPaymentRepo, resetPaymentRepo } from './lib/payment-factory.js';
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAC/D,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAClE,aAAa,EAAE,YAAY,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC3F,YAAY,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGtD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,YAAY,EACZ,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAC/D,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAClE,aAAa,EAAE,YAAY,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAGrE,OAAO,EACL,qBAAqB,EAAE,wBAAwB,GAChD,MAAM,4BAA4B,CAAA;AACnC,YAAY,EACV,mBAAmB,EAAE,oBAAoB,EACzC,kBAAkB,EAAE,mBAAmB,GACxC,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EACL,wBAAwB,EAAE,sBAAsB,EAAE,qBAAqB,GACxE,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAGlE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC3F,YAAY,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC3F,YAAY,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC3F,YAAY,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAGtE,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGtD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,YAAY,EACZ,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/server.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
// @mostajs/payment v0.3 — Server-side exports
|
|
2
2
|
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
3
3
|
export { registerProvider, setDefaultProvider, getProvider, listProviders, getProviderForCurrency, resetProviders, } from './core/payment-engine.js';
|
|
4
|
+
// ─── Dialecte de paiement : base abstraite (modèle dialect ORM) — v0.6 ───
|
|
5
|
+
export { AbstractPaymentProvider } from './core/abstract-provider.js';
|
|
6
|
+
// ─── Orchestration checkout↔persistance↔webhook — v0.6 ───
|
|
7
|
+
export { createPaymentCheckout, settlePaymentFromWebhook, } from './core/checkout-service.js';
|
|
8
|
+
// Auto-enregistrement des providers depuis l'environnement (v0.5.4+)
|
|
9
|
+
export { registerProvidersFromEnv, ensureProvidersFromEnv, resetEnsuredProviders, } from './core/auto-register.js';
|
|
4
10
|
// ─── Providers ──────────────────────────────────
|
|
5
11
|
export { SatimProvider, createSatimProvider } from './providers/satim.provider.js';
|
|
6
12
|
export { ChargilyProvider, createChargilyProvider } from './providers/chargily.provider.js';
|
|
7
13
|
export { PayPalProvider, createPayPalProvider } from './providers/paypal.provider.js';
|
|
8
14
|
export { StripeProvider, createStripeProvider } from './providers/stripe.provider.js';
|
|
9
15
|
export { ManualProvider, createManualProvider } from './providers/manual.provider.js';
|
|
16
|
+
// Agrégateurs Algérie (CIB/EDAHABIA via SATIM) — v0.7
|
|
17
|
+
export { SlickPayProvider, createSlickPayProvider } from './providers/slickpay.provider.js';
|
|
18
|
+
export { GuiddiniProvider, createGuiddiniProvider } from './providers/guiddini.provider.js';
|
|
10
19
|
// ─── Legacy Stripe functions (backward compat) ─
|
|
11
20
|
export { createStripeClient, createCheckoutSession, handleWebhook, createBillingSession, createPortalSession, handleBillingWebhook, } from './lib/stripe.js';
|
|
12
21
|
// ─── Repository ─────────────────────────────────
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,wCAAwC;AASxC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAEjC,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAGlF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAG3F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,kDAAkD;AAClD,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AAGxB,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3E,mDAAmD;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,wDAAwD;AACxD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AAOjC,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,wCAAwC;AASxC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAEjC,4EAA4E;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAErE,4DAA4D;AAC5D,OAAO,EACL,qBAAqB,EAAE,wBAAwB,GAChD,MAAM,4BAA4B,CAAA;AAMnC,qEAAqE;AACrE,OAAO,EACL,wBAAwB,EAAE,sBAAsB,EAAE,qBAAqB,GACxE,MAAM,yBAAyB,CAAA;AAGhC,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAGlF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAG3F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,sDAAsD;AACtD,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAG3F,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAG3F,kDAAkD;AAClD,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AAGxB,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3E,mDAAmD;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,wDAAwD;AACxD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,0BAA0B,CAAA;AAOjC,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -74,5 +74,9 @@ export interface PaymentDTO {
|
|
|
74
74
|
transactionRef?: string;
|
|
75
75
|
paidAt?: Date;
|
|
76
76
|
orderId?: string;
|
|
77
|
+
/** Nom du dialecte (provider) ayant émis le checkout — v0.6 */
|
|
78
|
+
provider?: string;
|
|
79
|
+
/** Contexte métier propagé au provider et restitué au webhook — v0.6 */
|
|
80
|
+
metadata?: Record<string, unknown>;
|
|
77
81
|
}
|
|
78
82
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;AACtE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAA;AAEpE,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,CAAA;IACzB,gCAAgC;IAChC,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,EAAE;QACT,GAAG,EAAE,MAAM,CAAA;QACX,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,MAAM,WAAW,QAAQ;IACvB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,uBAAuB;IACvB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,wBAAwB;IACxB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iBAAiB,CAAA;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;AACtE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAA;AAEpE,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,CAAA;IACzB,gCAAgC;IAChC,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,EAAE;QACT,GAAG,EAAE,MAAM,CAAA;QACX,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,MAAM,WAAW,QAAQ;IACvB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,uBAAuB;IACvB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,wBAAwB;IACxB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iBAAiB,CAAA;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC"}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# @mostajs/payment — fiche LLM
|
|
2
|
+
> Module de paiement multi-provider (Stripe, Satim/CIB, Chargily, PayPal, Manuel), multi-méthode, multi-devise.
|
|
3
|
+
|
|
4
|
+
- Version: 0.7.0 · Licence: AGPL-3.0-or-later · Auteur: Dr Hamid MADANI <drmdh@msn.com>
|
|
5
|
+
- Chemin: mostajs/mosta-payment · Statut audit: complet (dist/)
|
|
6
|
+
|
|
7
|
+
## RÔLE
|
|
8
|
+
Abstraction unifiée du paiement pour l'écosystème `@mostajs/*`. Un contrat `PaymentProvider` commun couvre **7 dialectes** (Stripe, Satim, Chargily, PayPal, Manuel, **SlickPay**, **Guiddini**). Fournit checkout, webhooks normalisés, billing/abonnements (Stripe), schéma ORM `Payment`, composant React `PaymentPage` et handlers de routes Next.js App Router. Sélection automatique du provider par devise (DZD → Chargily par défaut, autres → Stripe ; cibler SATIM/SlickPay/Guiddini via `providerName`).
|
|
9
|
+
|
|
10
|
+
## MODÈLE DIALECTE (v0.6) — calqué sur @mostajs/orm
|
|
11
|
+
Chaque **fournisseur = un dialecte de paiement**, exactement comme un dialecte ORM :
|
|
12
|
+
- `PaymentProvider` (contrat) ≡ `IDialect`.
|
|
13
|
+
- `AbstractPaymentProvider` (base, v0.6) ≡ `AbstractSqlDialect` : méthodes *template* publiques `createCheckout`/`verifyWebhook` (validation + garantie `metadata.orderId` + garde de devise) qui délèguent aux *primitives* `protected abstract doCheckout`/`doVerifyWebhook`. Les 5 providers l'étendent.
|
|
14
|
+
- `payment-engine` (register/get/forCurrency) ≡ registre des dialectes.
|
|
15
|
+
- **Orchestration** `createPaymentCheckout` / `settlePaymentFromWebhook` (v0.6) ≡ `BaseRepository`/`createConnection` : *utilise* un dialecte + persiste la ligne `Payment` (data-plug), sans réimplémenter la logique fournisseur.
|
|
16
|
+
|
|
17
|
+
## INSTALLATION
|
|
18
|
+
npm i @mostajs/payment stripe
|
|
19
|
+
|
|
20
|
+
## EXPORTS
|
|
21
|
+
Entrée `.` (client + serveur léger) :
|
|
22
|
+
- Composant React: `PaymentPage`
|
|
23
|
+
- Schémas: `PaymentSchema`, `createPaymentSchema`
|
|
24
|
+
- Constante: `moduleInfo`
|
|
25
|
+
- Types: `PaymentConfig`, `PaymentStatus`, `PaymentMethodType`, `LineItem`, `CheckoutRequest`, `CheckoutResult`, `OrderSummary`, `PaymentDTO`, `WebhookHandlers`
|
|
26
|
+
|
|
27
|
+
## EXPORTS PAR SOUS-CHEMIN
|
|
28
|
+
Entrée `@mostajs/payment/server` (serveur uniquement) :
|
|
29
|
+
- Engine: `registerProvider`, `setDefaultProvider`, `getProvider`, `listProviders`, `getProviderForCurrency`, `resetProviders`
|
|
30
|
+
- Dialecte base (v0.6): `AbstractPaymentProvider` (classe abstraite — étendue par les 5 providers)
|
|
31
|
+
- Orchestration (v0.6): `createPaymentCheckout(input)`, `settlePaymentFromWebhook(input)` + types `CreateCheckoutInput`/`CreateCheckoutOutput`/`SettleWebhookInput`/`SettleWebhookOutput`
|
|
32
|
+
- Auto-enregistrement (v0.5.4+): `registerProvidersFromEnv(opts?)`, `ensureProvidersFromEnv(opts?)`, `resetEnsuredProviders()` + type `AutoRegisterOptions`
|
|
33
|
+
- Providers/dialectes (classes + factories env): `StripeProvider`/`createStripeProvider`, `SatimProvider`/`createSatimProvider`, `ChargilyProvider`/`createChargilyProvider`, `PayPalProvider`/`createPayPalProvider`, `ManualProvider`/`createManualProvider`, **`SlickPayProvider`/`createSlickPayProvider`**, **`GuiddiniProvider`/`createGuiddiniProvider`** (+ configs `SlickPayConfig`/`GuiddiniConfig`). SATIM expose `getOrderStatusExtended` + statique `mapOrderStatus(code)` ; SlickPay/Guiddini exposent `mapStatus(raw)`.
|
|
34
|
+
- Stripe bas niveau: `createStripeClient`, `createCheckoutSession`, `handleWebhook`, `createBillingSession`, `createPortalSession`, `handleBillingWebhook`
|
|
35
|
+
- Webhook helpers: `handleProviderWebhook`, `pickSignatureHeader`, `getProviderByName`, `isPaidEvent`, `isFailedEvent`, `isRefundedEvent`, `extractOrderId`, `pickProviderByCurrency`, `isKnownProvider`, constantes `KNOWN_PROVIDERS`, `CURRENCY_TO_PROVIDER`
|
|
36
|
+
- Repo: `getPaymentRepo`, `resetPaymentRepo`
|
|
37
|
+
- Routes Next.js: `createCheckoutHandler`, `createPaymentHandlers`
|
|
38
|
+
- Module: `getSchemas`, `moduleInfo`, `paymentModuleRegistration`
|
|
39
|
+
- Types: `PaymentProvider`, `CheckoutParams`, `CheckoutResult`, `CustomerParams`, `SubscriptionParams`, `SubscriptionResult`, `RefundParams`, `RefundResult`, `InvoiceResult`, `WebhookEvent`, `ProviderName`, `HandleProviderWebhookArgs`, `HandleProviderWebhookResult`, configs `StripeConfig`/`SatimConfig`/`ChargilyConfig`/`PayPalConfig`/`ManualConfig`, `SmtpDriverConfig` n/a
|
|
40
|
+
|
|
41
|
+
## API — SIGNATURES
|
|
42
|
+
- `createPaymentSchema(options?: { currency?; relationTarget?; relationRequired?; subscriptionTarget?; invoiceTarget? }): EntitySchema`
|
|
43
|
+
- `createCheckoutHandler(config: PaymentConfig): (req: Request) => Promise<Response>`
|
|
44
|
+
- `createPaymentHandlers(dialect: IDialect): { GET; POST }`
|
|
45
|
+
- `getPaymentRepo(dialect: IDialect): BaseRepository<PaymentDTO>` — cache WeakMap par identité du dialect
|
|
46
|
+
- `registerProvider(p: PaymentProvider): void` · `setDefaultProvider(name): void` · `getProvider(name?): PaymentProvider` · `getProviderForCurrency(currency): PaymentProvider | null`
|
|
47
|
+
- `registerProvidersFromEnv(opts?: { providers?: ProviderName[]; setDefault?: ProviderName; force?: boolean }): string[]` — enregistre depuis l'env (cascade `MOSTA_ENV`) les providers configurés ; ordre = résolution devise (Chargily/Satim avant Stripe). `manual` exclu sauf si listé.
|
|
48
|
+
- `ensureProvidersFromEnv(opts?): string[]` — variante idempotente « une fois par process » (à appeler en tête de route handler) · `resetEnsuredProviders(): void` (tests)
|
|
49
|
+
- `pickProviderByCurrency(currency, fallback?: ProviderName): { name; provider }`
|
|
50
|
+
- `createPaymentCheckout(input: { dialect: IDialect; orderId; amount; currency; successUrl; cancelUrl; webhookUrl?; description?; method?: PaymentMethodType; metadata?; providerName? }): Promise<{ payment: PaymentDTO; checkout: CheckoutResult; provider: string }>` — sélectionne le dialecte (explicite > registre/devise > mapping), crée le checkout ET persiste la `Payment` (status 'pending', provider, transactionRef=sessionId, orderId, metadata)
|
|
51
|
+
- `settlePaymentFromWebhook(input: { dialect: IDialect; providerName: ProviderName; body: string; headers }): Promise<{ ok; reason?; event?; orderId?; status?: PaymentStatus; payment?: PaymentDTO|null }>` — vérifie le webhook, mappe l'event (paid/failed/refunded), retrouve la `Payment` par `orderId` et la met à jour (paidAt si paid). Le métier post-paiement reste au caller.
|
|
52
|
+
- `handleProviderWebhook(args: HandleProviderWebhookArgs): Promise<HandleProviderWebhookResult>`
|
|
53
|
+
- `isPaidEvent/isFailedEvent/isRefundedEvent(event: WebhookEvent): boolean` · `extractOrderId(event): string | null`
|
|
54
|
+
- Stripe: `createStripeClient(config)`, `createCheckoutSession(stripe, request, config)`, `handleWebhook(stripe, body, sig, secret)`, `createBillingSession(stripe, {...})`, `createPortalSession(stripe, customerId, returnUrl)`, `handleBillingWebhook(stripe, body, sig, secret, handlers)`
|
|
55
|
+
Interface `PaymentProvider` : `name`, `supportedCurrencies`, `supportedMethods`, `createCheckout(params)`, `verifyWebhook(body, sig)` requis ; `createCustomer/getCustomer/updateCustomer/createSubscription/getSubscription/cancelSubscription/changeSubscription/pauseSubscription/resumeSubscription/createRefund/listInvoices/getUpcomingInvoice/createPortal` optionnels.
|
|
56
|
+
|
|
57
|
+
## TYPES CLÉS
|
|
58
|
+
- `PaymentStatus = 'pending'|'paid'|'refunded'|'failed'`
|
|
59
|
+
- `PaymentMethodType = 'card'|'transfer'|'cash'|'tpe'`
|
|
60
|
+
- `ProviderName = 'chargily'|'stripe'|'satim'|'paypal'|'manual'|'slickpay'|'guiddini'`
|
|
61
|
+
- `PaymentConfig { currency: string; defaultCurrency?; stripeSecretKey?; stripePublicKey?; stripeWebhookSecret?; successUrlTemplate: string; cancelUrlTemplate: string; methods?: PaymentMethodType[]; bankInfo?: { rib; bankName; holder } }` — templates avec `{orderId}` substitué
|
|
62
|
+
- `LineItem { name; description?; unitAmount: number; quantity: number }` — unitAmount en unités de base (PAS en centimes)
|
|
63
|
+
- `CheckoutRequest { orderId; lineItems: LineItem[]; currency?; returnUrl?; metadata? }`
|
|
64
|
+
- `CheckoutResult { url: string | null; sessionId: string }`
|
|
65
|
+
- `CheckoutParams { orderId; amount; currency?; description?; successUrl; cancelUrl; webhookUrl?; metadata?; customerId?; priceId?; trialDays? }`
|
|
66
|
+
- `WebhookEvent { type: string; data: Record<string,unknown>; raw? }`
|
|
67
|
+
- `HandleProviderWebhookResult = { ok: true; event: WebhookEvent } | { ok: false; reason: 'bad_signature'|'malformed'|'unknown_provider'; error: string }`
|
|
68
|
+
- `PaymentDTO { id; amount; currency; method: PaymentMethodType; status: PaymentStatus; transactionRef?; paidAt?: Date; orderId?; provider?; metadata? }` (provider/metadata ajoutés v0.6 ; schéma `Payment` = 9 champs + index sur `orderId`)
|
|
69
|
+
- `WebhookHandlers { onCheckoutCompleted?; onInvoicePaid?; onSubscriptionUpdated?; onSubscriptionDeleted?; onPaymentFailed? }`
|
|
70
|
+
|
|
71
|
+
## PATTERN
|
|
72
|
+
```ts
|
|
73
|
+
// Route checkout Next.js
|
|
74
|
+
import { createCheckoutHandler } from '@mostajs/payment/server'
|
|
75
|
+
export const POST = createCheckoutHandler({
|
|
76
|
+
currency: 'EUR',
|
|
77
|
+
stripeSecretKey: process.env.STRIPE_SECRET_KEY,
|
|
78
|
+
successUrlTemplate: '/confirmation/{orderId}?paid=true',
|
|
79
|
+
cancelUrlTemplate: '/payment/{orderId}?cancelled=true',
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// Webhook provider-agnostic
|
|
83
|
+
import { handleProviderWebhook, isPaidEvent, extractOrderId } from '@mostajs/payment/server'
|
|
84
|
+
const r = await handleProviderWebhook({ body: await req.text(), headers: req.headers, providerName: 'chargily' })
|
|
85
|
+
if (!r.ok) return Response.json({ error: r.error }, { status: 400 })
|
|
86
|
+
if (isPaidEvent(r.event)) { /* MAJ DB métier via extractOrderId(r.event) */ }
|
|
87
|
+
|
|
88
|
+
// Orchestration v0.6 — checkout + persistance en un appel
|
|
89
|
+
import { ensureProvidersFromEnv, createPaymentCheckout, settlePaymentFromWebhook } from '@mostajs/payment/server'
|
|
90
|
+
ensureProvidersFromEnv() // dialectes depuis .env (cascade MOSTA_ENV)
|
|
91
|
+
const { checkout } = await createPaymentCheckout({
|
|
92
|
+
dialect, orderId, amount: 50000, currency: 'DZD', // → Chargily
|
|
93
|
+
successUrl, cancelUrl, webhookUrl, metadata: { campaignId },
|
|
94
|
+
})
|
|
95
|
+
// route webhook :
|
|
96
|
+
const s = await settlePaymentFromWebhook({ dialect, providerName: 'chargily', body: await req.text(), headers: req.headers })
|
|
97
|
+
if (s.status === 'paid') { /* activer la campagne sponsor (métier) */ }
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## DÉPEND DE
|
|
101
|
+
- `@mostajs/config` (dependency) — résolution env avec cascade `MOSTA_ENV` (`TEST_*`/`DEV_*`/`PROD_*`).
|
|
102
|
+
- `@mostajs/data-plug` (peer dep `^1.2.4`) — façade ORM : `BaseRepository`, `IDialect`, `EntitySchema`. Le module n'importe jamais `@mostajs/orm` directement.
|
|
103
|
+
- `stripe` (dependency) — SDK Stripe.
|
|
104
|
+
- `next` et `react` en peer deps optionnelles (routes + `PaymentPage`).
|
|
105
|
+
|
|
106
|
+
## PIÈGES
|
|
107
|
+
- `LineItem.unitAmount` est en unités de base de la devise, pas en centimes — la conversion Stripe est interne.
|
|
108
|
+
- Le body du webhook DOIT être lu brut (`req.text()`) avant tout parse JSON : la signature est calculée sur les bytes exacts.
|
|
109
|
+
- Le sous-chemin `/server` contient toute la logique sensible (clés, providers) — ne jamais l'importer côté client ; `PaymentPage`/`PaymentSchema` sont sur `.`.
|
|
110
|
+
- Sélection devise : `CURRENCY_TO_PROVIDER` mappe DZD → Chargily, le reste → Stripe ; pour CIB-only Algérie sans Chargily, passer `fallback` à `pickProviderByCurrency`.
|
|
111
|
+
- Les factories `create*Provider` lisent l'env en fallback (cascade `@mostajs/config`) ; defaults testMode : Chargily test-on (`!== 'false'`), Satim test-off (`=== 'true'`), PayPal test-on.
|
|
112
|
+
- `ChargilyProvider` : préférer `CHARGILY_SECRET_KEY` ; `CHARGILY_API_KEY` est un alias legacy.
|
|
113
|
+
- **Dialectes DZ (v0.7)** : `SatimProvider` (acquéreur direct, codes BPC OrderStatus, matching par `OrderNumber`), `SlickPayProvider` (env `SLICKPAY_PUBLIC_KEY` + base/chemins `SLICKPAY_BASE_URL`/`_INVOICE_PATH`), `GuiddiniProvider` (env `GUIDDINI_APP_KEY`/`_APP_SECRET` + `GUIDDINI_BASE_URL`/`_INITIATE_PATH`/`_STATUS_PATH`). DZD partagé : par défaut → Chargily ; cibler SATIM/SlickPay/Guiddini via `providerName` (ou ordre/`setDefault`). Confirmation par retour+statut (pas de HMAC) ; chemins SlickPay/Guiddini provisoires, pilotés par env, à confirmer en certification GIE.
|
|
114
|
+
- `getPaymentRepo` met en cache via WeakMap par identité de dialect — un changement de dialect reconstruit le repo ; `resetPaymentRepo` est un no-op de rétro-compat.
|
|
115
|
+
- Méthodes optionnelles de `PaymentProvider` (subscriptions, refunds…) : seul Stripe les implémente toutes ; vérifier la présence avant appel sur Satim/Chargily/Manual.
|
|
116
|
+
|
|
117
|
+
## RÉFÉRENCES
|
|
118
|
+
README.md · docs/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mostajs/payment",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Payment module for @mostajs — Multi-provider (Stripe, Satim/CIB, Chargily, PayPal), multi-method, multi-currency",
|
|
5
5
|
"author": "Dr Hamid MADANI <drmdh@msn.com>",
|
|
6
6
|
"license": "AGPL-3.0-or-later",
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
23
|
"dist",
|
|
24
|
-
"README.md"
|
|
24
|
+
"README.md",
|
|
25
|
+
"llms.txt"
|
|
25
26
|
],
|
|
26
27
|
"scripts": {
|
|
27
28
|
"build": "tsc",
|