@neocleus/razorpay-firebase-functions 1.0.4 → 1.0.5
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/lib/handlers/payments.js +37 -47
- package/lib/handlers/payments.js.map +1 -1
- package/lib/handlers/subscriptions.js +19 -35
- package/lib/handlers/subscriptions.js.map +1 -1
- package/lib/utils/typedFirestore.d.ts +4 -0
- package/lib/utils/typedFirestore.js +12 -0
- package/lib/utils/typedFirestore.js.map +1 -1
- package/package.json +1 -1
package/lib/handlers/payments.js
CHANGED
|
@@ -10,7 +10,6 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
|
|
|
10
10
|
const webhookPaymentId = event.payload.payment?.entity?.id || event.payload.payment?.id;
|
|
11
11
|
const webhookOrderId = event.payload.order?.entity?.id || event.payload.order?.id;
|
|
12
12
|
if (!webhookPaymentId && !webhookOrderId) {
|
|
13
|
-
logs_1.logs.error(new Error(`Missing both payment and order IDs in webhook payload: ${event.id}`));
|
|
14
13
|
return;
|
|
15
14
|
}
|
|
16
15
|
let fetchedPayment = null;
|
|
@@ -33,21 +32,11 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
|
|
|
33
32
|
}
|
|
34
33
|
}
|
|
35
34
|
catch (err) {
|
|
36
|
-
logs_1.logs.error(new Error(`
|
|
37
|
-
if ((0, retry_1.isTransientError)(err))
|
|
35
|
+
logs_1.logs.error(new Error(`API Fetch Failed. Event: ${event.event}. Error: ${err.message}`));
|
|
36
|
+
if ((0, retry_1.isTransientError)(err))
|
|
38
37
|
throw err;
|
|
39
|
-
}
|
|
40
38
|
return;
|
|
41
39
|
}
|
|
42
|
-
// Fetch associated order if this is a payment event and we need fallback values
|
|
43
|
-
if (isPayment && fetchedPayment && fetchedPayment.order_id) {
|
|
44
|
-
try {
|
|
45
|
-
fetchedOrder = await (0, retry_1.fetchWithBackoff)(() => razorpayClient.orders.fetch(fetchedPayment.order_id));
|
|
46
|
-
}
|
|
47
|
-
catch (orderErr) {
|
|
48
|
-
logs_1.logs.error(new Error(`Failed to fetch associated order ${fetchedPayment.order_id} for payment: ${orderErr.message}`));
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
40
|
const notes = fetchedPayment?.notes || fetchedOrder?.notes;
|
|
52
41
|
const sessionId = notes?.sessionId ? String(notes.sessionId) : undefined;
|
|
53
42
|
let uid;
|
|
@@ -59,20 +48,35 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
|
|
|
59
48
|
if (mappedUid) {
|
|
60
49
|
uid = mappedUid;
|
|
61
50
|
}
|
|
62
|
-
else {
|
|
63
|
-
logs_1.logs.info(`Razorpay Customer ID ${customerId} not mapped to a Firebase UID. Will fall back to notes.`);
|
|
64
|
-
}
|
|
65
51
|
}
|
|
66
|
-
// Fallback: use uid from payment/order notes if customerId mapping was not found or not present
|
|
67
52
|
if (!uid && notes?.uid) {
|
|
68
|
-
uid = String(notes.uid);
|
|
53
|
+
uid = String(notes.uid); // Fallback to notes
|
|
69
54
|
}
|
|
70
55
|
if (!uid) {
|
|
71
|
-
logs_1.logs.error(new Error(`Cannot resolve UID for event ${event.event}
|
|
56
|
+
logs_1.logs.error(new Error(`Cannot resolve UID for event ${event.event}.`));
|
|
72
57
|
return;
|
|
73
58
|
}
|
|
59
|
+
const typedFs = new typedFirestore_1.TypedFirestore(db, config);
|
|
60
|
+
// ========================================================================
|
|
61
|
+
// PART 1: THE STRIPE APPROACH ("Dumb" Mirroring)
|
|
62
|
+
// Always write the raw entity to a dedicated collection so Firestore
|
|
63
|
+
// exactly matches Razorpay, regardless of overlapping events.
|
|
64
|
+
// ========================================================================
|
|
65
|
+
const batch = db.batch();
|
|
66
|
+
if (fetchedPayment) {
|
|
67
|
+
const paymentRef = typedFs.getCustomerPaymentDoc(uid, fetchedPayment.id);
|
|
68
|
+
batch.set(paymentRef, fetchedPayment, { merge: true });
|
|
69
|
+
}
|
|
70
|
+
if (fetchedOrder) {
|
|
71
|
+
const orderRef = typedFs.getCustomerOrderDoc(uid, fetchedOrder.id);
|
|
72
|
+
batch.set(orderRef, fetchedOrder, { merge: true });
|
|
73
|
+
}
|
|
74
|
+
await batch.commit();
|
|
75
|
+
// --- SMART SEGREGATION ---
|
|
76
|
+
// If there is no sessionId, this is NOT a one-time checkout session.
|
|
77
|
+
// It is likely a subscription payment/order. We exit gracefully without throwing an error.
|
|
74
78
|
if (!sessionId) {
|
|
75
|
-
logs_1.logs.
|
|
79
|
+
logs_1.logs.info(`Skipping ${event.event} - No sessionId in notes. Likely a Subscription event.`);
|
|
76
80
|
return;
|
|
77
81
|
}
|
|
78
82
|
let newStatus = 'processing';
|
|
@@ -81,37 +85,29 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
|
|
|
81
85
|
newStatus = 'paid';
|
|
82
86
|
else if (fetchedPayment.status === 'failed')
|
|
83
87
|
newStatus = 'failed';
|
|
84
|
-
else
|
|
85
|
-
newStatus = 'processing';
|
|
86
88
|
}
|
|
87
89
|
else if (fetchedOrder) {
|
|
88
90
|
if (fetchedOrder.status === 'paid')
|
|
89
91
|
newStatus = 'paid';
|
|
90
|
-
else
|
|
91
|
-
newStatus = 'processing';
|
|
92
92
|
}
|
|
93
|
-
const typedFs = new typedFirestore_1.TypedFirestore(db, config);
|
|
94
93
|
const docRef = typedFs.getCheckoutSessionDoc(uid, sessionId);
|
|
95
94
|
const orderDocRef = typedFs.getCheckoutSessionOrderDoc(uid, sessionId);
|
|
96
95
|
let existingData;
|
|
96
|
+
let hasStatusChanged = false; // Tracks if we actually moved forward
|
|
97
97
|
try {
|
|
98
98
|
await db.runTransaction(async (tx) => {
|
|
99
99
|
const snap = await tx.get(docRef);
|
|
100
100
|
if (!snap.exists) {
|
|
101
|
-
logs_1.logs.error(new Error(`Checkout session
|
|
101
|
+
logs_1.logs.error(new Error(`Checkout session missing. Possible notes injection.`));
|
|
102
102
|
return;
|
|
103
103
|
}
|
|
104
104
|
existingData = snap.data();
|
|
105
|
-
|
|
105
|
+
hasStatusChanged = existingData?.status !== newStatus;
|
|
106
|
+
// --- TRUST BUT VERIFY (SECURITY) ---
|
|
106
107
|
const orderSnap = await tx.get(orderDocRef);
|
|
107
|
-
if (!orderSnap.exists) {
|
|
108
|
-
logs_1.logs.error(new Error(`Order details missing for session ${sessionId}. Possible notes injection.`));
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const orderData = orderSnap.data();
|
|
112
108
|
const expectedOrderId = isPayment && fetchedPayment ? fetchedPayment.order_id : fetchedOrder.id;
|
|
113
|
-
if (!
|
|
114
|
-
logs_1.logs.error(new Error(`Order ID
|
|
109
|
+
if (!orderSnap.exists || orderSnap.data()?.id !== expectedOrderId) {
|
|
110
|
+
logs_1.logs.error(new Error(`Order ID Mismatch! Possible Notes Injection attempt.`));
|
|
115
111
|
return;
|
|
116
112
|
}
|
|
117
113
|
const dataToWrite = {
|
|
@@ -121,29 +117,23 @@ const handlePaymentEvent = async (event, db, razorpayClient, config) => {
|
|
|
121
117
|
if (existingData?.processing_at) {
|
|
122
118
|
dataToWrite.processing_at = firestore_1.FieldValue.delete();
|
|
123
119
|
}
|
|
124
|
-
// Update status and timestamp on the main document
|
|
125
120
|
tx.set(docRef, dataToWrite, { merge: true });
|
|
126
|
-
// Store raw Razorpay responses in separate subcollection documents
|
|
127
121
|
if (isPayment && fetchedPayment) {
|
|
128
|
-
|
|
129
|
-
tx.set(paymentDocRef, fetchedPayment);
|
|
122
|
+
tx.set(typedFs.getCheckoutSessionPaymentDoc(uid, sessionId), fetchedPayment);
|
|
130
123
|
}
|
|
131
124
|
else if (fetchedOrder) {
|
|
132
125
|
tx.set(orderDocRef, fetchedOrder);
|
|
133
126
|
}
|
|
134
127
|
});
|
|
135
|
-
//
|
|
136
|
-
if
|
|
128
|
+
// --- IDEMPOTENT CALLBACK ---
|
|
129
|
+
// Only trigger the user's custom logic if the database state ACTUALLY changed.
|
|
130
|
+
if (hasStatusChanged && config.onCheckoutSessionUpdate && existingData) {
|
|
137
131
|
try {
|
|
138
|
-
const updatedSession = {
|
|
139
|
-
...existingData,
|
|
140
|
-
status: newStatus,
|
|
141
|
-
updated_at: firestore_1.FieldValue.serverTimestamp(),
|
|
142
|
-
};
|
|
132
|
+
const updatedSession = { ...existingData, status: newStatus, updated_at: firestore_1.FieldValue.serverTimestamp() };
|
|
143
133
|
await config.onCheckoutSessionUpdate(uid, updatedSession, fetchedPayment || undefined);
|
|
144
134
|
}
|
|
145
|
-
catch (
|
|
146
|
-
logs_1.logs.error(new Error(`
|
|
135
|
+
catch (err) {
|
|
136
|
+
logs_1.logs.error(new Error(`onCheckoutSessionUpdate error: ${err.message}`));
|
|
147
137
|
}
|
|
148
138
|
}
|
|
149
139
|
logs_1.logs.webhookProcessed(event.event, fetchedPayment?.id || fetchedOrder?.id || '');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/handlers/payments.ts"],"names":[],"mappings":";;;AAAA,wDAAsD;AAKtD,kCAA+B;AAE/B,0CAAoE;AACpE,8DAA8D;AAC9D,4DAAyD;AAElD,MAAM,kBAAkB,GAAG,KAAK,EACnC,KAAmB,EACnB,EAA6B,EAC7B,cAA6C,EAC7C,MAA0B,EAC5B,EAAE;IACA,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACxF,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAElF,IAAI,CAAC,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,
|
|
1
|
+
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/handlers/payments.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,57 +8,48 @@ const customerMapping_1 = require("../utils/customerMapping");
|
|
|
8
8
|
const typedFirestore_1 = require("../utils/typedFirestore");
|
|
9
9
|
const handleSubscriptionEvent = async (event, db, razorpayClient, config) => {
|
|
10
10
|
const webhookSubscription = event.payload.subscription?.entity;
|
|
11
|
-
if (!webhookSubscription?.id)
|
|
12
|
-
logs_1.logs.error(new Error(`Missing subscription entity or ID in webhook payload: ${event.id}`));
|
|
11
|
+
if (!webhookSubscription?.id)
|
|
13
12
|
return;
|
|
14
|
-
}
|
|
15
13
|
let subscriptionEntity;
|
|
16
14
|
try {
|
|
17
15
|
subscriptionEntity = await (0, retry_1.fetchWithBackoff)(() => razorpayClient.subscriptions.fetch(webhookSubscription.id));
|
|
18
16
|
}
|
|
19
17
|
catch (err) {
|
|
20
|
-
|
|
21
|
-
if ((0, retry_1.isTransientError)(err)) {
|
|
18
|
+
if ((0, retry_1.isTransientError)(err))
|
|
22
19
|
throw err;
|
|
23
|
-
}
|
|
24
20
|
return;
|
|
25
21
|
}
|
|
26
22
|
const customerId = subscriptionEntity.customer_id;
|
|
27
|
-
if (!customerId)
|
|
28
|
-
logs_1.logs.error(new Error(`No customer_id found on subscription ${subscriptionEntity.id}. Cannot resolve UID.`));
|
|
23
|
+
if (!customerId)
|
|
29
24
|
return;
|
|
30
|
-
}
|
|
31
25
|
const uid = await (0, customerMapping_1.getUidByCustomerId)(customerId, config.customersCollection);
|
|
32
|
-
if (!uid)
|
|
33
|
-
logs_1.logs.error(new Error(`No Firebase UID found mapped to Razorpay Customer ID ${customerId} for subscription ${subscriptionEntity.id}`));
|
|
26
|
+
if (!uid)
|
|
34
27
|
return;
|
|
35
|
-
}
|
|
36
28
|
const newStatus = String(subscriptionEntity.status);
|
|
37
29
|
const subscriptionId = subscriptionEntity.id;
|
|
38
30
|
const typedFs = new typedFirestore_1.TypedFirestore(db, config);
|
|
39
31
|
const docRef = typedFs.getSubscriptionDoc(uid, subscriptionId);
|
|
40
32
|
let paymentEntity = null;
|
|
41
|
-
const webhookPayment = event.payload.payment?.entity ||
|
|
33
|
+
const webhookPayment = event.payload.payment?.entity || event.payload.payment;
|
|
42
34
|
if (webhookPayment?.id) {
|
|
43
35
|
try {
|
|
44
36
|
paymentEntity = await (0, retry_1.fetchWithBackoff)(() => razorpayClient.payments.fetch(webhookPayment.id));
|
|
45
37
|
}
|
|
46
38
|
catch (err) {
|
|
47
|
-
|
|
48
|
-
if ((0, retry_1.isTransientError)(err)) {
|
|
39
|
+
if ((0, retry_1.isTransientError)(err))
|
|
49
40
|
throw err;
|
|
50
|
-
}
|
|
51
41
|
}
|
|
52
42
|
}
|
|
53
43
|
let existingData;
|
|
44
|
+
let hasStatusChanged = false; // Tracks if we actually moved forward
|
|
54
45
|
try {
|
|
55
46
|
await db.runTransaction(async (tx) => {
|
|
56
47
|
const existingDoc = await tx.get(docRef);
|
|
57
|
-
if (!existingDoc.exists)
|
|
58
|
-
logs_1.logs.error(new Error(`Subscription document does not exist in Firestore for ID: ${subscriptionId}. Rejecting webhook event.`));
|
|
48
|
+
if (!existingDoc.exists)
|
|
59
49
|
return;
|
|
60
|
-
}
|
|
61
50
|
existingData = existingDoc.data();
|
|
51
|
+
// --- IDEMPOTENCY CHECK ---
|
|
52
|
+
hasStatusChanged = existingData?.status !== newStatus;
|
|
62
53
|
const dataToWrite = {
|
|
63
54
|
status: newStatus,
|
|
64
55
|
updated_at: firestore_1.FieldValue.serverTimestamp(),
|
|
@@ -66,29 +57,22 @@ const handleSubscriptionEvent = async (event, db, razorpayClient, config) => {
|
|
|
66
57
|
if (existingData?.processing_at) {
|
|
67
58
|
dataToWrite.processing_at = firestore_1.FieldValue.delete();
|
|
68
59
|
}
|
|
69
|
-
// Update status and timestamp on the main document
|
|
70
60
|
tx.set(docRef, dataToWrite, { merge: true });
|
|
71
|
-
|
|
72
|
-
const detailsDocRef = typedFs.getSubscriptionDetailsDoc(uid, subscriptionId);
|
|
73
|
-
tx.set(detailsDocRef, subscriptionEntity);
|
|
74
|
-
// Store the raw payment entity directly in the payments subcollection
|
|
61
|
+
tx.set(typedFs.getSubscriptionDetailsDoc(uid, subscriptionId), subscriptionEntity);
|
|
75
62
|
if (paymentEntity) {
|
|
76
|
-
|
|
77
|
-
|
|
63
|
+
tx.set(typedFs.getSubscriptionPaymentDoc(uid, subscriptionId, paymentEntity.id), paymentEntity);
|
|
64
|
+
// Dumb Sync to global customer payments collection
|
|
65
|
+
tx.set(typedFs.getCustomerPaymentDoc(uid, paymentEntity.id), paymentEntity, { merge: true });
|
|
78
66
|
}
|
|
79
67
|
});
|
|
80
|
-
//
|
|
81
|
-
if (config.onSubscriptionUpdate && existingData) {
|
|
68
|
+
// --- IDEMPOTENT CALLBACK ---
|
|
69
|
+
if (hasStatusChanged && config.onSubscriptionUpdate && existingData) {
|
|
82
70
|
try {
|
|
83
|
-
const updatedSubscription = {
|
|
84
|
-
...existingData,
|
|
85
|
-
status: newStatus,
|
|
86
|
-
updated_at: firestore_1.FieldValue.serverTimestamp(),
|
|
87
|
-
};
|
|
71
|
+
const updatedSubscription = { ...existingData, status: newStatus, updated_at: firestore_1.FieldValue.serverTimestamp() };
|
|
88
72
|
await config.onSubscriptionUpdate(uid, updatedSubscription, subscriptionEntity);
|
|
89
73
|
}
|
|
90
|
-
catch (
|
|
91
|
-
logs_1.logs.error(new Error(`
|
|
74
|
+
catch (err) {
|
|
75
|
+
logs_1.logs.error(new Error(`onSubscriptionUpdate error: ${err.message}`));
|
|
92
76
|
}
|
|
93
77
|
}
|
|
94
78
|
logs_1.logs.webhookProcessed(event.event, subscriptionEntity.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/handlers/subscriptions.ts"],"names":[],"mappings":";;;AAAA,wDAAsD;AAKtD,kCAA+B;AAE/B,0CAAoE;AACpE,8DAA8D;AAC9D,4DAAyD;AAElD,MAAM,uBAAuB,GAAG,KAAK,EACxC,KAAmB,EACnB,EAA6B,EAC7B,cAA6C,EAC7C,MAA0B,EAC5B,EAAE;IACA,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;IAE/D,IAAI,CAAC,mBAAmB,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/handlers/subscriptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,10 @@ export declare class TypedFirestore {
|
|
|
22
22
|
getSubscriptionDetailsDoc(uid: string, subscriptionId: string): admin.firestore.DocumentReference<Subscriptions.RazorpaySubscription, admin.firestore.DocumentData>;
|
|
23
23
|
getSubscriptionPaymentsCollection(uid: string, subscriptionId: string): admin.firestore.CollectionReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
|
|
24
24
|
getSubscriptionPaymentDoc(uid: string, subscriptionId: string, paymentId: string): admin.firestore.DocumentReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
|
|
25
|
+
getCustomerPaymentsCollection(uid: string): admin.firestore.CollectionReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
|
|
26
|
+
getCustomerPaymentDoc(uid: string, paymentId: string): admin.firestore.DocumentReference<Payments.RazorpayPayment, admin.firestore.DocumentData>;
|
|
27
|
+
getCustomerOrdersCollection(uid: string): admin.firestore.CollectionReference<Orders.RazorpayOrder, admin.firestore.DocumentData>;
|
|
28
|
+
getCustomerOrderDoc(uid: string, orderId: string): admin.firestore.DocumentReference<Orders.RazorpayOrder, admin.firestore.DocumentData>;
|
|
25
29
|
getWebhookEventsCollection(): admin.firestore.CollectionReference<WebhookEventDoc, admin.firestore.DocumentData>;
|
|
26
30
|
getWebhookEventDoc(eventId: string): admin.firestore.DocumentReference<WebhookEventDoc, admin.firestore.DocumentData>;
|
|
27
31
|
}
|
|
@@ -72,6 +72,18 @@ class TypedFirestore {
|
|
|
72
72
|
getSubscriptionPaymentDoc(uid, subscriptionId, paymentId) {
|
|
73
73
|
return this.getSubscriptionPaymentsCollection(uid, subscriptionId).doc(paymentId);
|
|
74
74
|
}
|
|
75
|
+
getCustomerPaymentsCollection(uid) {
|
|
76
|
+
return this.getCustomerDoc(uid).collection('payments').withConverter(converter());
|
|
77
|
+
}
|
|
78
|
+
getCustomerPaymentDoc(uid, paymentId) {
|
|
79
|
+
return this.getCustomerPaymentsCollection(uid).doc(paymentId);
|
|
80
|
+
}
|
|
81
|
+
getCustomerOrdersCollection(uid) {
|
|
82
|
+
return this.getCustomerDoc(uid).collection('orders').withConverter(converter());
|
|
83
|
+
}
|
|
84
|
+
getCustomerOrderDoc(uid, orderId) {
|
|
85
|
+
return this.getCustomerOrdersCollection(uid).doc(orderId);
|
|
86
|
+
}
|
|
75
87
|
getWebhookEventsCollection() {
|
|
76
88
|
return this.db.collection('webhook_events').withConverter(converter());
|
|
77
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typedFirestore.js","sourceRoot":"","sources":["../../src/utils/typedFirestore.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"typedFirestore.js","sourceRoot":"","sources":["../../src/utils/typedFirestore.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neocleus/razorpay-firebase-functions",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "Consumable Firebase Cloud Functions for Razorpay payments and subscriptions integration using the Factory pattern",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|