@boostengine/payments 1.0.0 → 1.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.
@@ -0,0 +1,29 @@
1
+ import { B as BoostPaymentOpenOptions } from './types-D3bPaYhQ.js';
2
+
3
+ /**
4
+ * Dynamically loads an external script into the browser document.
5
+ */
6
+ declare function loadScript(src: string): Promise<boolean>;
7
+ /**
8
+ * Loads Razorpay Checkout JavaScript library.
9
+ */
10
+ declare function loadRazorpay(): Promise<boolean>;
11
+ /**
12
+ * Loads Cashfree JS SDK v3.
13
+ */
14
+ declare function loadCashfree(): Promise<boolean>;
15
+ /**
16
+ * Universal Checkout Launcher for Browser & React applications.
17
+ * Automatically loads the gateway script, opens modals, or redirects.
18
+ */
19
+ declare function openPaymentModal(options: BoostPaymentOpenOptions): Promise<void>;
20
+ /**
21
+ * React Hook for seamless payment checkout in Next.js / React.
22
+ */
23
+ declare function useBoostPayment(): {
24
+ openPaymentModal: (options: BoostPaymentOpenOptions) => Promise<void>;
25
+ isProcessing: boolean;
26
+ error: string | null;
27
+ };
28
+
29
+ export { loadCashfree, loadRazorpay, loadScript, openPaymentModal, useBoostPayment };
package/dist/react.mjs ADDED
@@ -0,0 +1,167 @@
1
+ 'use client';
2
+ import { useState, useCallback } from 'react';
3
+
4
+ function loadScript(src) {
5
+ return new Promise((resolve) => {
6
+ if (typeof window === "undefined") {
7
+ return resolve(false);
8
+ }
9
+ if (document.querySelector(`script[src="${src}"]`)) {
10
+ return resolve(true);
11
+ }
12
+ const script = document.createElement("script");
13
+ script.src = src;
14
+ script.async = true;
15
+ script.onload = () => resolve(true);
16
+ script.onerror = () => resolve(false);
17
+ document.body.appendChild(script);
18
+ });
19
+ }
20
+ async function loadRazorpay() {
21
+ return loadScript("https://checkout.razorpay.com/v1/checkout.js");
22
+ }
23
+ async function loadCashfree() {
24
+ return loadScript("https://sdk.cashfree.com/js/v3/cashfree.js");
25
+ }
26
+ async function openPaymentModal(options) {
27
+ const { order, onSuccess, onFailure, onDismiss, name, description, image, themeColor, prefill } = options;
28
+ if (typeof window === "undefined") {
29
+ throw new Error("openPaymentModal can only be called in a browser environment.");
30
+ }
31
+ const gateway = order.gateway;
32
+ if (gateway === "razorpay") {
33
+ const loaded = await loadRazorpay();
34
+ if (!loaded) {
35
+ onFailure?.({ gateway: "razorpay", message: "Failed to load Razorpay checkout SDK." });
36
+ return;
37
+ }
38
+ const RazorpayConstructor = window.Razorpay;
39
+ if (!RazorpayConstructor) {
40
+ onFailure?.({ gateway: "razorpay", message: "Razorpay SDK is not available on window." });
41
+ return;
42
+ }
43
+ const rzpOptions = {
44
+ key: order.rawResponse?.key || order.rawResponse?.key_id,
45
+ amount: Math.round(order.amount * 100),
46
+ currency: order.currency,
47
+ name: name || "Order Checkout",
48
+ description: description || `Payment for order #${order.orderId}`,
49
+ image,
50
+ order_id: order.gatewayOrderId,
51
+ prefill: prefill || {},
52
+ theme: {
53
+ color: themeColor || "#3399cc"
54
+ },
55
+ handler: function(response) {
56
+ onSuccess({
57
+ gateway: "razorpay",
58
+ orderId: order.orderId,
59
+ paymentId: response.razorpay_payment_id,
60
+ signature: response.razorpay_signature,
61
+ rawResponse: response
62
+ });
63
+ },
64
+ modal: {
65
+ ondismiss: function() {
66
+ onDismiss?.();
67
+ }
68
+ }
69
+ };
70
+ const rzp = new RazorpayConstructor(rzpOptions);
71
+ rzp.on("payment.failed", function(resp) {
72
+ onFailure?.({
73
+ gateway: "razorpay",
74
+ message: resp.error?.description || "Payment was declined",
75
+ rawError: resp.error
76
+ });
77
+ });
78
+ rzp.open();
79
+ return;
80
+ }
81
+ if (gateway === "cashfree") {
82
+ if (order.paymentSessionId) {
83
+ const loaded = await loadCashfree();
84
+ if (!loaded) {
85
+ onFailure?.({ gateway: "cashfree", message: "Failed to load Cashfree SDK." });
86
+ return;
87
+ }
88
+ const CashfreeConstructor = window.Cashfree;
89
+ if (CashfreeConstructor) {
90
+ const isSandbox = order.paymentSessionId.includes("test") || order.rawResponse?.environment === "SANDBOX";
91
+ const cashfree = CashfreeConstructor({ mode: isSandbox ? "sandbox" : "production" });
92
+ cashfree.checkout({
93
+ paymentSessionId: order.paymentSessionId,
94
+ redirectTarget: "_self"
95
+ });
96
+ return;
97
+ }
98
+ }
99
+ if (order.redirectUrl) {
100
+ window.location.href = order.redirectUrl;
101
+ return;
102
+ }
103
+ onFailure?.({ gateway: "cashfree", message: "No payment session ID or redirect URL found for Cashfree order." });
104
+ return;
105
+ }
106
+ if (gateway === "phonepe" || gateway === "stripe" || gateway === "paytm") {
107
+ if (order.redirectUrl) {
108
+ window.location.href = order.redirectUrl;
109
+ return;
110
+ }
111
+ onFailure?.({ gateway, message: `No redirect URL returned for ${gateway} checkout.` });
112
+ return;
113
+ }
114
+ if (gateway === "cod") {
115
+ onSuccess({
116
+ gateway: "cod",
117
+ orderId: order.orderId,
118
+ paymentId: `COD_${order.orderId}`,
119
+ rawResponse: order.rawResponse
120
+ });
121
+ return;
122
+ }
123
+ onFailure?.({ gateway, message: `Unsupported checkout gateway: ${gateway}` });
124
+ }
125
+ function useBoostPayment() {
126
+ const [isProcessing, setIsProcessing] = useState(false);
127
+ const [error, setError] = useState(null);
128
+ const startPayment = useCallback(async (options) => {
129
+ setIsProcessing(true);
130
+ setError(null);
131
+ try {
132
+ await openPaymentModal({
133
+ ...options,
134
+ onSuccess: (res) => {
135
+ setIsProcessing(false);
136
+ options.onSuccess(res);
137
+ },
138
+ onFailure: (err) => {
139
+ setIsProcessing(false);
140
+ setError(err.message);
141
+ options.onFailure?.(err);
142
+ },
143
+ onDismiss: () => {
144
+ setIsProcessing(false);
145
+ options.onDismiss?.();
146
+ }
147
+ });
148
+ } catch (err) {
149
+ setIsProcessing(false);
150
+ setError(err.message);
151
+ options.onFailure?.({
152
+ gateway: options.order.gateway,
153
+ message: err.message || "Payment initiation failed",
154
+ rawError: err
155
+ });
156
+ }
157
+ }, []);
158
+ return {
159
+ openPaymentModal: startPayment,
160
+ isProcessing,
161
+ error
162
+ };
163
+ }
164
+
165
+ export { loadCashfree, loadRazorpay, loadScript, openPaymentModal, useBoostPayment };
166
+ //# sourceMappingURL=react.mjs.map
167
+ //# sourceMappingURL=react.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/index.ts"],"names":[],"mappings":"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","file":"react.mjs","sourcesContent":["'use client';\n\nimport { useState, useCallback } from 'react';\nimport { BoostPaymentOpenOptions, GatewayName, UnifiedOrderResult } from '../types';\n\n/**\n * Dynamically loads an external script into the browser document.\n */\nexport function loadScript(src: string): Promise<boolean> {\n return new Promise((resolve) => {\n if (typeof window === 'undefined') {\n return resolve(false);\n }\n if (document.querySelector(`script[src=\"${src}\"]`)) {\n return resolve(true);\n }\n const script = document.createElement('script');\n script.src = src;\n script.async = true;\n script.onload = () => resolve(true);\n script.onerror = () => resolve(false);\n document.body.appendChild(script);\n });\n}\n\n/**\n * Loads Razorpay Checkout JavaScript library.\n */\nexport async function loadRazorpay(): Promise<boolean> {\n return loadScript('https://checkout.razorpay.com/v1/checkout.js');\n}\n\n/**\n * Loads Cashfree JS SDK v3.\n */\nexport async function loadCashfree(): Promise<boolean> {\n return loadScript('https://sdk.cashfree.com/js/v3/cashfree.js');\n}\n\n/**\n * Universal Checkout Launcher for Browser & React applications.\n * Automatically loads the gateway script, opens modals, or redirects.\n */\nexport async function openPaymentModal(options: BoostPaymentOpenOptions): Promise<void> {\n const { order, onSuccess, onFailure, onDismiss, name, description, image, themeColor, prefill } = options;\n\n if (typeof window === 'undefined') {\n throw new Error('openPaymentModal can only be called in a browser environment.');\n }\n\n const gateway = order.gateway;\n\n // 1. RAZORPAY MODAL\n if (gateway === 'razorpay') {\n const loaded = await loadRazorpay();\n if (!loaded) {\n onFailure?.({ gateway: 'razorpay', message: 'Failed to load Razorpay checkout SDK.' });\n return;\n }\n\n const RazorpayConstructor = (window as any).Razorpay;\n if (!RazorpayConstructor) {\n onFailure?.({ gateway: 'razorpay', message: 'Razorpay SDK is not available on window.' });\n return;\n }\n\n const rzpOptions = {\n key: (order.rawResponse as any)?.key || (order.rawResponse as any)?.key_id,\n amount: Math.round(order.amount * 100),\n currency: order.currency,\n name: name || 'Order Checkout',\n description: description || `Payment for order #${order.orderId}`,\n image: image,\n order_id: order.gatewayOrderId,\n prefill: prefill || {},\n theme: {\n color: themeColor || '#3399cc',\n },\n handler: function (response: any) {\n onSuccess({\n gateway: 'razorpay',\n orderId: order.orderId,\n paymentId: response.razorpay_payment_id,\n signature: response.razorpay_signature,\n rawResponse: response,\n });\n },\n modal: {\n ondismiss: function () {\n onDismiss?.();\n },\n },\n };\n\n const rzp = new RazorpayConstructor(rzpOptions);\n rzp.on('payment.failed', function (resp: any) {\n onFailure?.({\n gateway: 'razorpay',\n message: resp.error?.description || 'Payment was declined',\n rawError: resp.error,\n });\n });\n rzp.open();\n return;\n }\n\n // 2. CASHFREE DROPIN\n if (gateway === 'cashfree') {\n if (order.paymentSessionId) {\n const loaded = await loadCashfree();\n if (!loaded) {\n onFailure?.({ gateway: 'cashfree', message: 'Failed to load Cashfree SDK.' });\n return;\n }\n\n const CashfreeConstructor = (window as any).Cashfree;\n if (CashfreeConstructor) {\n const isSandbox = order.paymentSessionId.includes('test') || (order.rawResponse as any)?.environment === 'SANDBOX';\n const cashfree = CashfreeConstructor({ mode: isSandbox ? 'sandbox' : 'production' });\n cashfree.checkout({\n paymentSessionId: order.paymentSessionId,\n redirectTarget: '_self',\n });\n return;\n }\n }\n\n if (order.redirectUrl) {\n window.location.href = order.redirectUrl;\n return;\n }\n\n onFailure?.({ gateway: 'cashfree', message: 'No payment session ID or redirect URL found for Cashfree order.' });\n return;\n }\n\n // 3. PHONEPE / STRIPE / PAYTM REDIRECT\n if (gateway === 'phonepe' || gateway === 'stripe' || gateway === 'paytm') {\n if (order.redirectUrl) {\n window.location.href = order.redirectUrl;\n return;\n }\n onFailure?.({ gateway, message: `No redirect URL returned for ${gateway} checkout.` });\n return;\n }\n\n // 4. CASH ON DELIVERY (COD)\n if (gateway === 'cod') {\n onSuccess({\n gateway: 'cod',\n orderId: order.orderId,\n paymentId: `COD_${order.orderId}`,\n rawResponse: order.rawResponse,\n });\n return;\n }\n\n onFailure?.({ gateway, message: `Unsupported checkout gateway: ${gateway}` });\n}\n\n/**\n * React Hook for seamless payment checkout in Next.js / React.\n */\nexport function useBoostPayment() {\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const startPayment = useCallback(async (options: BoostPaymentOpenOptions) => {\n setIsProcessing(true);\n setError(null);\n\n try {\n await openPaymentModal({\n ...options,\n onSuccess: (res) => {\n setIsProcessing(false);\n options.onSuccess(res);\n },\n onFailure: (err) => {\n setIsProcessing(false);\n setError(err.message);\n options.onFailure?.(err);\n },\n onDismiss: () => {\n setIsProcessing(false);\n options.onDismiss?.();\n },\n });\n } catch (err: any) {\n setIsProcessing(false);\n setError(err.message);\n options.onFailure?.({\n gateway: options.order.gateway,\n message: err.message || 'Payment initiation failed',\n rawError: err,\n });\n }\n }, []);\n\n return {\n openPaymentModal: startPayment,\n isProcessing,\n error,\n };\n}\n"]}
@@ -0,0 +1,194 @@
1
+ type GatewayName = 'razorpay' | 'cashfree' | 'phonepe' | 'paytm' | 'stripe' | 'cod';
2
+ type SupportedGateway = GatewayName;
3
+ interface UnifiedCustomer {
4
+ id?: string;
5
+ name: string;
6
+ email: string;
7
+ phone: string;
8
+ }
9
+ interface UnifiedOrderItem {
10
+ name: string;
11
+ quantity: number;
12
+ price: number;
13
+ sku?: string;
14
+ }
15
+ interface UnifiedCreateOrderOptions {
16
+ /** Amount in standard human currency units (e.g. 1499.00 for INR, 25.00 for USD). Package handles subunit conversions internally! */
17
+ amount: number;
18
+ /** 3-letter ISO currency code (e.g. 'INR', 'USD', 'EUR') */
19
+ currency: string;
20
+ /** Merchant order or receipt reference ID */
21
+ receipt: string;
22
+ /** Customer details */
23
+ customer: UnifiedCustomer;
24
+ /** Line items */
25
+ items?: UnifiedOrderItem[];
26
+ /** Merchant notes/metadata */
27
+ notes?: Record<string, any>;
28
+ /** Customer return/redirect URL after payment */
29
+ redirectUrl?: string;
30
+ /** Server-to-server webhook callback URL */
31
+ callbackUrl?: string;
32
+ /** Explicitly override gateway for this transaction */
33
+ gateway?: GatewayName;
34
+ }
35
+ type CreateOrderOptions = UnifiedCreateOrderOptions;
36
+ interface UnifiedOrderResult {
37
+ gateway: GatewayName;
38
+ orderId: string;
39
+ gatewayOrderId: string;
40
+ /** Amount in standard currency units (e.g. 1499.00) */
41
+ amount: number;
42
+ currency: string;
43
+ status: 'CREATED' | 'PENDING' | 'PAID' | 'FAILED';
44
+ /** Cashfree payment_session_id for Drop-in UI or SDK */
45
+ paymentSessionId?: string;
46
+ /** Redirect or hosted pay URL (PhonePe, Stripe, Cashfree) */
47
+ redirectUrl?: string;
48
+ /** Paytm checkout txnToken */
49
+ txnToken?: string;
50
+ /** Raw response object from gateway */
51
+ rawResponse: any;
52
+ }
53
+ type PaymentOrderResult = UnifiedOrderResult;
54
+ interface UnifiedPaymentVerificationOptions {
55
+ gateway: GatewayName;
56
+ orderId: string;
57
+ paymentId?: string;
58
+ signature?: string;
59
+ rawPayload?: any;
60
+ }
61
+ interface UnifiedPaymentVerificationResult {
62
+ gateway: GatewayName;
63
+ isSuccessful: boolean;
64
+ paymentId: string;
65
+ orderId: string;
66
+ /** Amount in standard currency units (e.g. 1499.00) */
67
+ amount: number;
68
+ currency: string;
69
+ paymentMethod?: string;
70
+ rawResponse: any;
71
+ }
72
+ type VerificationResult = UnifiedPaymentVerificationResult;
73
+ interface UnifiedRefundOptions {
74
+ gateway: GatewayName;
75
+ paymentId: string;
76
+ orderId?: string;
77
+ /** Partial or full refund amount in standard currency units */
78
+ amount?: number;
79
+ reason?: string;
80
+ }
81
+ interface UnifiedRefundResult {
82
+ gateway: GatewayName;
83
+ refundId: string;
84
+ paymentId: string;
85
+ /** Amount in standard currency units */
86
+ amount: number;
87
+ status: 'SUCCESS' | 'PENDING' | 'FAILED';
88
+ rawResponse: any;
89
+ }
90
+ type RefundResult = UnifiedRefundResult;
91
+ type NormalizedWebhookEvent = 'PAYMENT_SUCCESS' | 'PAYMENT_FAILED' | 'REFUND_PROCESSED' | 'REFUND_FAILED' | 'DISPUTE_CREATED' | 'UNKNOWN';
92
+ interface WebhookVerificationOptions {
93
+ gateway: GatewayName;
94
+ rawBody: string | Buffer;
95
+ headers: Record<string, string | string[] | undefined>;
96
+ webhookSecret?: string;
97
+ }
98
+ interface WebhookVerificationResult {
99
+ isValid: boolean;
100
+ /** Standardized event name across all payment gateways */
101
+ normalizedEvent: NormalizedWebhookEvent;
102
+ /** Original raw event name sent by the provider */
103
+ rawEvent?: string;
104
+ gateway: GatewayName;
105
+ orderId?: string;
106
+ paymentId?: string;
107
+ /** Amount in standard currency units (e.g. 1499.00) */
108
+ amount?: number;
109
+ currency?: string;
110
+ data?: any;
111
+ error?: string;
112
+ }
113
+ type WebhookResult = WebhookVerificationResult;
114
+ interface RazorpayConfig {
115
+ keyId: string;
116
+ keySecret: string;
117
+ webhookSecret?: string;
118
+ }
119
+ interface CashfreeConfig {
120
+ appId: string;
121
+ secretKey: string;
122
+ env?: 'SANDBOX' | 'PRODUCTION';
123
+ apiVersion?: string;
124
+ }
125
+ interface PhonePeConfig {
126
+ merchantId: string;
127
+ saltKey: string;
128
+ saltIndex?: string;
129
+ env?: 'UAT' | 'PRODUCTION';
130
+ }
131
+ interface PaytmConfig {
132
+ mid: string;
133
+ merchantKey: string;
134
+ website?: string;
135
+ env?: 'STAGE' | 'PRODUCTION';
136
+ }
137
+ interface StripeConfig {
138
+ secretKey: string;
139
+ webhookSecret?: string;
140
+ }
141
+ interface CODConfig {
142
+ minOrderValue?: number;
143
+ maxOrderValue?: number;
144
+ extraFee?: number;
145
+ allowedPincodes?: string[];
146
+ }
147
+ interface GatewayConfigs {
148
+ razorpay?: RazorpayConfig;
149
+ cashfree?: CashfreeConfig;
150
+ phonepe?: PhonePeConfig;
151
+ paytm?: PaytmConfig;
152
+ stripe?: StripeConfig;
153
+ cod?: CODConfig;
154
+ }
155
+ interface SmartRoutingConfig {
156
+ /** Map currency to default gateway, e.g. { 'USD': 'stripe', 'INR': 'cashfree' } */
157
+ currencyMap?: Record<string, GatewayName>;
158
+ /** Automatic fallback order if primary gateway fails, e.g. ['razorpay', 'cashfree', 'phonepe'] */
159
+ fallbackChain?: GatewayName[];
160
+ }
161
+ interface PaymentManagerOptions {
162
+ defaultGateway?: GatewayName;
163
+ gateways: GatewayConfigs;
164
+ smartRouting?: SmartRoutingConfig;
165
+ }
166
+ interface BoostPaymentOpenOptions {
167
+ order: UnifiedOrderResult;
168
+ onSuccess: (response: {
169
+ gateway: GatewayName;
170
+ orderId: string;
171
+ paymentId?: string;
172
+ signature?: string;
173
+ rawResponse?: any;
174
+ }) => void;
175
+ onFailure?: (error: {
176
+ gateway: GatewayName;
177
+ message: string;
178
+ rawError?: any;
179
+ }) => void;
180
+ onDismiss?: () => void;
181
+ /** Store / brand name displayed in checkout modal */
182
+ name?: string;
183
+ description?: string;
184
+ image?: string;
185
+ themeColor?: string;
186
+ /** Prefill user details if available */
187
+ prefill?: {
188
+ name?: string;
189
+ email?: string;
190
+ contact?: string;
191
+ };
192
+ }
193
+
194
+ export type { BoostPaymentOpenOptions as B, CashfreeConfig as C, GatewayName as G, NormalizedWebhookEvent as N, PaymentManagerOptions as P, RazorpayConfig as R, StripeConfig as S, UnifiedCreateOrderOptions as U, VerificationResult as V, WebhookVerificationOptions as W, UnifiedOrderResult as a, UnifiedPaymentVerificationOptions as b, UnifiedPaymentVerificationResult as c, UnifiedRefundOptions as d, UnifiedRefundResult as e, WebhookVerificationResult as f, PhonePeConfig as g, PaytmConfig as h, CODConfig as i, CreateOrderOptions as j, GatewayConfigs as k, PaymentOrderResult as l, RefundResult as m, SmartRoutingConfig as n, SupportedGateway as o, UnifiedCustomer as p, UnifiedOrderItem as q, WebhookResult as r };
@@ -0,0 +1,194 @@
1
+ type GatewayName = 'razorpay' | 'cashfree' | 'phonepe' | 'paytm' | 'stripe' | 'cod';
2
+ type SupportedGateway = GatewayName;
3
+ interface UnifiedCustomer {
4
+ id?: string;
5
+ name: string;
6
+ email: string;
7
+ phone: string;
8
+ }
9
+ interface UnifiedOrderItem {
10
+ name: string;
11
+ quantity: number;
12
+ price: number;
13
+ sku?: string;
14
+ }
15
+ interface UnifiedCreateOrderOptions {
16
+ /** Amount in standard human currency units (e.g. 1499.00 for INR, 25.00 for USD). Package handles subunit conversions internally! */
17
+ amount: number;
18
+ /** 3-letter ISO currency code (e.g. 'INR', 'USD', 'EUR') */
19
+ currency: string;
20
+ /** Merchant order or receipt reference ID */
21
+ receipt: string;
22
+ /** Customer details */
23
+ customer: UnifiedCustomer;
24
+ /** Line items */
25
+ items?: UnifiedOrderItem[];
26
+ /** Merchant notes/metadata */
27
+ notes?: Record<string, any>;
28
+ /** Customer return/redirect URL after payment */
29
+ redirectUrl?: string;
30
+ /** Server-to-server webhook callback URL */
31
+ callbackUrl?: string;
32
+ /** Explicitly override gateway for this transaction */
33
+ gateway?: GatewayName;
34
+ }
35
+ type CreateOrderOptions = UnifiedCreateOrderOptions;
36
+ interface UnifiedOrderResult {
37
+ gateway: GatewayName;
38
+ orderId: string;
39
+ gatewayOrderId: string;
40
+ /** Amount in standard currency units (e.g. 1499.00) */
41
+ amount: number;
42
+ currency: string;
43
+ status: 'CREATED' | 'PENDING' | 'PAID' | 'FAILED';
44
+ /** Cashfree payment_session_id for Drop-in UI or SDK */
45
+ paymentSessionId?: string;
46
+ /** Redirect or hosted pay URL (PhonePe, Stripe, Cashfree) */
47
+ redirectUrl?: string;
48
+ /** Paytm checkout txnToken */
49
+ txnToken?: string;
50
+ /** Raw response object from gateway */
51
+ rawResponse: any;
52
+ }
53
+ type PaymentOrderResult = UnifiedOrderResult;
54
+ interface UnifiedPaymentVerificationOptions {
55
+ gateway: GatewayName;
56
+ orderId: string;
57
+ paymentId?: string;
58
+ signature?: string;
59
+ rawPayload?: any;
60
+ }
61
+ interface UnifiedPaymentVerificationResult {
62
+ gateway: GatewayName;
63
+ isSuccessful: boolean;
64
+ paymentId: string;
65
+ orderId: string;
66
+ /** Amount in standard currency units (e.g. 1499.00) */
67
+ amount: number;
68
+ currency: string;
69
+ paymentMethod?: string;
70
+ rawResponse: any;
71
+ }
72
+ type VerificationResult = UnifiedPaymentVerificationResult;
73
+ interface UnifiedRefundOptions {
74
+ gateway: GatewayName;
75
+ paymentId: string;
76
+ orderId?: string;
77
+ /** Partial or full refund amount in standard currency units */
78
+ amount?: number;
79
+ reason?: string;
80
+ }
81
+ interface UnifiedRefundResult {
82
+ gateway: GatewayName;
83
+ refundId: string;
84
+ paymentId: string;
85
+ /** Amount in standard currency units */
86
+ amount: number;
87
+ status: 'SUCCESS' | 'PENDING' | 'FAILED';
88
+ rawResponse: any;
89
+ }
90
+ type RefundResult = UnifiedRefundResult;
91
+ type NormalizedWebhookEvent = 'PAYMENT_SUCCESS' | 'PAYMENT_FAILED' | 'REFUND_PROCESSED' | 'REFUND_FAILED' | 'DISPUTE_CREATED' | 'UNKNOWN';
92
+ interface WebhookVerificationOptions {
93
+ gateway: GatewayName;
94
+ rawBody: string | Buffer;
95
+ headers: Record<string, string | string[] | undefined>;
96
+ webhookSecret?: string;
97
+ }
98
+ interface WebhookVerificationResult {
99
+ isValid: boolean;
100
+ /** Standardized event name across all payment gateways */
101
+ normalizedEvent: NormalizedWebhookEvent;
102
+ /** Original raw event name sent by the provider */
103
+ rawEvent?: string;
104
+ gateway: GatewayName;
105
+ orderId?: string;
106
+ paymentId?: string;
107
+ /** Amount in standard currency units (e.g. 1499.00) */
108
+ amount?: number;
109
+ currency?: string;
110
+ data?: any;
111
+ error?: string;
112
+ }
113
+ type WebhookResult = WebhookVerificationResult;
114
+ interface RazorpayConfig {
115
+ keyId: string;
116
+ keySecret: string;
117
+ webhookSecret?: string;
118
+ }
119
+ interface CashfreeConfig {
120
+ appId: string;
121
+ secretKey: string;
122
+ env?: 'SANDBOX' | 'PRODUCTION';
123
+ apiVersion?: string;
124
+ }
125
+ interface PhonePeConfig {
126
+ merchantId: string;
127
+ saltKey: string;
128
+ saltIndex?: string;
129
+ env?: 'UAT' | 'PRODUCTION';
130
+ }
131
+ interface PaytmConfig {
132
+ mid: string;
133
+ merchantKey: string;
134
+ website?: string;
135
+ env?: 'STAGE' | 'PRODUCTION';
136
+ }
137
+ interface StripeConfig {
138
+ secretKey: string;
139
+ webhookSecret?: string;
140
+ }
141
+ interface CODConfig {
142
+ minOrderValue?: number;
143
+ maxOrderValue?: number;
144
+ extraFee?: number;
145
+ allowedPincodes?: string[];
146
+ }
147
+ interface GatewayConfigs {
148
+ razorpay?: RazorpayConfig;
149
+ cashfree?: CashfreeConfig;
150
+ phonepe?: PhonePeConfig;
151
+ paytm?: PaytmConfig;
152
+ stripe?: StripeConfig;
153
+ cod?: CODConfig;
154
+ }
155
+ interface SmartRoutingConfig {
156
+ /** Map currency to default gateway, e.g. { 'USD': 'stripe', 'INR': 'cashfree' } */
157
+ currencyMap?: Record<string, GatewayName>;
158
+ /** Automatic fallback order if primary gateway fails, e.g. ['razorpay', 'cashfree', 'phonepe'] */
159
+ fallbackChain?: GatewayName[];
160
+ }
161
+ interface PaymentManagerOptions {
162
+ defaultGateway?: GatewayName;
163
+ gateways: GatewayConfigs;
164
+ smartRouting?: SmartRoutingConfig;
165
+ }
166
+ interface BoostPaymentOpenOptions {
167
+ order: UnifiedOrderResult;
168
+ onSuccess: (response: {
169
+ gateway: GatewayName;
170
+ orderId: string;
171
+ paymentId?: string;
172
+ signature?: string;
173
+ rawResponse?: any;
174
+ }) => void;
175
+ onFailure?: (error: {
176
+ gateway: GatewayName;
177
+ message: string;
178
+ rawError?: any;
179
+ }) => void;
180
+ onDismiss?: () => void;
181
+ /** Store / brand name displayed in checkout modal */
182
+ name?: string;
183
+ description?: string;
184
+ image?: string;
185
+ themeColor?: string;
186
+ /** Prefill user details if available */
187
+ prefill?: {
188
+ name?: string;
189
+ email?: string;
190
+ contact?: string;
191
+ };
192
+ }
193
+
194
+ export type { BoostPaymentOpenOptions as B, CashfreeConfig as C, GatewayName as G, NormalizedWebhookEvent as N, PaymentManagerOptions as P, RazorpayConfig as R, StripeConfig as S, UnifiedCreateOrderOptions as U, VerificationResult as V, WebhookVerificationOptions as W, UnifiedOrderResult as a, UnifiedPaymentVerificationOptions as b, UnifiedPaymentVerificationResult as c, UnifiedRefundOptions as d, UnifiedRefundResult as e, WebhookVerificationResult as f, PhonePeConfig as g, PaytmConfig as h, CODConfig as i, CreateOrderOptions as j, GatewayConfigs as k, PaymentOrderResult as l, RefundResult as m, SmartRoutingConfig as n, SupportedGateway as o, UnifiedCustomer as p, UnifiedOrderItem as q, WebhookResult as r };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@boostengine/payments",
3
- "version": "1.0.0",
4
- "description": "Unified Multi-Gateway Payment Orchestration for Indian & Global eCommerce (Razorpay, Cashfree, PhonePe, Paytm, Stripe, COD) with smart routing, automatic fallbacks, and signature verification.",
3
+ "version": "1.1.0",
4
+ "description": "Unified Multi-Gateway Payment Orchestration for Indian & Global eCommerce (Razorpay, Cashfree, PhonePe, Paytm, Stripe, COD) with smart routing, automatic fallbacks, signature verification, and React checkout hooks.",
5
5
  "author": "Boost Engine <boostengine001@gmail.com>",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -18,7 +18,9 @@
18
18
  "ecommerce",
19
19
  "checkout",
20
20
  "upi",
21
- "smart-routing"
21
+ "smart-routing",
22
+ "nextjs-webhook",
23
+ "react-payments"
22
24
  ],
23
25
  "bin": {
24
26
  "boost-payments": "./bin/cli.cjs"
@@ -31,6 +33,11 @@
31
33
  "types": "./dist/index.d.ts",
32
34
  "import": "./dist/index.mjs",
33
35
  "require": "./dist/index.cjs"
36
+ },
37
+ "./react": {
38
+ "types": "./dist/react.d.ts",
39
+ "import": "./dist/react.mjs",
40
+ "require": "./dist/react.cjs"
34
41
  }
35
42
  },
36
43
  "files": [
@@ -43,8 +50,18 @@
43
50
  "test": "node test-suite.cjs",
44
51
  "prepublishOnly": "npm run build && npm test"
45
52
  },
53
+ "peerDependencies": {
54
+ "react": ">=17.0.0"
55
+ },
56
+ "peerDependenciesMeta": {
57
+ "react": {
58
+ "optional": true
59
+ }
60
+ },
46
61
  "devDependencies": {
47
62
  "@types/node": "^20.14.0",
63
+ "@types/react": "^18.3.0",
64
+ "react": "^18.3.1",
48
65
  "tsup": "^8.3.5",
49
66
  "typescript": "^5.6.3"
50
67
  }