@pulgueta/epayco-convex 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 +201 -0
- package/README.md +945 -0
- package/dist/client/_generated/_ignore.d.ts +1 -0
- package/dist/client/_generated/_ignore.d.ts.map +1 -0
- package/dist/client/_generated/_ignore.js +3 -0
- package/dist/client/_generated/_ignore.js.map +1 -0
- package/dist/client/index.d.ts +222 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +355 -0
- package/dist/client/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +78 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +580 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/banks.d.ts +14 -0
- package/dist/component/banks.d.ts.map +1 -0
- package/dist/component/banks.js +37 -0
- package/dist/component/banks.js.map +1 -0
- package/dist/component/cashApi.d.ts +59 -0
- package/dist/component/cashApi.d.ts.map +1 -0
- package/dist/component/cashApi.js +88 -0
- package/dist/component/cashApi.js.map +1 -0
- package/dist/component/chargesApi.d.ts +64 -0
- package/dist/component/chargesApi.d.ts.map +1 -0
- package/dist/component/chargesApi.js +106 -0
- package/dist/component/chargesApi.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +6 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/customers.d.ts +67 -0
- package/dist/component/customers.d.ts.map +1 -0
- package/dist/component/customers.js +103 -0
- package/dist/component/customers.js.map +1 -0
- package/dist/component/customersApi.d.ts +99 -0
- package/dist/component/customersApi.d.ts.map +1 -0
- package/dist/component/customersApi.js +176 -0
- package/dist/component/customersApi.js.map +1 -0
- package/dist/component/daviplataApi.d.ts +43 -0
- package/dist/component/daviplataApi.d.ts.map +1 -0
- package/dist/component/daviplataApi.js +103 -0
- package/dist/component/daviplataApi.js.map +1 -0
- package/dist/component/epaycoClient.d.ts +84 -0
- package/dist/component/epaycoClient.d.ts.map +1 -0
- package/dist/component/epaycoClient.js +422 -0
- package/dist/component/epaycoClient.js.map +1 -0
- package/dist/component/payloads.d.ts +34 -0
- package/dist/component/payloads.d.ts.map +1 -0
- package/dist/component/payloads.js +45 -0
- package/dist/component/payloads.js.map +1 -0
- package/dist/component/plans.d.ts +47 -0
- package/dist/component/plans.d.ts.map +1 -0
- package/dist/component/plans.js +83 -0
- package/dist/component/plans.js.map +1 -0
- package/dist/component/plansApi.d.ts +64 -0
- package/dist/component/plansApi.d.ts.map +1 -0
- package/dist/component/plansApi.js +121 -0
- package/dist/component/plansApi.js.map +1 -0
- package/dist/component/pseApi.d.ts +68 -0
- package/dist/component/pseApi.d.ts.map +1 -0
- package/dist/component/pseApi.js +113 -0
- package/dist/component/pseApi.js.map +1 -0
- package/dist/component/rateLimits.d.ts +69 -0
- package/dist/component/rateLimits.d.ts.map +1 -0
- package/dist/component/rateLimits.js +67 -0
- package/dist/component/rateLimits.js.map +1 -0
- package/dist/component/safetypayApi.d.ts +35 -0
- package/dist/component/safetypayApi.d.ts.map +1 -0
- package/dist/component/safetypayApi.js +68 -0
- package/dist/component/safetypayApi.js.map +1 -0
- package/dist/component/schema.d.ts +200 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +104 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/signature.d.ts +11 -0
- package/dist/component/signature.d.ts.map +1 -0
- package/dist/component/signature.js +28 -0
- package/dist/component/signature.js.map +1 -0
- package/dist/component/status.d.ts +12 -0
- package/dist/component/status.d.ts.map +1 -0
- package/dist/component/status.js +55 -0
- package/dist/component/status.js.map +1 -0
- package/dist/component/subscriptions.d.ts +69 -0
- package/dist/component/subscriptions.d.ts.map +1 -0
- package/dist/component/subscriptions.js +114 -0
- package/dist/component/subscriptions.js.map +1 -0
- package/dist/component/subscriptionsApi.d.ts +62 -0
- package/dist/component/subscriptionsApi.d.ts.map +1 -0
- package/dist/component/subscriptionsApi.js +147 -0
- package/dist/component/subscriptionsApi.js.map +1 -0
- package/dist/component/tokens.d.ts +31 -0
- package/dist/component/tokens.d.ts.map +1 -0
- package/dist/component/tokens.js +79 -0
- package/dist/component/tokens.js.map +1 -0
- package/dist/component/tokensApi.d.ts +18 -0
- package/dist/component/tokensApi.d.ts.map +1 -0
- package/dist/component/tokensApi.js +53 -0
- package/dist/component/tokensApi.js.map +1 -0
- package/dist/component/transactions.d.ts +103 -0
- package/dist/component/transactions.d.ts.map +1 -0
- package/dist/component/transactions.js +177 -0
- package/dist/component/transactions.js.map +1 -0
- package/dist/component/validators.d.ts +571 -0
- package/dist/component/validators.d.ts.map +1 -0
- package/dist/component/validators.js +203 -0
- package/dist/component/validators.js.map +1 -0
- package/dist/component/webhooks.d.ts +55 -0
- package/dist/component/webhooks.d.ts.map +1 -0
- package/dist/component/webhooks.js +172 -0
- package/dist/component/webhooks.js.map +1 -0
- package/dist/react/index.d.ts +16 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +43 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +106 -0
- package/src/client/_generated/_ignore.ts +1 -0
- package/src/client/index.test.ts +66 -0
- package/src/client/index.ts +633 -0
- package/src/client/setup.test.ts +26 -0
- package/src/component/_generated/api.ts +94 -0
- package/src/component/_generated/component.ts +809 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/banks.ts +41 -0
- package/src/component/cashApi.ts +100 -0
- package/src/component/chargesApi.ts +119 -0
- package/src/component/convex.config.ts +7 -0
- package/src/component/customers.test.ts +122 -0
- package/src/component/customers.ts +116 -0
- package/src/component/customersApi.ts +206 -0
- package/src/component/daviplataApi.ts +119 -0
- package/src/component/epaycoApi.test.ts +110 -0
- package/src/component/epaycoClient.ts +578 -0
- package/src/component/payloads.ts +67 -0
- package/src/component/plans.test.ts +129 -0
- package/src/component/plans.ts +86 -0
- package/src/component/plansApi.ts +135 -0
- package/src/component/pseApi.ts +125 -0
- package/src/component/rateLimits.ts +67 -0
- package/src/component/safetypayApi.ts +78 -0
- package/src/component/schema.ts +124 -0
- package/src/component/setup.test.helper.ts +10 -0
- package/src/component/setup.test.ts +22 -0
- package/src/component/signature.ts +38 -0
- package/src/component/status.ts +71 -0
- package/src/component/subscriptions.test.ts +117 -0
- package/src/component/subscriptions.ts +128 -0
- package/src/component/subscriptionsApi.ts +172 -0
- package/src/component/tokens.ts +89 -0
- package/src/component/tokensApi.ts +63 -0
- package/src/component/transactions.test.ts +227 -0
- package/src/component/transactions.ts +200 -0
- package/src/component/validators.ts +245 -0
- package/src/component/webhooks.test.ts +137 -0
- package/src/component/webhooks.ts +229 -0
- package/src/react/index.ts +71 -0
- package/src/test.ts +13 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { v } from "convex/values";
|
|
2
|
+
import { action } from "./_generated/server.js";
|
|
3
|
+
import { internal } from "./_generated/api.js";
|
|
4
|
+
import { epaycoCredentialsValidator, daviplataInfoValidator, } from "./validators.js";
|
|
5
|
+
import { getEpaycoClient, unwrap, dataOf, pick } from "./epaycoClient.js";
|
|
6
|
+
import { statusFromEstado } from "./status.js";
|
|
7
|
+
import { rateLimiter } from "./rateLimits.js";
|
|
8
|
+
/** Start a Daviplata payment. Returns a ref_payco + id_session_token used for OTP confirmation. */
|
|
9
|
+
export const createDaviplataPayment = action({
|
|
10
|
+
args: {
|
|
11
|
+
credentials: epaycoCredentialsValidator,
|
|
12
|
+
userId: v.string(),
|
|
13
|
+
daviplataInfo: daviplataInfoValidator,
|
|
14
|
+
},
|
|
15
|
+
returns: v.any(),
|
|
16
|
+
handler: async (ctx, args) => {
|
|
17
|
+
await rateLimiter.limit(ctx, "createDaviplataPayment", {
|
|
18
|
+
key: args.userId,
|
|
19
|
+
throws: true,
|
|
20
|
+
});
|
|
21
|
+
const info = args.daviplataInfo;
|
|
22
|
+
const epayco = getEpaycoClient(args.credentials);
|
|
23
|
+
const result = unwrap(await epayco.daviplata.create({
|
|
24
|
+
doc_type: info.docType,
|
|
25
|
+
doc_number: info.docNumber,
|
|
26
|
+
name: info.name,
|
|
27
|
+
last_name: info.lastName,
|
|
28
|
+
email: info.email,
|
|
29
|
+
ind_country: info.indCountry ?? "CO",
|
|
30
|
+
phone: info.phone,
|
|
31
|
+
country: info.country ?? "CO",
|
|
32
|
+
...(info.city ? { city: info.city } : {}),
|
|
33
|
+
...(info.address ? { address: info.address } : {}),
|
|
34
|
+
...(info.ip ? { ip: info.ip } : {}),
|
|
35
|
+
currency: info.currency ?? "COP",
|
|
36
|
+
description: info.description,
|
|
37
|
+
value: String(info.value),
|
|
38
|
+
tax: String(info.tax),
|
|
39
|
+
tax_base: String(info.taxBase),
|
|
40
|
+
method_confirmation: info.methodConfirmation ?? "",
|
|
41
|
+
...(info.urlConfirmation
|
|
42
|
+
? { url_confirmation: info.urlConfirmation }
|
|
43
|
+
: {}),
|
|
44
|
+
}));
|
|
45
|
+
const data = dataOf(result);
|
|
46
|
+
// The OTP-confirmation session token is a short-lived secret; keep it out of
|
|
47
|
+
// the persisted transaction row (it's still returned to the caller below).
|
|
48
|
+
const safeRawResponse = { ...data };
|
|
49
|
+
delete safeRawResponse.id_session_token;
|
|
50
|
+
delete safeRawResponse.idSessionToken;
|
|
51
|
+
const refPayco = pick(data, ["ref_payco", "refPayco"]);
|
|
52
|
+
if (refPayco) {
|
|
53
|
+
await ctx.runMutation(internal.transactions.upsertTransaction, {
|
|
54
|
+
userId: args.userId,
|
|
55
|
+
epaycoRef: refPayco,
|
|
56
|
+
epaycoTransactionId: pick(data, ["transactionId", "transaction_id"]),
|
|
57
|
+
paymentMethod: "daviplata",
|
|
58
|
+
status: "pending",
|
|
59
|
+
amount: info.value,
|
|
60
|
+
currency: info.currency ?? "COP",
|
|
61
|
+
description: info.description,
|
|
62
|
+
customerEmail: info.email,
|
|
63
|
+
rawResponse: safeRawResponse,
|
|
64
|
+
lastSyncedAt: Date.now(),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
/** Confirm a Daviplata payment with the customer's OTP. */
|
|
71
|
+
export const confirmDaviplataPayment = action({
|
|
72
|
+
args: {
|
|
73
|
+
credentials: epaycoCredentialsValidator,
|
|
74
|
+
refPayco: v.string(),
|
|
75
|
+
idSessionToken: v.string(),
|
|
76
|
+
otp: v.string(),
|
|
77
|
+
},
|
|
78
|
+
returns: v.any(),
|
|
79
|
+
handler: async (ctx, args) => {
|
|
80
|
+
// Throttle OTP submissions per payment to limit brute-force guessing.
|
|
81
|
+
await rateLimiter.limit(ctx, "confirmDaviplataPayment", {
|
|
82
|
+
key: args.refPayco,
|
|
83
|
+
throws: true,
|
|
84
|
+
});
|
|
85
|
+
const epayco = getEpaycoClient(args.credentials);
|
|
86
|
+
const result = unwrap(await epayco.daviplata.confirm({
|
|
87
|
+
ref_payco: args.refPayco,
|
|
88
|
+
id_session_token: args.idSessionToken,
|
|
89
|
+
otp: args.otp,
|
|
90
|
+
}));
|
|
91
|
+
const data = dataOf(result);
|
|
92
|
+
const safeRawResponse = { ...data };
|
|
93
|
+
delete safeRawResponse.id_session_token;
|
|
94
|
+
delete safeRawResponse.idSessionToken;
|
|
95
|
+
await ctx.runMutation(internal.transactions.updateTransactionStatus, {
|
|
96
|
+
epaycoRef: args.refPayco,
|
|
97
|
+
status: statusFromEstado(pick(data, ["estado", "x_response", "respuesta"])),
|
|
98
|
+
rawResponse: safeRawResponse,
|
|
99
|
+
});
|
|
100
|
+
return result;
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=daviplataApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daviplataApi.js","sourceRoot":"","sources":["../../src/component/daviplataApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { EPaycoCredentials } from "./validators.js";
|
|
2
|
+
/**
|
|
3
|
+
* AES-128-CBC encrypt a UTF-8 string with the hex private key and a zero IV,
|
|
4
|
+
* returning Base64 ciphertext. Web Crypto applies PKCS#7 padding by default,
|
|
5
|
+
* matching `crypto-js`'s `Pkcs7`. (A 16-byte/32-hex private key yields a valid
|
|
6
|
+
* AES-128 key.)
|
|
7
|
+
*/
|
|
8
|
+
export declare function aesEncrypt(value: string, privateKeyHex: string): Promise<string>;
|
|
9
|
+
export type EpaycoResponse = Record<string, unknown> & {
|
|
10
|
+
success?: boolean;
|
|
11
|
+
status?: boolean | string;
|
|
12
|
+
titleResponse?: string;
|
|
13
|
+
title_response?: string;
|
|
14
|
+
textResponse?: string;
|
|
15
|
+
text_response?: string;
|
|
16
|
+
message?: string;
|
|
17
|
+
error?: string;
|
|
18
|
+
data?: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
type Payload = Record<string, unknown>;
|
|
21
|
+
export interface EpaycoClient {
|
|
22
|
+
token: {
|
|
23
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
24
|
+
};
|
|
25
|
+
customers: {
|
|
26
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
27
|
+
get(uid: string): Promise<EpaycoResponse>;
|
|
28
|
+
list(options?: Payload): Promise<EpaycoResponse>;
|
|
29
|
+
update(uid: string, options: Payload): Promise<EpaycoResponse>;
|
|
30
|
+
delete(options: Payload): Promise<EpaycoResponse>;
|
|
31
|
+
addDefaultCard(options: Payload): Promise<EpaycoResponse>;
|
|
32
|
+
addNewToken(options: Payload): Promise<EpaycoResponse>;
|
|
33
|
+
};
|
|
34
|
+
plans: {
|
|
35
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
36
|
+
get(uid: string): Promise<EpaycoResponse>;
|
|
37
|
+
list(): Promise<EpaycoResponse>;
|
|
38
|
+
update(uid: string, options: Payload): Promise<EpaycoResponse>;
|
|
39
|
+
delete(uid: string): Promise<EpaycoResponse>;
|
|
40
|
+
};
|
|
41
|
+
subscriptions: {
|
|
42
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
43
|
+
get(uid: string): Promise<EpaycoResponse>;
|
|
44
|
+
list(): Promise<EpaycoResponse>;
|
|
45
|
+
cancel(uid: string): Promise<EpaycoResponse>;
|
|
46
|
+
charge(options: Payload): Promise<EpaycoResponse>;
|
|
47
|
+
};
|
|
48
|
+
charge: {
|
|
49
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
50
|
+
get(uid: string): Promise<EpaycoResponse>;
|
|
51
|
+
};
|
|
52
|
+
bank: {
|
|
53
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
54
|
+
get(uid: string): Promise<EpaycoResponse>;
|
|
55
|
+
getBanks(): Promise<EpaycoResponse>;
|
|
56
|
+
};
|
|
57
|
+
cash: {
|
|
58
|
+
create(type: string, options: Payload): Promise<EpaycoResponse>;
|
|
59
|
+
get(uid: string): Promise<EpaycoResponse>;
|
|
60
|
+
};
|
|
61
|
+
daviplata: {
|
|
62
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
63
|
+
confirm(options: Payload): Promise<EpaycoResponse>;
|
|
64
|
+
};
|
|
65
|
+
safetypay: {
|
|
66
|
+
create(options: Payload): Promise<EpaycoResponse>;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build an ePayco client bound to a set of credentials. Mirrors the resource
|
|
71
|
+
* method surface of `epayco-sdk-node` so the resource action files are written
|
|
72
|
+
* against the same API.
|
|
73
|
+
*/
|
|
74
|
+
export declare function getEpaycoClient(credentials: EPaycoCredentials): EpaycoClient;
|
|
75
|
+
/**
|
|
76
|
+
* Normalize ePayco's response into either the raw JSON or a thrown
|
|
77
|
+
* `ConvexError`. ePayco never uses non-2xx for business errors — failures show
|
|
78
|
+
* up as `{ error }` or `{ success: false }` — so we surface those as throws.
|
|
79
|
+
*/
|
|
80
|
+
export declare function unwrap(result: EpaycoResponse | null | undefined): EpaycoResponse;
|
|
81
|
+
export declare function dataOf(result: EpaycoResponse): Record<string, unknown>;
|
|
82
|
+
export declare function pick(source: Record<string, unknown>, keys: string[]): string | undefined;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=epaycoClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epaycoClient.d.ts","sourceRoot":"","sources":["../../src/component/epaycoClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { ConvexError } from "convex/values";
|
|
2
|
+
/**
|
|
3
|
+
* Native (V8-runtime) implementation of the ePayco wire protocol.
|
|
4
|
+
*
|
|
5
|
+
* Convex components cannot use the Node.js runtime, so the official
|
|
6
|
+
* `epayco-sdk-node` package (which depends on Node built-ins) cannot run here.
|
|
7
|
+
* This module reproduces that SDK's exact request protocol using only Web
|
|
8
|
+
* platform APIs (`fetch`, Web Crypto, `TextEncoder`):
|
|
9
|
+
*
|
|
10
|
+
* - JWT login (`POST /v1/auth/login`) for `api.secure.payco.co` endpoints,
|
|
11
|
+
* and Basic-auth login (`POST /login`) for `apify.epayco.co` endpoints.
|
|
12
|
+
* - AES-128-CBC encryption (16-byte hex private key, all-zero IV, PKCS#7)
|
|
13
|
+
* for `secure.payco.co/restpagos` (PSE) endpoints, plus the
|
|
14
|
+
* `public_key` / `i` / `p` / `enpruebas` envelope the SDK emits.
|
|
15
|
+
* - Spanish field-name translation (`keylang`) for restpagos endpoints and
|
|
16
|
+
* camelCase translation (`keylang_apify`) for apify endpoints.
|
|
17
|
+
*
|
|
18
|
+
* Ported field-for-field from `epayco-sdk-node@1.4.4` `lib/resources/index.js`.
|
|
19
|
+
*/
|
|
20
|
+
const BASE_URL = "https://api.secure.payco.co";
|
|
21
|
+
const SECURE_URL = "https://secure.payco.co";
|
|
22
|
+
const APIFY_URL = "https://apify.epayco.co";
|
|
23
|
+
/** Upper bound for any ePayco API call, so a hung host can't block the action. */
|
|
24
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
25
|
+
/** Tighter bound for the best-effort ipify lookup on the payment hot path. */
|
|
26
|
+
const IP_LOOKUP_TIMEOUT_MS = 5_000;
|
|
27
|
+
/** Base64 of a 16-byte all-zero IV (`i` for the encrypted restpagos envelope). */
|
|
28
|
+
const ZERO_IV_BASE64 = "AAAAAAAAAAAAAAAAAAAAAA==";
|
|
29
|
+
/** Base64 of the ASCII string "0000000000000000" (`i` for the cash envelope). */
|
|
30
|
+
const CASH_IV_BASE64 = "MDAwMDAwMDAwMDAwMDAwMA==";
|
|
31
|
+
// keylang.json — SDK field name -> restpagos (Spanish) wire field name.
|
|
32
|
+
const KEYLANG = {
|
|
33
|
+
bank: "banco",
|
|
34
|
+
invoice: "factura",
|
|
35
|
+
description: "descripcion",
|
|
36
|
+
value: "valor",
|
|
37
|
+
tax: "iva",
|
|
38
|
+
ico: "ico",
|
|
39
|
+
tax_base: "baseiva",
|
|
40
|
+
currency: "moneda",
|
|
41
|
+
type_person: "tipo_persona",
|
|
42
|
+
doc_type: "tipo_doc",
|
|
43
|
+
doc_number: "documento",
|
|
44
|
+
name: "nombres",
|
|
45
|
+
last_name: "apellidos",
|
|
46
|
+
email: "email",
|
|
47
|
+
country: "pais",
|
|
48
|
+
department: "depto",
|
|
49
|
+
city: "ciudad",
|
|
50
|
+
phone: "telefono",
|
|
51
|
+
cell_phone: "celular",
|
|
52
|
+
address: "direccion",
|
|
53
|
+
ip: "ip",
|
|
54
|
+
url_response: "url_respuesta",
|
|
55
|
+
url_confirmation: "url_confirmacion",
|
|
56
|
+
method_confirmation: "method_confirmation",
|
|
57
|
+
metodoconfirmacion: "metodoconfirmacion",
|
|
58
|
+
end_date: "fechaexpiracion",
|
|
59
|
+
};
|
|
60
|
+
// keylang_apify.json — SDK field name -> apify (camelCase) wire field name.
|
|
61
|
+
const KEYLANG_APIFY = {
|
|
62
|
+
cash: "cash",
|
|
63
|
+
end_date: "expirationDate",
|
|
64
|
+
ref_payco: "refPayco",
|
|
65
|
+
id_session_token: "idSessionToken",
|
|
66
|
+
otp: "otp",
|
|
67
|
+
invoice: "invoice",
|
|
68
|
+
description: "description",
|
|
69
|
+
value: "value",
|
|
70
|
+
tax: "tax",
|
|
71
|
+
ico: "ico",
|
|
72
|
+
tax_base: "taxBase",
|
|
73
|
+
currency: "currency",
|
|
74
|
+
doc_type: "docType",
|
|
75
|
+
doc_number: "document",
|
|
76
|
+
name: "name",
|
|
77
|
+
last_name: "lastName",
|
|
78
|
+
email: "email",
|
|
79
|
+
ind_country: "indCountry",
|
|
80
|
+
country: "country",
|
|
81
|
+
city: "city",
|
|
82
|
+
phone: "phone",
|
|
83
|
+
address: "address",
|
|
84
|
+
ip: "ip",
|
|
85
|
+
test: "testMode",
|
|
86
|
+
url_response: "urlResponse",
|
|
87
|
+
url_confirmation: "urlConfirmation",
|
|
88
|
+
method_confirmation: "methodConfirmation",
|
|
89
|
+
};
|
|
90
|
+
function langkey(key) {
|
|
91
|
+
return KEYLANG[key] ?? key;
|
|
92
|
+
}
|
|
93
|
+
function langkeyApify(key) {
|
|
94
|
+
return KEYLANG_APIFY[key] ?? key;
|
|
95
|
+
}
|
|
96
|
+
const B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
97
|
+
function bytesToBase64(bytes) {
|
|
98
|
+
let out = "";
|
|
99
|
+
let i = 0;
|
|
100
|
+
for (; i + 3 <= bytes.length; i += 3) {
|
|
101
|
+
const n = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
|
|
102
|
+
out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63] + B64[(n >> 6) & 63] + B64[n & 63];
|
|
103
|
+
}
|
|
104
|
+
const rem = bytes.length - i;
|
|
105
|
+
if (rem === 1) {
|
|
106
|
+
const n = bytes[i] << 16;
|
|
107
|
+
out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63] + "==";
|
|
108
|
+
}
|
|
109
|
+
else if (rem === 2) {
|
|
110
|
+
const n = (bytes[i] << 16) | (bytes[i + 1] << 8);
|
|
111
|
+
out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63] + B64[(n >> 6) & 63] + "=";
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
function hexToBytes(hex) {
|
|
116
|
+
const bytes = new Uint8Array(Math.floor(hex.length / 2));
|
|
117
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
118
|
+
bytes[i] = parseInt(hex.substr(i * 2, 2), 16);
|
|
119
|
+
}
|
|
120
|
+
return bytes;
|
|
121
|
+
}
|
|
122
|
+
function utf8ToBase64(str) {
|
|
123
|
+
return bytesToBase64(new TextEncoder().encode(str));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* AES-128-CBC encrypt a UTF-8 string with the hex private key and a zero IV,
|
|
127
|
+
* returning Base64 ciphertext. Web Crypto applies PKCS#7 padding by default,
|
|
128
|
+
* matching `crypto-js`'s `Pkcs7`. (A 16-byte/32-hex private key yields a valid
|
|
129
|
+
* AES-128 key.)
|
|
130
|
+
*/
|
|
131
|
+
export async function aesEncrypt(value, privateKeyHex) {
|
|
132
|
+
const key = await crypto.subtle.importKey("raw", hexToBytes(privateKeyHex), { name: "AES-CBC" }, false, ["encrypt"]);
|
|
133
|
+
const ciphertext = await crypto.subtle.encrypt({ name: "AES-CBC", iv: new Uint8Array(16) }, key, new TextEncoder().encode(value));
|
|
134
|
+
return bytesToBase64(new Uint8Array(ciphertext));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Build an ePayco client bound to a set of credentials. Mirrors the resource
|
|
138
|
+
* method surface of `epayco-sdk-node` so the resource action files are written
|
|
139
|
+
* against the same API.
|
|
140
|
+
*/
|
|
141
|
+
export function getEpaycoClient(credentials) {
|
|
142
|
+
const apiKey = credentials.apiKey;
|
|
143
|
+
const privateKey = credentials.privateKey;
|
|
144
|
+
const test = credentials.testMode ?? false ? "TRUE" : "FALSE";
|
|
145
|
+
async function authenticate(apify) {
|
|
146
|
+
if (apify) {
|
|
147
|
+
const basic = utf8ToBase64(`${apiKey}:${privateKey}`);
|
|
148
|
+
const res = await fetch(`${APIFY_URL}/login`, {
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers: {
|
|
151
|
+
"Content-Type": "application/json",
|
|
152
|
+
// The trailing ";" is intentional: it matches epayco-sdk-node@1.4.4
|
|
153
|
+
// (lib/resources/index.js) exactly, which the apify host expects.
|
|
154
|
+
Authorization: `Basic ${basic};`,
|
|
155
|
+
},
|
|
156
|
+
body: JSON.stringify({}),
|
|
157
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
158
|
+
});
|
|
159
|
+
const json = (await res.json());
|
|
160
|
+
return String(json.token ?? json.bearer_token ?? "");
|
|
161
|
+
}
|
|
162
|
+
const res = await fetch(`${BASE_URL}/v1/auth/login`, {
|
|
163
|
+
method: "POST",
|
|
164
|
+
headers: { "Content-Type": "application/json" },
|
|
165
|
+
body: JSON.stringify({ public_key: apiKey, private_key: privateKey }),
|
|
166
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
167
|
+
});
|
|
168
|
+
const json = (await res.json());
|
|
169
|
+
return String(json.bearer_token ?? json.token ?? "");
|
|
170
|
+
}
|
|
171
|
+
async function setData(data, cashData, apify) {
|
|
172
|
+
const set = {};
|
|
173
|
+
if (apify) {
|
|
174
|
+
for (const key of Object.keys(data)) {
|
|
175
|
+
set[langkeyApify(key)] = data[key];
|
|
176
|
+
}
|
|
177
|
+
return set;
|
|
178
|
+
}
|
|
179
|
+
if (cashData) {
|
|
180
|
+
for (const key of Object.keys(data)) {
|
|
181
|
+
set[langkey(key)] = data[key];
|
|
182
|
+
}
|
|
183
|
+
set.public_key = apiKey;
|
|
184
|
+
set.i = CASH_IV_BASE64;
|
|
185
|
+
set.enpruebas = test;
|
|
186
|
+
set.lenguaje = "javascript";
|
|
187
|
+
set.p = "";
|
|
188
|
+
return set;
|
|
189
|
+
}
|
|
190
|
+
// Encrypted (PSE) path.
|
|
191
|
+
for (const key of Object.keys(data)) {
|
|
192
|
+
const value = data[key];
|
|
193
|
+
if (key.includes("extras_epayco") && value && typeof value === "object") {
|
|
194
|
+
const extra5 = value.extra5;
|
|
195
|
+
set[langkey(key)] = {
|
|
196
|
+
extra5: await aesEncrypt(String(extra5 ?? ""), privateKey),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
set[langkey(key)] = await aesEncrypt(String(value), privateKey);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
set.public_key = apiKey;
|
|
204
|
+
set.i = ZERO_IV_BASE64;
|
|
205
|
+
set.enpruebas = await aesEncrypt(test, privateKey);
|
|
206
|
+
set.lenguaje = "javascript";
|
|
207
|
+
set.p = bytesToBase64(hexToBytes(privateKey));
|
|
208
|
+
return set;
|
|
209
|
+
}
|
|
210
|
+
async function request(method, path, data, flags = {}) {
|
|
211
|
+
const { sw = false, cashData = false, card = false, apify = false } = flags;
|
|
212
|
+
const bearer = `Bearer ${await authenticate(apify)}`;
|
|
213
|
+
const headers = {
|
|
214
|
+
"Content-Type": "application/json",
|
|
215
|
+
type: "sdk-jwt",
|
|
216
|
+
lang: "NODE",
|
|
217
|
+
Authorization: bearer,
|
|
218
|
+
};
|
|
219
|
+
const base = apify ? APIFY_URL : sw ? SECURE_URL : BASE_URL;
|
|
220
|
+
const url = base + path;
|
|
221
|
+
if (method === "get") {
|
|
222
|
+
const res = await fetch(url, {
|
|
223
|
+
method: "GET",
|
|
224
|
+
headers,
|
|
225
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
226
|
+
});
|
|
227
|
+
return parseResponse(res);
|
|
228
|
+
}
|
|
229
|
+
let body = { ...data, extras_epayco: { extra5: "P44" } };
|
|
230
|
+
if (!card) {
|
|
231
|
+
body.test = test;
|
|
232
|
+
if (body.ip === undefined) {
|
|
233
|
+
const ip = await fetchServerIp();
|
|
234
|
+
if (ip)
|
|
235
|
+
body.ip = ip;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (sw || apify) {
|
|
239
|
+
body = await setData(body, cashData, apify);
|
|
240
|
+
}
|
|
241
|
+
const res = await fetch(url, {
|
|
242
|
+
method: "POST",
|
|
243
|
+
headers,
|
|
244
|
+
body: JSON.stringify(body),
|
|
245
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
246
|
+
});
|
|
247
|
+
return parseResponse(res);
|
|
248
|
+
}
|
|
249
|
+
const txLookup = (uid) => request("get", `/restpagos/transaction/response.json?ref_payco=${encodeURIComponent(uid)}&&public_key=${apiKey}`, {}, { sw: true });
|
|
250
|
+
return {
|
|
251
|
+
token: {
|
|
252
|
+
create: (options) => request("post", "/v1/tokens", options),
|
|
253
|
+
},
|
|
254
|
+
customers: {
|
|
255
|
+
create: (options) => request("post", "/payment/v1/customer/create", options),
|
|
256
|
+
get: (uid) => request("get", `/payment/v1/customer/${apiKey}/${uid}`, {}),
|
|
257
|
+
list: (options) => request("get", buildListUrl("/payment/v1/customers", options), {}, {
|
|
258
|
+
card: true,
|
|
259
|
+
}),
|
|
260
|
+
update: (uid, options) => request("post", `/payment/v1/customer/edit/${apiKey}/${uid}`, options),
|
|
261
|
+
delete: (options) => request("post", "/v1/remove/token", options),
|
|
262
|
+
addDefaultCard: (options) => request("post", "/payment/v1/customer/reasign/card/default", options, {
|
|
263
|
+
card: true,
|
|
264
|
+
}),
|
|
265
|
+
addNewToken: (options) => request("post", "/v1/customer/add/token", options, { card: true }),
|
|
266
|
+
},
|
|
267
|
+
plans: {
|
|
268
|
+
create: (options) => request("post", "/recurring/v1/plan/create", options),
|
|
269
|
+
get: (uid) => request("get", `/recurring/v1/plan/${apiKey}/${uid}`, {}),
|
|
270
|
+
list: () => request("get", `/recurring/v1/plans/${apiKey}`, {}),
|
|
271
|
+
update: (uid, options) => request("post", `/recurring/v1/plan/edit/${uid}`, options),
|
|
272
|
+
delete: (uid) => request("post", `/recurring/v1/plan/remove/${apiKey}/${uid}`, {}),
|
|
273
|
+
},
|
|
274
|
+
subscriptions: {
|
|
275
|
+
create: (options) => request("post", "/recurring/v1/subscription/create", options),
|
|
276
|
+
get: (uid) => request("get", `/recurring/v1/subscription/${uid}/${apiKey}`, {}),
|
|
277
|
+
list: () => request("get", `/recurring/v1/subscriptions/${apiKey}`, {}),
|
|
278
|
+
cancel: (uid) => request("post", "/recurring/v1/subscription/cancel", {
|
|
279
|
+
id: uid,
|
|
280
|
+
public_key: apiKey,
|
|
281
|
+
}),
|
|
282
|
+
charge: (options) => request("post", "/payment/v1/charge/subscription/create", options),
|
|
283
|
+
},
|
|
284
|
+
charge: {
|
|
285
|
+
create: (options) => request("post", "/payment/v1/charge/create", options),
|
|
286
|
+
get: (uid) => txLookup(uid),
|
|
287
|
+
},
|
|
288
|
+
bank: {
|
|
289
|
+
create: (options) => request("post", "/restpagos/pagos/debitos.json", options, { sw: true }),
|
|
290
|
+
get: (uid) => request("get", `/restpagos/pse/transactioninfomation.json?transactionID=${encodeURIComponent(uid)}&&public_key=${apiKey}`, {}, { sw: true }),
|
|
291
|
+
getBanks: () => request("get", `/restpagos/pse/bancos.json?public_key=${apiKey}`, {}, { sw: true, cashData: true }),
|
|
292
|
+
},
|
|
293
|
+
cash: {
|
|
294
|
+
create: (type, options) => request("post", `/restpagos/v2/efectivo/${type}`, options, {
|
|
295
|
+
sw: true,
|
|
296
|
+
cashData: true,
|
|
297
|
+
}),
|
|
298
|
+
get: (uid) => txLookup(uid),
|
|
299
|
+
},
|
|
300
|
+
daviplata: {
|
|
301
|
+
create: (options) => request("post", "/payment/process/daviplata", options, {
|
|
302
|
+
apify: true,
|
|
303
|
+
card: true,
|
|
304
|
+
}),
|
|
305
|
+
confirm: (options) => request("post", "/payment/confirm/daviplata", options, {
|
|
306
|
+
apify: true,
|
|
307
|
+
card: true,
|
|
308
|
+
}),
|
|
309
|
+
},
|
|
310
|
+
safetypay: {
|
|
311
|
+
create: (options) => request("post", "/payment/process/safetypay", options, {
|
|
312
|
+
apify: true,
|
|
313
|
+
card: true,
|
|
314
|
+
}),
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function buildListUrl(path, options) {
|
|
319
|
+
if (!options)
|
|
320
|
+
return path;
|
|
321
|
+
const params = new URLSearchParams();
|
|
322
|
+
for (const [key, value] of Object.entries(options)) {
|
|
323
|
+
if (value !== undefined && value !== null)
|
|
324
|
+
params.set(key, String(value));
|
|
325
|
+
}
|
|
326
|
+
const qs = params.toString();
|
|
327
|
+
return qs ? `${path}?${qs}` : path;
|
|
328
|
+
}
|
|
329
|
+
async function parseResponse(res) {
|
|
330
|
+
const text = await res.text();
|
|
331
|
+
try {
|
|
332
|
+
return JSON.parse(text);
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
return { error: text || `HTTP ${res.status}` };
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Best-effort server IP lookup (matches the SDK's ipify fallback). Used only
|
|
340
|
+
* when the caller doesn't supply `ip`; bounded by a short timeout so the payment
|
|
341
|
+
* hot path can't stall on a slow third party, and failures fall through silently.
|
|
342
|
+
*/
|
|
343
|
+
async function fetchServerIp() {
|
|
344
|
+
try {
|
|
345
|
+
const res = await fetch("https://api.ipify.org?format=json", {
|
|
346
|
+
signal: AbortSignal.timeout(IP_LOOKUP_TIMEOUT_MS),
|
|
347
|
+
});
|
|
348
|
+
const json = (await res.json());
|
|
349
|
+
return json.ip;
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
return undefined;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Normalize ePayco's response into either the raw JSON or a thrown
|
|
357
|
+
* `ConvexError`. ePayco never uses non-2xx for business errors — failures show
|
|
358
|
+
* up as `{ error }` or `{ success: false }` — so we surface those as throws.
|
|
359
|
+
*/
|
|
360
|
+
export function unwrap(result) {
|
|
361
|
+
if (result == null) {
|
|
362
|
+
throw new ConvexError({
|
|
363
|
+
code: "EPAYCO_API_ERROR",
|
|
364
|
+
message: "Empty response from ePayco",
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
// The SDK-style `{ error }` envelope, or ePayco's bare `{ message }` envelope
|
|
368
|
+
// (returned for account-gated features like recurring plans) — neither
|
|
369
|
+
// carries a success flag, payload, or id, so treat them as failures.
|
|
370
|
+
const hasNoSuccessSignal = result.success === undefined &&
|
|
371
|
+
result.status === undefined &&
|
|
372
|
+
result.data === undefined &&
|
|
373
|
+
result.id === undefined &&
|
|
374
|
+
result.ref_payco === undefined &&
|
|
375
|
+
result.token === undefined;
|
|
376
|
+
if (typeof result.error === "string" && hasNoSuccessSignal) {
|
|
377
|
+
throw new ConvexError({
|
|
378
|
+
code: "EPAYCO_API_ERROR",
|
|
379
|
+
message: result.error,
|
|
380
|
+
raw: result,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
if (typeof result.message === "string" && hasNoSuccessSignal) {
|
|
384
|
+
throw new ConvexError({
|
|
385
|
+
code: "EPAYCO_API_ERROR",
|
|
386
|
+
message: result.message,
|
|
387
|
+
raw: result,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
if (result.success === false || result.status === false) {
|
|
391
|
+
const message = result.text_response ??
|
|
392
|
+
result.textResponse ??
|
|
393
|
+
result.title_response ??
|
|
394
|
+
result.titleResponse ??
|
|
395
|
+
result.message ??
|
|
396
|
+
(typeof result.data === "object" && result.data !== null
|
|
397
|
+
? result.data.description
|
|
398
|
+
: undefined) ??
|
|
399
|
+
"ePayco request failed";
|
|
400
|
+
throw new ConvexError({
|
|
401
|
+
code: "EPAYCO_API_ERROR",
|
|
402
|
+
message: String(message),
|
|
403
|
+
raw: result,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
return result;
|
|
407
|
+
}
|
|
408
|
+
export function dataOf(result) {
|
|
409
|
+
return typeof result.data === "object" && result.data !== null
|
|
410
|
+
? result.data
|
|
411
|
+
: {};
|
|
412
|
+
}
|
|
413
|
+
export function pick(source, keys) {
|
|
414
|
+
for (const key of keys) {
|
|
415
|
+
const value = source[key];
|
|
416
|
+
if (value !== undefined && value !== null && value !== "") {
|
|
417
|
+
return String(value);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return undefined;
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=epaycoClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epaycoClient.js","sourceRoot":"","sources":["../../src/component/epaycoClient.ts"],"names":[],"mappings":"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"}
|