@payment-kit-js/vanilla 0.1.0-alpha.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 +755 -0
- package/dist/cardsetupintent-D2gBMj3e.d.mts +35 -0
- package/dist/cardsetupintent-D2gBMj3e.d.mts.map +1 -0
- package/dist/connect-card-DO2EJxu6.mjs +19 -0
- package/dist/connect-card-DO2EJxu6.mjs.map +1 -0
- package/dist/connect-card-EaOlRbPS.d.mts +25 -0
- package/dist/connect-card-EaOlRbPS.d.mts.map +1 -0
- package/dist/connect-tunnel-x-BhVAej5Q.mjs +44 -0
- package/dist/connect-tunnel-x-BhVAej5Q.mjs.map +1 -0
- package/dist/connect-tunnel-x-Ce423Pa2.d.mts +92 -0
- package/dist/connect-tunnel-x-Ce423Pa2.d.mts.map +1 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +69 -0
- package/dist/index.mjs.map +1 -0
- package/dist/next-action-handlers-DTsWjUIA.mjs +53 -0
- package/dist/next-action-handlers-DTsWjUIA.mjs.map +1 -0
- package/dist/payment-methods/card.d.mts +22 -0
- package/dist/payment-methods/card.d.mts.map +1 -0
- package/dist/payment-methods/card.mjs +183 -0
- package/dist/payment-methods/card.mjs.map +1 -0
- package/dist/payment-methods/google-pay.d.mts +49 -0
- package/dist/payment-methods/google-pay.d.mts.map +1 -0
- package/dist/payment-methods/google-pay.mjs +135 -0
- package/dist/payment-methods/google-pay.mjs.map +1 -0
- package/dist/payment-methods/next-action-handlers.d.mts +24 -0
- package/dist/payment-methods/next-action-handlers.d.mts.map +1 -0
- package/dist/payment-methods/next-action-handlers.mjs +3 -0
- package/dist/payment-methods/paypal.d.mts +49 -0
- package/dist/payment-methods/paypal.d.mts.map +1 -0
- package/dist/payment-methods/paypal.mjs +93 -0
- package/dist/payment-methods/paypal.mjs.map +1 -0
- package/dist/payment-methods/stripe-google-pay-adapter.d.mts +2 -0
- package/dist/payment-methods/stripe-google-pay-adapter.mjs +3 -0
- package/dist/penpal/connect-card.d.mts +4 -0
- package/dist/penpal/connect-card.mjs +4 -0
- package/dist/penpal/connect-tunnel-x.d.mts +3 -0
- package/dist/penpal/connect-tunnel-x.mjs +4 -0
- package/dist/penpal-BFKeZTVz.mjs +16 -0
- package/dist/penpal-BFKeZTVz.mjs.map +1 -0
- package/dist/publiccardcheckoutresponse-wxFCeVdO.d.mts +40 -0
- package/dist/publiccardcheckoutresponse-wxFCeVdO.d.mts.map +1 -0
- package/dist/stripe-google-pay-adapter-CkV5HWI-.d.mts +54 -0
- package/dist/stripe-google-pay-adapter-CkV5HWI-.d.mts.map +1 -0
- package/dist/stripe-google-pay-adapter-DMDArVp2.mjs +163 -0
- package/dist/stripe-google-pay-adapter-DMDArVp2.mjs.map +1 -0
- package/dist/types-6mOKdjCh.d.mts +64 -0
- package/dist/types-6mOKdjCh.d.mts.map +1 -0
- package/dist/utils-h0dxplHy.mjs +62 -0
- package/dist/utils-h0dxplHy.mjs.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.mjs","names":["params: Record<string, string>","submitPayment: TInternalFuncs[\"submitPayment\"]","errors: PaymentKitErrors","localStates: CardStates"],"sources":["../../src/payment-methods/card.ts"],"sourcesContent":["import {\n connectToCardIframe,\n type IFrameConnection,\n type CardInputType as PenpalCardInputType,\n type CheckoutResponse as PenpalCheckoutResponse,\n} from \"../penpal/connect-card\";\n\n// Re-export types for public API\nexport type CardInputType = PenpalCardInputType;\nexport type CheckoutResponse = PenpalCheckoutResponse;\n\nimport { TunnelXManager } from \"../penpal/connect-tunnel-x\";\nimport type { PaymentKitErrors, PaymentKitFields, PaymentKitStates, TInternalFuncs } from \"../types\";\nimport { $, collectFraudMetadata, createCheckoutIFrame, definePaymentMethod, validateFormFields } from \"../utils\";\nimport { handleNextAction } from \"./next-action-handlers\";\n\n/**\n * Splits a full name into first name and last name.\n * First word becomes firstName, rest becomes lastName.\n */\nconst splitName = (fullName: string): { firstName: string; lastName?: string } => {\n const trimmed = fullName.trim();\n const spaceIndex = trimmed.indexOf(\" \");\n if (spaceIndex === -1) {\n return { firstName: trimmed };\n }\n return {\n firstName: trimmed.substring(0, spaceIndex),\n lastName: trimmed.substring(spaceIndex + 1).trim() || undefined,\n };\n};\n\n/**\n * Maps PaymentKitFields to the customerInfo structure expected by the API.\n */\nconst mapFieldsToCustomerInfo = (fields: PaymentKitFields) => {\n const { firstName, lastName } = splitName(fields.customer_name);\n\n return {\n email: fields.customer_email || undefined,\n firstName,\n lastName,\n billingAddress:\n fields.customer_country || fields.customer_zip_code\n ? {\n country: fields.customer_country || undefined,\n zipCode: fields.customer_zip_code || undefined,\n }\n : undefined,\n };\n};\n\ntype CardStates = PaymentKitStates & {\n cardSetupIntentId?: string;\n cardInputConnections: Partial<Record<PenpalCardInputType, IFrameConnection>>;\n};\n\ntype CreateElementOptions = Partial<Parameters<typeof connectToCardIframe>[1]> & {\n style?: Record<string, string>;\n};\n\nconst defCreateElement = (states: CardStates) => {\n const { baseUrl, apiBaseUrl, cardInputConnections, secureToken } = states;\n\n return (type: PenpalCardInputType, options: CreateElementOptions) => {\n const { style, onLoaded, onFocusChange } = options;\n\n const mountIFrame = (parentSelector: string) => {\n const parent = $(parentSelector);\n const params: Record<string, string> = {\n checkout_token: secureToken,\n api_base_url: apiBaseUrl,\n };\n\n if (style) {\n params.style = JSON.stringify(style);\n }\n\n const iframe = createCheckoutIFrame(type.replace(\"_\", \"-\"), baseUrl, params);\n parent.appendChild(iframe);\n\n iframe.onload = () => {\n const connection = connectToCardIframe(iframe, {\n onLoaded: onLoaded || (() => {}),\n onFocusChange: onFocusChange || (() => {}),\n });\n\n states.cardInputConnections[type] = connection;\n };\n\n const unmount = () => {\n const connection = cardInputConnections[type];\n connection?.destroy();\n parent.removeChild(iframe);\n states.cardInputConnections[type] = undefined;\n };\n\n return { unmount };\n };\n\n return { mount: mountIFrame };\n };\n};\n\nconst defSubmitPayment = (states: CardStates) => {\n const submitPayment: TInternalFuncs[\"submitPayment\"] = async (fields) => {\n const tunnelX = await TunnelXManager.createFromPenpalConnection(states.tunnelXConnection);\n\n // Step 1. Validate card and form values.\n const validateCardResult = await validateCardFields(states);\n const validateFormResult = await validateFormFields(fields);\n if (!(validateCardResult.isSuccess && validateFormResult.isSuccess)) {\n return { errors: { ...validateCardResult.errors, ...validateFormResult.errors } };\n }\n\n // Step 2. Create card setup intent if not present\n if (!states.cardSetupIntentId) {\n const res = await tunnelX.publicEndpoints.createCardSetupIntent({\n checkoutToken: states.secureToken,\n });\n states.cardSetupIntentId = res.cardSetupIntentId;\n }\n\n // Step 3. Submit card values.\n const submitCardResult = await submitCardFields(states);\n if (!submitCardResult.isSuccess) {\n return { errors: submitCardResult.errors };\n }\n\n // Step 4. Get card setup intent.\n const cardSetupIntent = await tunnelX.publicEndpoints.getCardSetupIntent({\n cardSetupIntentId: states.cardSetupIntentId,\n checkoutToken: states.secureToken,\n });\n if (!cardSetupIntent.isCardAllSet) {\n const errors = {} as PaymentKitErrors;\n if (!cardSetupIntent.isCardPanSet) errors.card_pan = \"required\";\n if (!cardSetupIntent.isCardExpSet) errors.card_exp = \"required\";\n if (!cardSetupIntent.isCardCvcSet) errors.card_cvc = \"required\";\n return { errors };\n }\n\n console.log(\"Card setup intent is set ✅\", cardSetupIntent);\n console.log(\"Fields\", fields);\n\n // Step 5. Submit card checkout with customer info and fraud metadata\n let currentResult = await tunnelX.publicEndpoints.cardCheckout({\n checkoutToken: states.secureToken,\n publicCardCheckoutRequest: {\n cardSetupIntentId: states.cardSetupIntentId,\n customerInfo: mapFieldsToCustomerInfo(fields),\n fraudMetadata: collectFraudMetadata(),\n },\n });\n\n console.log(\"Card checkout result:\", currentResult);\n\n // Step 6. Handle next actions in a loop (supports multiple 3DS challenges)\n // This loop handles the case where one processor fails and we try another\n // that also requires 3DS authentication.\n const MAX_USER_ACTIONS = 5; // Safety limit to prevent infinite loops\n let userActionCount = 0;\n\n while (currentResult.nextAction && userActionCount < MAX_USER_ACTIONS) {\n userActionCount++;\n console.log(`Handling user action ${userActionCount}/${MAX_USER_ACTIONS}...`);\n\n const actionResult = await handleNextAction(currentResult.nextAction);\n\n // Always call verify endpoint so backend can properly conclude the checkout.\n // This is needed even on 3DS failure so the backend can transition from\n // user_actions_requested to card_payment_concluded with proper failure state.\n console.log(\"User action completed, verifying checkout...\");\n const verifyResult = await tunnelX.publicEndpoints.cardCheckoutVerify({\n checkoutToken: states.secureToken,\n });\n\n // Check if another action is required (e.g., cascade to next price tier with 3DS)\n // This must be checked BEFORE returning error, as cascade may offer a new 3DS challenge\n if (verifyResult.nextAction) {\n if (!actionResult.success) {\n console.log(\"3DS failed but cascade triggered new action, continuing loop...\");\n } else {\n console.log(\"Another user action required, continuing loop...\");\n }\n currentResult = verifyResult;\n continue;\n }\n\n if (!actionResult.success) {\n // 3DS failed and no cascade/retry available - return error\n console.log(\"3DS authentication failed, checkout concluded:\", verifyResult);\n return { errors: { root: actionResult.error } };\n }\n\n console.log(\"Card checkout verified ✅\", verifyResult);\n\n // No more actions needed, return the result\n return { data: verifyResult };\n }\n\n if (userActionCount >= MAX_USER_ACTIONS) {\n console.error(\"Max user actions exceeded\");\n return { errors: { root: \"Too many authentication attempts. Please try again.\" } };\n }\n\n // Return checkout result - caller should check state for success/failure\n // States: checkout_succeeded, payment_failed, payment_cus_info_received (needs action)\n console.log(\"Card checkout completed ✅\", currentResult);\n return { data: currentResult };\n };\n return submitPayment;\n};\n\nconst submitCardFields = async (states: CardStates) => {\n const errors = {} as PaymentKitErrors;\n const { cardSetupIntentId, cardInputConnections } = states;\n\n const submitPromises = Object.entries(cardInputConnections).map(async ([_type, connection]) => {\n const type = _type as PenpalCardInputType;\n\n const remote = await connection.promise;\n const result = await remote.onSubmit(cardSetupIntentId || \"\");\n\n if (\"error\" in result) {\n errors[type] = result.error;\n }\n });\n\n await Promise.allSettled(submitPromises);\n\n return {\n errors,\n isSuccess: Object.keys(errors).length === 0,\n };\n};\n\nconst validateCardFields = async (states: CardStates) => {\n const errors: PaymentKitErrors = {};\n const { cardInputConnections } = states;\n\n const validatePromises = Object.entries(cardInputConnections).map(async ([_type, connection]) => {\n const type = _type as PenpalCardInputType;\n\n if (!connection) {\n errors[type] = \"penpal_not_connected\";\n return;\n }\n\n const remote = await connection.promise;\n const errorMsg = await remote.onValidate();\n\n if (errorMsg) {\n errors[type] = errorMsg;\n }\n });\n\n await Promise.allSettled(validatePromises);\n\n return {\n errors,\n isSuccess: Object.keys(errors).length === 0,\n };\n};\n\nconst CardPaymentMethod = definePaymentMethod((paymentKitStates) => {\n const localStates: CardStates = { ...paymentKitStates, cardInputConnections: {} };\n\n return {\n name: \"card\",\n externalFuncs: {\n createElement: defCreateElement(localStates),\n },\n internalFuncs: {\n submitPayment: defSubmitPayment(localStates),\n cleanup: () => {\n // Clean up all card input iframe connections\n for (const connection of Object.values(localStates.cardInputConnections)) {\n connection?.destroy();\n }\n localStates.cardInputConnections = {};\n },\n },\n };\n});\n\nexport default CardPaymentMethod;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import "../cardsetupintent-D2gBMj3e.mjs";
|
|
2
|
+
import "../connect-tunnel-x-Ce423Pa2.mjs";
|
|
3
|
+
import "../publiccardcheckoutresponse-wxFCeVdO.mjs";
|
|
4
|
+
import "../connect-card-EaOlRbPS.mjs";
|
|
5
|
+
import { r as PaymentMethod } from "../types-6mOKdjCh.mjs";
|
|
6
|
+
import { n as GooglePayMockScenario } from "../stripe-google-pay-adapter-CkV5HWI-.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/payment-methods/google-pay.d.ts
|
|
9
|
+
type GooglePayCustomerInfo = {
|
|
10
|
+
first_name: string;
|
|
11
|
+
last_name: string;
|
|
12
|
+
};
|
|
13
|
+
type GooglePayStartRequest = {
|
|
14
|
+
processor_id: string;
|
|
15
|
+
customer_info: GooglePayCustomerInfo;
|
|
16
|
+
fraud_metadata: {
|
|
17
|
+
ipAddress?: string;
|
|
18
|
+
browserInfo?: {
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
};
|
|
21
|
+
processorFraudInfo?: {
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
mock_scenario?: string;
|
|
26
|
+
};
|
|
27
|
+
type GooglePayStartResponse = {
|
|
28
|
+
client_secret: string;
|
|
29
|
+
stripe_pk: string;
|
|
30
|
+
checkout_attempt_id: string;
|
|
31
|
+
amount: number;
|
|
32
|
+
currency: string;
|
|
33
|
+
country: string;
|
|
34
|
+
};
|
|
35
|
+
type GooglePayConfirmResponse = {
|
|
36
|
+
charge_status: "success" | "fail" | "pending";
|
|
37
|
+
transaction_id?: string;
|
|
38
|
+
error_message?: string;
|
|
39
|
+
checkout_attempt_id: string;
|
|
40
|
+
};
|
|
41
|
+
type GooglePaySubmitOptions = {
|
|
42
|
+
processorId: string;
|
|
43
|
+
customerInfo: GooglePayCustomerInfo;
|
|
44
|
+
mockScenario?: GooglePayMockScenario;
|
|
45
|
+
};
|
|
46
|
+
declare const GooglePayPaymentMethod: PaymentMethod<{}, "google_pay">;
|
|
47
|
+
//#endregion
|
|
48
|
+
export { GooglePayConfirmResponse, GooglePayCustomerInfo, GooglePayMockScenario, GooglePayStartRequest, GooglePayStartResponse, GooglePaySubmitOptions, GooglePayPaymentMethod as default };
|
|
49
|
+
//# sourceMappingURL=google-pay.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-pay.d.mts","names":[],"sources":["../../src/payment-methods/google-pay.ts"],"sourcesContent":[],"mappings":";;;;;;;;KAKY,qBAAA;;;;KAKA,qBAAA;;iBAEK;EAPL,cAAA,EAAA;IAKA,SAAA,CAAA,EAAA,MAAA;IAWA,WAAA,CAAA,EAAA;MASA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAwB;IAOxB,CAAA;IA8MN,kBAAA,CAAA,EASJ;;;;;;KAvOU,sBAAA;;;;;;;;KASA,wBAAA;;;;;;KAOA,sBAAA;;gBAEI;iBACC;;cA2MX,wBASJ"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { i as definePaymentMethod, n as collectFraudMetadata } from "../utils-h0dxplHy.mjs";
|
|
2
|
+
import { n as StripeGooglePayAdapter, t as GooglePayMockScenario } from "../stripe-google-pay-adapter-DMDArVp2.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/payment-methods/google-pay.ts
|
|
5
|
+
async function apiCall(url, options) {
|
|
6
|
+
const response = await fetch(url, options);
|
|
7
|
+
if (!response.ok) {
|
|
8
|
+
let errorMessage = `Request failed (${response.status})`;
|
|
9
|
+
try {
|
|
10
|
+
errorMessage = (await response.json()).detail || errorMessage;
|
|
11
|
+
} catch {
|
|
12
|
+
errorMessage = response.statusText || errorMessage;
|
|
13
|
+
}
|
|
14
|
+
return { error: errorMessage };
|
|
15
|
+
}
|
|
16
|
+
return { data: await response.json() };
|
|
17
|
+
}
|
|
18
|
+
function validateOptions(options) {
|
|
19
|
+
if (!options?.processorId) return { processor_id: "Processor ID is required" };
|
|
20
|
+
if (!options?.customerInfo?.first_name || !options?.customerInfo?.last_name) return { customer_name: "Customer first and last name are required" };
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
function getMockScenarioStr(mockScenario) {
|
|
24
|
+
return mockScenario && mockScenario !== GooglePayMockScenario.None ? mockScenario : void 0;
|
|
25
|
+
}
|
|
26
|
+
async function callStartEndpoint(apiBaseUrl, secureToken, options, mockScenarioStr) {
|
|
27
|
+
return apiCall(`${apiBaseUrl}/api/checkout/${secureToken}/google-pay/start`, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: { "Content-Type": "application/json" },
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
processor_id: options.processorId,
|
|
32
|
+
customer_info: options.customerInfo,
|
|
33
|
+
fraud_metadata: collectFraudMetadata(),
|
|
34
|
+
mock_scenario: mockScenarioStr
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function initializeAdapter(stripePk, startData, mockScenario) {
|
|
39
|
+
const adapter = new StripeGooglePayAdapter(mockScenario);
|
|
40
|
+
if (!adapter.initialize(stripePk)) return { error: "Stripe.js not loaded. Add <script src=\"https://js.stripe.com/v3/\"><\/script> to your page." };
|
|
41
|
+
const prConfig = {
|
|
42
|
+
country: startData.country,
|
|
43
|
+
currency: startData.currency.toLowerCase(),
|
|
44
|
+
total: {
|
|
45
|
+
label: "Total",
|
|
46
|
+
amount: startData.amount
|
|
47
|
+
},
|
|
48
|
+
requestPayerName: true,
|
|
49
|
+
requestPayerEmail: true
|
|
50
|
+
};
|
|
51
|
+
console.log("[GooglePay] PaymentRequest config:", prConfig);
|
|
52
|
+
adapter.createPaymentRequest(prConfig);
|
|
53
|
+
return { adapter };
|
|
54
|
+
}
|
|
55
|
+
async function showPaymentSheetAndConfirm(adapter, clientSecret) {
|
|
56
|
+
const isAvailable = await adapter.canMakePayment();
|
|
57
|
+
console.log("[GooglePay] canMakePayment result:", isAvailable);
|
|
58
|
+
if (!isAvailable) return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: "Google Pay not available on this device"
|
|
61
|
+
};
|
|
62
|
+
const paymentResult = await adapter.showPaymentSheet();
|
|
63
|
+
if (!paymentResult.success) {
|
|
64
|
+
if ("cancelled" in paymentResult && paymentResult.cancelled) return {
|
|
65
|
+
success: false,
|
|
66
|
+
error: "Google Pay cancelled by user"
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: "error" in paymentResult ? paymentResult.error : "Unknown error"
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const confirmResult = await adapter.confirmCardSetup(clientSecret, paymentResult.paymentMethodId);
|
|
74
|
+
if (!confirmResult.success) {
|
|
75
|
+
paymentResult.complete("fail");
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: confirmResult.error
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
paymentResult.complete("success");
|
|
82
|
+
return { success: true };
|
|
83
|
+
}
|
|
84
|
+
async function callConfirmEndpoint(apiBaseUrl, secureToken, mockScenarioStr) {
|
|
85
|
+
const result = await apiCall(`${apiBaseUrl}/api/checkout/${secureToken}/google-pay/confirm`, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: { "Content-Type": "application/json" },
|
|
88
|
+
body: JSON.stringify({ mock_scenario: mockScenarioStr })
|
|
89
|
+
});
|
|
90
|
+
if (result.error || !result.data) return { errors: { google_pay: result.error || "Failed to confirm payment" } };
|
|
91
|
+
const confirmData = result.data;
|
|
92
|
+
if (confirmData.charge_status === "success") return { data: {
|
|
93
|
+
id: confirmData.transaction_id,
|
|
94
|
+
checkoutAttemptId: confirmData.checkout_attempt_id,
|
|
95
|
+
checkoutSessionId: secureToken,
|
|
96
|
+
state: "checkout_succeeded"
|
|
97
|
+
} };
|
|
98
|
+
return { errors: { google_pay: confirmData.error_message || "Payment failed" } };
|
|
99
|
+
}
|
|
100
|
+
const defSubmitPayment = (states) => {
|
|
101
|
+
const submitPayment = async (_fields, options) => {
|
|
102
|
+
const { apiBaseUrl, secureToken } = states;
|
|
103
|
+
const gpayOptions = options;
|
|
104
|
+
const validationError = validateOptions(gpayOptions);
|
|
105
|
+
if (validationError) return { errors: validationError };
|
|
106
|
+
try {
|
|
107
|
+
const mockScenarioStr = getMockScenarioStr(gpayOptions.mockScenario);
|
|
108
|
+
const startResult = await callStartEndpoint(apiBaseUrl, secureToken, gpayOptions, mockScenarioStr);
|
|
109
|
+
if (startResult.error || !startResult.data) return { errors: { google_pay: startResult.error || "Failed to start Google Pay" } };
|
|
110
|
+
const { adapter, error: adapterError } = initializeAdapter(startResult.data.stripe_pk, startResult.data, gpayOptions.mockScenario);
|
|
111
|
+
if (!adapter) return { errors: { google_pay: adapterError } };
|
|
112
|
+
const paymentResult = await showPaymentSheetAndConfirm(adapter, startResult.data.client_secret);
|
|
113
|
+
if (!paymentResult.success) return { errors: { google_pay: paymentResult.error } };
|
|
114
|
+
return await callConfirmEndpoint(apiBaseUrl, secureToken, mockScenarioStr);
|
|
115
|
+
} catch (error) {
|
|
116
|
+
return { errors: { google_pay: `Google Pay error: ${error}` } };
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return submitPayment;
|
|
120
|
+
};
|
|
121
|
+
const GooglePayPaymentMethod = definePaymentMethod((paymentKitStates) => {
|
|
122
|
+
return {
|
|
123
|
+
name: "google_pay",
|
|
124
|
+
externalFuncs: {},
|
|
125
|
+
internalFuncs: {
|
|
126
|
+
submitPayment: defSubmitPayment(paymentKitStates),
|
|
127
|
+
cleanup: () => {}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
var google_pay_default = GooglePayPaymentMethod;
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
export { GooglePayMockScenario, google_pay_default as default };
|
|
135
|
+
//# sourceMappingURL=google-pay.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-pay.mjs","names":["submitPayment: TInternalFuncs[\"submitPayment\"]"],"sources":["../../src/payment-methods/google-pay.ts"],"sourcesContent":["import type { PaymentKitErrors, PaymentKitStates, TInternalFuncs } from \"../types\";\nimport { collectFraudMetadata, definePaymentMethod } from \"../utils\";\nimport { GooglePayMockScenario, StripeGooglePayAdapter } from \"./stripe-google-pay-adapter\";\n\n// Google Pay-specific types\nexport type GooglePayCustomerInfo = {\n first_name: string;\n last_name: string;\n};\n\nexport type GooglePayStartRequest = {\n processor_id: string;\n customer_info: GooglePayCustomerInfo;\n fraud_metadata: {\n ipAddress?: string;\n browserInfo?: { [key: string]: unknown };\n processorFraudInfo?: { [key: string]: unknown };\n };\n mock_scenario?: string;\n};\n\nexport type GooglePayStartResponse = {\n client_secret: string;\n stripe_pk: string;\n checkout_attempt_id: string;\n amount: number;\n currency: string;\n country: string;\n};\n\nexport type GooglePayConfirmResponse = {\n charge_status: \"success\" | \"fail\" | \"pending\";\n transaction_id?: string;\n error_message?: string;\n checkout_attempt_id: string;\n};\n\nexport type GooglePaySubmitOptions = {\n processorId: string;\n customerInfo: GooglePayCustomerInfo;\n mockScenario?: GooglePayMockScenario;\n};\n\ntype GooglePayResult = { data?: { [key: string]: unknown }; errors?: PaymentKitErrors };\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nasync function apiCall<T>(url: string, options: RequestInit): Promise<{ data?: T; error?: string }> {\n const response = await fetch(url, options);\n if (!response.ok) {\n let errorMessage = `Request failed (${response.status})`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.detail || errorMessage;\n } catch {\n errorMessage = response.statusText || errorMessage;\n }\n return { error: errorMessage };\n }\n return { data: await response.json() };\n}\n\nfunction validateOptions(options: GooglePaySubmitOptions): PaymentKitErrors | null {\n if (!options?.processorId) {\n return { processor_id: \"Processor ID is required\" };\n }\n if (!options?.customerInfo?.first_name || !options?.customerInfo?.last_name) {\n return { customer_name: \"Customer first and last name are required\" };\n }\n return null;\n}\n\nfunction getMockScenarioStr(mockScenario?: GooglePayMockScenario): string | undefined {\n return mockScenario && mockScenario !== GooglePayMockScenario.None ? mockScenario : undefined;\n}\n\nasync function callStartEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n options: GooglePaySubmitOptions,\n mockScenarioStr?: string,\n): Promise<{ data?: GooglePayStartResponse; error?: string }> {\n return apiCall<GooglePayStartResponse>(`${apiBaseUrl}/api/checkout/${secureToken}/google-pay/start`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n processor_id: options.processorId,\n customer_info: options.customerInfo,\n fraud_metadata: collectFraudMetadata(),\n mock_scenario: mockScenarioStr,\n } as GooglePayStartRequest),\n });\n}\n\nfunction initializeAdapter(\n stripePk: string,\n startData: GooglePayStartResponse,\n mockScenario?: GooglePayMockScenario,\n): { adapter?: StripeGooglePayAdapter; error?: string } {\n const adapter = new StripeGooglePayAdapter(mockScenario);\n\n if (!adapter.initialize(stripePk)) {\n return { error: 'Stripe.js not loaded. Add <script src=\"https://js.stripe.com/v3/\"></script> to your page.' };\n }\n\n const prConfig = {\n country: startData.country,\n currency: startData.currency.toLowerCase(),\n total: { label: \"Total\", amount: startData.amount },\n requestPayerName: true,\n requestPayerEmail: true,\n };\n console.log(\"[GooglePay] PaymentRequest config:\", prConfig);\n\n adapter.createPaymentRequest(prConfig);\n return { adapter };\n}\n\nasync function showPaymentSheetAndConfirm(\n adapter: StripeGooglePayAdapter,\n clientSecret: string,\n): Promise<{ success: boolean; error?: string }> {\n // Check availability\n const isAvailable = await adapter.canMakePayment();\n console.log(\"[GooglePay] canMakePayment result:\", isAvailable);\n\n if (!isAvailable) {\n return { success: false, error: \"Google Pay not available on this device\" };\n }\n\n // Show payment sheet\n const paymentResult = await adapter.showPaymentSheet();\n\n if (!paymentResult.success) {\n if (\"cancelled\" in paymentResult && paymentResult.cancelled) {\n return { success: false, error: \"Google Pay cancelled by user\" };\n }\n const errorMessage = \"error\" in paymentResult ? paymentResult.error : \"Unknown error\";\n return { success: false, error: errorMessage };\n }\n\n // Confirm with Stripe SDK\n const confirmResult = await adapter.confirmCardSetup(clientSecret, paymentResult.paymentMethodId);\n\n if (!confirmResult.success) {\n paymentResult.complete(\"fail\");\n return { success: false, error: confirmResult.error };\n }\n\n paymentResult.complete(\"success\");\n return { success: true };\n}\n\nasync function callConfirmEndpoint(\n apiBaseUrl: string,\n secureToken: string,\n mockScenarioStr?: string,\n): Promise<GooglePayResult> {\n const result = await apiCall<GooglePayConfirmResponse>(\n `${apiBaseUrl}/api/checkout/${secureToken}/google-pay/confirm`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ mock_scenario: mockScenarioStr }),\n },\n );\n\n if (result.error || !result.data) {\n return { errors: { google_pay: result.error || \"Failed to confirm payment\" } };\n }\n\n const confirmData = result.data;\n\n if (confirmData.charge_status === \"success\") {\n return {\n data: {\n id: confirmData.transaction_id,\n checkoutAttemptId: confirmData.checkout_attempt_id,\n checkoutSessionId: secureToken,\n state: \"checkout_succeeded\",\n },\n };\n }\n\n return { errors: { google_pay: confirmData.error_message || \"Payment failed\" } };\n}\n\n// =============================================================================\n// Main Submit Function\n// =============================================================================\n\nconst defSubmitPayment = (states: PaymentKitStates) => {\n const submitPayment: TInternalFuncs[\"submitPayment\"] = async (_fields, options) => {\n const { apiBaseUrl, secureToken } = states;\n const gpayOptions = options as GooglePaySubmitOptions;\n\n // Validate options\n const validationError = validateOptions(gpayOptions);\n if (validationError) {\n return { errors: validationError };\n }\n\n try {\n const mockScenarioStr = getMockScenarioStr(gpayOptions.mockScenario);\n\n // Step 1: Start Google Pay flow\n const startResult = await callStartEndpoint(apiBaseUrl, secureToken, gpayOptions, mockScenarioStr);\n if (startResult.error || !startResult.data) {\n return { errors: { google_pay: startResult.error || \"Failed to start Google Pay\" } };\n }\n\n // Step 2: Initialize Stripe adapter\n const { adapter, error: adapterError } = initializeAdapter(\n startResult.data.stripe_pk,\n startResult.data,\n gpayOptions.mockScenario,\n );\n if (!adapter) {\n return { errors: { google_pay: adapterError } };\n }\n\n // Step 3: Show payment sheet and confirm with Stripe\n const paymentResult = await showPaymentSheetAndConfirm(adapter, startResult.data.client_secret);\n if (!paymentResult.success) {\n return { errors: { google_pay: paymentResult.error } };\n }\n\n // Step 4: Confirm with backend\n return await callConfirmEndpoint(apiBaseUrl, secureToken, mockScenarioStr);\n } catch (error) {\n return { errors: { google_pay: `Google Pay error: ${error}` } };\n }\n };\n\n return submitPayment;\n};\n\n// =============================================================================\n// Payment Method Definition\n// =============================================================================\n\nconst GooglePayPaymentMethod = definePaymentMethod((paymentKitStates) => {\n return {\n name: \"google_pay\",\n externalFuncs: {},\n internalFuncs: {\n submitPayment: defSubmitPayment(paymentKitStates),\n cleanup: () => {},\n },\n };\n});\n\nexport { GooglePayMockScenario };\n\nexport default GooglePayPaymentMethod;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { t as PublicCardCheckoutResponse } from "../publiccardcheckoutresponse-wxFCeVdO.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/payment-methods/next-action-handlers.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Result of handling a next action.
|
|
7
|
+
*/
|
|
8
|
+
type NextActionResult = {
|
|
9
|
+
success: true;
|
|
10
|
+
} | {
|
|
11
|
+
success: false;
|
|
12
|
+
error: string;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Handle a next action based on its type.
|
|
16
|
+
* Routes to the appropriate processor-specific handler.
|
|
17
|
+
*
|
|
18
|
+
* @param nextAction - The next action from the checkout response
|
|
19
|
+
* @returns Result indicating success or failure with error message
|
|
20
|
+
*/
|
|
21
|
+
declare const handleNextAction: (nextAction: NonNullable<PublicCardCheckoutResponse["nextAction"]>) => Promise<NextActionResult>;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { NextActionResult, handleNextAction };
|
|
24
|
+
//# sourceMappingURL=next-action-handlers.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-action-handlers.d.mts","names":[],"sources":["../../src/payment-methods/next-action-handlers.ts"],"sourcesContent":[],"mappings":";;;;;;;KA6CY,gBAAA;;;;;;;;;;;;;cAgCC,+BACC,YAAY,8CACvB,QAAQ"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import "../cardsetupintent-D2gBMj3e.mjs";
|
|
2
|
+
import "../connect-tunnel-x-Ce423Pa2.mjs";
|
|
3
|
+
import "../publiccardcheckoutresponse-wxFCeVdO.mjs";
|
|
4
|
+
import "../connect-card-EaOlRbPS.mjs";
|
|
5
|
+
import { r as PaymentMethod } from "../types-6mOKdjCh.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/payment-methods/paypal.d.ts
|
|
8
|
+
type PayPalCustomerInfo = {
|
|
9
|
+
first_name: string;
|
|
10
|
+
last_name: string;
|
|
11
|
+
};
|
|
12
|
+
type PayPalStartRequest = {
|
|
13
|
+
processor_id: string;
|
|
14
|
+
customer_info: PayPalCustomerInfo;
|
|
15
|
+
fraud_metadata: {
|
|
16
|
+
ipAddress?: string;
|
|
17
|
+
browserInfo?: {
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
};
|
|
20
|
+
processorFraudInfo?: {
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
type PayPalStartResponse = {
|
|
26
|
+
approval_url: string;
|
|
27
|
+
popup_token: string;
|
|
28
|
+
checkout_attempt_id: string;
|
|
29
|
+
};
|
|
30
|
+
type PayPalStatusResponse = {
|
|
31
|
+
completed: boolean;
|
|
32
|
+
status: "success" | "failed" | "cancelled";
|
|
33
|
+
result?: unknown;
|
|
34
|
+
error?: string;
|
|
35
|
+
};
|
|
36
|
+
type PayPalCheckoutResponse = {
|
|
37
|
+
id: string;
|
|
38
|
+
checkoutAttemptId: string;
|
|
39
|
+
checkoutSessionId: string;
|
|
40
|
+
state: string;
|
|
41
|
+
};
|
|
42
|
+
type PayPalSubmitOptions = {
|
|
43
|
+
processorId: string;
|
|
44
|
+
customerInfo: PayPalCustomerInfo;
|
|
45
|
+
};
|
|
46
|
+
declare const PayPalPaymentMethod: PaymentMethod<{}, "paypal">;
|
|
47
|
+
//#endregion
|
|
48
|
+
export { PayPalCheckoutResponse, PayPalCustomerInfo, PayPalStartRequest, PayPalStartResponse, PayPalStatusResponse, PayPalSubmitOptions, PayPalPaymentMethod as default };
|
|
49
|
+
//# sourceMappingURL=paypal.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal.d.mts","names":[],"sources":["../../src/payment-methods/paypal.ts"],"sourcesContent":[],"mappings":";;;;;;;KAIY,kBAAA;;;;KAKA,kBAAA;;iBAEK;EAPL,cAAA,EAAA;IAKA,SAAA,CAAA,EAAA,MAAkB;IAUlB,WAAA,CAAA,EAAA;MAMA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAoB,OAAA;IAOpB,CAAA;IAOA,kBAAmB,CAAA,EAAA;MA0JzB,CAAA,GAAA,EAAA,MAAA,CAAA,EAqBJ,OAAA;;;;KAnMU,mBAAA;;;;;KAMA,oBAAA;;;;;;KAOA,sBAAA;;;;;;KAOA,mBAAA;;gBAEI;;cAwJV,qBAqBJ"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { i as definePaymentMethod, n as collectFraudMetadata } from "../utils-h0dxplHy.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/payment-methods/paypal.ts
|
|
4
|
+
const defSubmitPayment = (states) => {
|
|
5
|
+
const submitPayment = async (_fields, options) => {
|
|
6
|
+
const { apiBaseUrl, secureToken } = states;
|
|
7
|
+
const paypalOptions = options;
|
|
8
|
+
if (!paypalOptions?.processorId) return { errors: { processor_id: "Processor ID is required" } };
|
|
9
|
+
if (!paypalOptions?.customerInfo?.first_name || !paypalOptions?.customerInfo?.last_name) return { errors: { customer_name: "Customer first and last name are required" } };
|
|
10
|
+
try {
|
|
11
|
+
const startResponse = await fetch(`${apiBaseUrl}/api/checkout/${secureToken}/paypal/start`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: { "Content-Type": "application/json" },
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
processor_id: paypalOptions.processorId,
|
|
16
|
+
customer_info: paypalOptions.customerInfo,
|
|
17
|
+
fraud_metadata: collectFraudMetadata()
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
if (!startResponse.ok) {
|
|
21
|
+
let errorMessage = `Failed to start PayPal checkout (${startResponse.status})`;
|
|
22
|
+
try {
|
|
23
|
+
errorMessage = (await startResponse.json()).detail || errorMessage;
|
|
24
|
+
} catch {
|
|
25
|
+
errorMessage = startResponse.statusText || errorMessage;
|
|
26
|
+
}
|
|
27
|
+
return { errors: { paypal: errorMessage } };
|
|
28
|
+
}
|
|
29
|
+
const { approval_url, popup_token, checkout_attempt_id } = await startResponse.json();
|
|
30
|
+
const popup = window.open(approval_url, "PayPal", "width=600,height=700");
|
|
31
|
+
if (!popup) return { errors: { paypal: "Failed to open PayPal popup. Please allow popups for this site." } };
|
|
32
|
+
states.popup = popup;
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
const pollInterval = setInterval(async () => {
|
|
35
|
+
try {
|
|
36
|
+
const statusResponse = await fetch(`${apiBaseUrl}/api/checkout/${secureToken}/popup/status?popup_token=${popup_token}`);
|
|
37
|
+
if (!statusResponse.ok) {
|
|
38
|
+
clearInterval(pollInterval);
|
|
39
|
+
popup.close();
|
|
40
|
+
resolve({ errors: { paypal: "Failed to check PayPal status" } });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const statusResult = await statusResponse.json();
|
|
44
|
+
if (statusResult.completed) {
|
|
45
|
+
clearInterval(pollInterval);
|
|
46
|
+
popup.close();
|
|
47
|
+
if (statusResult.status === "success") resolve({ data: statusResult.result || {
|
|
48
|
+
id: checkout_attempt_id,
|
|
49
|
+
checkoutAttemptId: checkout_attempt_id,
|
|
50
|
+
checkoutSessionId: secureToken,
|
|
51
|
+
state: "checkout_succeeded"
|
|
52
|
+
} });
|
|
53
|
+
else resolve({ errors: { paypal: statusResult.error || `PayPal checkout ${statusResult.status}` } });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (popup.closed) {
|
|
57
|
+
clearInterval(pollInterval);
|
|
58
|
+
resolve({ errors: { paypal: "PayPal popup closed by user" } });
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
} catch (error) {
|
|
62
|
+
clearInterval(pollInterval);
|
|
63
|
+
popup.close();
|
|
64
|
+
resolve({ errors: { paypal: `Polling error: ${error}` } });
|
|
65
|
+
}
|
|
66
|
+
}, 2e3);
|
|
67
|
+
states.pollInterval = pollInterval;
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
return { errors: { paypal: `PayPal checkout error: ${error}` } };
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
return submitPayment;
|
|
74
|
+
};
|
|
75
|
+
const PayPalPaymentMethod = definePaymentMethod((paymentKitStates) => {
|
|
76
|
+
const localStates = { ...paymentKitStates };
|
|
77
|
+
return {
|
|
78
|
+
name: "paypal",
|
|
79
|
+
externalFuncs: {},
|
|
80
|
+
internalFuncs: {
|
|
81
|
+
submitPayment: defSubmitPayment(localStates),
|
|
82
|
+
cleanup: () => {
|
|
83
|
+
if (localStates.pollInterval) clearInterval(localStates.pollInterval);
|
|
84
|
+
if (localStates.popup && !localStates.popup.closed) localStates.popup.close();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
var paypal_default = PayPalPaymentMethod;
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
export { paypal_default as default };
|
|
93
|
+
//# sourceMappingURL=paypal.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paypal.mjs","names":["submitPayment: TInternalFuncs[\"submitPayment\"]","localStates: PayPalStates"],"sources":["../../src/payment-methods/paypal.ts"],"sourcesContent":["import type { PaymentKitErrors, PaymentKitStates, TInternalFuncs } from \"../types\";\nimport { collectFraudMetadata, definePaymentMethod } from \"../utils\";\n\n// PayPal-specific types\nexport type PayPalCustomerInfo = {\n first_name: string;\n last_name: string;\n};\n\nexport type PayPalStartRequest = {\n processor_id: string;\n customer_info: PayPalCustomerInfo;\n fraud_metadata: {\n ipAddress?: string;\n browserInfo?: { [key: string]: unknown };\n processorFraudInfo?: { [key: string]: unknown };\n };\n};\n\nexport type PayPalStartResponse = {\n approval_url: string;\n popup_token: string;\n checkout_attempt_id: string;\n};\n\nexport type PayPalStatusResponse = {\n completed: boolean;\n status: \"success\" | \"failed\" | \"cancelled\";\n result?: unknown;\n error?: string;\n};\n\nexport type PayPalCheckoutResponse = {\n id: string;\n checkoutAttemptId: string;\n checkoutSessionId: string;\n state: string;\n};\n\nexport type PayPalSubmitOptions = {\n processorId: string;\n customerInfo: PayPalCustomerInfo;\n};\n\ntype PayPalStates = PaymentKitStates & {\n popup?: Window | null;\n pollInterval?: number;\n};\n\nconst defSubmitPayment = (states: PayPalStates) => {\n const submitPayment: TInternalFuncs[\"submitPayment\"] = async (_fields, options) => {\n const { apiBaseUrl, secureToken } = states;\n const paypalOptions = options as PayPalSubmitOptions;\n\n if (!paypalOptions?.processorId) {\n return { errors: { processor_id: \"Processor ID is required\" } as PaymentKitErrors };\n }\n\n if (!paypalOptions?.customerInfo?.first_name || !paypalOptions?.customerInfo?.last_name) {\n return {\n errors: {\n customer_name: \"Customer first and last name are required\",\n } as PaymentKitErrors,\n };\n }\n\n try {\n // Step 1: Call PayPal start endpoint\n const startResponse = await fetch(`${apiBaseUrl}/api/checkout/${secureToken}/paypal/start`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n processor_id: paypalOptions.processorId,\n customer_info: paypalOptions.customerInfo,\n fraud_metadata: collectFraudMetadata(),\n } as PayPalStartRequest),\n });\n\n if (!startResponse.ok) {\n let errorMessage = `Failed to start PayPal checkout (${startResponse.status})`;\n try {\n const errorData = await startResponse.json();\n errorMessage = errorData.detail || errorMessage;\n } catch {\n // Response body is not JSON, use status text\n errorMessage = startResponse.statusText || errorMessage;\n }\n return {\n errors: {\n paypal: errorMessage,\n } as PaymentKitErrors,\n };\n }\n\n const { approval_url, popup_token, checkout_attempt_id } = (await startResponse.json()) as PayPalStartResponse;\n\n // Step 2: Open PayPal popup\n const popup = window.open(approval_url, \"PayPal\", \"width=600,height=700\");\n\n if (!popup) {\n return {\n errors: {\n paypal: \"Failed to open PayPal popup. Please allow popups for this site.\",\n } as PaymentKitErrors,\n };\n }\n\n states.popup = popup;\n\n // Step 3: Poll for completion\n return new Promise((resolve) => {\n const pollInterval = setInterval(async () => {\n try {\n // Check status FIRST - popup might close after successful callback\n const statusResponse = await fetch(\n `${apiBaseUrl}/api/checkout/${secureToken}/popup/status?popup_token=${popup_token}`,\n );\n\n if (!statusResponse.ok) {\n clearInterval(pollInterval);\n popup.close();\n resolve({\n errors: {\n paypal: \"Failed to check PayPal status\",\n } as PaymentKitErrors,\n });\n return;\n }\n\n const statusResult = (await statusResponse.json()) as PayPalStatusResponse;\n\n if (statusResult.completed) {\n clearInterval(pollInterval);\n popup.close();\n\n if (statusResult.status === \"success\") {\n // Use result from popup status endpoint\n const result = (statusResult.result || {\n id: checkout_attempt_id,\n checkoutAttemptId: checkout_attempt_id,\n checkoutSessionId: secureToken,\n state: \"checkout_succeeded\",\n }) as { [key: string]: unknown };\n\n resolve({ data: result });\n } else {\n resolve({\n errors: {\n paypal: statusResult.error || `PayPal checkout ${statusResult.status}`,\n } as PaymentKitErrors,\n });\n }\n return;\n }\n\n // Only check popup.closed AFTER confirming status is not completed\n // This avoids race condition where popup closes from successful callback\n if (popup.closed) {\n clearInterval(pollInterval);\n resolve({\n errors: {\n paypal: \"PayPal popup closed by user\",\n } as PaymentKitErrors,\n });\n return;\n }\n } catch (error) {\n clearInterval(pollInterval);\n popup.close();\n resolve({\n errors: {\n paypal: `Polling error: ${error}`,\n } as PaymentKitErrors,\n });\n }\n }, 2000); // Poll every 2 seconds\n\n states.pollInterval = pollInterval as unknown as number;\n });\n } catch (error) {\n return {\n errors: {\n paypal: `PayPal checkout error: ${error}`,\n } as PaymentKitErrors,\n };\n }\n };\n\n return submitPayment;\n};\n\nconst PayPalPaymentMethod = definePaymentMethod((paymentKitStates) => {\n const localStates: PayPalStates = { ...paymentKitStates };\n\n return {\n name: \"paypal\",\n externalFuncs: {\n // PayPal doesn't need createElement like card iframes\n },\n internalFuncs: {\n submitPayment: defSubmitPayment(localStates),\n cleanup: () => {\n // Clean up popup and polling interval if still active\n if (localStates.pollInterval) {\n clearInterval(localStates.pollInterval);\n }\n if (localStates.popup && !localStates.popup.closed) {\n localStates.popup.close();\n }\n },\n },\n };\n});\n\nexport default PayPalPaymentMethod;\n"],"mappings":";;;AAiDA,MAAM,oBAAoB,WAAyB;CACjD,MAAMA,gBAAiD,OAAO,SAAS,YAAY;EACjF,MAAM,EAAE,YAAY,gBAAgB;EACpC,MAAM,gBAAgB;AAEtB,MAAI,CAAC,eAAe,YAClB,QAAO,EAAE,QAAQ,EAAE,cAAc,4BAA4B,EAAsB;AAGrF,MAAI,CAAC,eAAe,cAAc,cAAc,CAAC,eAAe,cAAc,UAC5E,QAAO,EACL,QAAQ,EACN,eAAe,6CAChB,EACF;AAGH,MAAI;GAEF,MAAM,gBAAgB,MAAM,MAAM,GAAG,WAAW,gBAAgB,YAAY,gBAAgB;IAC1F,QAAQ;IACR,SAAS,EACP,gBAAgB,oBACjB;IACD,MAAM,KAAK,UAAU;KACnB,cAAc,cAAc;KAC5B,eAAe,cAAc;KAC7B,gBAAgB,sBAAsB;KACvC,CAAuB;IACzB,CAAC;AAEF,OAAI,CAAC,cAAc,IAAI;IACrB,IAAI,eAAe,oCAAoC,cAAc,OAAO;AAC5E,QAAI;AAEF,qBADkB,MAAM,cAAc,MAAM,EACnB,UAAU;YAC7B;AAEN,oBAAe,cAAc,cAAc;;AAE7C,WAAO,EACL,QAAQ,EACN,QAAQ,cACT,EACF;;GAGH,MAAM,EAAE,cAAc,aAAa,wBAAyB,MAAM,cAAc,MAAM;GAGtF,MAAM,QAAQ,OAAO,KAAK,cAAc,UAAU,uBAAuB;AAEzE,OAAI,CAAC,MACH,QAAO,EACL,QAAQ,EACN,QAAQ,mEACT,EACF;AAGH,UAAO,QAAQ;AAGf,UAAO,IAAI,SAAS,YAAY;IAC9B,MAAM,eAAe,YAAY,YAAY;AAC3C,SAAI;MAEF,MAAM,iBAAiB,MAAM,MAC3B,GAAG,WAAW,gBAAgB,YAAY,4BAA4B,cACvE;AAED,UAAI,CAAC,eAAe,IAAI;AACtB,qBAAc,aAAa;AAC3B,aAAM,OAAO;AACb,eAAQ,EACN,QAAQ,EACN,QAAQ,iCACT,EACF,CAAC;AACF;;MAGF,MAAM,eAAgB,MAAM,eAAe,MAAM;AAEjD,UAAI,aAAa,WAAW;AAC1B,qBAAc,aAAa;AAC3B,aAAM,OAAO;AAEb,WAAI,aAAa,WAAW,UAS1B,SAAQ,EAAE,MAPM,aAAa,UAAU;QACrC,IAAI;QACJ,mBAAmB;QACnB,mBAAmB;QACnB,OAAO;QACR,EAEuB,CAAC;WAEzB,SAAQ,EACN,QAAQ,EACN,QAAQ,aAAa,SAAS,mBAAmB,aAAa,UAC/D,EACF,CAAC;AAEJ;;AAKF,UAAI,MAAM,QAAQ;AAChB,qBAAc,aAAa;AAC3B,eAAQ,EACN,QAAQ,EACN,QAAQ,+BACT,EACF,CAAC;AACF;;cAEK,OAAO;AACd,oBAAc,aAAa;AAC3B,YAAM,OAAO;AACb,cAAQ,EACN,QAAQ,EACN,QAAQ,kBAAkB,SAC3B,EACF,CAAC;;OAEH,IAAK;AAER,WAAO,eAAe;KACtB;WACK,OAAO;AACd,UAAO,EACL,QAAQ,EACN,QAAQ,0BAA0B,SACnC,EACF;;;AAIL,QAAO;;AAGT,MAAM,sBAAsB,qBAAqB,qBAAqB;CACpE,MAAMC,cAA4B,EAAE,GAAG,kBAAkB;AAEzD,QAAO;EACL,MAAM;EACN,eAAe,EAEd;EACD,eAAe;GACb,eAAe,iBAAiB,YAAY;GAC5C,eAAe;AAEb,QAAI,YAAY,aACd,eAAc,YAAY,aAAa;AAEzC,QAAI,YAAY,SAAS,CAAC,YAAY,MAAM,OAC1C,aAAY,MAAM,OAAO;;GAG9B;EACF;EACD;AAEF,qBAAe"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as StripeGooglePayAdapter, i as ShowPaymentSheetResult, n as GooglePayMockScenario, r as PaymentRequestConfig, t as ConfirmResult } from "../stripe-google-pay-adapter-CkV5HWI-.mjs";
|
|
2
|
+
export { ConfirmResult, GooglePayMockScenario, PaymentRequestConfig, ShowPaymentSheetResult, StripeGooglePayAdapter };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import "../cardsetupintent-D2gBMj3e.mjs";
|
|
2
|
+
import "../publiccardcheckoutresponse-wxFCeVdO.mjs";
|
|
3
|
+
import { a as ParentConnection, i as IFrameConnection, n as CardInputType, o as connectToCardIframe, r as CheckoutResponse, s as connectToCardParent, t as CardErrorCode } from "../connect-card-EaOlRbPS.mjs";
|
|
4
|
+
export { CardErrorCode, CardInputType, CheckoutResponse, IFrameConnection, ParentConnection, connectToCardIframe, connectToCardParent };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import "../cardsetupintent-D2gBMj3e.mjs";
|
|
2
|
+
import { a as connectToTunnelXParent, i as connectToTunnelXIframe, n as TunnelXManager, r as TunnelXParentConnection, t as TunnelXIFrameConnection } from "../connect-tunnel-x-Ce423Pa2.mjs";
|
|
3
|
+
export { TunnelXIFrameConnection, TunnelXManager, TunnelXParentConnection, connectToTunnelXIframe, connectToTunnelXParent };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { WindowMessenger, connect } from "penpal";
|
|
2
|
+
|
|
3
|
+
//#region src/penpal/index.ts
|
|
4
|
+
const connectToWindow = ({ window, methods }) => {
|
|
5
|
+
return connect({
|
|
6
|
+
methods,
|
|
7
|
+
messenger: new WindowMessenger({
|
|
8
|
+
remoteWindow: window,
|
|
9
|
+
allowedOrigins: ["*"]
|
|
10
|
+
})
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { connectToWindow as t };
|
|
16
|
+
//# sourceMappingURL=penpal-BFKeZTVz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"penpal-BFKeZTVz.mjs","names":[],"sources":["../src/penpal/index.ts"],"sourcesContent":["import { connect, type Methods, WindowMessenger } from \"penpal\";\n\ntype Options<TMethods> = {\n window: Window;\n methods: TMethods;\n};\n\nexport const connectToWindow = <TMethods extends Methods, TExposedMethods extends Methods = Methods>({\n window,\n methods,\n}: Options<TExposedMethods>) => {\n const messenger = new WindowMessenger({\n remoteWindow: window,\n // Allow all origins since the iframe is loaded from a trusted source (baseUrl)\n // The security boundary is the checkout_token, not the origin\n allowedOrigins: [\"*\"],\n });\n return connect<TMethods>({ methods, messenger });\n};\n"],"mappings":";;;AAOA,MAAa,mBAAwF,EACnG,QACA,cAC8B;AAO9B,QAAO,QAAkB;EAAE;EAAS,WANlB,IAAI,gBAAgB;GACpC,cAAc;GAGd,gBAAgB,CAAC,IAAI;GACtB,CAAC;EAC6C,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region ../../packages/sdk/esm/models/stripe3dsaction.d.ts
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stripe 3DS authentication via Stripe.js SDK.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
*
|
|
8
|
+
* Frontend should use stripe.confirmCardPayment(client_secret) to display
|
|
9
|
+
* the 3DS authentication modal.
|
|
10
|
+
*/
|
|
11
|
+
type Stripe3dsAction = {
|
|
12
|
+
type: "stripe_3ds";
|
|
13
|
+
/**
|
|
14
|
+
* PaymentIntent client secret
|
|
15
|
+
*/
|
|
16
|
+
clientSecret: string;
|
|
17
|
+
/**
|
|
18
|
+
* Stripe publishable key
|
|
19
|
+
*/
|
|
20
|
+
stripePk: string;
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region ../../packages/sdk/esm/models/publiccardcheckoutresponse.d.ts
|
|
24
|
+
/**
|
|
25
|
+
* Public response model for card checkout - uses external IDs only.
|
|
26
|
+
*/
|
|
27
|
+
type PublicCardCheckoutResponse = {
|
|
28
|
+
id: string;
|
|
29
|
+
checkoutAttemptId: string;
|
|
30
|
+
checkoutSessionId: string;
|
|
31
|
+
paymentIntentId: string;
|
|
32
|
+
subscriptionId?: string | null | undefined;
|
|
33
|
+
invoiceId?: string | null | undefined;
|
|
34
|
+
state: string;
|
|
35
|
+
errorMessage?: string | null | undefined;
|
|
36
|
+
nextAction?: Stripe3dsAction | null | undefined;
|
|
37
|
+
};
|
|
38
|
+
//#endregion
|
|
39
|
+
export { PublicCardCheckoutResponse as t };
|
|
40
|
+
//# sourceMappingURL=publiccardcheckoutresponse-wxFCeVdO.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publiccardcheckoutresponse-wxFCeVdO.d.mts","names":["z","Result","SafeParseResult","SDKValidationError","Stripe3dsAction","Stripe3dsAction$inboundSchema","ZodTypeDef","ZodType","stripe3dsActionFromJSON","z","Result","SafeParseResult","SDKValidationError","Stripe3dsAction","NextAction","PublicCardCheckoutResponse","NextAction$inboundSchema","ZodTypeDef","ZodType","nextActionFromJSON","PublicCardCheckoutResponse$inboundSchema","publicCardCheckoutResponseFromJSON"],"sources":["../../../packages/sdk/esm/models/stripe3dsaction.d.ts","../../../packages/sdk/esm/models/publiccardcheckoutresponse.d.ts"],"sourcesContent":["import * as z from \"zod/v3\";\nimport { Result as SafeParseResult } from \"../types/fp.js\";\nimport { SDKValidationError } from \"./errors/sdkvalidationerror.js\";\n/**\n * Stripe 3DS authentication via Stripe.js SDK.\n *\n * @remarks\n *\n * Frontend should use stripe.confirmCardPayment(client_secret) to display\n * the 3DS authentication modal.\n */\nexport type Stripe3dsAction = {\n type: \"stripe_3ds\";\n /**\n * PaymentIntent client secret\n */\n clientSecret: string;\n /**\n * Stripe publishable key\n */\n stripePk: string;\n};\n/** @internal */\nexport declare const Stripe3dsAction$inboundSchema: z.ZodType<Stripe3dsAction, z.ZodTypeDef, unknown>;\nexport declare function stripe3dsActionFromJSON(jsonString: string): SafeParseResult<Stripe3dsAction, SDKValidationError>;\n//# sourceMappingURL=stripe3dsaction.d.ts.map","import * as z from \"zod/v3\";\nimport { Result as SafeParseResult } from \"../types/fp.js\";\nimport { SDKValidationError } from \"./errors/sdkvalidationerror.js\";\nimport { Stripe3dsAction } from \"./stripe3dsaction.js\";\nexport type NextAction = Stripe3dsAction;\n/**\n * Public response model for card checkout - uses external IDs only.\n */\nexport type PublicCardCheckoutResponse = {\n id: string;\n checkoutAttemptId: string;\n checkoutSessionId: string;\n paymentIntentId: string;\n subscriptionId?: string | null | undefined;\n invoiceId?: string | null | undefined;\n state: string;\n errorMessage?: string | null | undefined;\n nextAction?: Stripe3dsAction | null | undefined;\n};\n/** @internal */\nexport declare const NextAction$inboundSchema: z.ZodType<NextAction, z.ZodTypeDef, unknown>;\nexport declare function nextActionFromJSON(jsonString: string): SafeParseResult<NextAction, SDKValidationError>;\n/** @internal */\nexport declare const PublicCardCheckoutResponse$inboundSchema: z.ZodType<PublicCardCheckoutResponse, z.ZodTypeDef, unknown>;\nexport declare function publicCardCheckoutResponseFromJSON(jsonString: string): SafeParseResult<PublicCardCheckoutResponse, SDKValidationError>;\n//# sourceMappingURL=publiccardcheckoutresponse.d.ts.map"],"mappings":";;;;ACQA;;;;;;KDGYI,eAAAA;;;;;;;;;;;;;ACHZ;;;KAAYW,0BAAAA;;;;;;;;;eASKF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { StripeConstructor } from "@stripe/stripe-js";
|
|
2
|
+
|
|
3
|
+
//#region src/payment-methods/stripe-google-pay-adapter.d.ts
|
|
4
|
+
declare global {
|
|
5
|
+
interface Window {
|
|
6
|
+
Stripe?: StripeConstructor;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
interface PaymentRequestConfig {
|
|
10
|
+
country: string;
|
|
11
|
+
currency: string;
|
|
12
|
+
total: {
|
|
13
|
+
label: string;
|
|
14
|
+
amount: number;
|
|
15
|
+
};
|
|
16
|
+
requestPayerName: boolean;
|
|
17
|
+
requestPayerEmail: boolean;
|
|
18
|
+
}
|
|
19
|
+
type ShowPaymentSheetResult = {
|
|
20
|
+
success: true;
|
|
21
|
+
paymentMethodId: string;
|
|
22
|
+
complete: (status: "success" | "fail") => void;
|
|
23
|
+
} | {
|
|
24
|
+
success: false;
|
|
25
|
+
cancelled: true;
|
|
26
|
+
} | {
|
|
27
|
+
success: false;
|
|
28
|
+
error: string;
|
|
29
|
+
};
|
|
30
|
+
type ConfirmResult = {
|
|
31
|
+
success: true;
|
|
32
|
+
} | {
|
|
33
|
+
success: false;
|
|
34
|
+
error: string;
|
|
35
|
+
};
|
|
36
|
+
declare enum GooglePayMockScenario {
|
|
37
|
+
None = "none",
|
|
38
|
+
Success = "success",
|
|
39
|
+
Cancelled = "cancelled",
|
|
40
|
+
}
|
|
41
|
+
declare class StripeGooglePayAdapter {
|
|
42
|
+
private stripe;
|
|
43
|
+
private paymentRequest;
|
|
44
|
+
private mockScenario;
|
|
45
|
+
constructor(mockScenario?: GooglePayMockScenario);
|
|
46
|
+
initialize(publishableKey: string): boolean;
|
|
47
|
+
createPaymentRequest(config: PaymentRequestConfig): void;
|
|
48
|
+
canMakePayment(): Promise<boolean>;
|
|
49
|
+
showPaymentSheet(): Promise<ShowPaymentSheetResult>;
|
|
50
|
+
confirmCardSetup(clientSecret: string, paymentMethodId: string): Promise<ConfirmResult>;
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { StripeGooglePayAdapter as a, ShowPaymentSheetResult as i, GooglePayMockScenario as n, PaymentRequestConfig as r, ConfirmResult as t };
|
|
54
|
+
//# sourceMappingURL=stripe-google-pay-adapter-CkV5HWI-.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe-google-pay-adapter-CkV5HWI-.d.mts","names":[],"sources":["../src/payment-methods/stripe-google-pay-adapter.ts"],"sourcesContent":[],"mappings":";;;;;IAAqH,MAAA,CAAA,EAKxG,iBALwG;EAAA;;AAKvF,UAIb,oBAAA,CAJa;EAAA,OAAA,EAAA,MAAA;EAIb,QAAA,EAAA,MAAA;EAQL,KAAA,EAAA;IAKA,KAAA,EAAA,MAAa;IAEb,MAAA,EAAA,MAAA;EAMC,CAAA;EAKgB,gBAAA,EAAA,OAAA;EA0BE,iBAAA,EAAA,OAAA;;AAyCK,KArFxB,sBAAA,GAqFwB;EAAR,OAAA,EAAA,IAAA;EAqDqD,eAAA,EAAA,MAAA;EAAR,QAAA,EAAA,CAAA,MAAA,EAAA,SAAA,GAAA,MAAA,EAAA,GAAA,IAAA;CAAO,GAAA;;;;;;;KArIpE,aAAA;;;;;;aAEA,qBAAA;;;;;cAMC,sBAAA;;;;6BAKgB;;+BA0BE;oBAmBL;sBAsBE,QAAQ;mEAqDqC,QAAQ"}
|