@gmisoftware/przelewy24-payments-medusa 0.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/.medusa/server/src/admin/index.js +20 -0
- package/.medusa/server/src/admin/index.mjs +21 -0
- package/.medusa/server/src/api/payments/blik/route.js +90 -0
- package/.medusa/server/src/api/return/route.js +23 -0
- package/.medusa/server/src/providers/przelewy24/core/p24-base.js +506 -0
- package/.medusa/server/src/providers/przelewy24/index.js +25 -0
- package/.medusa/server/src/providers/przelewy24/services/index.js +28 -0
- package/.medusa/server/src/providers/przelewy24/services/p24-api.js +153 -0
- package/.medusa/server/src/providers/przelewy24/services/p24-blik.js +30 -0
- package/.medusa/server/src/providers/przelewy24/services/p24-cards.js +24 -0
- package/.medusa/server/src/providers/przelewy24/services/p24-provider.js +24 -0
- package/.medusa/server/src/providers/przelewy24/types/index.js +17 -0
- package/.medusa/server/src/utils/get-smallest-unit.js +33 -0
- package/README.md +324 -0
- package/package.json +91 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const widgetModule = { widgets: [] };
|
|
3
|
+
const routeModule = {
|
|
4
|
+
routes: []
|
|
5
|
+
};
|
|
6
|
+
const menuItemModule = {
|
|
7
|
+
menuItems: []
|
|
8
|
+
};
|
|
9
|
+
const formModule = { customFields: {} };
|
|
10
|
+
const displayModule = {
|
|
11
|
+
displays: {}
|
|
12
|
+
};
|
|
13
|
+
const plugin = {
|
|
14
|
+
widgetModule,
|
|
15
|
+
routeModule,
|
|
16
|
+
menuItemModule,
|
|
17
|
+
formModule,
|
|
18
|
+
displayModule
|
|
19
|
+
};
|
|
20
|
+
module.exports = plugin;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const widgetModule = { widgets: [] };
|
|
2
|
+
const routeModule = {
|
|
3
|
+
routes: []
|
|
4
|
+
};
|
|
5
|
+
const menuItemModule = {
|
|
6
|
+
menuItems: []
|
|
7
|
+
};
|
|
8
|
+
const formModule = { customFields: {} };
|
|
9
|
+
const displayModule = {
|
|
10
|
+
displays: {}
|
|
11
|
+
};
|
|
12
|
+
const plugin = {
|
|
13
|
+
widgetModule,
|
|
14
|
+
routeModule,
|
|
15
|
+
menuItemModule,
|
|
16
|
+
formModule,
|
|
17
|
+
displayModule
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
plugin as default
|
|
21
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const blikPaymentSchema = zod_1.z.object({
|
|
7
|
+
token: zod_1.z.string().min(1, "Token is required").max(100, "Token is too long"),
|
|
8
|
+
blikCode: zod_1.z.string().regex(/^\d{6}$/, "BLIK code must be exactly 6 digits"),
|
|
9
|
+
});
|
|
10
|
+
async function POST(req, res) {
|
|
11
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
12
|
+
try {
|
|
13
|
+
const validationResult = blikPaymentSchema.safeParse(req.body);
|
|
14
|
+
if (!validationResult.success) {
|
|
15
|
+
const errors = validationResult.error.errors.map((err) => `${err.path.join(".")}: ${err.message}`);
|
|
16
|
+
res.status(400).json({
|
|
17
|
+
error: "Validation failed",
|
|
18
|
+
details: errors,
|
|
19
|
+
});
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const { token, blikCode } = validationResult.data;
|
|
23
|
+
const posId = process.env.P24_POS_ID;
|
|
24
|
+
const apiKey = process.env.P24_API_KEY;
|
|
25
|
+
const sandbox = process.env.P24_IS_SANDBOX;
|
|
26
|
+
if (!posId || !apiKey) {
|
|
27
|
+
logger.error("P24 configuration missing: P24_POS_ID or P24_API_KEY not set");
|
|
28
|
+
res.status(500).json({
|
|
29
|
+
error: "Configuration error",
|
|
30
|
+
message: "P24 configuration is incomplete",
|
|
31
|
+
});
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const baseURL = sandbox
|
|
35
|
+
? "https://sandbox.przelewy24.pl/api/v1"
|
|
36
|
+
: "https://secure.przelewy24.pl/api/v1";
|
|
37
|
+
const url = `${baseURL}/paymentMethod/blik/chargeByCode`;
|
|
38
|
+
const credentials = Buffer.from(`${posId}:${apiKey}`).toString("base64");
|
|
39
|
+
const response = await fetch(url, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: {
|
|
42
|
+
"Content-Type": "application/json",
|
|
43
|
+
Authorization: `Basic ${credentials}`,
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify({
|
|
46
|
+
token,
|
|
47
|
+
blikCode,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
const errorText = await response.text();
|
|
52
|
+
logger.error(`P24 API request failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
53
|
+
res.status(400).json({
|
|
54
|
+
error: "P24 API request failed",
|
|
55
|
+
details: errorText,
|
|
56
|
+
status: response.status,
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const blikResponse = await response.json();
|
|
61
|
+
if (blikResponse.responseCode !== 0) {
|
|
62
|
+
logger.error(`BLIK payment failed: ${blikResponse.responseCode} - ${blikResponse.data?.message || "Unknown error"}`);
|
|
63
|
+
res.status(400).json({
|
|
64
|
+
error: "BLIK payment failed",
|
|
65
|
+
details: blikResponse.data?.message || "Unknown error",
|
|
66
|
+
responseCode: blikResponse.responseCode,
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// BLIK payment initiated successfully
|
|
71
|
+
// The actual payment confirmation will come via webhook
|
|
72
|
+
res.status(200).json({
|
|
73
|
+
success: true,
|
|
74
|
+
message: "BLIK payment initiated successfully",
|
|
75
|
+
data: {
|
|
76
|
+
token,
|
|
77
|
+
orderId: blikResponse.data.orderId,
|
|
78
|
+
message: blikResponse.data.message,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
logger.error(`Error processing BLIK payment: ${error?.message || "Unknown error"}`);
|
|
84
|
+
res.status(500).json({
|
|
85
|
+
error: "Internal server error",
|
|
86
|
+
message: error?.message || "Unknown error occurred",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3BheW1lbnRzL2JsaWsvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxvQkF3R0M7QUFoSEQscURBQXNFO0FBQ3RFLDZCQUF3QjtBQUV4QixNQUFNLGlCQUFpQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDakMsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQztJQUMzRSxRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsb0NBQW9DLENBQUM7Q0FDNUUsQ0FBQyxDQUFDO0FBRUksS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5FLElBQUksQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzlDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDakQsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNuQixLQUFLLEVBQUUs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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
async function GET(req, res) {
|
|
6
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
7
|
+
const { sessionId, status } = req.query;
|
|
8
|
+
try {
|
|
9
|
+
logger.info(`P24 payment return: sessionId=${sessionId}, status=${status}`);
|
|
10
|
+
// Redirect to frontend with payment result
|
|
11
|
+
const redirectUrl = process.env.FRONTEND_URL || "http://localhost:3000";
|
|
12
|
+
const returnUrl = `${redirectUrl}/payment/return?session_id=${sessionId}&status=${status}`;
|
|
13
|
+
res.redirect(302, returnUrl);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
logger.error(`Error handling P24 return: ${error?.message || "Unknown error"}`);
|
|
17
|
+
// Redirect to error page
|
|
18
|
+
const redirectUrl = process.env.FRONTEND_URL || "http://localhost:3000";
|
|
19
|
+
const errorUrl = `${redirectUrl}/payment/error`;
|
|
20
|
+
res.redirect(302, errorUrl);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3JldHVybi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLGtCQTBCQztBQTVCRCxxREFBc0U7QUFFL0QsS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBRXhDLElBQUksQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLFNBQVMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTVFLDJDQUEyQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSx1QkFBdUIsQ0FBQztRQUN4RSxNQUFNLFNBQVMsR0FBRyxHQUFHLFdBQVcsOEJBQThCLFNBQVMsV0FBVyxNQUFNLEVBQUUsQ0FBQztRQUUzRixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixNQUFNLENBQUMsS0FBSyxDQUNWLDhCQUE4QixLQUFLLEVBQUUsT0FBTyxJQUFJLGVBQWUsRUFBRSxDQUNsRSxDQUFDO1FBRUYseUJBQXlCO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLHVCQUF1QixDQUFDO1FBQ3hFLE1BQU0sUUFBUSxHQUFHLEdBQUcsV0FBVyxnQkFBZ0IsQ0FBQztRQUVoRCxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0FBQ0gsQ0FBQyJ9
|