@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.
- package/.medusa/server/src/admin/vite-env.d.js +1 -0
- package/.medusa/server/src/api/admin/plugin/route.js +7 -0
- package/.medusa/server/src/api/middlewares.js +10 -0
- package/.medusa/server/src/api/store/mercadopago/middlewares.js +15 -0
- package/.medusa/server/src/api/store/mercadopago/payment/route.js +13 -0
- package/.medusa/server/src/api/store/mercadopago/payment/validators.js +16 -0
- package/.medusa/server/src/api/store/middlewares.js +8 -0
- package/.medusa/server/src/providers/mercado-pago/index.js +11 -0
- package/.medusa/server/src/providers/mercado-pago/service.js +223 -0
- package/.medusa/server/src/types/index.js +3 -0
- package/.medusa/server/src/workflows/mercadopago/steps/create-payment.js +12 -0
- package/.medusa/server/src/workflows/mercadopago/steps/validate-transaction-amount.js +11 -0
- package/.medusa/server/src/workflows/mercadopago/workflows/create-payment.js +25 -0
- package/README.md +120 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -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
|
+
}
|