@nicogorga/medusa-payment-mercadopago 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ async function GET(req, res) {
5
+ res.sendStatus(200);
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3BsdWdpbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtCQUtDO0FBTE0sS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDIn0=
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const framework_1 = require("@medusajs/framework");
4
+ const middlewares_1 = require("./store/middlewares");
5
+ exports.default = (0, framework_1.defineMiddlewares)({
6
+ routes: [
7
+ ...middlewares_1.storeMiddlewares
8
+ ],
9
+ });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBQXdEO0FBQ3hELHFEQUF1RDtBQUV2RCxrQkFBZSxJQUFBLDZCQUFpQixFQUFDO0lBQzdCLE1BQU0sRUFBRTtRQUNKLEdBQUcsOEJBQWdCO0tBQ3RCO0NBQ0osQ0FBQyxDQUFBIn0=
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mercadopagoMiddlewares = void 0;
4
+ const framework_1 = require("@medusajs/framework");
5
+ const validators_1 = require("./payment/validators");
6
+ exports.mercadopagoMiddlewares = [
7
+ {
8
+ matcher: '/store/mercadopago/payment',
9
+ method: 'POST',
10
+ middlewares: [
11
+ (0, framework_1.validateAndTransformBody)(validators_1.PostStoreMercadopagoPayment),
12
+ ]
13
+ }
14
+ ];
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL21lcmNhZG9wYWdvL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFnRjtBQUNoRixxREFBbUU7QUFFdEQsUUFBQSxzQkFBc0IsR0FBc0I7SUFDckQ7UUFDSSxPQUFPLEVBQUUsNEJBQTRCO1FBQ3JDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsV0FBVyxFQUFFO1lBQ1QsSUFBQSxvQ0FBd0IsRUFBQyx3Q0FBMkIsQ0FBQztTQUN4RDtLQUNKO0NBQ0osQ0FBQSJ9
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const create_payment_1 = require("../../../../workflows/mercadopago/workflows/create-payment");
5
+ const POST = async (req, res) => {
6
+ const { paymentSessionId, paymentData } = req.validatedBody;
7
+ await (0, create_payment_1.createMercadopagoPaymentWorkflow)(req.scope).run({
8
+ input: { paymentSessionId, paymentData }
9
+ });
10
+ return res.status(201).json({});
11
+ };
12
+ exports.POST = POST;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL21lcmNhZG9wYWdvL3BheW1lbnQvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsK0ZBQThHO0FBRXZHLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFtRCxFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztJQUM1RCxNQUFNLElBQUEsaURBQWdDLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNsRCxLQUFLLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUU7S0FDM0MsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUE7QUFOWSxRQUFBLElBQUksUUFNaEIifQ==
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostStoreMercadopagoPayment = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.PostStoreMercadopagoPayment = zod_1.z.object({
6
+ paymentSessionId: zod_1.z.string().min(1),
7
+ paymentData: zod_1.z.object({
8
+ token: zod_1.z.string().min(1),
9
+ transaction_amount: zod_1.z.number().min(1),
10
+ installments: zod_1.z.number(),
11
+ payer: zod_1.z.object({
12
+ email: zod_1.z.string(),
13
+ })
14
+ })
15
+ });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvbWVyY2Fkb3BhZ28vcGF5bWVudC92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUF1QjtBQUdWLFFBQUEsMkJBQTJCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNoRCxnQkFBZ0IsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuQyxXQUFXLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsQixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsa0JBQWtCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckMsWUFBWSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDeEIsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUM7WUFDWixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtTQUNwQixDQUFDO0tBQ0wsQ0FBQztDQUNMLENBQUMsQ0FBQSJ9
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.storeMiddlewares = void 0;
4
+ const middlewares_1 = require("./mercadopago/middlewares");
5
+ exports.storeMiddlewares = [
6
+ ...middlewares_1.mercadopagoMiddlewares,
7
+ ];
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJEQUFtRTtBQUV0RCxRQUFBLGdCQUFnQixHQUFzQjtJQUMvQyxHQUFHLG9DQUFzQjtDQUM1QixDQUFBIn0=
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const service_1 = __importDefault(require("../mercado-pago/service"));
8
+ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.PAYMENT, {
9
+ services: [service_1.default],
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL21lcmNhZG8tcGFnby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFvRTtBQUNwRSxzRUFBaUU7QUFFakUsa0JBQWUsSUFBQSxzQkFBYyxFQUFDLGVBQU8sQ0FBQyxPQUFPLEVBQUU7SUFDM0MsUUFBUSxFQUFFLENBQUMsaUJBQTBCLENBQUM7Q0FDekMsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const utils_1 = require("@medusajs/framework/utils");
37
+ const mercadopago_1 = __importStar(require("mercadopago"));
38
+ const crypto_1 = require("crypto");
39
+ class MercadopagoProviderService extends utils_1.AbstractPaymentProvider {
40
+ constructor(container, options) {
41
+ super(container, options);
42
+ this.options_ = options;
43
+ this.client_ = new mercadopago_1.default({
44
+ accessToken: options.accessToken
45
+ });
46
+ }
47
+ static validateOptions(options) {
48
+ if (!options.accessToken || !(0, utils_1.isString)(options.accessToken)) {
49
+ throw new utils_1.MedusaError(utils_1.MedusaErrorTypes.INVALID_DATA, 'Mercado pago \'accessToken\' needs to be a non empty string');
50
+ }
51
+ }
52
+ async initiatePayment(input) {
53
+ return {
54
+ id: '',
55
+ data: {
56
+ session_id: input.data?.session_id,
57
+ }
58
+ };
59
+ }
60
+ async deletePayment(input) {
61
+ const paymentId = input.data?.id;
62
+ if (paymentId) {
63
+ const payment = new mercadopago_1.Payment(this.client_);
64
+ await payment.cancel({ id: paymentId });
65
+ }
66
+ return {};
67
+ }
68
+ async authorizePayment(input) {
69
+ const paymentSessionId = input.data?.session_id;
70
+ let data = {};
71
+ if (paymentSessionId) {
72
+ const payment = new mercadopago_1.Payment(this.client_);
73
+ const results = (await payment.search({ options: { external_reference: paymentSessionId } }))?.results ?? [];
74
+ data = results[0] ?? {};
75
+ }
76
+ // Returning PaymentSessionStatus.CAPTURED for auto capture, since for UY card method they are captured automatically
77
+ // Should make it conditionally in cases where a method could be not auto captured (maybe cash or another country)
78
+ return Promise.resolve({
79
+ data: data,
80
+ status: utils_1.PaymentSessionStatus.CAPTURED,
81
+ });
82
+ }
83
+ capturePayment(input) {
84
+ return Promise.resolve({ data: input.data });
85
+ }
86
+ async cancelPayment(input) {
87
+ const paymentId = input.data?.id;
88
+ if (!paymentId || !(0, utils_1.isString)(paymentId)) {
89
+ return { data: input.data ?? {} };
90
+ }
91
+ const payment = new mercadopago_1.Payment(this.client_);
92
+ const paymentData = await payment.cancel({ id: paymentId });
93
+ return { data: paymentData };
94
+ }
95
+ async getPaymentStatus(input) {
96
+ const paymentId = input.data?.id;
97
+ const payment = new mercadopago_1.Payment(this.client_);
98
+ const paymentData = await payment.get({ id: paymentId });
99
+ const status = paymentData.status;
100
+ switch (status) {
101
+ case 'authorized':
102
+ return { status: 'authorized' };
103
+ case 'approved':
104
+ case 'in_mediation':
105
+ return { status: 'captured' };
106
+ case 'cancelled':
107
+ case 'refunded':
108
+ return { status: 'canceled' };
109
+ default:
110
+ return { status: 'pending' };
111
+ }
112
+ }
113
+ async refundPayment(input) {
114
+ const paymentId = this.getIdOrThrow(input.data);
115
+ const payment = new mercadopago_1.Payment(this.client_);
116
+ const paymentData = await payment.get({ id: paymentId });
117
+ const refundAmount = input.amount;
118
+ const isPartial = (paymentData.transaction_amount ?? input.amount) > input.amount;
119
+ const refund = new mercadopago_1.PaymentRefund(this.client_);
120
+ const refundData = await refund.create({
121
+ payment_id: paymentId, body: {
122
+ amount: isPartial ? Number(refundAmount) : undefined
123
+ }
124
+ });
125
+ return { data: refundData };
126
+ }
127
+ async retrievePayment(input) {
128
+ const paymentId = this.getIdOrThrow(input.data);
129
+ const payment = new mercadopago_1.Payment(this.client_);
130
+ const paymentData = await payment.get({ id: paymentId });
131
+ return { data: paymentData };
132
+ }
133
+ updatePayment(input) {
134
+ return Promise.resolve({ data: input.data });
135
+ }
136
+ async getWebhookActionAndData(payload) {
137
+ this.validateWebhookSignature(payload);
138
+ const mercadopagoData = payload.data;
139
+ const eventType = mercadopagoData.action;
140
+ try {
141
+ switch (eventType) {
142
+ case 'payment.created':
143
+ case 'payment.updated':
144
+ const payment = new mercadopago_1.Payment(this.client_);
145
+ const paymentData = await payment.get({ id: mercadopagoData.data.id });
146
+ const paymentSessionId = paymentData.external_reference;
147
+ if (!paymentSessionId) {
148
+ throw new Error('No external_reference found in mercadopago payload, unable to match against Medusa payment session');
149
+ }
150
+ if (['authorized', 'approved'].includes(paymentData.status ?? '')) {
151
+ return {
152
+ action: paymentData.status === 'approved' ? 'captured' : paymentData.status,
153
+ data: {
154
+ session_id: paymentSessionId,
155
+ amount: paymentData.transaction_amount
156
+ }
157
+ };
158
+ }
159
+ default:
160
+ return { action: 'not_supported' };
161
+ }
162
+ }
163
+ catch (error) {
164
+ return { action: 'failed' };
165
+ }
166
+ }
167
+ async createPayment({ paymentSessionId, payload }) {
168
+ const payment = new mercadopago_1.Payment(this.client_);
169
+ return payment.create({
170
+ body: {
171
+ ...payload,
172
+ external_reference: paymentSessionId,
173
+ }
174
+ });
175
+ }
176
+ validateWebhookSignature(data) {
177
+ const secret = this.options_.webhookSecret;
178
+ // If no webhookSecret is set, the assumption is this protection is not required
179
+ if (!secret) {
180
+ return;
181
+ }
182
+ const headers = data.headers;
183
+ const xSignature = (headers['x-signature'] ?? 'noop');
184
+ const xRequestId = (headers['x-request-id'] ?? 'noop');
185
+ const body = data?.data;
186
+ const dataId = (body.data?.id ?? 'noop');
187
+ const parts = xSignature.split(',');
188
+ let timestamp;
189
+ let hash;
190
+ parts.forEach(part => {
191
+ const [key, val] = part.split('=');
192
+ if (key && val) {
193
+ const [trimmedKey, trimmedVal] = [key.trim(), val.trim()];
194
+ if (trimmedKey === 'ts') {
195
+ timestamp = trimmedVal;
196
+ }
197
+ else if (trimmedKey === 'v1') {
198
+ hash = trimmedVal;
199
+ }
200
+ }
201
+ });
202
+ const manifest = `id:${dataId};request-id:${xRequestId};ts:${timestamp};`;
203
+ const hmac = (0, crypto_1.createHmac)('sha256', secret);
204
+ hmac.update(manifest);
205
+ const sha = hmac.digest('hex');
206
+ if (sha !== hash) {
207
+ this.logger_.warn(`Unable to verify Mercado Pago authenticity of request with headers:\n
208
+ ${headers}
209
+ `);
210
+ throw new utils_1.MedusaError(utils_1.MedusaErrorTypes.INVALID_DATA, 'Invalid signature');
211
+ }
212
+ }
213
+ getIdOrThrow(data) {
214
+ const id = data?.id;
215
+ if (!id || !(0, utils_1.isString)(id)) {
216
+ throw new utils_1.MedusaError(utils_1.MedusaErrorTypes.INVALID_DATA, 'No valid string stored against \'id\' key of data object');
217
+ }
218
+ return id;
219
+ }
220
+ }
221
+ MercadopagoProviderService.identifier = 'mercadopago';
222
+ exports.default = MercadopagoProviderService;
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvbWVyY2Fkby1wYWdvL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBbUk7QUFFbkksMkRBQXdFO0FBSXhFLG1DQUFvQztBQU9wQyxNQUFNLDBCQUEyQixTQUFRLCtCQUEyQztJQU1oRixZQUFZLFNBQStCLEVBQUUsT0FBMkI7UUFDcEUsS0FBSyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUV6QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQWlCLENBQUM7WUFDakMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1NBQ25DLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQXlCO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBQSxnQkFBUSxFQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxtQkFBVyxDQUNqQix3QkFBZ0IsQ0FBQyxZQUFZLEVBQzdCLDZEQUE2RCxDQUNoRSxDQUFBO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQTJCO1FBQzdDLE9BQU87WUFDSCxFQUFFLEVBQUUsRUFBRTtZQUNOLElBQUksRUFBRTtnQkFDRixVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVO2FBQ3JDO1NBQ0osQ0FBQTtJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQXlCO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFBO1FBQ2hDLElBQUksU0FBUyxFQUFF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
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPaymentStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ exports.createPaymentStep = (0, workflows_sdk_1.createStep)('create-mercado-pago-payment', async ({ paymentSessionId, paymentData }, { container }) => {
6
+ //@ts-ignore
7
+ const mercadopagoPaymentProvider = container.resolve('payment').paymentProviderService_
8
+ .retrieveProvider('pp_mercadopago_mercadopago');
9
+ await mercadopagoPaymentProvider.createPayment({ paymentSessionId, payload: paymentData });
10
+ return new workflows_sdk_1.StepResponse();
11
+ });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBheW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL21lcmNhZG9wYWdvL3N0ZXBzL2NyZWF0ZS1wYXltZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE2RTtBQVNoRSxRQUFBLGlCQUFpQixHQUFHLElBQUEsMEJBQVUsRUFDdkMsNkJBQTZCLEVBQzdCLEtBQUssRUFBRSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUN2RCxZQUFZO0lBQ1osTUFBTSwwQkFBMEIsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLHVCQUF1QjtTQUNsRixnQkFBZ0IsQ0FBQyw0QkFBNEIsQ0FBK0IsQ0FBQztJQUNsRixNQUFNLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLE9BQU8sSUFBSSw0QkFBWSxFQUFFLENBQUE7QUFDN0IsQ0FBQyxDQUNKLENBQUEifQ==
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTransactionAmountStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ exports.validateTransactionAmountStep = (0, workflows_sdk_1.createStep)('vaidate-transaction-amount', async ({ transactionAmount, medusaAmount }) => {
7
+ if (medusaAmount !== transactionAmount) {
8
+ throw new utils_1.MedusaError(utils_1.MedusaErrorTypes.PAYMENT_AUTHORIZATION_ERROR, 'CMedusa amount doesn\'t match Mercado Pago amount, unable to generate payment');
9
+ }
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtdHJhbnNhY3Rpb24tYW1vdW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9tZXJjYWRvcGFnby9zdGVwcy92YWxpZGF0ZS10cmFuc2FjdGlvbi1hbW91bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQTBFO0FBQzFFLHFFQUErRDtBQU9sRCxRQUFBLDZCQUE2QixHQUFHLElBQUEsMEJBQVUsRUFDbkQsNEJBQTRCLEVBQzVCLEtBQUssRUFBRSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7SUFDMUMsSUFBSSxZQUFZLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksbUJBQVcsQ0FDakIsd0JBQWdCLENBQUMsMkJBQTJCLEVBQzVDLCtFQUErRSxDQUNsRixDQUFBO0lBQ0wsQ0FBQztBQUNMLENBQUMsQ0FDSixDQUFBIn0=
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMercadopagoPaymentWorkflow = void 0;
4
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const validate_transaction_amount_1 = require("../steps/validate-transaction-amount");
7
+ const create_payment_1 = require("../steps/create-payment");
8
+ exports.createMercadopagoPaymentWorkflow = (0, workflows_sdk_1.createWorkflow)('create-mercadopago-payment', ({ paymentSessionId, paymentData }) => {
9
+ //@ts-ignore
10
+ const { data: paymentSessions } = (0, core_flows_1.useQueryGraphStep)({
11
+ entity: 'payment_session',
12
+ fields: ['amount'],
13
+ filters: {
14
+ id: paymentSessionId
15
+ },
16
+ options: {
17
+ throwIfKeyNotFound: true
18
+ }
19
+ });
20
+ const paymentSession = (0, workflows_sdk_1.transform)({ paymentSessions }, ({ paymentSessions }) => paymentSessions[0]);
21
+ const validateTransactionStepInput = (0, workflows_sdk_1.transform)({ paymentSession, paymentData }, ({ paymentSession, paymentData }) => ({ medusaAmount: Number(paymentSession.amount), transactionAmount: paymentData.transaction_amount ?? 0 }));
22
+ (0, validate_transaction_amount_1.validateTransactionAmountStep)(validateTransactionStepInput);
23
+ return new workflows_sdk_1.WorkflowResponse((0, create_payment_1.createPaymentStep)({ paymentSessionId, paymentData }));
24
+ });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBheW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL21lcmNhZG9wYWdvL3dvcmtmbG93cy9jcmVhdGUtcGF5bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0REFBZ0U7QUFDaEUscUVBQWdHO0FBR2hHLHNGQUFtSDtBQUNuSCw0REFBNEQ7QUFPL0MsUUFBQSxnQ0FBZ0MsR0FBRyxJQUFBLDhCQUFjLEVBQzFELDRCQUE0QixFQUM1QixDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUE4QixFQUFFLEVBQUU7SUFDOUQsWUFBWTtJQUNaLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBQSw4QkFBaUIsRUFBQztRQUNoRCxNQUFNLEVBQUUsaUJBQWlCO1FBQ3pCLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNsQixPQUFPLEVBQUU7WUFDTCxFQUFFLEVBQUUsZ0JBQWdCO1NBQ3ZCO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsa0JBQWtCLEVBQUUsSUFBSTtTQUMzQjtLQUNKLENBQUMsQ0FBQztJQUNILE1BQU0sY0FBYyxHQUFHLElBQUEseUJBQVMsRUFBQyxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUMsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBaUMsQ0FBQyxDQUFDO0lBQ25JLE1BQU0sNEJBQTRCLEdBQWlDLElBQUEseUJBQVMsRUFDeEUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQy9CLENBQUMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLENBQUMsa0JBQWtCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDakosQ0FBQztJQUNGLElBQUEsMkRBQTZCLEVBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUM1RCxPQUFPLElBQUksZ0NBQWdCLENBQUMsSUFBQSxrQ0FBaUIsRUFBQyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDLENBQ0osQ0FBQSJ9
package/README.md ADDED
@@ -0,0 +1,120 @@
1
+ # @nicogorga/medusa-payment-mercadopago
2
+
3
+ Receive payments on your Medusa commerce application using Mercado Pago.
4
+
5
+ [Medusa Payment Mercadopago Repository](https://github.com/NicolasGorga/medusa-payment-mercadopago) | [Medusa Website](https://medusajs.com/) | [Medusa Repository](https://github.com/medusajs/medusa)
6
+
7
+ > [!WARNING]
8
+ > This plugin is a WIP and has only been tested for Credit / Debit Card methods following Mercado Pago docs for Uruguay. You can sumbit issues through [GitHub Issues](https://github.com/NicolasGorga/medusa-payment-mercadopago/issues). Feel free to make contributions by making pull requests and proposing ideas / new flows to implement via [Discussions](https://github.com/NicolasGorga/medusa-payment-mercadopago/discussions)
9
+
10
+ ## Features
11
+
12
+ - Mercado Pago integration via Checkout API
13
+ - Payments created asynchronously via webhook event.
14
+ - Payments automatically captured (so far as for Uruguay, Credit / Debit is auto capture)
15
+
16
+ ---
17
+
18
+ ## Prerequisites
19
+
20
+ - [Node.js v20 or greater](https://nodejs.org/en)
21
+ - [A Medusa backend](https://docs.medusajs.com/learn/installation)
22
+ - For local testing, you need to expose localhost. You can use [ngrok](https://ngrok.com/)
23
+ - Mercado Pago developers setup:
24
+ - [Mercadopago developer account](https://www.mercadopago.com.uy/hub/registration/splitter)
25
+ - [Mercado Pago Checkout API application](https://www.mercadopago.com.uy/developers/panel/app/create-app)
26
+ - Name your app
27
+ - Choose _Pagos Online_ under "Solution Type"
28
+ - Select _Yes_ to ecommerce platform question and select _Otrasplataformas_ from the dropdown
29
+ - Select _CheckoutAPI_ from the "Product to integrate" dropdown
30
+ - Create application. For more information visit [Your Integrations](https://www.mercadopago.com.uy/developers/en/docs/checkout-api/additional-content/your-integrations/introduction)
31
+ - Setup Mercado Pago (credentials)[https://www.mercadopago.com.uy/developers/es/docs/your-integrations/credentials]:
32
+ - Generate test credentials and optionally, production credentials.
33
+ - Setup Mercado Pago [webhok notifications](https://www.mercadopago.com.uy/developers/es/docs/your-integrations/notifications)
34
+ - Under "Eventos", select _Pagos_
35
+ - (Optional) Generate a webhook secret. Although it is optional, it is recommended for security purposes.
36
+ - Go to your Medusa backend, run `yarn dev` and in a separate terminal `ngrok http 9000`. If you are serving the backend in a port other than 9000, change the last argument accordingly.
37
+ - Your localhost will be exposed by a URL like: `https://d76b-2800-a4-15d2-2900-1105-b8e5-c64-7697.ngrok-free.app`.
38
+ - Grab the generated URL and go to Mercado Pago webhook configuration. Under "URL para prueba", specify `[ngrok URL]/hooks/payment/mercadopago_mercadopago`, replaceing `ngrok URL` accordingly
39
+ - A frontend that integrates [Payment brick](https://www.mercadopago.com.uy/developers/es/docs/checkout-bricks/payment-brick/introduction). I suggest you clone this [Storefront](https://github.com/NicolasGorga/medusa-payment-mercadopago-storefront)
40
+
41
+ ---
42
+
43
+ ## How to Install
44
+
45
+ 1\. Run the following command in the directory of the Medusa backend using your package manager (for example for npm):
46
+
47
+ ```bash
48
+ npm install @nicogorga/medusa-payment-mercadopago
49
+ ```
50
+
51
+ 2\. Set the following environment variables in `.env`:
52
+
53
+ ```bash
54
+ # Access Token available in your Mercado Pago application Test Credentials section
55
+ ACCESS_TOKEN=
56
+ # (Optional) Webhook secret available in your Mercado Pago application Webhooks section
57
+ WEBHOOK_SECRET=
58
+ ```
59
+
60
+ 3\. In `medusa-config.ts` add the following at the end of the `plugins` array in your project config object:
61
+
62
+ ```js
63
+ projectConfig: {
64
+ plugins = [
65
+ // ...
66
+ {
67
+ resolve: `@nicogorga/medusa-payment-mercadopago`,
68
+ options: {
69
+ accessToken: process.env.MERCADOPAGO_ACCESS_TOKEN,
70
+ webhookSecret: process.env.MERCADOPAGO_WEBHOOK_SECRET,
71
+ },
72
+ },
73
+ ]
74
+ }
75
+ ```
76
+
77
+ 4\. In `medusa-config.ts` add the following to the `modules` array in your project config object:
78
+
79
+ ```js
80
+ modules: [
81
+ {
82
+ resolve: '@medusajs/medusa/payment',
83
+ options: {
84
+ providers: [
85
+ {
86
+ resolve: '@nicogorga/medusa-payment-mercadopago/providers/mercado-pago',
87
+ id: 'mercadopago',
88
+ options: {
89
+ accessToken: process.env.MERCADOPAGO_ACCESS_TOKEN,
90
+ webhookSecret: process.env.MERCADOPAGO_WEBHOOK_SECRET,
91
+ },
92
+ dependencies: [
93
+ ContainerRegistrationKeys.LOGGER
94
+ ]
95
+ }
96
+ ],
97
+ }
98
+ }
99
+ ],
100
+ ```
101
+
102
+ ---
103
+
104
+ ## Test the Plugin
105
+
106
+ 1\. Run the following command in the directory of the Medusa backend to run the backend:
107
+
108
+ ```bash
109
+ npm run dev
110
+ ```
111
+
112
+ 2\. Enable Mercadopago in a [region in the admin](https://docs.medusajs.com/resources/references/payment/provider#5-test-it-out). Alternatively, you can use the [Admin APIs](https://docs.medusajs.com/api/admin#regions_postregionsid).
113
+
114
+ 3\. Place an order using a frontend that collects payment data using [Mercadopago Payment brick](https://www.mercadopago.com.uy/developers/es/docs/checkout-bricks/payment-brick/introduction) like [this](https://github.com/NicolasGorga/medusa-payment-mercadopago-storefront). Send a POST to `localhost:9000/store/mercadopago/payment` with a body that adheres to [validator](https://github.com/NicolasGorga/medusa-payment-mercadopago/blob/master/src/api/store/mercadopago/payment/validators.ts)
115
+
116
+ ---
117
+
118
+ ## Additional Resources
119
+
120
+ - [Mercado Pago Online Payments Docs](https://www.mercadopago.com.uy/developers/es/docs#online-payments)
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@nicogorga/medusa-payment-mercadopago",
3
+ "version": "0.0.1",
4
+ "description": "Mercado Pago payment provider plugin for MedusaJS",
5
+ "author": "Nicolas Gorga",
6
+ "license": "MIT",
7
+ "files": [
8
+ ".medusa/server"
9
+ ],
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ "./workflows": "./.medusa/server/src/workflows/index.js",
13
+ "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
14
+ "./modules/*": "./.medusa/server/src/modules/*/index.js",
15
+ "./providers/*": "./.medusa/server/src/providers/*/index.js",
16
+ "./*": "./.medusa/server/src/*.js"
17
+ },
18
+ "keywords": [
19
+ "medusa",
20
+ "plugin",
21
+ "medusa-plugin-other",
22
+ "medusa-plugin",
23
+ "medusa-v2",
24
+ "mercadopago",
25
+ "mercado pago",
26
+ "payment"
27
+ ],
28
+ "scripts": {
29
+ "build": "medusa plugin:build",
30
+ "dev": "medusa plugin:develop",
31
+ "prepublishOnly": "medusa plugin:build"
32
+ },
33
+ "devDependencies": {
34
+ "@medusajs/admin-sdk": "2.5.0",
35
+ "@medusajs/cli": "2.5.0",
36
+ "@medusajs/framework": "2.5.0",
37
+ "@medusajs/icons": "2.5.0",
38
+ "@medusajs/medusa": "2.5.0",
39
+ "@medusajs/test-utils": "2.5.0",
40
+ "@medusajs/ui": "4.0.4",
41
+ "@mikro-orm/cli": "6.4.3",
42
+ "@mikro-orm/core": "6.4.3",
43
+ "@mikro-orm/knex": "6.4.3",
44
+ "@mikro-orm/migrations": "6.4.3",
45
+ "@mikro-orm/postgresql": "6.4.3",
46
+ "@swc/core": "1.5.7",
47
+ "@types/node": "^20.0.0",
48
+ "@types/react": "^18.3.2",
49
+ "@types/react-dom": "^18.2.25",
50
+ "awilix": "^8.0.1",
51
+ "pg": "^8.13.0",
52
+ "prop-types": "^15.8.1",
53
+ "react": "^18.2.0",
54
+ "react-dom": "^18.2.0",
55
+ "ts-node": "^10.9.2",
56
+ "typescript": "^5.6.2",
57
+ "vite": "^5.2.11",
58
+ "yalc": "^1.0.0-pre.53"
59
+ },
60
+ "peerDependencies": {
61
+ "@medusajs/admin-sdk": "2.5.0",
62
+ "@medusajs/cli": "2.5.0",
63
+ "@medusajs/framework": "2.5.0",
64
+ "@medusajs/icons": "2.5.0",
65
+ "@medusajs/medusa": "2.5.0",
66
+ "@medusajs/test-utils": "2.5.0",
67
+ "@medusajs/ui": "4.0.3",
68
+ "@mikro-orm/cli": "6.4.3",
69
+ "@mikro-orm/core": "6.4.3",
70
+ "@mikro-orm/knex": "6.4.3",
71
+ "@mikro-orm/migrations": "6.4.3",
72
+ "@mikro-orm/postgresql": "6.4.3",
73
+ "awilix": "^8.0.1",
74
+ "pg": "^8.13.0"
75
+ },
76
+ "engines": {
77
+ "node": ">=20"
78
+ },
79
+ "dependencies": {
80
+ "mercadopago": "^2.3.0"
81
+ }
82
+ }