@deiondz/better-auth-razorpay 2.0.10 → 2.0.12
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 +107 -11
- package/dist/client/hooks.d.ts +81 -6
- package/dist/client/hooks.js +52 -0
- package/dist/client/hooks.js.map +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/index.d.ts +5 -4
- package/dist/index.js +69 -30
- package/dist/index.js.map +1 -1
- package/dist/{types-bkMGY9Jy.d.ts → types-BGWv0IJy.d.ts} +6 -3
- package/dist/{types-B25gyPpX.d.ts → types-VZW_XCzQ.d.ts} +7 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,8 +63,57 @@ The package includes `razorpay` and `zod` as dependencies.
|
|
|
63
63
|
|
|
64
64
|
2. **Configure the Plugin**
|
|
65
65
|
|
|
66
|
+
You can either pass an existing Razorpay instance (`razorpayClient`) or let the plugin create it from credentials (`razorpayKeyId` + `razorpayKeySecret`).
|
|
67
|
+
|
|
68
|
+
**Option A: Pass credentials (plugin creates the Razorpay instance)**
|
|
69
|
+
|
|
66
70
|
```typescript
|
|
67
71
|
// src/lib/auth.ts (or your auth configuration file)
|
|
72
|
+
import { betterAuth } from 'better-auth'
|
|
73
|
+
import { razorpayPlugin } from '@deiondz/better-auth-razorpay'
|
|
74
|
+
|
|
75
|
+
export const auth = betterAuth({
|
|
76
|
+
// ... your Better Auth configuration
|
|
77
|
+
database: mongodbAdapter(await connect()), // or your adapter
|
|
78
|
+
secret: process.env.BETTER_AUTH_SECRET,
|
|
79
|
+
baseURL: process.env.BETTER_AUTH_URL,
|
|
80
|
+
|
|
81
|
+
plugins: [
|
|
82
|
+
razorpayPlugin({
|
|
83
|
+
razorpayKeyId: process.env.RAZORPAY_KEY_ID!,
|
|
84
|
+
razorpayKeySecret: process.env.RAZORPAY_KEY_SECRET!, // also enables verify-payment endpoint when set
|
|
85
|
+
razorpayWebhookSecret: process.env.RAZORPAY_WEBHOOK_SECRET,
|
|
86
|
+
createCustomerOnSignUp: true, // optional
|
|
87
|
+
subscription: {
|
|
88
|
+
enabled: true,
|
|
89
|
+
plans: [
|
|
90
|
+
{
|
|
91
|
+
name: 'Starter',
|
|
92
|
+
monthlyPlanId: 'plan_xxxxxxxxxxxx',
|
|
93
|
+
annualPlanId: 'plan_yyyyyyyyyyyy', // optional
|
|
94
|
+
limits: { features: 5 },
|
|
95
|
+
freeTrial: { days: 7 }, // optional
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
onSubscriptionActivated: async ({ subscription, plan }) => {
|
|
99
|
+
console.log(`Subscription ${subscription.id} activated for plan ${plan.name}`)
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
onWebhookEvent: async (payload, context) => {
|
|
103
|
+
const { event, subscription, payment } = payload
|
|
104
|
+
if (event === 'subscription.charged' && payment) {
|
|
105
|
+
// Send confirmation email, etc.
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
}),
|
|
109
|
+
],
|
|
110
|
+
})
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Option B: Pass an existing Razorpay client**
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// src/lib/auth.ts
|
|
68
117
|
import Razorpay from 'razorpay'
|
|
69
118
|
import { betterAuth } from 'better-auth'
|
|
70
119
|
import { razorpayPlugin } from '@deiondz/better-auth-razorpay'
|
|
@@ -76,7 +125,7 @@ const razorpayClient = new Razorpay({
|
|
|
76
125
|
|
|
77
126
|
export const auth = betterAuth({
|
|
78
127
|
// ... your Better Auth configuration
|
|
79
|
-
database: mongodbAdapter(await connect()),
|
|
128
|
+
database: mongodbAdapter(await connect()),
|
|
80
129
|
secret: process.env.BETTER_AUTH_SECRET,
|
|
81
130
|
baseURL: process.env.BETTER_AUTH_URL,
|
|
82
131
|
|
|
@@ -165,9 +214,10 @@ npx @better-auth/cli@latest generate
|
|
|
165
214
|
|
|
166
215
|
```typescript
|
|
167
216
|
interface RazorpayPluginOptions {
|
|
168
|
-
razorpayClient
|
|
169
|
-
|
|
170
|
-
razorpayKeySecret?: string
|
|
217
|
+
razorpayClient?: Razorpay // Optional: Initialized Razorpay instance; omit when using razorpayKeyId + razorpayKeySecret
|
|
218
|
+
razorpayKeyId?: string // Optional: Razorpay API key ID; required when razorpayClient is not provided (plugin creates the instance)
|
|
219
|
+
razorpayKeySecret?: string // Optional: Razorpay API key secret; required when razorpayClient is not provided; when set, enables POST /razorpay/verify-payment
|
|
220
|
+
razorpayWebhookSecret?: string // Optional: Webhook secret for signature verification
|
|
171
221
|
createCustomerOnSignUp?: boolean // Optional: Create Razorpay customer on user sign-up (default: false)
|
|
172
222
|
onCustomerCreate?: (args) => Promise<void>
|
|
173
223
|
getCustomerCreateParams?: (args) => Promise<{ params?: Record<string, unknown> }>
|
|
@@ -287,7 +337,7 @@ All endpoints are prefixed with `/api/auth/razorpay/` (or your configured `baseP
|
|
|
287
337
|
|
|
288
338
|
| Action | Method | Endpoint | Description |
|
|
289
339
|
|--------|--------|----------|-------------|
|
|
290
|
-
| Create or update | `POST` | `subscription/create-or-update` | Start a subscription or update
|
|
340
|
+
| Create or update | `POST` | `subscription/create-or-update` | Start a subscription or update. With `embed: true` returns data for in-page modal (no redirect); otherwise returns `checkoutUrl`. Body: `plan` (plan **name** or Razorpay plan ID `plan_*`), `annual?`, `seats?`, `subscriptionId?`, `successUrl?`, `disableRedirect?`, `embed?`. |
|
|
291
341
|
| Cancel | `POST` | `subscription/cancel` | Cancel by local subscription ID. Body: `subscriptionId`, `immediately?`. |
|
|
292
342
|
| Restore | `POST` | `subscription/restore` | Restore a subscription scheduled to cancel. Body: `subscriptionId`. |
|
|
293
343
|
| List | `GET` | `subscription/list` | List active/trialing subscriptions. Query: `referenceId?` (default: current user). |
|
|
@@ -684,13 +734,30 @@ if (plansRes.success) console.log(plansRes.data)
|
|
|
684
734
|
// List subscriptions
|
|
685
735
|
const listRes = await authClient.razorpay.listSubscriptions({ referenceId: 'optional' })
|
|
686
736
|
|
|
687
|
-
// Create or update subscription
|
|
737
|
+
// Create or update subscription
|
|
738
|
+
// With embed: true — in-page modal (no redirect); use openRazorpaySubscriptionCheckout with razorpaySubscriptionId
|
|
739
|
+
// Without embed — returns checkoutUrl for redirect
|
|
688
740
|
const result = await authClient.razorpay.createOrUpdateSubscription({
|
|
689
741
|
plan: 'Starter',
|
|
690
742
|
annual: false,
|
|
691
743
|
seats: 1,
|
|
744
|
+
embed: true, // keep user on your page; checkout opens as modal
|
|
692
745
|
})
|
|
693
|
-
if (result.success
|
|
746
|
+
if (result.success && result.data.razorpaySubscriptionId) {
|
|
747
|
+
const { openRazorpaySubscriptionCheckout } = await import('@deiondz/better-auth-razorpay/hooks')
|
|
748
|
+
await openRazorpaySubscriptionCheckout({
|
|
749
|
+
key: process.env.NEXT_PUBLIC_RAZORPAY_KEY_ID!,
|
|
750
|
+
subscriptionId: result.data.razorpaySubscriptionId,
|
|
751
|
+
handler: async (res) => {
|
|
752
|
+
await authClient.razorpay.verifyPayment({
|
|
753
|
+
razorpay_payment_id: res.razorpay_payment_id,
|
|
754
|
+
razorpay_subscription_id: res.razorpay_subscription_id,
|
|
755
|
+
razorpay_signature: res.razorpay_signature,
|
|
756
|
+
})
|
|
757
|
+
},
|
|
758
|
+
})
|
|
759
|
+
}
|
|
760
|
+
// Or redirect: if (result.success && result.data.checkoutUrl) window.location.href = result.data.checkoutUrl
|
|
694
761
|
|
|
695
762
|
// Cancel, restore, verify payment
|
|
696
763
|
await authClient.razorpay.cancelSubscription({ subscriptionId: 'sub_xxx', immediately: false })
|
|
@@ -747,6 +814,8 @@ import {
|
|
|
747
814
|
useCreateOrUpdateSubscription,
|
|
748
815
|
useCancelSubscription,
|
|
749
816
|
useRestoreSubscription,
|
|
817
|
+
useVerifyPayment,
|
|
818
|
+
openRazorpaySubscriptionCheckout,
|
|
750
819
|
razorpayQueryKeys,
|
|
751
820
|
} from '@deiondz/better-auth-razorpay/hooks'
|
|
752
821
|
import type { CreateOrUpdateSubscriptionInput } from '@deiondz/better-auth-razorpay/hooks'
|
|
@@ -775,15 +844,31 @@ function SubscriptionUI() {
|
|
|
775
844
|
const { data: subscriptions, isLoading: subsLoading } = useSubscriptions()
|
|
776
845
|
|
|
777
846
|
const createOrUpdate = useCreateOrUpdateSubscription()
|
|
847
|
+
const verifyPayment = useVerifyPayment()
|
|
778
848
|
const cancel = useCancelSubscription()
|
|
779
849
|
const restore = useRestoreSubscription()
|
|
780
850
|
|
|
781
851
|
const handleSubscribe = () => {
|
|
782
852
|
createOrUpdate.mutate(
|
|
783
|
-
{ plan: 'Starter', annual: false },
|
|
853
|
+
{ plan: 'Starter', annual: false, embed: true }, // in-page modal, no redirect
|
|
784
854
|
{
|
|
785
|
-
onSuccess: (data) => {
|
|
786
|
-
|
|
855
|
+
onSuccess: async (data) => {
|
|
856
|
+
if (data.checkoutUrl) {
|
|
857
|
+
window.location.href = data.checkoutUrl // redirect flow
|
|
858
|
+
return
|
|
859
|
+
}
|
|
860
|
+
// In-page: open Razorpay modal on your site
|
|
861
|
+
await openRazorpaySubscriptionCheckout({
|
|
862
|
+
key: process.env.NEXT_PUBLIC_RAZORPAY_KEY_ID!,
|
|
863
|
+
subscriptionId: data.razorpaySubscriptionId,
|
|
864
|
+
handler: (res) => {
|
|
865
|
+
verifyPayment.mutate({
|
|
866
|
+
razorpay_payment_id: res.razorpay_payment_id,
|
|
867
|
+
razorpay_subscription_id: res.razorpay_subscription_id,
|
|
868
|
+
razorpay_signature: res.razorpay_signature,
|
|
869
|
+
})
|
|
870
|
+
},
|
|
871
|
+
})
|
|
787
872
|
},
|
|
788
873
|
}
|
|
789
874
|
)
|
|
@@ -826,7 +911,8 @@ function SubscriptionUI() {
|
|
|
826
911
|
|------|------|-------------|
|
|
827
912
|
| `usePlans(options?)` | `useQuery` | Fetches configured plans (GET `/razorpay/get-plans`). Requires `RazorpayAuthProvider` above in the tree. |
|
|
828
913
|
| `useSubscriptions(input?, options?)` | `useQuery` | Lists active/trialing subscriptions (GET `/razorpay/subscription/list`). Optional `referenceId` in input or options. Requires `RazorpayAuthProvider`. |
|
|
829
|
-
| `useCreateOrUpdateSubscription(options?)` | `useMutation` | Creates or updates subscription; returns `checkoutUrl`. Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
|
|
914
|
+
| `useCreateOrUpdateSubscription(options?)` | `useMutation` | Creates or updates subscription; with `embed: true` returns data for in-page modal (use `openRazorpaySubscriptionCheckout`); otherwise returns `checkoutUrl`. Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
|
|
915
|
+
| `useVerifyPayment(options?)` | `useMutation` | Verifies payment after Razorpay checkout success (in-page or redirect). Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
|
|
830
916
|
| `useCancelSubscription(options?)` | `useMutation` | Cancels by local subscription ID; optional `immediately`. Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
|
|
831
917
|
| `useRestoreSubscription(options?)` | `useMutation` | Restores a subscription scheduled to cancel. Invalidates subscriptions list on success. Requires `RazorpayAuthProvider`. |
|
|
832
918
|
|
|
@@ -840,6 +926,16 @@ razorpayQueryKeys.subscriptions() // ['razorpay', 'subscriptions', 'me']
|
|
|
840
926
|
razorpayQueryKeys.subscriptions('user-id') // ['razorpay', 'subscriptions', 'user-id']
|
|
841
927
|
```
|
|
842
928
|
|
|
929
|
+
### In-page checkout (no redirect)
|
|
930
|
+
|
|
931
|
+
To keep users on your site instead of redirecting to Razorpay’s hosted page:
|
|
932
|
+
|
|
933
|
+
1. Call `createOrUpdateSubscription` with **`embed: true`**. The API will not return `checkoutUrl`; it will return `razorpaySubscriptionId`.
|
|
934
|
+
2. Use **`openRazorpaySubscriptionCheckout`** from `@deiondz/better-auth-razorpay/hooks` with your Razorpay key ID and the returned `razorpaySubscriptionId`. This loads Razorpay Checkout.js and opens the payment form as a **modal on your page**.
|
|
935
|
+
3. In the `handler` callback, call **`verifyPayment`** with `razorpay_payment_id`, `razorpay_subscription_id`, and `razorpay_signature` to verify and persist the payment.
|
|
936
|
+
|
|
937
|
+
You can optionally call **`loadRazorpayCheckoutScript()`** earlier (e.g. on route load) so the script is ready when the user clicks Subscribe.
|
|
938
|
+
|
|
843
939
|
## Webhook Setup
|
|
844
940
|
|
|
845
941
|
### 1. Configure Webhook in Razorpay Dashboard
|
package/dist/client/hooks.d.ts
CHANGED
|
@@ -1,12 +1,86 @@
|
|
|
1
|
-
import { S as SubscriptionRecord } from '../types-
|
|
1
|
+
import { S as SubscriptionRecord } from '../types-VZW_XCzQ.js';
|
|
2
2
|
import * as _tanstack_react_query from '@tanstack/react-query';
|
|
3
3
|
import { UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';
|
|
4
4
|
import * as react from 'react';
|
|
5
5
|
import { ReactNode } from 'react';
|
|
6
|
-
import { c as RazorpayAuthClient, d as CancelSubscriptionResponse, a as CancelSubscriptionInput, e as CreateOrUpdateSubscriptionResponse, C as CreateOrUpdateSubscriptionInput, P as PlanSummary, f as RestoreSubscriptionResponse, b as RestoreSubscriptionInput, g as ListSubscriptionsResponse, h as VerifyPaymentResponse, V as VerifyPaymentInput, L as ListSubscriptionsInput } from '../types-
|
|
7
|
-
export { G as GetPlansResponse, i as RazorpayApiError, R as RazorpayApiResult, j as RazorpayClientActions } from '../types-
|
|
6
|
+
import { c as RazorpayAuthClient, d as CancelSubscriptionResponse, a as CancelSubscriptionInput, e as CreateOrUpdateSubscriptionResponse, C as CreateOrUpdateSubscriptionInput, P as PlanSummary, f as RestoreSubscriptionResponse, b as RestoreSubscriptionInput, g as ListSubscriptionsResponse, h as VerifyPaymentResponse, V as VerifyPaymentInput, L as ListSubscriptionsInput } from '../types-BGWv0IJy.js';
|
|
7
|
+
export { G as GetPlansResponse, i as RazorpayApiError, R as RazorpayApiResult, j as RazorpayClientActions } from '../types-BGWv0IJy.js';
|
|
8
8
|
import 'razorpay';
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* In-page Razorpay subscription checkout (modal on your site).
|
|
12
|
+
* Load the script once, then open the checkout with subscription_id from create-or-update (embed: true).
|
|
13
|
+
*/
|
|
14
|
+
declare global {
|
|
15
|
+
interface Window {
|
|
16
|
+
Razorpay?: new (options: RazorpayCheckoutOptions) => RazorpayCheckoutInstance;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Razorpay Checkout.js options for subscription (in-page modal). */
|
|
20
|
+
interface RazorpaySubscriptionCheckoutOptions {
|
|
21
|
+
/** Razorpay key ID (e.g. from NEXT_PUBLIC_RAZORPAY_KEY_ID). */
|
|
22
|
+
key: string;
|
|
23
|
+
/** Razorpay subscription ID (from create-or-update response when embed: true). */
|
|
24
|
+
subscriptionId: string;
|
|
25
|
+
/** Called when payment succeeds; verify signature with verify-payment API. */
|
|
26
|
+
handler: (response: RazorpayCheckoutSuccessPayload) => void;
|
|
27
|
+
/** Prefill name, email, contact. */
|
|
28
|
+
prefill?: {
|
|
29
|
+
name?: string;
|
|
30
|
+
email?: string;
|
|
31
|
+
contact?: string;
|
|
32
|
+
};
|
|
33
|
+
name?: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
image?: string;
|
|
36
|
+
theme?: {
|
|
37
|
+
color?: string;
|
|
38
|
+
};
|
|
39
|
+
/** Modal lifecycle (e.g. ondismiss when user closes without paying). */
|
|
40
|
+
modal?: {
|
|
41
|
+
ondismiss?: () => void;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Success payload from Razorpay Checkout (subscription). */
|
|
45
|
+
type RazorpayCheckoutSuccessPayload = {
|
|
46
|
+
razorpay_payment_id: string;
|
|
47
|
+
razorpay_subscription_id: string;
|
|
48
|
+
razorpay_signature: string;
|
|
49
|
+
};
|
|
50
|
+
interface RazorpayCheckoutOptions {
|
|
51
|
+
key: string;
|
|
52
|
+
subscription_id: string;
|
|
53
|
+
handler: (response: RazorpayCheckoutSuccessPayload) => void;
|
|
54
|
+
prefill?: {
|
|
55
|
+
name?: string;
|
|
56
|
+
email?: string;
|
|
57
|
+
contact?: string;
|
|
58
|
+
};
|
|
59
|
+
name?: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
image?: string;
|
|
62
|
+
theme?: {
|
|
63
|
+
color?: string;
|
|
64
|
+
};
|
|
65
|
+
modal?: {
|
|
66
|
+
ondismiss?: () => void;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
interface RazorpayCheckoutInstance {
|
|
70
|
+
open: () => void;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Load Razorpay Checkout.js script once. Call before openRazorpaySubscriptionCheckout
|
|
74
|
+
* or pass it as the first step in your flow.
|
|
75
|
+
*/
|
|
76
|
+
declare function loadRazorpayCheckoutScript(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Open Razorpay subscription checkout as a modal on the current page.
|
|
79
|
+
* Loads the Checkout script if needed. Use with create-or-update subscription with embed: true;
|
|
80
|
+
* pass the returned razorpaySubscriptionId.
|
|
81
|
+
*/
|
|
82
|
+
declare function openRazorpaySubscriptionCheckout(options: RazorpaySubscriptionCheckoutOptions): Promise<void>;
|
|
83
|
+
|
|
10
84
|
/** Context holding the Razorpay-capable auth client. Default is null. */
|
|
11
85
|
declare const RazorpayAuthContext: react.Context<RazorpayAuthClient | null>;
|
|
12
86
|
/** Provider that supplies the auth client to Razorpay hooks. Wrap your app once with client={authClient}. */
|
|
@@ -38,12 +112,13 @@ type UseSubscriptionsOptions = Omit<UseQueryOptions<ListSubscriptionsResponse['d
|
|
|
38
112
|
declare function useSubscriptions(input?: ListSubscriptionsInput, options?: UseSubscriptionsOptions): _tanstack_react_query.UseQueryResult<SubscriptionRecord[], Error>;
|
|
39
113
|
type UseCreateOrUpdateSubscriptionOptions = UseMutationOptions<CreateOrUpdateSubscriptionResponse['data'], Error, CreateOrUpdateSubscriptionInput, unknown>;
|
|
40
114
|
/**
|
|
41
|
-
* Create or update a subscription.
|
|
115
|
+
* Create or update a subscription. With embed: true returns data for in-page modal (no checkoutUrl);
|
|
116
|
+
* use openRazorpaySubscriptionCheckout with razorpaySubscriptionId. Without embed, returns checkoutUrl for redirect.
|
|
42
117
|
* Invalidates subscriptions list on success.
|
|
43
118
|
* Requires RazorpayAuthProvider above in the tree.
|
|
44
119
|
*/
|
|
45
120
|
declare function useCreateOrUpdateSubscription(options?: UseCreateOrUpdateSubscriptionOptions): _tanstack_react_query.UseMutationResult<{
|
|
46
|
-
checkoutUrl
|
|
121
|
+
checkoutUrl?: string | null;
|
|
47
122
|
subscriptionId: string;
|
|
48
123
|
razorpaySubscriptionId: string;
|
|
49
124
|
}, Error, CreateOrUpdateSubscriptionInput, unknown>;
|
|
@@ -84,4 +159,4 @@ declare function useVerifyPayment(options?: UseVerifyPaymentOptions): _tanstack_
|
|
|
84
159
|
subscription_id: string;
|
|
85
160
|
}, Error, VerifyPaymentInput, unknown>;
|
|
86
161
|
|
|
87
|
-
export { CancelSubscriptionInput, CancelSubscriptionResponse, CreateOrUpdateSubscriptionInput, CreateOrUpdateSubscriptionResponse, ListSubscriptionsInput, ListSubscriptionsResponse, PlanSummary, RazorpayAuthClient, RazorpayAuthContext, RazorpayAuthProvider, RestoreSubscriptionInput, RestoreSubscriptionResponse, type UseCancelSubscriptionOptions, type UseCreateOrUpdateSubscriptionOptions, type UsePlansOptions, type UseRestoreSubscriptionOptions, type UseSubscriptionsOptions, type UseVerifyPaymentOptions, VerifyPaymentInput, VerifyPaymentResponse, razorpayQueryKeys, useCancelSubscription, useCreateOrUpdateSubscription, usePlans, useRazorpayAuthClient, useRestoreSubscription, useSubscriptions, useVerifyPayment };
|
|
162
|
+
export { CancelSubscriptionInput, CancelSubscriptionResponse, CreateOrUpdateSubscriptionInput, CreateOrUpdateSubscriptionResponse, ListSubscriptionsInput, ListSubscriptionsResponse, PlanSummary, RazorpayAuthClient, RazorpayAuthContext, RazorpayAuthProvider, type RazorpaySubscriptionCheckoutOptions, RestoreSubscriptionInput, RestoreSubscriptionResponse, type UseCancelSubscriptionOptions, type UseCreateOrUpdateSubscriptionOptions, type UsePlansOptions, type UseRestoreSubscriptionOptions, type UseSubscriptionsOptions, type UseVerifyPaymentOptions, VerifyPaymentInput, VerifyPaymentResponse, loadRazorpayCheckoutScript, openRazorpaySubscriptionCheckout, razorpayQueryKeys, useCancelSubscription, useCreateOrUpdateSubscription, usePlans, useRazorpayAuthClient, useRestoreSubscription, useSubscriptions, useVerifyPayment };
|
package/dist/client/hooks.js
CHANGED
|
@@ -7,6 +7,56 @@ import {
|
|
|
7
7
|
useMutation,
|
|
8
8
|
useQueryClient
|
|
9
9
|
} from "@tanstack/react-query";
|
|
10
|
+
|
|
11
|
+
// client/checkout.ts
|
|
12
|
+
var CHECKOUT_SCRIPT_URL = "https://checkout.razorpay.com/v1/checkout.js";
|
|
13
|
+
var scriptLoadPromise = null;
|
|
14
|
+
function loadRazorpayCheckoutScript() {
|
|
15
|
+
if (typeof window === "undefined") {
|
|
16
|
+
return Promise.reject(new Error("Razorpay Checkout runs only in the browser"));
|
|
17
|
+
}
|
|
18
|
+
if (window.Razorpay) {
|
|
19
|
+
return Promise.resolve();
|
|
20
|
+
}
|
|
21
|
+
if (scriptLoadPromise) {
|
|
22
|
+
return scriptLoadPromise;
|
|
23
|
+
}
|
|
24
|
+
scriptLoadPromise = new Promise((resolve, reject) => {
|
|
25
|
+
const script = document.createElement("script");
|
|
26
|
+
script.src = CHECKOUT_SCRIPT_URL;
|
|
27
|
+
script.async = true;
|
|
28
|
+
script.onload = () => resolve();
|
|
29
|
+
script.onerror = () => {
|
|
30
|
+
scriptLoadPromise = null;
|
|
31
|
+
reject(new Error("Failed to load Razorpay Checkout script"));
|
|
32
|
+
};
|
|
33
|
+
document.head.appendChild(script);
|
|
34
|
+
});
|
|
35
|
+
return scriptLoadPromise;
|
|
36
|
+
}
|
|
37
|
+
async function openRazorpaySubscriptionCheckout(options) {
|
|
38
|
+
if (typeof window === "undefined") {
|
|
39
|
+
throw new Error("Razorpay Checkout runs only in the browser");
|
|
40
|
+
}
|
|
41
|
+
if (!window.Razorpay) {
|
|
42
|
+
await loadRazorpayCheckoutScript();
|
|
43
|
+
}
|
|
44
|
+
const Razorpay = window.Razorpay;
|
|
45
|
+
const rzp = new Razorpay({
|
|
46
|
+
key: options.key,
|
|
47
|
+
subscription_id: options.subscriptionId,
|
|
48
|
+
handler: options.handler,
|
|
49
|
+
prefill: options.prefill,
|
|
50
|
+
name: options.name,
|
|
51
|
+
description: options.description,
|
|
52
|
+
image: options.image,
|
|
53
|
+
theme: options.theme,
|
|
54
|
+
modal: options.modal
|
|
55
|
+
});
|
|
56
|
+
rzp.open();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// client/hooks.ts
|
|
10
60
|
var BASE = "/razorpay";
|
|
11
61
|
var RAZORPAY_NO_CLIENT_MESSAGE = "Razorpay hooks require wrapping your app with <RazorpayAuthProvider client={authClient}>.";
|
|
12
62
|
var RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE = "Razorpay hooks require a client created with razorpayClientPlugin() in createAuthClient({ plugins: [...] }).";
|
|
@@ -170,6 +220,8 @@ function useVerifyPayment(options) {
|
|
|
170
220
|
export {
|
|
171
221
|
RazorpayAuthContext,
|
|
172
222
|
RazorpayAuthProvider,
|
|
223
|
+
loadRazorpayCheckoutScript,
|
|
224
|
+
openRazorpaySubscriptionCheckout,
|
|
173
225
|
razorpayQueryKeys,
|
|
174
226
|
useCancelSubscription,
|
|
175
227
|
useCreateOrUpdateSubscription,
|
package/dist/client/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../client/hooks.ts"],"sourcesContent":["/**\r\n * React hooks for Razorpay subscription features using TanStack Query.\r\n * Wrap your app with <RazorpayAuthProvider client={authClient}> and use usePlans(), useSubscriptions(), etc. with no client argument.\r\n */\r\n\r\nimport { createContext, useContext, createElement, type ReactNode } from 'react'\r\nimport {\r\n useQuery,\r\n useMutation,\r\n useQueryClient,\r\n type UseQueryOptions,\r\n type UseMutationOptions,\r\n} from '@tanstack/react-query'\r\nimport type {\r\n RazorpayAuthClient,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n} from './types'\r\n\r\nconst BASE = '/razorpay'\r\n\r\nconst RAZORPAY_NO_CLIENT_MESSAGE =\r\n 'Razorpay hooks require wrapping your app with <RazorpayAuthProvider client={authClient}>.'\r\n\r\nconst RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE =\r\n 'Razorpay hooks require a client created with razorpayClientPlugin() in createAuthClient({ plugins: [...] }).'\r\n\r\n/** Context holding the Razorpay-capable auth client. Default is null. */\r\nexport const RazorpayAuthContext = createContext<RazorpayAuthClient | null>(null)\r\n\r\n/** Provider that supplies the auth client to Razorpay hooks. Wrap your app once with client={authClient}. */\r\nexport function RazorpayAuthProvider({\r\n client,\r\n children,\r\n}: {\r\n client: RazorpayAuthClient | null\r\n children: ReactNode\r\n}) {\r\n return createElement(RazorpayAuthContext.Provider, { value: client }, children)\r\n}\r\n\r\n/** Returns the Razorpay-capable auth client from context, or null if not wrapped with RazorpayAuthProvider. */\r\nexport function useRazorpayAuthClient(): RazorpayAuthClient | null {\r\n return useContext(RazorpayAuthContext)\r\n}\r\n\r\nfunction requireRazorpayOrApi(client: RazorpayAuthClient): void {\r\n if (!client.razorpay && !client.api) {\r\n throw new Error(RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE)\r\n }\r\n}\r\n\r\n/** Query keys for cache invalidation. */\r\nexport const razorpayQueryKeys = {\r\n all: ['razorpay'] as const,\r\n plans: () => [...razorpayQueryKeys.all, 'plans'] as const,\r\n subscriptions: (referenceId?: string) =>\r\n [...razorpayQueryKeys.all, 'subscriptions', referenceId ?? 'me'] as const,\r\n}\r\n\r\nfunction assertSuccess<T>(res: unknown): asserts res is { success: true; data: T } {\r\n if (res && typeof res === 'object' && 'success' in res) {\r\n if ((res as { success: boolean }).success) return\r\n const err = res as RazorpayApiError\r\n throw new Error(err.error?.description ?? err.error?.code ?? 'Request failed')\r\n }\r\n throw new Error('Invalid response')\r\n}\r\n\r\n/** Fetch plans (GET /razorpay/get-plans). Prefers client.razorpay when available to avoid 404s. */\r\nasync function fetchPlans(client: RazorpayAuthClient): Promise<PlanSummary[]> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.getPlans()\r\n : await client.api!.get(`${BASE}/get-plans`)\r\n assertSuccess<PlanSummary[]>(res)\r\n return res.data\r\n}\r\n\r\n/** Fetch subscriptions list (GET /razorpay/subscription/list). Prefers client.razorpay when available. */\r\nasync function fetchSubscriptions(\r\n client: RazorpayAuthClient,\r\n input?: ListSubscriptionsInput\r\n): Promise<ListSubscriptionsResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.listSubscriptions(input)\r\n : (() => {\r\n const query: Record<string, string> = {}\r\n if (input?.referenceId) query.referenceId = input.referenceId\r\n const path = `${BASE}/subscription/list`\r\n return Object.keys(query).length > 0\r\n ? client.api!.get(path, { query })\r\n : client.api!.get(path)\r\n })()\r\n assertSuccess<ListSubscriptionsResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Create or update subscription (POST /razorpay/subscription/create-or-update). Prefers client.razorpay when available. */\r\nasync function createOrUpdateSubscription(\r\n client: RazorpayAuthClient,\r\n input: CreateOrUpdateSubscriptionInput\r\n): Promise<CreateOrUpdateSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.createOrUpdateSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/create-or-update`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CreateOrUpdateSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Cancel subscription (POST /razorpay/subscription/cancel). Prefers client.razorpay when available. */\r\nasync function cancelSubscription(\r\n client: RazorpayAuthClient,\r\n input: CancelSubscriptionInput\r\n): Promise<CancelSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.cancelSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/cancel`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CancelSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Restore subscription (POST /razorpay/subscription/restore). Prefers client.razorpay when available. */\r\nasync function restoreSubscription(\r\n client: RazorpayAuthClient,\r\n input: RestoreSubscriptionInput\r\n): Promise<RestoreSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.restoreSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/restore`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<RestoreSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Verify payment (POST /razorpay/verify-payment). Prefers client.razorpay when available. */\r\nasync function verifyPayment(\r\n client: RazorpayAuthClient,\r\n input: VerifyPaymentInput\r\n): Promise<VerifyPaymentResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.verifyPayment(input)\r\n : await client.api!.post(`${BASE}/verify-payment`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<VerifyPaymentResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\nexport type UsePlansOptions = Omit<\r\n UseQueryOptions<PlanSummary[], Error, PlanSummary[], readonly string[]>,\r\n 'queryKey' | 'queryFn'\r\n>\r\n\r\n/**\r\n * Fetch configured subscription plans (no auth required).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function usePlans(options?: UsePlansOptions) {\r\n const client = useRazorpayAuthClient()\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.plans(),\r\n queryFn: () => fetchPlans(client!),\r\n enabled: !!client,\r\n ...options,\r\n })\r\n}\r\n\r\nexport type UseSubscriptionsOptions = Omit<\r\n UseQueryOptions<\r\n ListSubscriptionsResponse['data'],\r\n Error,\r\n ListSubscriptionsResponse['data'],\r\n readonly (string | undefined)[]\r\n >,\r\n 'queryKey' | 'queryFn'\r\n> & { referenceId?: string }\r\n\r\n/**\r\n * List active/trialing subscriptions for the current user (or referenceId).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useSubscriptions(\r\n input?: ListSubscriptionsInput,\r\n options?: UseSubscriptionsOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const { referenceId, ...queryOptions } = options ?? {}\r\n const refId = input?.referenceId ?? referenceId\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.subscriptions(refId),\r\n queryFn: () => fetchSubscriptions(client!, input),\r\n enabled: !!client,\r\n ...queryOptions,\r\n })\r\n}\r\n\r\nexport type UseCreateOrUpdateSubscriptionOptions = UseMutationOptions<\r\n CreateOrUpdateSubscriptionResponse['data'],\r\n Error,\r\n CreateOrUpdateSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Create or update a subscription. Returns checkoutUrl for Razorpay payment page.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCreateOrUpdateSubscription(\r\n options?: UseCreateOrUpdateSubscriptionOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CreateOrUpdateSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return createOrUpdateSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseCancelSubscriptionOptions = UseMutationOptions<\r\n CancelSubscriptionResponse['data'],\r\n Error,\r\n CancelSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Cancel a subscription by local subscription ID (at period end or immediately).\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCancelSubscription(options?: UseCancelSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CancelSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return cancelSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseRestoreSubscriptionOptions = UseMutationOptions<\r\n RestoreSubscriptionResponse['data'],\r\n Error,\r\n RestoreSubscriptionInput,\r\n unknown\r\n>\r\n\r\n// Re-export client types for convenience when importing from this entry\r\nexport type {\r\n RazorpayAuthClient,\r\n RazorpayClientActions,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n RazorpayApiResult,\r\n} from './types'\r\n\r\n/**\r\n * Restore a subscription that was scheduled to cancel at period end.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useRestoreSubscription(options?: UseRestoreSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: RestoreSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return restoreSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseVerifyPaymentOptions = UseMutationOptions<\r\n VerifyPaymentResponse['data'],\r\n Error,\r\n VerifyPaymentInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Verify payment signature after Razorpay checkout success.\r\n * Call with the payload from the Razorpay success handler (razorpay_payment_id, razorpay_subscription_id, razorpay_signature).\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useVerifyPayment(options?: UseVerifyPaymentOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: VerifyPaymentInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return verifyPayment(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../client/hooks.ts","../../client/checkout.ts"],"sourcesContent":["/**\r\n * React hooks for Razorpay subscription features using TanStack Query.\r\n * Wrap your app with <RazorpayAuthProvider client={authClient}> and use usePlans(), useSubscriptions(), etc. with no client argument.\r\n */\r\n\r\nimport { createContext, useContext, createElement, type ReactNode } from 'react'\r\nimport {\r\n useQuery,\r\n useMutation,\r\n useQueryClient,\r\n type UseQueryOptions,\r\n type UseMutationOptions,\r\n} from '@tanstack/react-query'\r\nimport type {\r\n RazorpayAuthClient,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n} from './types'\r\n\r\nconst BASE = '/razorpay'\r\n\r\nconst RAZORPAY_NO_CLIENT_MESSAGE =\r\n 'Razorpay hooks require wrapping your app with <RazorpayAuthProvider client={authClient}>.'\r\n\r\nconst RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE =\r\n 'Razorpay hooks require a client created with razorpayClientPlugin() in createAuthClient({ plugins: [...] }).'\r\n\r\n/** Context holding the Razorpay-capable auth client. Default is null. */\r\nexport const RazorpayAuthContext = createContext<RazorpayAuthClient | null>(null)\r\n\r\n/** Provider that supplies the auth client to Razorpay hooks. Wrap your app once with client={authClient}. */\r\nexport function RazorpayAuthProvider({\r\n client,\r\n children,\r\n}: {\r\n client: RazorpayAuthClient | null\r\n children: ReactNode\r\n}) {\r\n return createElement(RazorpayAuthContext.Provider, { value: client }, children)\r\n}\r\n\r\n/** Returns the Razorpay-capable auth client from context, or null if not wrapped with RazorpayAuthProvider. */\r\nexport function useRazorpayAuthClient(): RazorpayAuthClient | null {\r\n return useContext(RazorpayAuthContext)\r\n}\r\n\r\nfunction requireRazorpayOrApi(client: RazorpayAuthClient): void {\r\n if (!client.razorpay && !client.api) {\r\n throw new Error(RAZORPAY_NO_RAZORPAY_OR_API_MESSAGE)\r\n }\r\n}\r\n\r\n/** Query keys for cache invalidation. */\r\nexport const razorpayQueryKeys = {\r\n all: ['razorpay'] as const,\r\n plans: () => [...razorpayQueryKeys.all, 'plans'] as const,\r\n subscriptions: (referenceId?: string) =>\r\n [...razorpayQueryKeys.all, 'subscriptions', referenceId ?? 'me'] as const,\r\n}\r\n\r\nfunction assertSuccess<T>(res: unknown): asserts res is { success: true; data: T } {\r\n if (res && typeof res === 'object' && 'success' in res) {\r\n if ((res as { success: boolean }).success) return\r\n const err = res as RazorpayApiError\r\n throw new Error(err.error?.description ?? err.error?.code ?? 'Request failed')\r\n }\r\n throw new Error('Invalid response')\r\n}\r\n\r\n/** Fetch plans (GET /razorpay/get-plans). Prefers client.razorpay when available to avoid 404s. */\r\nasync function fetchPlans(client: RazorpayAuthClient): Promise<PlanSummary[]> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.getPlans()\r\n : await client.api!.get(`${BASE}/get-plans`)\r\n assertSuccess<PlanSummary[]>(res)\r\n return res.data\r\n}\r\n\r\n/** Fetch subscriptions list (GET /razorpay/subscription/list). Prefers client.razorpay when available. */\r\nasync function fetchSubscriptions(\r\n client: RazorpayAuthClient,\r\n input?: ListSubscriptionsInput\r\n): Promise<ListSubscriptionsResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.listSubscriptions(input)\r\n : (() => {\r\n const query: Record<string, string> = {}\r\n if (input?.referenceId) query.referenceId = input.referenceId\r\n const path = `${BASE}/subscription/list`\r\n return Object.keys(query).length > 0\r\n ? client.api!.get(path, { query })\r\n : client.api!.get(path)\r\n })()\r\n assertSuccess<ListSubscriptionsResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Create or update subscription (POST /razorpay/subscription/create-or-update). Prefers client.razorpay when available. */\r\nasync function createOrUpdateSubscription(\r\n client: RazorpayAuthClient,\r\n input: CreateOrUpdateSubscriptionInput\r\n): Promise<CreateOrUpdateSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.createOrUpdateSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/create-or-update`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CreateOrUpdateSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Cancel subscription (POST /razorpay/subscription/cancel). Prefers client.razorpay when available. */\r\nasync function cancelSubscription(\r\n client: RazorpayAuthClient,\r\n input: CancelSubscriptionInput\r\n): Promise<CancelSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.cancelSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/cancel`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<CancelSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Restore subscription (POST /razorpay/subscription/restore). Prefers client.razorpay when available. */\r\nasync function restoreSubscription(\r\n client: RazorpayAuthClient,\r\n input: RestoreSubscriptionInput\r\n): Promise<RestoreSubscriptionResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.restoreSubscription(input)\r\n : await client.api!.post(`${BASE}/subscription/restore`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<RestoreSubscriptionResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\n/** Verify payment (POST /razorpay/verify-payment). Prefers client.razorpay when available. */\r\nasync function verifyPayment(\r\n client: RazorpayAuthClient,\r\n input: VerifyPaymentInput\r\n): Promise<VerifyPaymentResponse['data']> {\r\n requireRazorpayOrApi(client)\r\n const res = client.razorpay\r\n ? await client.razorpay.verifyPayment(input)\r\n : await client.api!.post(`${BASE}/verify-payment`, {\r\n body: input as unknown as Record<string, unknown>,\r\n })\r\n assertSuccess<VerifyPaymentResponse['data']>(res)\r\n return res.data\r\n}\r\n\r\nexport type UsePlansOptions = Omit<\r\n UseQueryOptions<PlanSummary[], Error, PlanSummary[], readonly string[]>,\r\n 'queryKey' | 'queryFn'\r\n>\r\n\r\n/**\r\n * Fetch configured subscription plans (no auth required).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function usePlans(options?: UsePlansOptions) {\r\n const client = useRazorpayAuthClient()\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.plans(),\r\n queryFn: () => fetchPlans(client!),\r\n enabled: !!client,\r\n ...options,\r\n })\r\n}\r\n\r\nexport type UseSubscriptionsOptions = Omit<\r\n UseQueryOptions<\r\n ListSubscriptionsResponse['data'],\r\n Error,\r\n ListSubscriptionsResponse['data'],\r\n readonly (string | undefined)[]\r\n >,\r\n 'queryKey' | 'queryFn'\r\n> & { referenceId?: string }\r\n\r\n/**\r\n * List active/trialing subscriptions for the current user (or referenceId).\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useSubscriptions(\r\n input?: ListSubscriptionsInput,\r\n options?: UseSubscriptionsOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const { referenceId, ...queryOptions } = options ?? {}\r\n const refId = input?.referenceId ?? referenceId\r\n return useQuery({\r\n queryKey: razorpayQueryKeys.subscriptions(refId),\r\n queryFn: () => fetchSubscriptions(client!, input),\r\n enabled: !!client,\r\n ...queryOptions,\r\n })\r\n}\r\n\r\nexport type UseCreateOrUpdateSubscriptionOptions = UseMutationOptions<\r\n CreateOrUpdateSubscriptionResponse['data'],\r\n Error,\r\n CreateOrUpdateSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Create or update a subscription. With embed: true returns data for in-page modal (no checkoutUrl);\r\n * use openRazorpaySubscriptionCheckout with razorpaySubscriptionId. Without embed, returns checkoutUrl for redirect.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCreateOrUpdateSubscription(\r\n options?: UseCreateOrUpdateSubscriptionOptions\r\n) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CreateOrUpdateSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return createOrUpdateSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseCancelSubscriptionOptions = UseMutationOptions<\r\n CancelSubscriptionResponse['data'],\r\n Error,\r\n CancelSubscriptionInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Cancel a subscription by local subscription ID (at period end or immediately).\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useCancelSubscription(options?: UseCancelSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: CancelSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return cancelSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseRestoreSubscriptionOptions = UseMutationOptions<\r\n RestoreSubscriptionResponse['data'],\r\n Error,\r\n RestoreSubscriptionInput,\r\n unknown\r\n>\r\n\r\n// Re-export client types and in-page checkout helpers\r\nexport type {\r\n RazorpayAuthClient,\r\n RazorpayClientActions,\r\n PlanSummary,\r\n CreateOrUpdateSubscriptionInput,\r\n CancelSubscriptionInput,\r\n RestoreSubscriptionInput,\r\n ListSubscriptionsInput,\r\n VerifyPaymentInput,\r\n GetPlansResponse,\r\n ListSubscriptionsResponse,\r\n CreateOrUpdateSubscriptionResponse,\r\n CancelSubscriptionResponse,\r\n RestoreSubscriptionResponse,\r\n VerifyPaymentResponse,\r\n RazorpayApiError,\r\n RazorpayApiResult,\r\n} from './types'\r\nexport {\r\n loadRazorpayCheckoutScript,\r\n openRazorpaySubscriptionCheckout,\r\n type RazorpaySubscriptionCheckoutOptions,\r\n} from './checkout'\r\n\r\n/**\r\n * Restore a subscription that was scheduled to cancel at period end.\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useRestoreSubscription(options?: UseRestoreSubscriptionOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: RestoreSubscriptionInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return restoreSubscription(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n\r\nexport type UseVerifyPaymentOptions = UseMutationOptions<\r\n VerifyPaymentResponse['data'],\r\n Error,\r\n VerifyPaymentInput,\r\n unknown\r\n>\r\n\r\n/**\r\n * Verify payment signature after Razorpay checkout success.\r\n * Call with the payload from the Razorpay success handler (razorpay_payment_id, razorpay_subscription_id, razorpay_signature).\r\n * Invalidates subscriptions list on success.\r\n * Requires RazorpayAuthProvider above in the tree.\r\n */\r\nexport function useVerifyPayment(options?: UseVerifyPaymentOptions) {\r\n const client = useRazorpayAuthClient()\r\n const queryClient = useQueryClient()\r\n return useMutation({\r\n mutationFn: (input: VerifyPaymentInput) => {\r\n if (!client) throw new Error(RAZORPAY_NO_CLIENT_MESSAGE)\r\n return verifyPayment(client, input)\r\n },\r\n ...options,\r\n onSuccess: (data, variables, onMutateResult, context) => {\r\n queryClient.invalidateQueries({ queryKey: razorpayQueryKeys.subscriptions() })\r\n options?.onSuccess?.(data, variables, onMutateResult, context)\r\n },\r\n })\r\n}\r\n","/**\r\n * In-page Razorpay subscription checkout (modal on your site).\r\n * Load the script once, then open the checkout with subscription_id from create-or-update (embed: true).\r\n */\r\n\r\nconst CHECKOUT_SCRIPT_URL = 'https://checkout.razorpay.com/v1/checkout.js'\r\n\r\ndeclare global {\r\n interface Window {\r\n Razorpay?: new (options: RazorpayCheckoutOptions) => RazorpayCheckoutInstance\r\n }\r\n}\r\n\r\n/** Razorpay Checkout.js options for subscription (in-page modal). */\r\nexport interface RazorpaySubscriptionCheckoutOptions {\r\n /** Razorpay key ID (e.g. from NEXT_PUBLIC_RAZORPAY_KEY_ID). */\r\n key: string\r\n /** Razorpay subscription ID (from create-or-update response when embed: true). */\r\n subscriptionId: string\r\n /** Called when payment succeeds; verify signature with verify-payment API. */\r\n handler: (response: RazorpayCheckoutSuccessPayload) => void\r\n /** Prefill name, email, contact. */\r\n prefill?: { name?: string; email?: string; contact?: string }\r\n name?: string\r\n description?: string\r\n image?: string\r\n theme?: { color?: string }\r\n /** Modal lifecycle (e.g. ondismiss when user closes without paying). */\r\n modal?: { ondismiss?: () => void }\r\n}\r\n\r\n/** Success payload from Razorpay Checkout (subscription). */\r\nexport type RazorpayCheckoutSuccessPayload = {\r\n razorpay_payment_id: string\r\n razorpay_subscription_id: string\r\n razorpay_signature: string\r\n}\r\n\r\ninterface RazorpayCheckoutOptions {\r\n key: string\r\n subscription_id: string\r\n handler: (response: RazorpayCheckoutSuccessPayload) => void\r\n prefill?: { name?: string; email?: string; contact?: string }\r\n name?: string\r\n description?: string\r\n image?: string\r\n theme?: { color?: string }\r\n modal?: { ondismiss?: () => void }\r\n}\r\n\r\ninterface RazorpayCheckoutInstance {\r\n open: () => void\r\n}\r\n\r\nlet scriptLoadPromise: Promise<void> | null = null\r\n\r\n/**\r\n * Load Razorpay Checkout.js script once. Call before openRazorpaySubscriptionCheckout\r\n * or pass it as the first step in your flow.\r\n */\r\nexport function loadRazorpayCheckoutScript(): Promise<void> {\r\n if (typeof window === 'undefined') {\r\n return Promise.reject(new Error('Razorpay Checkout runs only in the browser'))\r\n }\r\n if (window.Razorpay) {\r\n return Promise.resolve()\r\n }\r\n if (scriptLoadPromise) {\r\n return scriptLoadPromise\r\n }\r\n scriptLoadPromise = new Promise((resolve, reject) => {\r\n const script = document.createElement('script')\r\n script.src = CHECKOUT_SCRIPT_URL\r\n script.async = true\r\n script.onload = () => resolve()\r\n script.onerror = () => {\r\n scriptLoadPromise = null\r\n reject(new Error('Failed to load Razorpay Checkout script'))\r\n }\r\n document.head.appendChild(script)\r\n })\r\n return scriptLoadPromise\r\n}\r\n\r\n/**\r\n * Open Razorpay subscription checkout as a modal on the current page.\r\n * Loads the Checkout script if needed. Use with create-or-update subscription with embed: true;\r\n * pass the returned razorpaySubscriptionId.\r\n */\r\nexport async function openRazorpaySubscriptionCheckout(\r\n options: RazorpaySubscriptionCheckoutOptions\r\n): Promise<void> {\r\n if (typeof window === 'undefined') {\r\n throw new Error('Razorpay Checkout runs only in the browser')\r\n }\r\n if (!window.Razorpay) {\r\n await loadRazorpayCheckoutScript()\r\n }\r\n const Razorpay = window.Razorpay!\r\n const rzp = new Razorpay({\r\n key: options.key,\r\n subscription_id: options.subscriptionId,\r\n handler: options.handler,\r\n prefill: options.prefill,\r\n name: options.name,\r\n description: options.description,\r\n image: options.image,\r\n theme: options.theme,\r\n modal: options.modal,\r\n })\r\n rzp.open()\r\n}\r\n"],"mappings":"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","names":[]}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { S as SubscriptionRecord } from './types-
|
|
1
|
+
import { S as SubscriptionRecord } from './types-VZW_XCzQ.js';
|
|
2
2
|
import { razorpayPlugin } from './index.js';
|
|
3
|
-
import { R as RazorpayApiResult, P as PlanSummary, L as ListSubscriptionsInput, C as CreateOrUpdateSubscriptionInput, a as CancelSubscriptionInput, b as RestoreSubscriptionInput, V as VerifyPaymentInput } from './types-
|
|
3
|
+
import { R as RazorpayApiResult, P as PlanSummary, L as ListSubscriptionsInput, C as CreateOrUpdateSubscriptionInput, a as CancelSubscriptionInput, b as RestoreSubscriptionInput, V as VerifyPaymentInput } from './types-BGWv0IJy.js';
|
|
4
4
|
import 'razorpay';
|
|
5
5
|
import 'better-auth';
|
|
6
6
|
|
|
@@ -23,7 +23,7 @@ declare const razorpayClientPlugin: () => {
|
|
|
23
23
|
getPlans: (fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<PlanSummary[]>>;
|
|
24
24
|
listSubscriptions: (input?: ListSubscriptionsInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<SubscriptionRecord[]>>;
|
|
25
25
|
createOrUpdateSubscription: (input: CreateOrUpdateSubscriptionInput, fetchOptions?: Parameters<FetchFn>[1]) => Promise<RazorpayApiResult<{
|
|
26
|
-
checkoutUrl
|
|
26
|
+
checkoutUrl?: string | null;
|
|
27
27
|
subscriptionId: string;
|
|
28
28
|
razorpaySubscriptionId: string;
|
|
29
29
|
}>>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BetterAuthPlugin } from 'better-auth';
|
|
2
|
-
import { R as RazorpayPluginOptions } from './types-
|
|
3
|
-
export { O as OnWebhookEventCallback, a as RazorpayApiResponse, b as RazorpayErrorResponse, c as RazorpayPlan, d as RazorpaySubscription, e as RazorpaySuccessResponse, f as RazorpayUserRecord, g as RazorpayWebhookContext, h as RazorpayWebhookEvent, i as RazorpayWebhookPayload, S as SubscriptionRecord, j as SubscriptionStatus } from './types-
|
|
2
|
+
import { R as RazorpayPluginOptions } from './types-VZW_XCzQ.js';
|
|
3
|
+
export { O as OnWebhookEventCallback, a as RazorpayApiResponse, b as RazorpayErrorResponse, c as RazorpayPlan, d as RazorpaySubscription, e as RazorpaySuccessResponse, f as RazorpayUserRecord, g as RazorpayWebhookContext, h as RazorpayWebhookEvent, i as RazorpayWebhookPayload, S as SubscriptionRecord, j as SubscriptionStatus } from './types-VZW_XCzQ.js';
|
|
4
4
|
import 'razorpay';
|
|
5
5
|
|
|
6
6
|
interface WebhookResult {
|
|
@@ -18,9 +18,10 @@ interface WebhookResult {
|
|
|
18
18
|
* - Plans: named plans with monthly/annual IDs, limits, free trial
|
|
19
19
|
*
|
|
20
20
|
* @param options - Plugin configuration
|
|
21
|
-
* @param options.razorpayClient - Initialized Razorpay instance (
|
|
21
|
+
* @param options.razorpayClient - Initialized Razorpay instance (optional; omit when using razorpayKeyId + razorpayKeySecret)
|
|
22
|
+
* @param options.razorpayKeyId - Razorpay API key ID (required when razorpayClient is not provided; plugin creates the Razorpay instance)
|
|
23
|
+
* @param options.razorpayKeySecret - Razorpay API key secret (required when razorpayClient is not provided; when set, also enables POST /razorpay/verify-payment)
|
|
22
24
|
* @param options.razorpayWebhookSecret - Webhook secret for signature verification
|
|
23
|
-
* @param options.razorpayKeySecret - API key secret for payment signature verification (optional; when set, enables POST /razorpay/verify-payment)
|
|
24
25
|
* @param options.createCustomerOnSignUp - Create Razorpay customer when user signs up (default: false)
|
|
25
26
|
* @param options.onCustomerCreate - Callback after customer is created
|
|
26
27
|
* @param options.getCustomerCreateParams - Custom params when creating customer
|