@pagosrd/azul 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +156 -2
- package/dist/index.cjs +817 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +380 -0
- package/dist/index.d.ts +380 -0
- package/dist/index.js +773 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { Dispatcher } from 'undici';
|
|
2
|
+
|
|
3
|
+
type AzulEnvironment = "pruebas" | "produccion";
|
|
4
|
+
/**
|
|
5
|
+
* URLs de AZUL según los documentos técnicos oficiales 2026 (Página de Pago e
|
|
6
|
+
* Integración vía API). La URL alterna de producción viene de `pyazul` (MIT):
|
|
7
|
+
* PENDIENTE DE VERIFICAR, el manual menciona un sitio secundario sin dar la URL.
|
|
8
|
+
*/
|
|
9
|
+
declare const AZUL_URLS: {
|
|
10
|
+
readonly pruebas: {
|
|
11
|
+
readonly webservices: "https://pruebas.azul.com.do/webservices/JSON/Default.aspx";
|
|
12
|
+
readonly paymentPage: "https://pruebas.azul.com.do/PaymentPage/";
|
|
13
|
+
};
|
|
14
|
+
readonly produccion: {
|
|
15
|
+
readonly webservices: "https://pagos.azul.com.do/webservices/JSON/Default.aspx";
|
|
16
|
+
readonly webservicesAlterna: "https://contpagos.azul.com.do/Webservices/JSON/default.aspx";
|
|
17
|
+
readonly paymentPage: "https://pagos.azul.com.do/PaymentPage/Default.aspx";
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
interface AzulPaymentPageConfig {
|
|
21
|
+
/** Llave privada de la Página de Pagos ("AuthKey"), entregada por AZUL. */
|
|
22
|
+
authKey: string;
|
|
23
|
+
/** Nombre del comercio que se muestra en la Página de Pagos. */
|
|
24
|
+
merchantName: string;
|
|
25
|
+
/** Tipo de comercio, según lo asigna AZUL. */
|
|
26
|
+
merchantType: string;
|
|
27
|
+
/** Reemplaza el cálculo del AuthHash (por defecto, el del manual oficial: `defaultPaymentPageHash`). */
|
|
28
|
+
hashFn?: (fields: Record<string, string>, authKey: string) => string;
|
|
29
|
+
}
|
|
30
|
+
/** Datos de una solicitud o respuesta, ya sin datos de tarjeta, para logs. */
|
|
31
|
+
interface AzulRedactedEvent {
|
|
32
|
+
operation: string;
|
|
33
|
+
url: string;
|
|
34
|
+
payload: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
interface AzulClientConfig {
|
|
37
|
+
/** Merchant ID (MID) del comercio, se envía como "Store". */
|
|
38
|
+
merchantId: string;
|
|
39
|
+
/** Credencial "Auth1" del comercio. */
|
|
40
|
+
auth1: string;
|
|
41
|
+
/** Credencial "Auth2" del comercio. */
|
|
42
|
+
auth2: string;
|
|
43
|
+
/** Certificado de cliente en formato PEM (contenido, no ruta). */
|
|
44
|
+
certificate: string | Buffer;
|
|
45
|
+
/** Llave privada del certificado en formato PEM (contenido, no ruta). */
|
|
46
|
+
privateKey: string | Buffer;
|
|
47
|
+
environment: AzulEnvironment;
|
|
48
|
+
/** Canal de la transacción. Por defecto "EC" (e-commerce). */
|
|
49
|
+
channel?: string;
|
|
50
|
+
/** Tiempo máximo por solicitud en milisegundos. Por defecto 30000. */
|
|
51
|
+
timeoutMs?: number;
|
|
52
|
+
/** Reemplaza las URLs de los webservices (útil para pruebas o un proxy propio). */
|
|
53
|
+
urls?: {
|
|
54
|
+
webservices?: string;
|
|
55
|
+
webservicesAlterna?: string;
|
|
56
|
+
};
|
|
57
|
+
/** Requerido solo si vas a usar la Página de Pagos. */
|
|
58
|
+
paymentPage?: AzulPaymentPageConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Dispatcher de undici a usar. Si lo pasas, el SDK NO configura el
|
|
61
|
+
* certificado de cliente por ti. Pensado para pruebas (MockAgent) o proxies.
|
|
62
|
+
*/
|
|
63
|
+
dispatcher?: Dispatcher;
|
|
64
|
+
/** Se llama antes de cada solicitud con el payload ya censurado. Útil para logs. */
|
|
65
|
+
onRequest?: (event: AzulRedactedEvent) => void;
|
|
66
|
+
/** Se llama con cada respuesta de AZUL, censurada. */
|
|
67
|
+
onResponse?: (event: AzulRedactedEvent) => void;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
interface PaymentPageInput {
|
|
71
|
+
/** Monto TOTAL en centavos, ITBIS incluido. */
|
|
72
|
+
amount: number;
|
|
73
|
+
/** ITBIS en centavos. 0 u omitido si está exento. */
|
|
74
|
+
itbis?: number;
|
|
75
|
+
/** Número de orden único del comercio (máx. 15). */
|
|
76
|
+
orderNumber: string;
|
|
77
|
+
/** URL https a la que AZUL devuelve al cliente si el pago se aprueba. */
|
|
78
|
+
approvedUrl: string;
|
|
79
|
+
/** URL https si el pago se declina (se envía como "DeclinedUrl"). */
|
|
80
|
+
declineUrl: string;
|
|
81
|
+
/** URL https si el cliente cancela. */
|
|
82
|
+
cancelUrl: string;
|
|
83
|
+
/** Idioma de la página. Por defecto "ES". */
|
|
84
|
+
locale?: "ES" | "EN";
|
|
85
|
+
/** Mostrar el resultado en la página de AZUL antes de volver. Por defecto true. */
|
|
86
|
+
showTransactionResult?: boolean;
|
|
87
|
+
/** Hasta dos campos personalizados que se muestran al cliente. */
|
|
88
|
+
customFields?: [CustomField?, CustomField?];
|
|
89
|
+
/** Nombre alterno en el estado de cuenta (máx. 25; letras, números, espacios, punto y coma). */
|
|
90
|
+
altMerchantName?: string;
|
|
91
|
+
/** Guardar la tarjeta en DataVault. */
|
|
92
|
+
saveToDataVault?: boolean;
|
|
93
|
+
}
|
|
94
|
+
interface CustomField {
|
|
95
|
+
label: string;
|
|
96
|
+
value: string;
|
|
97
|
+
}
|
|
98
|
+
interface PaymentPageRequest {
|
|
99
|
+
/** URL a la que se envía el formulario por POST. */
|
|
100
|
+
url: string;
|
|
101
|
+
/** Campos del formulario, ya con el AuthHash calculado. */
|
|
102
|
+
fields: Record<string, string>;
|
|
103
|
+
/** HTML listo para devolver al navegador; se envía solo al cargar. */
|
|
104
|
+
html: string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Campos del requerimiento que entran en el AuthHash, en el orden exacto del
|
|
108
|
+
* "Documento técnico - Página de Pago AZUL 2026" (sección "Manejo de
|
|
109
|
+
* autenticación"), confirmado con el ejemplo de cálculo que AZUL nos envió.
|
|
110
|
+
*/
|
|
111
|
+
declare const PAYMENT_PAGE_HASH_FIELDS: readonly ["MerchantId", "MerchantName", "MerchantType", "CurrencyCode", "OrderNumber", "Amount", "ITBIS", "ApprovedUrl", "DeclinedUrl", "CancelUrl", "UseCustomField1", "CustomField1Label", "CustomField1Value", "UseCustomField2", "CustomField2Label", "CustomField2Value"];
|
|
112
|
+
/** Campos del retorno a ApprovedUrl/DeclinedUrl que entran en su AuthHash, en orden. */
|
|
113
|
+
declare const PAYMENT_PAGE_RESPONSE_HASH_FIELDS: readonly ["OrderNumber", "Amount", "AuthorizationCode", "DateTime", "ResponseCode", "IsoCode", "ResponseMessage", "ErrorDescription", "RRN"];
|
|
114
|
+
/**
|
|
115
|
+
* AuthHash del requerimiento: HMAC-SHA512 con la AuthKey como llave sobre los
|
|
116
|
+
* campos concatenados más la AuthKey al final, en hexadecimal. AZUL acepta la
|
|
117
|
+
* cadena en UTF-8 o en UTF-16LE; usamos UTF-8, que es lo que reproduce el
|
|
118
|
+
* ejemplo oficial.
|
|
119
|
+
*/
|
|
120
|
+
declare function defaultPaymentPageHash(fields: Record<string, string>, authKey: string): string;
|
|
121
|
+
/**
|
|
122
|
+
* AuthHash que AZUL manda en el retorno: HMAC-SHA512 con la AuthKey como llave
|
|
123
|
+
* sobre OrderNumber + Amount + AuthorizationCode + DateTime + ResponseCode +
|
|
124
|
+
* IsoCode + ResponseMessage + ErrorDescription + RRN + AuthKey, con la cadena
|
|
125
|
+
* en UTF-16LE ("Unicode"), según el manual.
|
|
126
|
+
*/
|
|
127
|
+
declare function paymentPageResponseHash(params: Record<string, string | undefined>, authKey: string): string;
|
|
128
|
+
/**
|
|
129
|
+
* Verifica que un retorno de la Página de Pagos lo generó AZUL. Devuelve false
|
|
130
|
+
* si falta el AuthHash o no coincide. Compara en tiempo constante.
|
|
131
|
+
* OJO: el hash no cubre AzulOrderId, CardNumber ni ITBIS; esos valores vienen
|
|
132
|
+
* del navegador y no deben usarse para mover dinero sin otra confirmación.
|
|
133
|
+
*/
|
|
134
|
+
declare function verifyPaymentPageResponse(params: Record<string, string | undefined>, authKey: string): boolean;
|
|
135
|
+
/** Escapa texto para HTML. pyazul NO escapa los valores; aquí sí, para evitar inyección de HTML. */
|
|
136
|
+
declare function escapeHtml(value: string): string;
|
|
137
|
+
|
|
138
|
+
type AzulStatus = "approved" | "declined" | "requires_3ds";
|
|
139
|
+
/** Respuesta normalizada de una operación con AZUL. */
|
|
140
|
+
interface AzulResult {
|
|
141
|
+
/** approved = aprobada, declined = declinada por el banco o por reglas, requires_3ds = falta autenticación 3D Secure. */
|
|
142
|
+
status: AzulStatus;
|
|
143
|
+
/** "ISO8583" en transacciones procesadas. */
|
|
144
|
+
responseCode: string | undefined;
|
|
145
|
+
/** "00" = aprobada. Cualquier otro código es una declinación. */
|
|
146
|
+
isoCode: string | undefined;
|
|
147
|
+
/** Mensaje de AZUL, por ejemplo "APROBADA". */
|
|
148
|
+
message: string | undefined;
|
|
149
|
+
/** Detalle del error o de la declinación, si lo hay. */
|
|
150
|
+
errorDescription: string | undefined;
|
|
151
|
+
authorizationCode: string | undefined;
|
|
152
|
+
/** Identificador de AZUL. Lo necesitas para capturar, anular o reembolsar. */
|
|
153
|
+
azulOrderId: string | undefined;
|
|
154
|
+
/** Número de referencia de la red (RRN), útil para conciliación. */
|
|
155
|
+
rrn: string | undefined;
|
|
156
|
+
/** Token de DataVault, si se pidió guardar la tarjeta. */
|
|
157
|
+
dataVaultToken: string | undefined;
|
|
158
|
+
/** Identificador propio con el que puedes consultar la transacción con verifyPayment. */
|
|
159
|
+
customOrderId: string | undefined;
|
|
160
|
+
/** Respuesta original de AZUL (sin datos de tarjeta completos). */
|
|
161
|
+
raw: Record<string, unknown>;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Resultado de verifyPayment: la transacción encontrada o `found: false`. */
|
|
165
|
+
type VerifyPaymentResult = ({
|
|
166
|
+
found: true;
|
|
167
|
+
} & AzulResult) | {
|
|
168
|
+
found: false;
|
|
169
|
+
customOrderId: string;
|
|
170
|
+
raw: Record<string, unknown>;
|
|
171
|
+
};
|
|
172
|
+
/** Datos comunes de las operaciones que mueven dinero. */
|
|
173
|
+
interface OrderFields {
|
|
174
|
+
/** Monto TOTAL en centavos, ITBIS incluido. 150050 = RD$1,500.50. */
|
|
175
|
+
amount: number;
|
|
176
|
+
/** ITBIS en centavos. Omítelo o usa 0 si está exento. */
|
|
177
|
+
itbis?: number;
|
|
178
|
+
/** Número de orden del comercio (máx. 15 caracteres). */
|
|
179
|
+
orderNumber: string;
|
|
180
|
+
/**
|
|
181
|
+
* Identificador único tuyo (máx. 75). Si no lo pasas, el SDK genera uno.
|
|
182
|
+
* Guárdalo: es lo que permite consultar el resultado con verifyPayment si
|
|
183
|
+
* la conexión se cae a mitad de la operación.
|
|
184
|
+
*/
|
|
185
|
+
customOrderId?: string;
|
|
186
|
+
/** Nombre alterno que aparece en el estado de cuenta del cliente (máx. 25). */
|
|
187
|
+
altMerchantName?: string;
|
|
188
|
+
/** "1" para forzar sin 3D Secure. Úsalo solo si AZUL lo autorizó para tu comercio. */
|
|
189
|
+
forceNo3DS?: boolean;
|
|
190
|
+
}
|
|
191
|
+
interface CardSaleInput extends OrderFields {
|
|
192
|
+
cardNumber: string;
|
|
193
|
+
/** "YYYYMM", "MM/YY" o "MM/YYYY". */
|
|
194
|
+
expiration: string;
|
|
195
|
+
cvc: string;
|
|
196
|
+
/** Guarda la tarjeta en DataVault y devuelve un token reutilizable. */
|
|
197
|
+
saveToDataVault?: boolean;
|
|
198
|
+
}
|
|
199
|
+
interface TokenSaleInput extends OrderFields {
|
|
200
|
+
dataVaultToken: string;
|
|
201
|
+
cvc?: string;
|
|
202
|
+
}
|
|
203
|
+
interface CaptureInput {
|
|
204
|
+
/** AzulOrderId de la pre-autorización (hold). */
|
|
205
|
+
azulOrderId: string;
|
|
206
|
+
/** Monto a capturar en centavos (puede ser menor que el retenido). */
|
|
207
|
+
amount: number;
|
|
208
|
+
itbis?: number;
|
|
209
|
+
}
|
|
210
|
+
interface RefundInput {
|
|
211
|
+
/** AzulOrderId de la venta original. */
|
|
212
|
+
azulOrderId: string;
|
|
213
|
+
amount: number;
|
|
214
|
+
itbis?: number;
|
|
215
|
+
orderNumber: string;
|
|
216
|
+
customOrderId?: string;
|
|
217
|
+
}
|
|
218
|
+
interface DataVaultCreateInput {
|
|
219
|
+
cardNumber: string;
|
|
220
|
+
expiration: string;
|
|
221
|
+
cvc: string;
|
|
222
|
+
}
|
|
223
|
+
interface DataVaultResult {
|
|
224
|
+
status: "approved" | "declined";
|
|
225
|
+
dataVaultToken: string | undefined;
|
|
226
|
+
/** Número enmascarado que devuelve AZUL, por ejemplo "411111******1111". */
|
|
227
|
+
maskedCardNumber: string | undefined;
|
|
228
|
+
brand: string | undefined;
|
|
229
|
+
/** Vencimiento del token, "YYYYMM". */
|
|
230
|
+
expiration: string | undefined;
|
|
231
|
+
hasCvv: boolean;
|
|
232
|
+
isoCode: string | undefined;
|
|
233
|
+
message: string | undefined;
|
|
234
|
+
errorDescription: string | undefined;
|
|
235
|
+
raw: Record<string, unknown>;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Cliente para los webservices de AZUL.
|
|
239
|
+
*
|
|
240
|
+
* ```ts
|
|
241
|
+
* const azul = new AzulClient({
|
|
242
|
+
* environment: "pruebas",
|
|
243
|
+
* merchantId: process.env.AZUL_MERCHANT_ID!,
|
|
244
|
+
* auth1: process.env.AZUL_AUTH1!,
|
|
245
|
+
* auth2: process.env.AZUL_AUTH2!,
|
|
246
|
+
* certificate: process.env.AZUL_CERT_PEM!,
|
|
247
|
+
* privateKey: process.env.AZUL_KEY_PEM!,
|
|
248
|
+
* });
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
declare class AzulClient {
|
|
252
|
+
private readonly config;
|
|
253
|
+
private readonly transport;
|
|
254
|
+
constructor(config: AzulClientConfig);
|
|
255
|
+
/** Cierra las conexiones abiertas. Llámalo al apagar tu servidor. */
|
|
256
|
+
close(): Promise<void>;
|
|
257
|
+
/**
|
|
258
|
+
* Venta directa con datos de tarjeta.
|
|
259
|
+
*
|
|
260
|
+
* OJO: recibir el número de tarjeta en tu servidor te pone dentro del
|
|
261
|
+
* alcance de PCI DSS. Si puedes, usa la Página de Pagos (paymentPage) o
|
|
262
|
+
* cobra con un token de DataVault (tokenSale).
|
|
263
|
+
*/
|
|
264
|
+
sale(input: CardSaleInput): Promise<AzulResult>;
|
|
265
|
+
/** Pre-autorización: retiene el monto sin cobrarlo. Captúralo luego con capture(). */
|
|
266
|
+
hold(input: CardSaleInput): Promise<AzulResult>;
|
|
267
|
+
/** Venta con una tarjeta guardada en DataVault. */
|
|
268
|
+
tokenSale(input: TokenSaleInput): Promise<AzulResult>;
|
|
269
|
+
/** Captura (total o parcial) una pre-autorización hecha con hold(). */
|
|
270
|
+
capture(input: CaptureInput): Promise<AzulResult>;
|
|
271
|
+
/** Anula una transacción del mismo día (antes del cierre de lote). */
|
|
272
|
+
void(input: {
|
|
273
|
+
azulOrderId: string;
|
|
274
|
+
}): Promise<AzulResult>;
|
|
275
|
+
/** Reembolsa (total o parcialmente) una venta ya liquidada. */
|
|
276
|
+
refund(input: RefundInput): Promise<AzulResult>;
|
|
277
|
+
/**
|
|
278
|
+
* Consulta el estado de una transacción hecha por la API (ProcessPayment) por
|
|
279
|
+
* su customOrderId. Es la forma correcta de salir de la duda después de un
|
|
280
|
+
* AzulAmbiguousError. Si hay varias con el mismo id, AZUL devuelve la última.
|
|
281
|
+
* Si no existe, AZUL responde Found=false y aquí se devuelve `{ found: false }`.
|
|
282
|
+
*/
|
|
283
|
+
verifyPayment(input: {
|
|
284
|
+
customOrderId: string;
|
|
285
|
+
}): Promise<VerifyPaymentResult>;
|
|
286
|
+
readonly dataVault: {
|
|
287
|
+
/** Guarda una tarjeta y devuelve un token reutilizable. */
|
|
288
|
+
create: (input: DataVaultCreateInput) => Promise<DataVaultResult>;
|
|
289
|
+
/** Elimina un token de DataVault. */
|
|
290
|
+
delete: (input: {
|
|
291
|
+
dataVaultToken: string;
|
|
292
|
+
}) => Promise<DataVaultResult>;
|
|
293
|
+
};
|
|
294
|
+
/**
|
|
295
|
+
* Prepara el formulario para redirigir al cliente a la Página de Pagos de
|
|
296
|
+
* AZUL. Con esta vía tu servidor nunca ve el número de tarjeta.
|
|
297
|
+
*/
|
|
298
|
+
paymentPage(input: PaymentPageInput): PaymentPageRequest;
|
|
299
|
+
private base;
|
|
300
|
+
private customOrderId;
|
|
301
|
+
private orderFields;
|
|
302
|
+
private cardTransaction;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Errores del SDK.
|
|
307
|
+
*
|
|
308
|
+
* Regla de diseño: un pago DECLINADO no es una excepción. Una declinación es una
|
|
309
|
+
* respuesta normal del banco y se devuelve como `status: "declined"`.
|
|
310
|
+
* Las excepciones se reservan para cosas que el código que llama debe manejar
|
|
311
|
+
* de forma distinta: configuración inválida, datos inválidos, fallas del
|
|
312
|
+
* sistema de AZUL y, sobre todo, resultados AMBIGUOS (no sabemos si se cobró).
|
|
313
|
+
*/
|
|
314
|
+
declare class AzulError extends Error {
|
|
315
|
+
readonly name: string;
|
|
316
|
+
constructor(message: string, options?: {
|
|
317
|
+
cause?: unknown;
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/** La configuración del cliente es inválida (credenciales, certificado, ambiente). */
|
|
321
|
+
declare class AzulConfigError extends AzulError {
|
|
322
|
+
readonly name = "AzulConfigError";
|
|
323
|
+
}
|
|
324
|
+
/** Los datos de la operación son inválidos. No se envió nada a AZUL. */
|
|
325
|
+
declare class AzulValidationError extends AzulError {
|
|
326
|
+
readonly name = "AzulValidationError";
|
|
327
|
+
readonly issues: string[];
|
|
328
|
+
constructor(message: string, issues?: string[]);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* AZUL respondió, pero con un error de sistema (ResponseCode "Error",
|
|
332
|
+
* errores SGS de gateway o ErrorMessage). La operación NO fue aprobada.
|
|
333
|
+
*/
|
|
334
|
+
declare class AzulResponseError extends AzulError {
|
|
335
|
+
readonly name = "AzulResponseError";
|
|
336
|
+
readonly response: Record<string, unknown>;
|
|
337
|
+
constructor(message: string, response: Record<string, unknown>);
|
|
338
|
+
}
|
|
339
|
+
/** AZUL respondió con un código HTTP de error y la operación es segura de tratar como no ejecutada. */
|
|
340
|
+
declare class AzulHttpError extends AzulError {
|
|
341
|
+
readonly name = "AzulHttpError";
|
|
342
|
+
readonly statusCode: number;
|
|
343
|
+
readonly body: string;
|
|
344
|
+
constructor(message: string, statusCode: number, body: string);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* La solicitud pudo haber llegado a AZUL, pero no recibimos una respuesta
|
|
348
|
+
* confiable (timeout de lectura, conexión cortada, HTTP 5xx, JSON inválido).
|
|
349
|
+
*
|
|
350
|
+
* NO reintentes a ciegas una operación que mueve dinero: podrías cobrar dos
|
|
351
|
+
* veces. Consulta el estado con `verifyPayment({ customOrderId })` y decide.
|
|
352
|
+
*/
|
|
353
|
+
declare class AzulAmbiguousError extends AzulError {
|
|
354
|
+
readonly name = "AzulAmbiguousError";
|
|
355
|
+
readonly customOrderId: string | undefined;
|
|
356
|
+
constructor(message: string, customOrderId: string | undefined, options?: {
|
|
357
|
+
cause?: unknown;
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Convierte un monto escrito en pesos a centavos SIN pasar por punto flotante.
|
|
363
|
+
*
|
|
364
|
+
* toCents("1,500.50") === 150050
|
|
365
|
+
* toCents("1500") === 150000
|
|
366
|
+
* toCents(1500.5) === 150050
|
|
367
|
+
*/
|
|
368
|
+
declare function toCents(amount: string | number): number;
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Censura de datos sensibles para logs. Nunca registres un número de tarjeta
|
|
372
|
+
* completo ni un CVC: eso te mete de lleno en el alcance de PCI DSS.
|
|
373
|
+
*/
|
|
374
|
+
declare function maskPan(pan: string): string;
|
|
375
|
+
declare function redact(payload: Record<string, unknown>): Record<string, unknown>;
|
|
376
|
+
|
|
377
|
+
/** Algoritmo de Luhn: detecta errores de digitación en números de tarjeta. */
|
|
378
|
+
declare function passesLuhn(digits: string): boolean;
|
|
379
|
+
|
|
380
|
+
export { AZUL_URLS, AzulAmbiguousError, AzulClient, type AzulClientConfig, AzulConfigError, type AzulEnvironment, AzulError, AzulHttpError, type AzulPaymentPageConfig, type AzulRedactedEvent, AzulResponseError, type AzulResult, type AzulStatus, AzulValidationError, type CaptureInput, type CardSaleInput, type CustomField, type DataVaultCreateInput, type DataVaultResult, PAYMENT_PAGE_HASH_FIELDS, PAYMENT_PAGE_RESPONSE_HASH_FIELDS, type PaymentPageInput, type PaymentPageRequest, type RefundInput, type TokenSaleInput, type VerifyPaymentResult, defaultPaymentPageHash, escapeHtml, maskPan, passesLuhn, paymentPageResponseHash, redact, toCents, verifyPaymentPageResponse };
|