@paykit-sdk/medusajs 1.0.0 → 1.0.2
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 +2 -2
- package/dist/index.js +130 -31
- package/dist/index.mjs +131 -32
- package/dist/providers/paykit-provider.js +130 -31
- package/dist/providers/paykit-provider.mjs +131 -32
- package/package.json +5 -6
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Universal payment provider adapter for Medusa v2+ using PayKit. Compatible with
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install @paykit-sdk/medusajs
|
|
8
|
+
npm install @paykit-sdk/medusajs
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Install your provider
|
|
@@ -25,7 +25,7 @@ import { createStripe } from '@paykit-sdk/stripe';
|
|
|
25
25
|
export default defineConfig({
|
|
26
26
|
modules: [
|
|
27
27
|
{
|
|
28
|
-
resolve: '@paykit-sdk/
|
|
28
|
+
resolve: '@paykit-sdk/medusajs',
|
|
29
29
|
options: {
|
|
30
30
|
provider: createStripe({ apiKey: process.env.STRIPE_API_KEY }),
|
|
31
31
|
webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,
|
package/dist/index.js
CHANGED
|
@@ -83,14 +83,20 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
83
83
|
data
|
|
84
84
|
}) => {
|
|
85
85
|
if (this.options.debug) {
|
|
86
|
-
console.info("[PayKit] Initiating payment", {
|
|
86
|
+
console.info("[PayKit] Initiating payment", {
|
|
87
|
+
context,
|
|
88
|
+
amount,
|
|
89
|
+
currency_code,
|
|
90
|
+
data
|
|
91
|
+
});
|
|
87
92
|
}
|
|
88
93
|
const intent = {
|
|
89
|
-
status: "pending",
|
|
90
94
|
amount: Number(amount),
|
|
91
95
|
currency: currency_code,
|
|
92
|
-
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ??
|
|
93
|
-
provider_metadata: data?.provider_metadata
|
|
96
|
+
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ?? null },
|
|
97
|
+
provider_metadata: data?.provider_metadata,
|
|
98
|
+
capture_method: "manual",
|
|
99
|
+
item_id: data?.item_id
|
|
94
100
|
};
|
|
95
101
|
let customer;
|
|
96
102
|
if (context?.account_holder?.data?.id) {
|
|
@@ -99,7 +105,10 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
99
105
|
customer = { email: data.email };
|
|
100
106
|
}
|
|
101
107
|
if (!customer) {
|
|
102
|
-
throw new utils.MedusaError(
|
|
108
|
+
throw new utils.MedusaError(
|
|
109
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
110
|
+
"Required: customer ID (account_holder) or email (data)"
|
|
111
|
+
);
|
|
103
112
|
}
|
|
104
113
|
if (typeof customer === "object" && "email" in customer) {
|
|
105
114
|
await core.tryCatchAsync(
|
|
@@ -107,7 +116,9 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
107
116
|
email: customer.email,
|
|
108
117
|
phone: data?.phone ?? "",
|
|
109
118
|
name: data?.name ? data.name : customer.email.split("@")[0],
|
|
110
|
-
metadata: {
|
|
119
|
+
metadata: {
|
|
120
|
+
PAYKIT_METADATA_KEY: JSON.stringify({ source: "medusa-paykit-adapter" })
|
|
121
|
+
}
|
|
111
122
|
})
|
|
112
123
|
);
|
|
113
124
|
} else {
|
|
@@ -117,9 +128,25 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
117
128
|
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
118
129
|
this.paykit.payments.create(intent)
|
|
119
130
|
);
|
|
120
|
-
if (paymentIntentError)
|
|
121
|
-
throw new utils.MedusaError(
|
|
122
|
-
|
|
131
|
+
if (paymentIntentError) {
|
|
132
|
+
throw new utils.MedusaError(
|
|
133
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
134
|
+
paymentIntentError.message
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
if (paymentIntentResult.requires_action && paymentIntentResult.payment_url) {
|
|
138
|
+
return {
|
|
139
|
+
id: paymentIntentResult.id,
|
|
140
|
+
status: utils.PaymentSessionStatus.REQUIRES_MORE,
|
|
141
|
+
data: {
|
|
142
|
+
payment_url: paymentIntentResult.payment_url
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
id: paymentIntentResult.id,
|
|
148
|
+
status: medusaStatus$InboundSchema(paymentIntentResult.status)
|
|
149
|
+
};
|
|
123
150
|
};
|
|
124
151
|
capturePayment = async (input) => {
|
|
125
152
|
if (this.options.debug) {
|
|
@@ -130,13 +157,24 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
130
157
|
input?.data ?? {},
|
|
131
158
|
"Missing required payment ID"
|
|
132
159
|
);
|
|
133
|
-
if (!id)
|
|
134
|
-
|
|
160
|
+
if (!id)
|
|
161
|
+
throw new utils.MedusaError(
|
|
162
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
163
|
+
"Missing required payment ID"
|
|
164
|
+
);
|
|
165
|
+
if (!amount)
|
|
166
|
+
throw new utils.MedusaError(
|
|
167
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
168
|
+
"Missing required payment amount"
|
|
169
|
+
);
|
|
135
170
|
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
136
171
|
this.paykit.payments.capture(id, { amount: Number(amount) })
|
|
137
172
|
);
|
|
138
173
|
if (paymentIntentError)
|
|
139
|
-
throw new utils.MedusaError(
|
|
174
|
+
throw new utils.MedusaError(
|
|
175
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
176
|
+
paymentIntentError.message
|
|
177
|
+
);
|
|
140
178
|
return { data: paymentIntentResult };
|
|
141
179
|
};
|
|
142
180
|
authorizePayment = async (input) => {
|
|
@@ -154,10 +192,19 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
154
192
|
input?.data ?? {},
|
|
155
193
|
"Missing required payment ID"
|
|
156
194
|
);
|
|
157
|
-
if (!id)
|
|
158
|
-
|
|
195
|
+
if (!id)
|
|
196
|
+
throw new utils.MedusaError(
|
|
197
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
198
|
+
"Missing required payment ID"
|
|
199
|
+
);
|
|
200
|
+
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
201
|
+
this.paykit.payments.cancel(id)
|
|
202
|
+
);
|
|
159
203
|
if (paymentIntentError)
|
|
160
|
-
throw new utils.MedusaError(
|
|
204
|
+
throw new utils.MedusaError(
|
|
205
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
206
|
+
paymentIntentError.message
|
|
207
|
+
);
|
|
161
208
|
return { data: paymentIntentResult };
|
|
162
209
|
};
|
|
163
210
|
deletePayment = async (input) => {
|
|
@@ -169,11 +216,24 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
169
216
|
input?.data ?? {},
|
|
170
217
|
"Missing required payment ID"
|
|
171
218
|
);
|
|
172
|
-
if (!id)
|
|
173
|
-
|
|
219
|
+
if (!id)
|
|
220
|
+
throw new utils.MedusaError(
|
|
221
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
222
|
+
"Missing required payment ID"
|
|
223
|
+
);
|
|
224
|
+
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
225
|
+
this.paykit.payments.retrieve(id)
|
|
226
|
+
);
|
|
174
227
|
if (paymentIntentError)
|
|
175
|
-
throw new utils.MedusaError(
|
|
176
|
-
|
|
228
|
+
throw new utils.MedusaError(
|
|
229
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
230
|
+
paymentIntentError.message
|
|
231
|
+
);
|
|
232
|
+
if (!paymentIntentResult)
|
|
233
|
+
throw new utils.MedusaError(
|
|
234
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
235
|
+
"Payment not found"
|
|
236
|
+
);
|
|
177
237
|
return {
|
|
178
238
|
status: medusaStatus$InboundSchema(paymentIntentResult.status),
|
|
179
239
|
data: paymentIntentResult
|
|
@@ -188,7 +248,11 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
188
248
|
input?.data ?? {},
|
|
189
249
|
"Missing required payment ID"
|
|
190
250
|
);
|
|
191
|
-
if (!paymentId)
|
|
251
|
+
if (!paymentId)
|
|
252
|
+
throw new utils.MedusaError(
|
|
253
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
254
|
+
"Missing required payment ID"
|
|
255
|
+
);
|
|
192
256
|
const [refundResult, refundError] = await core.tryCatchAsync(
|
|
193
257
|
this.paykit.refunds.create({
|
|
194
258
|
payment_id: paymentId,
|
|
@@ -198,7 +262,11 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
198
262
|
provider_metadata: input.data?.provider_metadata ? input.data.provider_metadata : void 0
|
|
199
263
|
})
|
|
200
264
|
);
|
|
201
|
-
if (refundError)
|
|
265
|
+
if (refundError)
|
|
266
|
+
throw new utils.MedusaError(
|
|
267
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
268
|
+
refundError.message
|
|
269
|
+
);
|
|
202
270
|
return { data: refundResult };
|
|
203
271
|
};
|
|
204
272
|
retrievePayment = async (input) => {
|
|
@@ -210,10 +278,19 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
210
278
|
input?.data ?? {},
|
|
211
279
|
"Missing required payment ID"
|
|
212
280
|
);
|
|
213
|
-
if (!id)
|
|
214
|
-
|
|
281
|
+
if (!id)
|
|
282
|
+
throw new utils.MedusaError(
|
|
283
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
284
|
+
"Missing required payment ID"
|
|
285
|
+
);
|
|
286
|
+
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
287
|
+
this.paykit.payments.retrieve(id)
|
|
288
|
+
);
|
|
215
289
|
if (paymentIntentError)
|
|
216
|
-
throw new utils.MedusaError(
|
|
290
|
+
throw new utils.MedusaError(
|
|
291
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
292
|
+
paymentIntentError.message
|
|
293
|
+
);
|
|
217
294
|
return { data: paymentIntentResult };
|
|
218
295
|
};
|
|
219
296
|
updatePayment = async (input) => {
|
|
@@ -226,13 +303,20 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
226
303
|
"Missing required payment ID"
|
|
227
304
|
);
|
|
228
305
|
if (!amount || !currency_code)
|
|
229
|
-
throw new utils.MedusaError(
|
|
306
|
+
throw new utils.MedusaError(
|
|
307
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
308
|
+
"Missing required amount or currency code"
|
|
309
|
+
);
|
|
230
310
|
const { id: paymentId } = core.validateRequiredKeys(
|
|
231
311
|
["id"],
|
|
232
312
|
input.data,
|
|
233
313
|
"Missing required payment ID"
|
|
234
314
|
);
|
|
235
|
-
if (!paymentId)
|
|
315
|
+
if (!paymentId)
|
|
316
|
+
throw new utils.MedusaError(
|
|
317
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
318
|
+
"Missing required payment ID"
|
|
319
|
+
);
|
|
236
320
|
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
237
321
|
this.paykit.payments.update(paymentId, {
|
|
238
322
|
amount: Number(amount),
|
|
@@ -242,7 +326,10 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
242
326
|
})
|
|
243
327
|
);
|
|
244
328
|
if (paymentIntentError)
|
|
245
|
-
throw new utils.MedusaError(
|
|
329
|
+
throw new utils.MedusaError(
|
|
330
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
331
|
+
paymentIntentError.message
|
|
332
|
+
);
|
|
246
333
|
return { data: paymentIntentResult };
|
|
247
334
|
};
|
|
248
335
|
getWebhookActionAndData = async (payload) => {
|
|
@@ -271,7 +358,10 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
271
358
|
const webhook = this.paykit.webhooks.setup({ webhookSecret: this.options.webhookSecret }).on("payment.created", async (event) => {
|
|
272
359
|
return {
|
|
273
360
|
action: utils.PaymentActions.PENDING,
|
|
274
|
-
data: {
|
|
361
|
+
data: {
|
|
362
|
+
session_id: event.data?.metadata?.session_id,
|
|
363
|
+
amount: event.data?.amount
|
|
364
|
+
}
|
|
275
365
|
};
|
|
276
366
|
}).on("payment.updated", async (event) => {
|
|
277
367
|
const statusActionMap = {
|
|
@@ -285,17 +375,26 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
285
375
|
};
|
|
286
376
|
return {
|
|
287
377
|
action: event.data?.status ? statusActionMap[event.data.status] : utils.PaymentActions.PENDING,
|
|
288
|
-
data: {
|
|
378
|
+
data: {
|
|
379
|
+
session_id: event.data?.metadata?.session_id,
|
|
380
|
+
amount: event.data?.amount
|
|
381
|
+
}
|
|
289
382
|
};
|
|
290
383
|
}).on("payment.canceled", async (event) => {
|
|
291
384
|
return {
|
|
292
385
|
action: utils.PaymentActions.CANCELED,
|
|
293
|
-
data: {
|
|
386
|
+
data: {
|
|
387
|
+
session_id: event.data?.metadata?.session_id,
|
|
388
|
+
amount: event.data?.amount
|
|
389
|
+
}
|
|
294
390
|
};
|
|
295
391
|
});
|
|
392
|
+
const stringifiedHeaders = Object.fromEntries(
|
|
393
|
+
Object.entries(headers).map(([key, value]) => [key, String(value)])
|
|
394
|
+
);
|
|
296
395
|
const webhookEvents = await webhook.handle({
|
|
297
396
|
body: rawData,
|
|
298
|
-
headers,
|
|
397
|
+
headers: new Headers(stringifiedHeaders),
|
|
299
398
|
fullUrl
|
|
300
399
|
});
|
|
301
400
|
return webhookEvents;
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ModuleProvider, Modules, AbstractPaymentProvider, MedusaError,
|
|
1
|
+
import { ModuleProvider, Modules, AbstractPaymentProvider, MedusaError, PaymentSessionStatus, PaymentActions } from '@medusajs/framework/utils';
|
|
2
2
|
import { providerSchema, PayKit, tryCatchAsync, validateRequiredKeys } from '@paykit-sdk/core';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
|
|
@@ -79,14 +79,20 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
79
79
|
data
|
|
80
80
|
}) => {
|
|
81
81
|
if (this.options.debug) {
|
|
82
|
-
console.info("[PayKit] Initiating payment", {
|
|
82
|
+
console.info("[PayKit] Initiating payment", {
|
|
83
|
+
context,
|
|
84
|
+
amount,
|
|
85
|
+
currency_code,
|
|
86
|
+
data
|
|
87
|
+
});
|
|
83
88
|
}
|
|
84
89
|
const intent = {
|
|
85
|
-
status: "pending",
|
|
86
90
|
amount: Number(amount),
|
|
87
91
|
currency: currency_code,
|
|
88
|
-
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ??
|
|
89
|
-
provider_metadata: data?.provider_metadata
|
|
92
|
+
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ?? null },
|
|
93
|
+
provider_metadata: data?.provider_metadata,
|
|
94
|
+
capture_method: "manual",
|
|
95
|
+
item_id: data?.item_id
|
|
90
96
|
};
|
|
91
97
|
let customer;
|
|
92
98
|
if (context?.account_holder?.data?.id) {
|
|
@@ -95,7 +101,10 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
95
101
|
customer = { email: data.email };
|
|
96
102
|
}
|
|
97
103
|
if (!customer) {
|
|
98
|
-
throw new MedusaError(
|
|
104
|
+
throw new MedusaError(
|
|
105
|
+
MedusaError.Types.INVALID_DATA,
|
|
106
|
+
"Required: customer ID (account_holder) or email (data)"
|
|
107
|
+
);
|
|
99
108
|
}
|
|
100
109
|
if (typeof customer === "object" && "email" in customer) {
|
|
101
110
|
await tryCatchAsync(
|
|
@@ -103,7 +112,9 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
103
112
|
email: customer.email,
|
|
104
113
|
phone: data?.phone ?? "",
|
|
105
114
|
name: data?.name ? data.name : customer.email.split("@")[0],
|
|
106
|
-
metadata: {
|
|
115
|
+
metadata: {
|
|
116
|
+
PAYKIT_METADATA_KEY: JSON.stringify({ source: "medusa-paykit-adapter" })
|
|
117
|
+
}
|
|
107
118
|
})
|
|
108
119
|
);
|
|
109
120
|
} else {
|
|
@@ -113,9 +124,25 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
113
124
|
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
114
125
|
this.paykit.payments.create(intent)
|
|
115
126
|
);
|
|
116
|
-
if (paymentIntentError)
|
|
117
|
-
throw new MedusaError(
|
|
118
|
-
|
|
127
|
+
if (paymentIntentError) {
|
|
128
|
+
throw new MedusaError(
|
|
129
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
130
|
+
paymentIntentError.message
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
if (paymentIntentResult.requires_action && paymentIntentResult.payment_url) {
|
|
134
|
+
return {
|
|
135
|
+
id: paymentIntentResult.id,
|
|
136
|
+
status: PaymentSessionStatus.REQUIRES_MORE,
|
|
137
|
+
data: {
|
|
138
|
+
payment_url: paymentIntentResult.payment_url
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
id: paymentIntentResult.id,
|
|
144
|
+
status: medusaStatus$InboundSchema(paymentIntentResult.status)
|
|
145
|
+
};
|
|
119
146
|
};
|
|
120
147
|
capturePayment = async (input) => {
|
|
121
148
|
if (this.options.debug) {
|
|
@@ -126,13 +153,24 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
126
153
|
input?.data ?? {},
|
|
127
154
|
"Missing required payment ID"
|
|
128
155
|
);
|
|
129
|
-
if (!id)
|
|
130
|
-
|
|
156
|
+
if (!id)
|
|
157
|
+
throw new MedusaError(
|
|
158
|
+
MedusaError.Types.INVALID_DATA,
|
|
159
|
+
"Missing required payment ID"
|
|
160
|
+
);
|
|
161
|
+
if (!amount)
|
|
162
|
+
throw new MedusaError(
|
|
163
|
+
MedusaError.Types.INVALID_DATA,
|
|
164
|
+
"Missing required payment amount"
|
|
165
|
+
);
|
|
131
166
|
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
132
167
|
this.paykit.payments.capture(id, { amount: Number(amount) })
|
|
133
168
|
);
|
|
134
169
|
if (paymentIntentError)
|
|
135
|
-
throw new MedusaError(
|
|
170
|
+
throw new MedusaError(
|
|
171
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
172
|
+
paymentIntentError.message
|
|
173
|
+
);
|
|
136
174
|
return { data: paymentIntentResult };
|
|
137
175
|
};
|
|
138
176
|
authorizePayment = async (input) => {
|
|
@@ -150,10 +188,19 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
150
188
|
input?.data ?? {},
|
|
151
189
|
"Missing required payment ID"
|
|
152
190
|
);
|
|
153
|
-
if (!id)
|
|
154
|
-
|
|
191
|
+
if (!id)
|
|
192
|
+
throw new MedusaError(
|
|
193
|
+
MedusaError.Types.INVALID_DATA,
|
|
194
|
+
"Missing required payment ID"
|
|
195
|
+
);
|
|
196
|
+
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
197
|
+
this.paykit.payments.cancel(id)
|
|
198
|
+
);
|
|
155
199
|
if (paymentIntentError)
|
|
156
|
-
throw new MedusaError(
|
|
200
|
+
throw new MedusaError(
|
|
201
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
202
|
+
paymentIntentError.message
|
|
203
|
+
);
|
|
157
204
|
return { data: paymentIntentResult };
|
|
158
205
|
};
|
|
159
206
|
deletePayment = async (input) => {
|
|
@@ -165,11 +212,24 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
165
212
|
input?.data ?? {},
|
|
166
213
|
"Missing required payment ID"
|
|
167
214
|
);
|
|
168
|
-
if (!id)
|
|
169
|
-
|
|
215
|
+
if (!id)
|
|
216
|
+
throw new MedusaError(
|
|
217
|
+
MedusaError.Types.INVALID_DATA,
|
|
218
|
+
"Missing required payment ID"
|
|
219
|
+
);
|
|
220
|
+
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
221
|
+
this.paykit.payments.retrieve(id)
|
|
222
|
+
);
|
|
170
223
|
if (paymentIntentError)
|
|
171
|
-
throw new MedusaError(
|
|
172
|
-
|
|
224
|
+
throw new MedusaError(
|
|
225
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
226
|
+
paymentIntentError.message
|
|
227
|
+
);
|
|
228
|
+
if (!paymentIntentResult)
|
|
229
|
+
throw new MedusaError(
|
|
230
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
231
|
+
"Payment not found"
|
|
232
|
+
);
|
|
173
233
|
return {
|
|
174
234
|
status: medusaStatus$InboundSchema(paymentIntentResult.status),
|
|
175
235
|
data: paymentIntentResult
|
|
@@ -184,7 +244,11 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
184
244
|
input?.data ?? {},
|
|
185
245
|
"Missing required payment ID"
|
|
186
246
|
);
|
|
187
|
-
if (!paymentId)
|
|
247
|
+
if (!paymentId)
|
|
248
|
+
throw new MedusaError(
|
|
249
|
+
MedusaError.Types.INVALID_DATA,
|
|
250
|
+
"Missing required payment ID"
|
|
251
|
+
);
|
|
188
252
|
const [refundResult, refundError] = await tryCatchAsync(
|
|
189
253
|
this.paykit.refunds.create({
|
|
190
254
|
payment_id: paymentId,
|
|
@@ -194,7 +258,11 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
194
258
|
provider_metadata: input.data?.provider_metadata ? input.data.provider_metadata : void 0
|
|
195
259
|
})
|
|
196
260
|
);
|
|
197
|
-
if (refundError)
|
|
261
|
+
if (refundError)
|
|
262
|
+
throw new MedusaError(
|
|
263
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
264
|
+
refundError.message
|
|
265
|
+
);
|
|
198
266
|
return { data: refundResult };
|
|
199
267
|
};
|
|
200
268
|
retrievePayment = async (input) => {
|
|
@@ -206,10 +274,19 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
206
274
|
input?.data ?? {},
|
|
207
275
|
"Missing required payment ID"
|
|
208
276
|
);
|
|
209
|
-
if (!id)
|
|
210
|
-
|
|
277
|
+
if (!id)
|
|
278
|
+
throw new MedusaError(
|
|
279
|
+
MedusaError.Types.INVALID_DATA,
|
|
280
|
+
"Missing required payment ID"
|
|
281
|
+
);
|
|
282
|
+
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
283
|
+
this.paykit.payments.retrieve(id)
|
|
284
|
+
);
|
|
211
285
|
if (paymentIntentError)
|
|
212
|
-
throw new MedusaError(
|
|
286
|
+
throw new MedusaError(
|
|
287
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
288
|
+
paymentIntentError.message
|
|
289
|
+
);
|
|
213
290
|
return { data: paymentIntentResult };
|
|
214
291
|
};
|
|
215
292
|
updatePayment = async (input) => {
|
|
@@ -222,13 +299,20 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
222
299
|
"Missing required payment ID"
|
|
223
300
|
);
|
|
224
301
|
if (!amount || !currency_code)
|
|
225
|
-
throw new MedusaError(
|
|
302
|
+
throw new MedusaError(
|
|
303
|
+
MedusaError.Types.INVALID_DATA,
|
|
304
|
+
"Missing required amount or currency code"
|
|
305
|
+
);
|
|
226
306
|
const { id: paymentId } = validateRequiredKeys(
|
|
227
307
|
["id"],
|
|
228
308
|
input.data,
|
|
229
309
|
"Missing required payment ID"
|
|
230
310
|
);
|
|
231
|
-
if (!paymentId)
|
|
311
|
+
if (!paymentId)
|
|
312
|
+
throw new MedusaError(
|
|
313
|
+
MedusaError.Types.INVALID_DATA,
|
|
314
|
+
"Missing required payment ID"
|
|
315
|
+
);
|
|
232
316
|
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
233
317
|
this.paykit.payments.update(paymentId, {
|
|
234
318
|
amount: Number(amount),
|
|
@@ -238,7 +322,10 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
238
322
|
})
|
|
239
323
|
);
|
|
240
324
|
if (paymentIntentError)
|
|
241
|
-
throw new MedusaError(
|
|
325
|
+
throw new MedusaError(
|
|
326
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
327
|
+
paymentIntentError.message
|
|
328
|
+
);
|
|
242
329
|
return { data: paymentIntentResult };
|
|
243
330
|
};
|
|
244
331
|
getWebhookActionAndData = async (payload) => {
|
|
@@ -267,7 +354,10 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
267
354
|
const webhook = this.paykit.webhooks.setup({ webhookSecret: this.options.webhookSecret }).on("payment.created", async (event) => {
|
|
268
355
|
return {
|
|
269
356
|
action: PaymentActions.PENDING,
|
|
270
|
-
data: {
|
|
357
|
+
data: {
|
|
358
|
+
session_id: event.data?.metadata?.session_id,
|
|
359
|
+
amount: event.data?.amount
|
|
360
|
+
}
|
|
271
361
|
};
|
|
272
362
|
}).on("payment.updated", async (event) => {
|
|
273
363
|
const statusActionMap = {
|
|
@@ -281,17 +371,26 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
281
371
|
};
|
|
282
372
|
return {
|
|
283
373
|
action: event.data?.status ? statusActionMap[event.data.status] : PaymentActions.PENDING,
|
|
284
|
-
data: {
|
|
374
|
+
data: {
|
|
375
|
+
session_id: event.data?.metadata?.session_id,
|
|
376
|
+
amount: event.data?.amount
|
|
377
|
+
}
|
|
285
378
|
};
|
|
286
379
|
}).on("payment.canceled", async (event) => {
|
|
287
380
|
return {
|
|
288
381
|
action: PaymentActions.CANCELED,
|
|
289
|
-
data: {
|
|
382
|
+
data: {
|
|
383
|
+
session_id: event.data?.metadata?.session_id,
|
|
384
|
+
amount: event.data?.amount
|
|
385
|
+
}
|
|
290
386
|
};
|
|
291
387
|
});
|
|
388
|
+
const stringifiedHeaders = Object.fromEntries(
|
|
389
|
+
Object.entries(headers).map(([key, value]) => [key, String(value)])
|
|
390
|
+
);
|
|
292
391
|
const webhookEvents = await webhook.handle({
|
|
293
392
|
body: rawData,
|
|
294
|
-
headers,
|
|
393
|
+
headers: new Headers(stringifiedHeaders),
|
|
295
394
|
fullUrl
|
|
296
395
|
});
|
|
297
396
|
return webhookEvents;
|
|
@@ -81,14 +81,20 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
81
81
|
data
|
|
82
82
|
}) => {
|
|
83
83
|
if (this.options.debug) {
|
|
84
|
-
console.info("[PayKit] Initiating payment", {
|
|
84
|
+
console.info("[PayKit] Initiating payment", {
|
|
85
|
+
context,
|
|
86
|
+
amount,
|
|
87
|
+
currency_code,
|
|
88
|
+
data
|
|
89
|
+
});
|
|
85
90
|
}
|
|
86
91
|
const intent = {
|
|
87
|
-
status: "pending",
|
|
88
92
|
amount: Number(amount),
|
|
89
93
|
currency: currency_code,
|
|
90
|
-
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ??
|
|
91
|
-
provider_metadata: data?.provider_metadata
|
|
94
|
+
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ?? null },
|
|
95
|
+
provider_metadata: data?.provider_metadata,
|
|
96
|
+
capture_method: "manual",
|
|
97
|
+
item_id: data?.item_id
|
|
92
98
|
};
|
|
93
99
|
let customer;
|
|
94
100
|
if (context?.account_holder?.data?.id) {
|
|
@@ -97,7 +103,10 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
97
103
|
customer = { email: data.email };
|
|
98
104
|
}
|
|
99
105
|
if (!customer) {
|
|
100
|
-
throw new utils.MedusaError(
|
|
106
|
+
throw new utils.MedusaError(
|
|
107
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
108
|
+
"Required: customer ID (account_holder) or email (data)"
|
|
109
|
+
);
|
|
101
110
|
}
|
|
102
111
|
if (typeof customer === "object" && "email" in customer) {
|
|
103
112
|
await core.tryCatchAsync(
|
|
@@ -105,7 +114,9 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
105
114
|
email: customer.email,
|
|
106
115
|
phone: data?.phone ?? "",
|
|
107
116
|
name: data?.name ? data.name : customer.email.split("@")[0],
|
|
108
|
-
metadata: {
|
|
117
|
+
metadata: {
|
|
118
|
+
PAYKIT_METADATA_KEY: JSON.stringify({ source: "medusa-paykit-adapter" })
|
|
119
|
+
}
|
|
109
120
|
})
|
|
110
121
|
);
|
|
111
122
|
} else {
|
|
@@ -115,9 +126,25 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
115
126
|
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
116
127
|
this.paykit.payments.create(intent)
|
|
117
128
|
);
|
|
118
|
-
if (paymentIntentError)
|
|
119
|
-
throw new utils.MedusaError(
|
|
120
|
-
|
|
129
|
+
if (paymentIntentError) {
|
|
130
|
+
throw new utils.MedusaError(
|
|
131
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
132
|
+
paymentIntentError.message
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
if (paymentIntentResult.requires_action && paymentIntentResult.payment_url) {
|
|
136
|
+
return {
|
|
137
|
+
id: paymentIntentResult.id,
|
|
138
|
+
status: utils.PaymentSessionStatus.REQUIRES_MORE,
|
|
139
|
+
data: {
|
|
140
|
+
payment_url: paymentIntentResult.payment_url
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
id: paymentIntentResult.id,
|
|
146
|
+
status: medusaStatus$InboundSchema(paymentIntentResult.status)
|
|
147
|
+
};
|
|
121
148
|
};
|
|
122
149
|
capturePayment = async (input) => {
|
|
123
150
|
if (this.options.debug) {
|
|
@@ -128,13 +155,24 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
128
155
|
input?.data ?? {},
|
|
129
156
|
"Missing required payment ID"
|
|
130
157
|
);
|
|
131
|
-
if (!id)
|
|
132
|
-
|
|
158
|
+
if (!id)
|
|
159
|
+
throw new utils.MedusaError(
|
|
160
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
161
|
+
"Missing required payment ID"
|
|
162
|
+
);
|
|
163
|
+
if (!amount)
|
|
164
|
+
throw new utils.MedusaError(
|
|
165
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
166
|
+
"Missing required payment amount"
|
|
167
|
+
);
|
|
133
168
|
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
134
169
|
this.paykit.payments.capture(id, { amount: Number(amount) })
|
|
135
170
|
);
|
|
136
171
|
if (paymentIntentError)
|
|
137
|
-
throw new utils.MedusaError(
|
|
172
|
+
throw new utils.MedusaError(
|
|
173
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
174
|
+
paymentIntentError.message
|
|
175
|
+
);
|
|
138
176
|
return { data: paymentIntentResult };
|
|
139
177
|
};
|
|
140
178
|
authorizePayment = async (input) => {
|
|
@@ -152,10 +190,19 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
152
190
|
input?.data ?? {},
|
|
153
191
|
"Missing required payment ID"
|
|
154
192
|
);
|
|
155
|
-
if (!id)
|
|
156
|
-
|
|
193
|
+
if (!id)
|
|
194
|
+
throw new utils.MedusaError(
|
|
195
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
196
|
+
"Missing required payment ID"
|
|
197
|
+
);
|
|
198
|
+
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
199
|
+
this.paykit.payments.cancel(id)
|
|
200
|
+
);
|
|
157
201
|
if (paymentIntentError)
|
|
158
|
-
throw new utils.MedusaError(
|
|
202
|
+
throw new utils.MedusaError(
|
|
203
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
204
|
+
paymentIntentError.message
|
|
205
|
+
);
|
|
159
206
|
return { data: paymentIntentResult };
|
|
160
207
|
};
|
|
161
208
|
deletePayment = async (input) => {
|
|
@@ -167,11 +214,24 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
167
214
|
input?.data ?? {},
|
|
168
215
|
"Missing required payment ID"
|
|
169
216
|
);
|
|
170
|
-
if (!id)
|
|
171
|
-
|
|
217
|
+
if (!id)
|
|
218
|
+
throw new utils.MedusaError(
|
|
219
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
220
|
+
"Missing required payment ID"
|
|
221
|
+
);
|
|
222
|
+
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
223
|
+
this.paykit.payments.retrieve(id)
|
|
224
|
+
);
|
|
172
225
|
if (paymentIntentError)
|
|
173
|
-
throw new utils.MedusaError(
|
|
174
|
-
|
|
226
|
+
throw new utils.MedusaError(
|
|
227
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
228
|
+
paymentIntentError.message
|
|
229
|
+
);
|
|
230
|
+
if (!paymentIntentResult)
|
|
231
|
+
throw new utils.MedusaError(
|
|
232
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
233
|
+
"Payment not found"
|
|
234
|
+
);
|
|
175
235
|
return {
|
|
176
236
|
status: medusaStatus$InboundSchema(paymentIntentResult.status),
|
|
177
237
|
data: paymentIntentResult
|
|
@@ -186,7 +246,11 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
186
246
|
input?.data ?? {},
|
|
187
247
|
"Missing required payment ID"
|
|
188
248
|
);
|
|
189
|
-
if (!paymentId)
|
|
249
|
+
if (!paymentId)
|
|
250
|
+
throw new utils.MedusaError(
|
|
251
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
252
|
+
"Missing required payment ID"
|
|
253
|
+
);
|
|
190
254
|
const [refundResult, refundError] = await core.tryCatchAsync(
|
|
191
255
|
this.paykit.refunds.create({
|
|
192
256
|
payment_id: paymentId,
|
|
@@ -196,7 +260,11 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
196
260
|
provider_metadata: input.data?.provider_metadata ? input.data.provider_metadata : void 0
|
|
197
261
|
})
|
|
198
262
|
);
|
|
199
|
-
if (refundError)
|
|
263
|
+
if (refundError)
|
|
264
|
+
throw new utils.MedusaError(
|
|
265
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
266
|
+
refundError.message
|
|
267
|
+
);
|
|
200
268
|
return { data: refundResult };
|
|
201
269
|
};
|
|
202
270
|
retrievePayment = async (input) => {
|
|
@@ -208,10 +276,19 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
208
276
|
input?.data ?? {},
|
|
209
277
|
"Missing required payment ID"
|
|
210
278
|
);
|
|
211
|
-
if (!id)
|
|
212
|
-
|
|
279
|
+
if (!id)
|
|
280
|
+
throw new utils.MedusaError(
|
|
281
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
282
|
+
"Missing required payment ID"
|
|
283
|
+
);
|
|
284
|
+
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
285
|
+
this.paykit.payments.retrieve(id)
|
|
286
|
+
);
|
|
213
287
|
if (paymentIntentError)
|
|
214
|
-
throw new utils.MedusaError(
|
|
288
|
+
throw new utils.MedusaError(
|
|
289
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
290
|
+
paymentIntentError.message
|
|
291
|
+
);
|
|
215
292
|
return { data: paymentIntentResult };
|
|
216
293
|
};
|
|
217
294
|
updatePayment = async (input) => {
|
|
@@ -224,13 +301,20 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
224
301
|
"Missing required payment ID"
|
|
225
302
|
);
|
|
226
303
|
if (!amount || !currency_code)
|
|
227
|
-
throw new utils.MedusaError(
|
|
304
|
+
throw new utils.MedusaError(
|
|
305
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
306
|
+
"Missing required amount or currency code"
|
|
307
|
+
);
|
|
228
308
|
const { id: paymentId } = core.validateRequiredKeys(
|
|
229
309
|
["id"],
|
|
230
310
|
input.data,
|
|
231
311
|
"Missing required payment ID"
|
|
232
312
|
);
|
|
233
|
-
if (!paymentId)
|
|
313
|
+
if (!paymentId)
|
|
314
|
+
throw new utils.MedusaError(
|
|
315
|
+
utils.MedusaError.Types.INVALID_DATA,
|
|
316
|
+
"Missing required payment ID"
|
|
317
|
+
);
|
|
234
318
|
const [paymentIntentResult, paymentIntentError] = await core.tryCatchAsync(
|
|
235
319
|
this.paykit.payments.update(paymentId, {
|
|
236
320
|
amount: Number(amount),
|
|
@@ -240,7 +324,10 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
240
324
|
})
|
|
241
325
|
);
|
|
242
326
|
if (paymentIntentError)
|
|
243
|
-
throw new utils.MedusaError(
|
|
327
|
+
throw new utils.MedusaError(
|
|
328
|
+
utils.MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
329
|
+
paymentIntentError.message
|
|
330
|
+
);
|
|
244
331
|
return { data: paymentIntentResult };
|
|
245
332
|
};
|
|
246
333
|
getWebhookActionAndData = async (payload) => {
|
|
@@ -269,7 +356,10 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
269
356
|
const webhook = this.paykit.webhooks.setup({ webhookSecret: this.options.webhookSecret }).on("payment.created", async (event) => {
|
|
270
357
|
return {
|
|
271
358
|
action: utils.PaymentActions.PENDING,
|
|
272
|
-
data: {
|
|
359
|
+
data: {
|
|
360
|
+
session_id: event.data?.metadata?.session_id,
|
|
361
|
+
amount: event.data?.amount
|
|
362
|
+
}
|
|
273
363
|
};
|
|
274
364
|
}).on("payment.updated", async (event) => {
|
|
275
365
|
const statusActionMap = {
|
|
@@ -283,17 +373,26 @@ var PaykitMedusaJSAdapter = class extends utils.AbstractPaymentProvider {
|
|
|
283
373
|
};
|
|
284
374
|
return {
|
|
285
375
|
action: event.data?.status ? statusActionMap[event.data.status] : utils.PaymentActions.PENDING,
|
|
286
|
-
data: {
|
|
376
|
+
data: {
|
|
377
|
+
session_id: event.data?.metadata?.session_id,
|
|
378
|
+
amount: event.data?.amount
|
|
379
|
+
}
|
|
287
380
|
};
|
|
288
381
|
}).on("payment.canceled", async (event) => {
|
|
289
382
|
return {
|
|
290
383
|
action: utils.PaymentActions.CANCELED,
|
|
291
|
-
data: {
|
|
384
|
+
data: {
|
|
385
|
+
session_id: event.data?.metadata?.session_id,
|
|
386
|
+
amount: event.data?.amount
|
|
387
|
+
}
|
|
292
388
|
};
|
|
293
389
|
});
|
|
390
|
+
const stringifiedHeaders = Object.fromEntries(
|
|
391
|
+
Object.entries(headers).map(([key, value]) => [key, String(value)])
|
|
392
|
+
);
|
|
294
393
|
const webhookEvents = await webhook.handle({
|
|
295
394
|
body: rawData,
|
|
296
|
-
headers,
|
|
395
|
+
headers: new Headers(stringifiedHeaders),
|
|
297
396
|
fullUrl
|
|
298
397
|
});
|
|
299
398
|
return webhookEvents;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbstractPaymentProvider, MedusaError,
|
|
1
|
+
import { AbstractPaymentProvider, MedusaError, PaymentSessionStatus, PaymentActions } from '@medusajs/framework/utils';
|
|
2
2
|
import { providerSchema, PayKit, tryCatchAsync, validateRequiredKeys } from '@paykit-sdk/core';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
|
|
@@ -79,14 +79,20 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
79
79
|
data
|
|
80
80
|
}) => {
|
|
81
81
|
if (this.options.debug) {
|
|
82
|
-
console.info("[PayKit] Initiating payment", {
|
|
82
|
+
console.info("[PayKit] Initiating payment", {
|
|
83
|
+
context,
|
|
84
|
+
amount,
|
|
85
|
+
currency_code,
|
|
86
|
+
data
|
|
87
|
+
});
|
|
83
88
|
}
|
|
84
89
|
const intent = {
|
|
85
|
-
status: "pending",
|
|
86
90
|
amount: Number(amount),
|
|
87
91
|
currency: currency_code,
|
|
88
|
-
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ??
|
|
89
|
-
provider_metadata: data?.provider_metadata
|
|
92
|
+
metadata: { ...data?.metadata ?? {}, session_id: data?.session_id ?? null },
|
|
93
|
+
provider_metadata: data?.provider_metadata,
|
|
94
|
+
capture_method: "manual",
|
|
95
|
+
item_id: data?.item_id
|
|
90
96
|
};
|
|
91
97
|
let customer;
|
|
92
98
|
if (context?.account_holder?.data?.id) {
|
|
@@ -95,7 +101,10 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
95
101
|
customer = { email: data.email };
|
|
96
102
|
}
|
|
97
103
|
if (!customer) {
|
|
98
|
-
throw new MedusaError(
|
|
104
|
+
throw new MedusaError(
|
|
105
|
+
MedusaError.Types.INVALID_DATA,
|
|
106
|
+
"Required: customer ID (account_holder) or email (data)"
|
|
107
|
+
);
|
|
99
108
|
}
|
|
100
109
|
if (typeof customer === "object" && "email" in customer) {
|
|
101
110
|
await tryCatchAsync(
|
|
@@ -103,7 +112,9 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
103
112
|
email: customer.email,
|
|
104
113
|
phone: data?.phone ?? "",
|
|
105
114
|
name: data?.name ? data.name : customer.email.split("@")[0],
|
|
106
|
-
metadata: {
|
|
115
|
+
metadata: {
|
|
116
|
+
PAYKIT_METADATA_KEY: JSON.stringify({ source: "medusa-paykit-adapter" })
|
|
117
|
+
}
|
|
107
118
|
})
|
|
108
119
|
);
|
|
109
120
|
} else {
|
|
@@ -113,9 +124,25 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
113
124
|
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
114
125
|
this.paykit.payments.create(intent)
|
|
115
126
|
);
|
|
116
|
-
if (paymentIntentError)
|
|
117
|
-
throw new MedusaError(
|
|
118
|
-
|
|
127
|
+
if (paymentIntentError) {
|
|
128
|
+
throw new MedusaError(
|
|
129
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
130
|
+
paymentIntentError.message
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
if (paymentIntentResult.requires_action && paymentIntentResult.payment_url) {
|
|
134
|
+
return {
|
|
135
|
+
id: paymentIntentResult.id,
|
|
136
|
+
status: PaymentSessionStatus.REQUIRES_MORE,
|
|
137
|
+
data: {
|
|
138
|
+
payment_url: paymentIntentResult.payment_url
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
id: paymentIntentResult.id,
|
|
144
|
+
status: medusaStatus$InboundSchema(paymentIntentResult.status)
|
|
145
|
+
};
|
|
119
146
|
};
|
|
120
147
|
capturePayment = async (input) => {
|
|
121
148
|
if (this.options.debug) {
|
|
@@ -126,13 +153,24 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
126
153
|
input?.data ?? {},
|
|
127
154
|
"Missing required payment ID"
|
|
128
155
|
);
|
|
129
|
-
if (!id)
|
|
130
|
-
|
|
156
|
+
if (!id)
|
|
157
|
+
throw new MedusaError(
|
|
158
|
+
MedusaError.Types.INVALID_DATA,
|
|
159
|
+
"Missing required payment ID"
|
|
160
|
+
);
|
|
161
|
+
if (!amount)
|
|
162
|
+
throw new MedusaError(
|
|
163
|
+
MedusaError.Types.INVALID_DATA,
|
|
164
|
+
"Missing required payment amount"
|
|
165
|
+
);
|
|
131
166
|
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
132
167
|
this.paykit.payments.capture(id, { amount: Number(amount) })
|
|
133
168
|
);
|
|
134
169
|
if (paymentIntentError)
|
|
135
|
-
throw new MedusaError(
|
|
170
|
+
throw new MedusaError(
|
|
171
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
172
|
+
paymentIntentError.message
|
|
173
|
+
);
|
|
136
174
|
return { data: paymentIntentResult };
|
|
137
175
|
};
|
|
138
176
|
authorizePayment = async (input) => {
|
|
@@ -150,10 +188,19 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
150
188
|
input?.data ?? {},
|
|
151
189
|
"Missing required payment ID"
|
|
152
190
|
);
|
|
153
|
-
if (!id)
|
|
154
|
-
|
|
191
|
+
if (!id)
|
|
192
|
+
throw new MedusaError(
|
|
193
|
+
MedusaError.Types.INVALID_DATA,
|
|
194
|
+
"Missing required payment ID"
|
|
195
|
+
);
|
|
196
|
+
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
197
|
+
this.paykit.payments.cancel(id)
|
|
198
|
+
);
|
|
155
199
|
if (paymentIntentError)
|
|
156
|
-
throw new MedusaError(
|
|
200
|
+
throw new MedusaError(
|
|
201
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
202
|
+
paymentIntentError.message
|
|
203
|
+
);
|
|
157
204
|
return { data: paymentIntentResult };
|
|
158
205
|
};
|
|
159
206
|
deletePayment = async (input) => {
|
|
@@ -165,11 +212,24 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
165
212
|
input?.data ?? {},
|
|
166
213
|
"Missing required payment ID"
|
|
167
214
|
);
|
|
168
|
-
if (!id)
|
|
169
|
-
|
|
215
|
+
if (!id)
|
|
216
|
+
throw new MedusaError(
|
|
217
|
+
MedusaError.Types.INVALID_DATA,
|
|
218
|
+
"Missing required payment ID"
|
|
219
|
+
);
|
|
220
|
+
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
221
|
+
this.paykit.payments.retrieve(id)
|
|
222
|
+
);
|
|
170
223
|
if (paymentIntentError)
|
|
171
|
-
throw new MedusaError(
|
|
172
|
-
|
|
224
|
+
throw new MedusaError(
|
|
225
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
226
|
+
paymentIntentError.message
|
|
227
|
+
);
|
|
228
|
+
if (!paymentIntentResult)
|
|
229
|
+
throw new MedusaError(
|
|
230
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
231
|
+
"Payment not found"
|
|
232
|
+
);
|
|
173
233
|
return {
|
|
174
234
|
status: medusaStatus$InboundSchema(paymentIntentResult.status),
|
|
175
235
|
data: paymentIntentResult
|
|
@@ -184,7 +244,11 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
184
244
|
input?.data ?? {},
|
|
185
245
|
"Missing required payment ID"
|
|
186
246
|
);
|
|
187
|
-
if (!paymentId)
|
|
247
|
+
if (!paymentId)
|
|
248
|
+
throw new MedusaError(
|
|
249
|
+
MedusaError.Types.INVALID_DATA,
|
|
250
|
+
"Missing required payment ID"
|
|
251
|
+
);
|
|
188
252
|
const [refundResult, refundError] = await tryCatchAsync(
|
|
189
253
|
this.paykit.refunds.create({
|
|
190
254
|
payment_id: paymentId,
|
|
@@ -194,7 +258,11 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
194
258
|
provider_metadata: input.data?.provider_metadata ? input.data.provider_metadata : void 0
|
|
195
259
|
})
|
|
196
260
|
);
|
|
197
|
-
if (refundError)
|
|
261
|
+
if (refundError)
|
|
262
|
+
throw new MedusaError(
|
|
263
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
264
|
+
refundError.message
|
|
265
|
+
);
|
|
198
266
|
return { data: refundResult };
|
|
199
267
|
};
|
|
200
268
|
retrievePayment = async (input) => {
|
|
@@ -206,10 +274,19 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
206
274
|
input?.data ?? {},
|
|
207
275
|
"Missing required payment ID"
|
|
208
276
|
);
|
|
209
|
-
if (!id)
|
|
210
|
-
|
|
277
|
+
if (!id)
|
|
278
|
+
throw new MedusaError(
|
|
279
|
+
MedusaError.Types.INVALID_DATA,
|
|
280
|
+
"Missing required payment ID"
|
|
281
|
+
);
|
|
282
|
+
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
283
|
+
this.paykit.payments.retrieve(id)
|
|
284
|
+
);
|
|
211
285
|
if (paymentIntentError)
|
|
212
|
-
throw new MedusaError(
|
|
286
|
+
throw new MedusaError(
|
|
287
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
288
|
+
paymentIntentError.message
|
|
289
|
+
);
|
|
213
290
|
return { data: paymentIntentResult };
|
|
214
291
|
};
|
|
215
292
|
updatePayment = async (input) => {
|
|
@@ -222,13 +299,20 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
222
299
|
"Missing required payment ID"
|
|
223
300
|
);
|
|
224
301
|
if (!amount || !currency_code)
|
|
225
|
-
throw new MedusaError(
|
|
302
|
+
throw new MedusaError(
|
|
303
|
+
MedusaError.Types.INVALID_DATA,
|
|
304
|
+
"Missing required amount or currency code"
|
|
305
|
+
);
|
|
226
306
|
const { id: paymentId } = validateRequiredKeys(
|
|
227
307
|
["id"],
|
|
228
308
|
input.data,
|
|
229
309
|
"Missing required payment ID"
|
|
230
310
|
);
|
|
231
|
-
if (!paymentId)
|
|
311
|
+
if (!paymentId)
|
|
312
|
+
throw new MedusaError(
|
|
313
|
+
MedusaError.Types.INVALID_DATA,
|
|
314
|
+
"Missing required payment ID"
|
|
315
|
+
);
|
|
232
316
|
const [paymentIntentResult, paymentIntentError] = await tryCatchAsync(
|
|
233
317
|
this.paykit.payments.update(paymentId, {
|
|
234
318
|
amount: Number(amount),
|
|
@@ -238,7 +322,10 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
238
322
|
})
|
|
239
323
|
);
|
|
240
324
|
if (paymentIntentError)
|
|
241
|
-
throw new MedusaError(
|
|
325
|
+
throw new MedusaError(
|
|
326
|
+
MedusaError.Types.PAYMENT_AUTHORIZATION_ERROR,
|
|
327
|
+
paymentIntentError.message
|
|
328
|
+
);
|
|
242
329
|
return { data: paymentIntentResult };
|
|
243
330
|
};
|
|
244
331
|
getWebhookActionAndData = async (payload) => {
|
|
@@ -267,7 +354,10 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
267
354
|
const webhook = this.paykit.webhooks.setup({ webhookSecret: this.options.webhookSecret }).on("payment.created", async (event) => {
|
|
268
355
|
return {
|
|
269
356
|
action: PaymentActions.PENDING,
|
|
270
|
-
data: {
|
|
357
|
+
data: {
|
|
358
|
+
session_id: event.data?.metadata?.session_id,
|
|
359
|
+
amount: event.data?.amount
|
|
360
|
+
}
|
|
271
361
|
};
|
|
272
362
|
}).on("payment.updated", async (event) => {
|
|
273
363
|
const statusActionMap = {
|
|
@@ -281,17 +371,26 @@ var PaykitMedusaJSAdapter = class extends AbstractPaymentProvider {
|
|
|
281
371
|
};
|
|
282
372
|
return {
|
|
283
373
|
action: event.data?.status ? statusActionMap[event.data.status] : PaymentActions.PENDING,
|
|
284
|
-
data: {
|
|
374
|
+
data: {
|
|
375
|
+
session_id: event.data?.metadata?.session_id,
|
|
376
|
+
amount: event.data?.amount
|
|
377
|
+
}
|
|
285
378
|
};
|
|
286
379
|
}).on("payment.canceled", async (event) => {
|
|
287
380
|
return {
|
|
288
381
|
action: PaymentActions.CANCELED,
|
|
289
|
-
data: {
|
|
382
|
+
data: {
|
|
383
|
+
session_id: event.data?.metadata?.session_id,
|
|
384
|
+
amount: event.data?.amount
|
|
385
|
+
}
|
|
290
386
|
};
|
|
291
387
|
});
|
|
388
|
+
const stringifiedHeaders = Object.fromEntries(
|
|
389
|
+
Object.entries(headers).map(([key, value]) => [key, String(value)])
|
|
390
|
+
);
|
|
292
391
|
const webhookEvents = await webhook.handle({
|
|
293
392
|
body: rawData,
|
|
294
|
-
headers,
|
|
393
|
+
headers: new Headers(stringifiedHeaders),
|
|
295
394
|
fullUrl
|
|
296
395
|
});
|
|
297
396
|
return webhookEvents;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paykit-sdk/medusajs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "MedusaJS Integrations for Paykit",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -16,8 +16,7 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"scripts": {
|
|
19
|
-
"build": "tsup"
|
|
20
|
-
"prepublishOnly": "rm -rf dist && npm run build"
|
|
19
|
+
"build": "tsup"
|
|
21
20
|
},
|
|
22
21
|
"keywords": [
|
|
23
22
|
"medusajs",
|
|
@@ -29,8 +28,7 @@
|
|
|
29
28
|
"license": "ISC",
|
|
30
29
|
"packageManager": "pnpm@10.13.1",
|
|
31
30
|
"peerDependencies": {
|
|
32
|
-
"@medusajs/framework": ">=2.10.3"
|
|
33
|
-
"@paykit-sdk/core": ">=1.1.9"
|
|
31
|
+
"@medusajs/framework": ">=2.10.3"
|
|
34
32
|
},
|
|
35
33
|
"devDependencies": {
|
|
36
34
|
"@medusajs/framework": "^2.10.3",
|
|
@@ -39,7 +37,8 @@
|
|
|
39
37
|
"typescript": "^5.9.2"
|
|
40
38
|
},
|
|
41
39
|
"dependencies": {
|
|
42
|
-
"zod": "^3.25.76"
|
|
40
|
+
"zod": "^3.25.76",
|
|
41
|
+
"@paykit-sdk/core": ">=1.1.98"
|
|
43
42
|
},
|
|
44
43
|
"publishConfig": {
|
|
45
44
|
"access": "public"
|