@sazito/checkout 0.4.19 → 0.4.20
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 +19 -37
- package/dist/chunks/{labels-Cysz2BgA.js → labels-CwHBYso8.js} +9 -5
- package/dist/chunks/labels-CwHBYso8.js.map +1 -0
- package/dist/chunks/{labels-Cy05dLJx.cjs → labels-FNi3eq4p.cjs} +9 -5
- package/dist/chunks/labels-FNi3eq4p.cjs.map +1 -0
- package/dist/chunks/{use-checkout-wHkKNkbK.cjs → use-checkout-DsTtOAMs.cjs} +9 -4
- package/dist/chunks/use-checkout-DsTtOAMs.cjs.map +1 -0
- package/dist/chunks/{use-checkout-uWEi8iqK.js → use-checkout-OyHfWeAh.js} +10 -5
- package/dist/chunks/use-checkout-OyHfWeAh.js.map +1 -0
- package/dist/core/index.cjs +3 -1
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +18 -4
- package/dist/core/index.d.ts +18 -4
- package/dist/core/index.js +2 -2
- package/dist/next/index.cjs +12 -6
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +10 -3
- package/dist/next/index.d.ts +10 -3
- package/dist/next/index.js +14 -8
- package/dist/next/index.js.map +1 -1
- package/dist/next/payment-return.cjs +50 -0
- package/dist/next/payment-return.cjs.map +1 -1
- package/dist/next/payment-return.d.cts +16 -2
- package/dist/next/payment-return.d.ts +16 -2
- package/dist/next/payment-return.js +49 -1
- package/dist/next/payment-return.js.map +1 -1
- package/dist/next/server.cjs +10 -0
- package/dist/next/server.cjs.map +1 -0
- package/dist/next/server.d.cts +33 -0
- package/dist/next/server.d.ts +33 -0
- package/dist/next/server.js +4 -0
- package/dist/next/server.js.map +1 -0
- package/dist/react/index.cjs +2 -2
- package/dist/react/index.d.cts +3 -2
- package/dist/react/index.d.ts +3 -2
- package/dist/react/index.js +2 -2
- package/dist/server/index.cjs +182 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +33 -0
- package/dist/server/index.d.ts +33 -0
- package/dist/server/index.js +180 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +30 -2
- package/dist/chunks/labels-Cy05dLJx.cjs.map +0 -1
- package/dist/chunks/labels-Cysz2BgA.js.map +0 -1
- package/dist/chunks/use-checkout-uWEi8iqK.js.map +0 -1
- package/dist/chunks/use-checkout-wHkKNkbK.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/server/index.ts"],"sourcesContent":["/**\n * @sazito/checkout/server — server-only payment callback handlers.\n *\n * The implementation uses only the standard Web Request/Response APIs so the\n * same handlers work in Next.js Route Handlers and other compatible runtimes.\n */\nimport {\n createSazitoClient,\n type PaymentCallbackFieldValue,\n type PaymentCallbackFields,\n type SazitoConfig\n} from '@sazito/client-sdk';\nimport {\n parsePaymentReturnUrl,\n SAZITO_PAYMENT_STATUS_QUERY\n} from '../core/payment-return';\nimport type { PaymentReturnParserOptions } from '../core/types';\n\nconst DEFAULT_CHECKOUT_PATH = '/checkout';\nconst DEFAULT_MAX_BODY_BYTES = 64 * 1024;\n\nexport type SazitoPaymentRouteHandler = (request: Request) => Promise<Response>;\n\nexport interface SazitoCheckoutServerConfig extends SazitoConfig {\n /** Page that renders `SazitoCheckoutPage` after server verification. */\n checkoutPath?: string;\n /** Maximum accepted gateway callback body size. Defaults to 64 KiB. */\n maxCallbackBodyBytes?: number;\n /** Replace the built-in gateway-result marker allowlist. */\n gatewayResultMarkers?: readonly string[];\n}\n\nexport interface SazitoCheckoutServer {\n handlers: {\n GET: SazitoPaymentRouteHandler;\n POST: SazitoPaymentRouteHandler;\n };\n}\n\n/**\n * Create GET and POST route handlers for payment callbacks.\n * A fresh SDK client is created for each request so server-side guest\n * credentials can never leak between concurrent callbacks.\n */\nexport function SazitoCheckout(config: SazitoCheckoutServerConfig): SazitoCheckoutServer {\n const {\n checkoutPath = DEFAULT_CHECKOUT_PATH,\n maxCallbackBodyBytes = DEFAULT_MAX_BODY_BYTES,\n gatewayResultMarkers,\n ...sdkConfig\n } = config;\n\n validateConfig(sdkConfig, checkoutPath, maxCallbackBodyBytes);\n const parserOptions: PaymentReturnParserOptions = { gatewayResultMarkers };\n\n const createHandler = (method: 'GET' | 'POST'): SazitoPaymentRouteHandler =>\n async (request) => {\n if (request.method.toUpperCase() !== method) {\n return errorResponse(405, 'method_not_allowed', { Allow: method });\n }\n\n try {\n const callback = parsePaymentReturnUrl(request.url, parserOptions);\n if (!callback || callback.resolution === 'status') {\n return errorResponse(400, 'invalid_payment_callback');\n }\n\n const requestUrl = new URL(request.url);\n const body = method === 'POST'\n ? await readCallbackBody(request, maxCallbackBodyBytes)\n : undefined;\n const query = fieldsFromSearchParams(requestUrl.searchParams);\n const client = createSazitoClient(sdkConfig);\n const verification = await client.payments.verifyPaymentCallback({\n paymentId: callback.payment.id,\n paymentIdentifier: callback.payment.identifier,\n body,\n query\n });\n\n if (verification.error || !verification.data) {\n if (sdkConfig.debug) {\n console.error('[Sazito Checkout] Payment callback verification failed:', {\n paymentId: callback.payment.id,\n error: verification.error\n });\n }\n return errorResponse(502, 'payment_verification_failed');\n }\n\n const redirectUrl = createStatusRedirectUrl(\n requestUrl,\n checkoutPath,\n callback.payment\n );\n return new Response(null, {\n status: 303,\n headers: {\n Location: redirectUrl.toString(),\n 'Cache-Control': 'no-store',\n 'Referrer-Policy': 'no-referrer'\n }\n });\n } catch (error) {\n if (config.debug) {\n console.error('[Sazito Checkout] Invalid payment callback request:', error);\n }\n const status = error instanceof CallbackRequestError ? error.status : 500;\n const code = error instanceof CallbackRequestError\n ? error.code\n : 'payment_callback_failed';\n return errorResponse(status, code);\n }\n };\n\n return {\n handlers: {\n GET: createHandler('GET'),\n POST: createHandler('POST')\n }\n };\n}\n\nfunction validateConfig(\n config: SazitoConfig,\n checkoutPath: string,\n maxCallbackBodyBytes: number\n): void {\n if (!config.domain?.trim()) {\n throw new Error('[@sazito/checkout] `domain` is required by the payment callback handler.');\n }\n if (!checkoutPath.trim()) {\n throw new Error('[@sazito/checkout] `checkoutPath` cannot be empty.');\n }\n if (!Number.isSafeInteger(maxCallbackBodyBytes) || maxCallbackBodyBytes <= 0) {\n throw new Error('[@sazito/checkout] `maxCallbackBodyBytes` must be a positive integer.');\n }\n}\n\nasync function readCallbackBody(\n request: Request,\n maxBodyBytes: number\n): Promise<PaymentCallbackFields> {\n const declaredLength = Number(request.headers.get('content-length') ?? 0);\n if (Number.isFinite(declaredLength) && declaredLength > maxBodyBytes) {\n throw new CallbackRequestError(413, 'payment_callback_too_large');\n }\n\n const bytes = await request.arrayBuffer();\n if (bytes.byteLength > maxBodyBytes) {\n throw new CallbackRequestError(413, 'payment_callback_too_large');\n }\n if (bytes.byteLength === 0) return {};\n\n const contentType = request.headers.get('content-type')?.toLowerCase() ?? '';\n if (contentType.includes('application/json')) {\n return fieldsFromJson(new TextDecoder().decode(bytes));\n }\n if (contentType.includes('multipart/form-data')) {\n const form = await new Response(bytes, {\n headers: { 'Content-Type': request.headers.get('content-type') ?? '' }\n }).formData();\n return fieldsFromFormData(form);\n }\n\n // Gateways commonly omit Content-Type or label URL-encoded data as text.\n return fieldsFromSearchParams(new URLSearchParams(new TextDecoder().decode(bytes)));\n}\n\nfunction fieldsFromJson(source: string): PaymentCallbackFields {\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch {\n throw new CallbackRequestError(400, 'invalid_payment_callback_body');\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new CallbackRequestError(400, 'invalid_payment_callback_body');\n }\n return value as PaymentCallbackFields;\n}\n\nfunction fieldsFromSearchParams(params: URLSearchParams): PaymentCallbackFields {\n const fields: PaymentCallbackFields = {};\n for (const [name, value] of params) appendField(fields, name, value);\n return fields;\n}\n\nfunction fieldsFromFormData(form: FormData): PaymentCallbackFields {\n const fields: PaymentCallbackFields = {};\n for (const [name, value] of form) {\n if (typeof value !== 'string') {\n throw new CallbackRequestError(400, 'unsupported_payment_callback_file');\n }\n appendField(fields, name, value);\n }\n return fields;\n}\n\nfunction appendField(\n fields: PaymentCallbackFields,\n name: string,\n value: PaymentCallbackFieldValue\n): void {\n const current = fields[name];\n if (current === undefined) {\n fields[name] = value;\n } else if (Array.isArray(current)) {\n fields[name] = [...current, value ?? null];\n } else {\n fields[name] = [current, value ?? null];\n }\n}\n\nfunction createStatusRedirectUrl(\n requestUrl: URL,\n checkoutPath: string,\n payment: { id: number; identifier: string }\n): URL {\n const redirectUrl = new URL(checkoutPath, requestUrl.origin);\n redirectUrl.searchParams.set(SAZITO_PAYMENT_STATUS_QUERY.resolution, 'status');\n redirectUrl.searchParams.set(SAZITO_PAYMENT_STATUS_QUERY.paymentId, String(payment.id));\n redirectUrl.searchParams.set(\n SAZITO_PAYMENT_STATUS_QUERY.paymentIdentifier,\n payment.identifier\n );\n return redirectUrl;\n}\n\nfunction errorResponse(\n status: number,\n code: string,\n extraHeaders: Record<string, string> = {}\n): Response {\n return Response.json(\n { error: code },\n {\n status,\n headers: {\n 'Cache-Control': 'no-store',\n ...extraHeaders\n }\n }\n );\n}\n\nclass CallbackRequestError extends Error {\n constructor(\n readonly status: number,\n readonly code: string\n ) {\n super(code);\n }\n}\n"],"names":["parsePaymentReturnUrl","createSazitoClient","SAZITO_PAYMENT_STATUS_QUERY"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SazitoConfig } from '@sazito/client-sdk';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @sazito/checkout/server — server-only payment callback handlers.
|
|
5
|
+
*
|
|
6
|
+
* The implementation uses only the standard Web Request/Response APIs so the
|
|
7
|
+
* same handlers work in Next.js Route Handlers and other compatible runtimes.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
type SazitoPaymentRouteHandler = (request: Request) => Promise<Response>;
|
|
11
|
+
interface SazitoCheckoutServerConfig extends SazitoConfig {
|
|
12
|
+
/** Page that renders `SazitoCheckoutPage` after server verification. */
|
|
13
|
+
checkoutPath?: string;
|
|
14
|
+
/** Maximum accepted gateway callback body size. Defaults to 64 KiB. */
|
|
15
|
+
maxCallbackBodyBytes?: number;
|
|
16
|
+
/** Replace the built-in gateway-result marker allowlist. */
|
|
17
|
+
gatewayResultMarkers?: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
interface SazitoCheckoutServer {
|
|
20
|
+
handlers: {
|
|
21
|
+
GET: SazitoPaymentRouteHandler;
|
|
22
|
+
POST: SazitoPaymentRouteHandler;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create GET and POST route handlers for payment callbacks.
|
|
27
|
+
* A fresh SDK client is created for each request so server-side guest
|
|
28
|
+
* credentials can never leak between concurrent callbacks.
|
|
29
|
+
*/
|
|
30
|
+
declare function SazitoCheckout(config: SazitoCheckoutServerConfig): SazitoCheckoutServer;
|
|
31
|
+
|
|
32
|
+
export { SazitoCheckout };
|
|
33
|
+
export type { SazitoCheckoutServer, SazitoCheckoutServerConfig, SazitoPaymentRouteHandler };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { SazitoConfig } from '@sazito/client-sdk';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @sazito/checkout/server — server-only payment callback handlers.
|
|
5
|
+
*
|
|
6
|
+
* The implementation uses only the standard Web Request/Response APIs so the
|
|
7
|
+
* same handlers work in Next.js Route Handlers and other compatible runtimes.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
type SazitoPaymentRouteHandler = (request: Request) => Promise<Response>;
|
|
11
|
+
interface SazitoCheckoutServerConfig extends SazitoConfig {
|
|
12
|
+
/** Page that renders `SazitoCheckoutPage` after server verification. */
|
|
13
|
+
checkoutPath?: string;
|
|
14
|
+
/** Maximum accepted gateway callback body size. Defaults to 64 KiB. */
|
|
15
|
+
maxCallbackBodyBytes?: number;
|
|
16
|
+
/** Replace the built-in gateway-result marker allowlist. */
|
|
17
|
+
gatewayResultMarkers?: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
interface SazitoCheckoutServer {
|
|
20
|
+
handlers: {
|
|
21
|
+
GET: SazitoPaymentRouteHandler;
|
|
22
|
+
POST: SazitoPaymentRouteHandler;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create GET and POST route handlers for payment callbacks.
|
|
27
|
+
* A fresh SDK client is created for each request so server-side guest
|
|
28
|
+
* credentials can never leak between concurrent callbacks.
|
|
29
|
+
*/
|
|
30
|
+
declare function SazitoCheckout(config: SazitoCheckoutServerConfig): SazitoCheckoutServer;
|
|
31
|
+
|
|
32
|
+
export { SazitoCheckout };
|
|
33
|
+
export type { SazitoCheckoutServer, SazitoCheckoutServerConfig, SazitoPaymentRouteHandler };
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { createSazitoClient } from '@sazito/client-sdk';
|
|
2
|
+
import { parsePaymentReturnUrl, SAZITO_PAYMENT_STATUS_QUERY } from '../next/payment-return.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @sazito/checkout/server — server-only payment callback handlers.
|
|
6
|
+
*
|
|
7
|
+
* The implementation uses only the standard Web Request/Response APIs so the
|
|
8
|
+
* same handlers work in Next.js Route Handlers and other compatible runtimes.
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_CHECKOUT_PATH = '/checkout';
|
|
11
|
+
const DEFAULT_MAX_BODY_BYTES = 64 * 1024;
|
|
12
|
+
/**
|
|
13
|
+
* Create GET and POST route handlers for payment callbacks.
|
|
14
|
+
* A fresh SDK client is created for each request so server-side guest
|
|
15
|
+
* credentials can never leak between concurrent callbacks.
|
|
16
|
+
*/
|
|
17
|
+
function SazitoCheckout(config) {
|
|
18
|
+
const { checkoutPath = DEFAULT_CHECKOUT_PATH, maxCallbackBodyBytes = DEFAULT_MAX_BODY_BYTES, gatewayResultMarkers, ...sdkConfig } = config;
|
|
19
|
+
validateConfig(sdkConfig, checkoutPath, maxCallbackBodyBytes);
|
|
20
|
+
const parserOptions = { gatewayResultMarkers };
|
|
21
|
+
const createHandler = (method) => async (request) => {
|
|
22
|
+
if (request.method.toUpperCase() !== method) {
|
|
23
|
+
return errorResponse(405, 'method_not_allowed', { Allow: method });
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const callback = parsePaymentReturnUrl(request.url, parserOptions);
|
|
27
|
+
if (!callback || callback.resolution === 'status') {
|
|
28
|
+
return errorResponse(400, 'invalid_payment_callback');
|
|
29
|
+
}
|
|
30
|
+
const requestUrl = new URL(request.url);
|
|
31
|
+
const body = method === 'POST'
|
|
32
|
+
? await readCallbackBody(request, maxCallbackBodyBytes)
|
|
33
|
+
: undefined;
|
|
34
|
+
const query = fieldsFromSearchParams(requestUrl.searchParams);
|
|
35
|
+
const client = createSazitoClient(sdkConfig);
|
|
36
|
+
const verification = await client.payments.verifyPaymentCallback({
|
|
37
|
+
paymentId: callback.payment.id,
|
|
38
|
+
paymentIdentifier: callback.payment.identifier,
|
|
39
|
+
body,
|
|
40
|
+
query
|
|
41
|
+
});
|
|
42
|
+
if (verification.error || !verification.data) {
|
|
43
|
+
if (sdkConfig.debug) {
|
|
44
|
+
console.error('[Sazito Checkout] Payment callback verification failed:', {
|
|
45
|
+
paymentId: callback.payment.id,
|
|
46
|
+
error: verification.error
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return errorResponse(502, 'payment_verification_failed');
|
|
50
|
+
}
|
|
51
|
+
const redirectUrl = createStatusRedirectUrl(requestUrl, checkoutPath, callback.payment);
|
|
52
|
+
return new Response(null, {
|
|
53
|
+
status: 303,
|
|
54
|
+
headers: {
|
|
55
|
+
Location: redirectUrl.toString(),
|
|
56
|
+
'Cache-Control': 'no-store',
|
|
57
|
+
'Referrer-Policy': 'no-referrer'
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (config.debug) {
|
|
63
|
+
console.error('[Sazito Checkout] Invalid payment callback request:', error);
|
|
64
|
+
}
|
|
65
|
+
const status = error instanceof CallbackRequestError ? error.status : 500;
|
|
66
|
+
const code = error instanceof CallbackRequestError
|
|
67
|
+
? error.code
|
|
68
|
+
: 'payment_callback_failed';
|
|
69
|
+
return errorResponse(status, code);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
handlers: {
|
|
74
|
+
GET: createHandler('GET'),
|
|
75
|
+
POST: createHandler('POST')
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function validateConfig(config, checkoutPath, maxCallbackBodyBytes) {
|
|
80
|
+
if (!config.domain?.trim()) {
|
|
81
|
+
throw new Error('[@sazito/checkout] `domain` is required by the payment callback handler.');
|
|
82
|
+
}
|
|
83
|
+
if (!checkoutPath.trim()) {
|
|
84
|
+
throw new Error('[@sazito/checkout] `checkoutPath` cannot be empty.');
|
|
85
|
+
}
|
|
86
|
+
if (!Number.isSafeInteger(maxCallbackBodyBytes) || maxCallbackBodyBytes <= 0) {
|
|
87
|
+
throw new Error('[@sazito/checkout] `maxCallbackBodyBytes` must be a positive integer.');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function readCallbackBody(request, maxBodyBytes) {
|
|
91
|
+
const declaredLength = Number(request.headers.get('content-length') ?? 0);
|
|
92
|
+
if (Number.isFinite(declaredLength) && declaredLength > maxBodyBytes) {
|
|
93
|
+
throw new CallbackRequestError(413, 'payment_callback_too_large');
|
|
94
|
+
}
|
|
95
|
+
const bytes = await request.arrayBuffer();
|
|
96
|
+
if (bytes.byteLength > maxBodyBytes) {
|
|
97
|
+
throw new CallbackRequestError(413, 'payment_callback_too_large');
|
|
98
|
+
}
|
|
99
|
+
if (bytes.byteLength === 0)
|
|
100
|
+
return {};
|
|
101
|
+
const contentType = request.headers.get('content-type')?.toLowerCase() ?? '';
|
|
102
|
+
if (contentType.includes('application/json')) {
|
|
103
|
+
return fieldsFromJson(new TextDecoder().decode(bytes));
|
|
104
|
+
}
|
|
105
|
+
if (contentType.includes('multipart/form-data')) {
|
|
106
|
+
const form = await new Response(bytes, {
|
|
107
|
+
headers: { 'Content-Type': request.headers.get('content-type') ?? '' }
|
|
108
|
+
}).formData();
|
|
109
|
+
return fieldsFromFormData(form);
|
|
110
|
+
}
|
|
111
|
+
// Gateways commonly omit Content-Type or label URL-encoded data as text.
|
|
112
|
+
return fieldsFromSearchParams(new URLSearchParams(new TextDecoder().decode(bytes)));
|
|
113
|
+
}
|
|
114
|
+
function fieldsFromJson(source) {
|
|
115
|
+
let value;
|
|
116
|
+
try {
|
|
117
|
+
value = JSON.parse(source);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
throw new CallbackRequestError(400, 'invalid_payment_callback_body');
|
|
121
|
+
}
|
|
122
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
123
|
+
throw new CallbackRequestError(400, 'invalid_payment_callback_body');
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
function fieldsFromSearchParams(params) {
|
|
128
|
+
const fields = {};
|
|
129
|
+
for (const [name, value] of params)
|
|
130
|
+
appendField(fields, name, value);
|
|
131
|
+
return fields;
|
|
132
|
+
}
|
|
133
|
+
function fieldsFromFormData(form) {
|
|
134
|
+
const fields = {};
|
|
135
|
+
for (const [name, value] of form) {
|
|
136
|
+
if (typeof value !== 'string') {
|
|
137
|
+
throw new CallbackRequestError(400, 'unsupported_payment_callback_file');
|
|
138
|
+
}
|
|
139
|
+
appendField(fields, name, value);
|
|
140
|
+
}
|
|
141
|
+
return fields;
|
|
142
|
+
}
|
|
143
|
+
function appendField(fields, name, value) {
|
|
144
|
+
const current = fields[name];
|
|
145
|
+
if (current === undefined) {
|
|
146
|
+
fields[name] = value;
|
|
147
|
+
}
|
|
148
|
+
else if (Array.isArray(current)) {
|
|
149
|
+
fields[name] = [...current, value ?? null];
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
fields[name] = [current, value ?? null];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function createStatusRedirectUrl(requestUrl, checkoutPath, payment) {
|
|
156
|
+
const redirectUrl = new URL(checkoutPath, requestUrl.origin);
|
|
157
|
+
redirectUrl.searchParams.set(SAZITO_PAYMENT_STATUS_QUERY.resolution, 'status');
|
|
158
|
+
redirectUrl.searchParams.set(SAZITO_PAYMENT_STATUS_QUERY.paymentId, String(payment.id));
|
|
159
|
+
redirectUrl.searchParams.set(SAZITO_PAYMENT_STATUS_QUERY.paymentIdentifier, payment.identifier);
|
|
160
|
+
return redirectUrl;
|
|
161
|
+
}
|
|
162
|
+
function errorResponse(status, code, extraHeaders = {}) {
|
|
163
|
+
return Response.json({ error: code }, {
|
|
164
|
+
status,
|
|
165
|
+
headers: {
|
|
166
|
+
'Cache-Control': 'no-store',
|
|
167
|
+
...extraHeaders
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
class CallbackRequestError extends Error {
|
|
172
|
+
constructor(status, code) {
|
|
173
|
+
super(code);
|
|
174
|
+
this.status = status;
|
|
175
|
+
this.code = code;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export { SazitoCheckout };
|
|
180
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/server/index.ts"],"sourcesContent":["/**\n * @sazito/checkout/server — server-only payment callback handlers.\n *\n * The implementation uses only the standard Web Request/Response APIs so the\n * same handlers work in Next.js Route Handlers and other compatible runtimes.\n */\nimport {\n createSazitoClient,\n type PaymentCallbackFieldValue,\n type PaymentCallbackFields,\n type SazitoConfig\n} from '@sazito/client-sdk';\nimport {\n parsePaymentReturnUrl,\n SAZITO_PAYMENT_STATUS_QUERY\n} from '../core/payment-return';\nimport type { PaymentReturnParserOptions } from '../core/types';\n\nconst DEFAULT_CHECKOUT_PATH = '/checkout';\nconst DEFAULT_MAX_BODY_BYTES = 64 * 1024;\n\nexport type SazitoPaymentRouteHandler = (request: Request) => Promise<Response>;\n\nexport interface SazitoCheckoutServerConfig extends SazitoConfig {\n /** Page that renders `SazitoCheckoutPage` after server verification. */\n checkoutPath?: string;\n /** Maximum accepted gateway callback body size. Defaults to 64 KiB. */\n maxCallbackBodyBytes?: number;\n /** Replace the built-in gateway-result marker allowlist. */\n gatewayResultMarkers?: readonly string[];\n}\n\nexport interface SazitoCheckoutServer {\n handlers: {\n GET: SazitoPaymentRouteHandler;\n POST: SazitoPaymentRouteHandler;\n };\n}\n\n/**\n * Create GET and POST route handlers for payment callbacks.\n * A fresh SDK client is created for each request so server-side guest\n * credentials can never leak between concurrent callbacks.\n */\nexport function SazitoCheckout(config: SazitoCheckoutServerConfig): SazitoCheckoutServer {\n const {\n checkoutPath = DEFAULT_CHECKOUT_PATH,\n maxCallbackBodyBytes = DEFAULT_MAX_BODY_BYTES,\n gatewayResultMarkers,\n ...sdkConfig\n } = config;\n\n validateConfig(sdkConfig, checkoutPath, maxCallbackBodyBytes);\n const parserOptions: PaymentReturnParserOptions = { gatewayResultMarkers };\n\n const createHandler = (method: 'GET' | 'POST'): SazitoPaymentRouteHandler =>\n async (request) => {\n if (request.method.toUpperCase() !== method) {\n return errorResponse(405, 'method_not_allowed', { Allow: method });\n }\n\n try {\n const callback = parsePaymentReturnUrl(request.url, parserOptions);\n if (!callback || callback.resolution === 'status') {\n return errorResponse(400, 'invalid_payment_callback');\n }\n\n const requestUrl = new URL(request.url);\n const body = method === 'POST'\n ? await readCallbackBody(request, maxCallbackBodyBytes)\n : undefined;\n const query = fieldsFromSearchParams(requestUrl.searchParams);\n const client = createSazitoClient(sdkConfig);\n const verification = await client.payments.verifyPaymentCallback({\n paymentId: callback.payment.id,\n paymentIdentifier: callback.payment.identifier,\n body,\n query\n });\n\n if (verification.error || !verification.data) {\n if (sdkConfig.debug) {\n console.error('[Sazito Checkout] Payment callback verification failed:', {\n paymentId: callback.payment.id,\n error: verification.error\n });\n }\n return errorResponse(502, 'payment_verification_failed');\n }\n\n const redirectUrl = createStatusRedirectUrl(\n requestUrl,\n checkoutPath,\n callback.payment\n );\n return new Response(null, {\n status: 303,\n headers: {\n Location: redirectUrl.toString(),\n 'Cache-Control': 'no-store',\n 'Referrer-Policy': 'no-referrer'\n }\n });\n } catch (error) {\n if (config.debug) {\n console.error('[Sazito Checkout] Invalid payment callback request:', error);\n }\n const status = error instanceof CallbackRequestError ? error.status : 500;\n const code = error instanceof CallbackRequestError\n ? error.code\n : 'payment_callback_failed';\n return errorResponse(status, code);\n }\n };\n\n return {\n handlers: {\n GET: createHandler('GET'),\n POST: createHandler('POST')\n }\n };\n}\n\nfunction validateConfig(\n config: SazitoConfig,\n checkoutPath: string,\n maxCallbackBodyBytes: number\n): void {\n if (!config.domain?.trim()) {\n throw new Error('[@sazito/checkout] `domain` is required by the payment callback handler.');\n }\n if (!checkoutPath.trim()) {\n throw new Error('[@sazito/checkout] `checkoutPath` cannot be empty.');\n }\n if (!Number.isSafeInteger(maxCallbackBodyBytes) || maxCallbackBodyBytes <= 0) {\n throw new Error('[@sazito/checkout] `maxCallbackBodyBytes` must be a positive integer.');\n }\n}\n\nasync function readCallbackBody(\n request: Request,\n maxBodyBytes: number\n): Promise<PaymentCallbackFields> {\n const declaredLength = Number(request.headers.get('content-length') ?? 0);\n if (Number.isFinite(declaredLength) && declaredLength > maxBodyBytes) {\n throw new CallbackRequestError(413, 'payment_callback_too_large');\n }\n\n const bytes = await request.arrayBuffer();\n if (bytes.byteLength > maxBodyBytes) {\n throw new CallbackRequestError(413, 'payment_callback_too_large');\n }\n if (bytes.byteLength === 0) return {};\n\n const contentType = request.headers.get('content-type')?.toLowerCase() ?? '';\n if (contentType.includes('application/json')) {\n return fieldsFromJson(new TextDecoder().decode(bytes));\n }\n if (contentType.includes('multipart/form-data')) {\n const form = await new Response(bytes, {\n headers: { 'Content-Type': request.headers.get('content-type') ?? '' }\n }).formData();\n return fieldsFromFormData(form);\n }\n\n // Gateways commonly omit Content-Type or label URL-encoded data as text.\n return fieldsFromSearchParams(new URLSearchParams(new TextDecoder().decode(bytes)));\n}\n\nfunction fieldsFromJson(source: string): PaymentCallbackFields {\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch {\n throw new CallbackRequestError(400, 'invalid_payment_callback_body');\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new CallbackRequestError(400, 'invalid_payment_callback_body');\n }\n return value as PaymentCallbackFields;\n}\n\nfunction fieldsFromSearchParams(params: URLSearchParams): PaymentCallbackFields {\n const fields: PaymentCallbackFields = {};\n for (const [name, value] of params) appendField(fields, name, value);\n return fields;\n}\n\nfunction fieldsFromFormData(form: FormData): PaymentCallbackFields {\n const fields: PaymentCallbackFields = {};\n for (const [name, value] of form) {\n if (typeof value !== 'string') {\n throw new CallbackRequestError(400, 'unsupported_payment_callback_file');\n }\n appendField(fields, name, value);\n }\n return fields;\n}\n\nfunction appendField(\n fields: PaymentCallbackFields,\n name: string,\n value: PaymentCallbackFieldValue\n): void {\n const current = fields[name];\n if (current === undefined) {\n fields[name] = value;\n } else if (Array.isArray(current)) {\n fields[name] = [...current, value ?? null];\n } else {\n fields[name] = [current, value ?? null];\n }\n}\n\nfunction createStatusRedirectUrl(\n requestUrl: URL,\n checkoutPath: string,\n payment: { id: number; identifier: string }\n): URL {\n const redirectUrl = new URL(checkoutPath, requestUrl.origin);\n redirectUrl.searchParams.set(SAZITO_PAYMENT_STATUS_QUERY.resolution, 'status');\n redirectUrl.searchParams.set(SAZITO_PAYMENT_STATUS_QUERY.paymentId, String(payment.id));\n redirectUrl.searchParams.set(\n SAZITO_PAYMENT_STATUS_QUERY.paymentIdentifier,\n payment.identifier\n );\n return redirectUrl;\n}\n\nfunction errorResponse(\n status: number,\n code: string,\n extraHeaders: Record<string, string> = {}\n): Response {\n return Response.json(\n { error: code },\n {\n status,\n headers: {\n 'Cache-Control': 'no-store',\n ...extraHeaders\n }\n }\n );\n}\n\nclass CallbackRequestError extends Error {\n constructor(\n readonly status: number,\n readonly code: string\n ) {\n super(code);\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sazito/checkout",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.20",
|
|
4
4
|
"description": "Headless checkout engine + React UI for the Sazito platform, powered by @sazito/client-sdk",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -67,6 +67,28 @@
|
|
|
67
67
|
},
|
|
68
68
|
"default": "./dist/next/payment-return.js"
|
|
69
69
|
},
|
|
70
|
+
"./next/server": {
|
|
71
|
+
"import": {
|
|
72
|
+
"types": "./dist/next/server.d.ts",
|
|
73
|
+
"default": "./dist/next/server.js"
|
|
74
|
+
},
|
|
75
|
+
"require": {
|
|
76
|
+
"types": "./dist/next/server.d.cts",
|
|
77
|
+
"default": "./dist/next/server.cjs"
|
|
78
|
+
},
|
|
79
|
+
"default": "./dist/next/server.js"
|
|
80
|
+
},
|
|
81
|
+
"./server": {
|
|
82
|
+
"import": {
|
|
83
|
+
"types": "./dist/server/index.d.ts",
|
|
84
|
+
"default": "./dist/server/index.js"
|
|
85
|
+
},
|
|
86
|
+
"require": {
|
|
87
|
+
"types": "./dist/server/index.d.cts",
|
|
88
|
+
"default": "./dist/server/index.cjs"
|
|
89
|
+
},
|
|
90
|
+
"default": "./dist/server/index.js"
|
|
91
|
+
},
|
|
70
92
|
"./styles.css": "./dist/styles.css"
|
|
71
93
|
},
|
|
72
94
|
"typesVersions": {
|
|
@@ -82,6 +104,12 @@
|
|
|
82
104
|
],
|
|
83
105
|
"next/payment-return": [
|
|
84
106
|
"dist/next/payment-return.d.ts"
|
|
107
|
+
],
|
|
108
|
+
"next/server": [
|
|
109
|
+
"dist/next/server.d.ts"
|
|
110
|
+
],
|
|
111
|
+
"server": [
|
|
112
|
+
"dist/server/index.d.ts"
|
|
85
113
|
]
|
|
86
114
|
}
|
|
87
115
|
},
|
|
@@ -99,7 +127,7 @@
|
|
|
99
127
|
"prepublishOnly": "pnpm run release:check"
|
|
100
128
|
},
|
|
101
129
|
"peerDependencies": {
|
|
102
|
-
"@sazito/client-sdk": "^1.2.
|
|
130
|
+
"@sazito/client-sdk": "^1.2.28",
|
|
103
131
|
"react": "^18.0.0 || ^19.0.0",
|
|
104
132
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
105
133
|
},
|