@gmisoftware/przelewy24-payments-medusa 0.0.6 → 0.1.0
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/api/payments/blik/route.js +7 -83
- package/.medusa/server/src/api/store/payments/blik/charge/route.js +46 -0
- package/.medusa/server/src/api/store/payments/card/charge/route.js +69 -0
- package/.medusa/server/src/api/store/payments/transaction/status/route.js +42 -0
- package/.medusa/server/src/api/store/payments/utils/charge-helper.js +125 -0
- package/.medusa/server/src/api/store/payments/visa-mobile/charge/route.js +58 -0
- package/.medusa/server/src/jobs/reconcile-p24-payments.js +106 -0
- package/.medusa/server/src/providers/przelewy24/core/p24-base.js +301 -328
- package/.medusa/server/src/providers/przelewy24/core/p24-transaction-status.js +36 -0
- package/.medusa/server/src/providers/przelewy24/core/p24-webhook.js +129 -0
- package/.medusa/server/src/providers/przelewy24/index.js +8 -10
- package/.medusa/server/src/providers/przelewy24/services/index.js +4 -2
- package/.medusa/server/src/providers/przelewy24/services/p24-api.js +175 -18
- package/.medusa/server/src/providers/przelewy24/services/p24-blik.js +14 -4
- package/.medusa/server/src/providers/przelewy24/services/p24-cards.js +93 -4
- package/.medusa/server/src/providers/przelewy24/services/p24-provider.js +2 -3
- package/.medusa/server/src/providers/przelewy24/services/p24-visa-mobile.js +49 -0
- package/.medusa/server/src/providers/przelewy24/types/index.js +11 -2
- package/.medusa/server/src/utils/coerce-sandbox.js +19 -0
- package/.medusa/server/src/utils/p24-errors.js +126 -0
- package/.medusa/server/src/utils/p24-logger.js +59 -0
- package/.medusa/server/src/utils/p24-payment-methods.js +125 -0
- package/.medusa/server/src/utils/p24-session-data.js +54 -0
- package/.medusa/server/src/utils/payment-job-errors.js +39 -0
- package/README.md +166 -63
- package/package.json +1 -1
|
@@ -2,89 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.POST = POST;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
5
|
+
const route_js_1 = require("../../store/payments/blik/charge/route.js");
|
|
6
|
+
/**
|
|
7
|
+
* @deprecated Use POST /store/payments/blik/charge instead.
|
|
8
|
+
*/
|
|
10
9
|
async function POST(req, res) {
|
|
11
10
|
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
}
|
|
11
|
+
logger.warn("Deprecated route /payments/blik called. Use /store/payments/blik/charge instead.");
|
|
12
|
+
return (0, route_js_1.POST)(req, res);
|
|
89
13
|
}
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3BheW1lbnRzL2JsaWsvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxvQkFPQztBQWRELHFEQUFzRTtBQUV0RSx3RUFBc0Y7QUFFdEY7O0dBRUc7QUFDSSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsTUFBTSxDQUFDLElBQUksQ0FDVCxrRkFBa0YsQ0FDbkYsQ0FBQztJQUVGLE9BQU8sSUFBQSxlQUFpQixFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQyxDQUFDIn0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const charge_helper_1 = require("../../utils/charge-helper");
|
|
6
|
+
const types_1 = require("../../../../../providers/przelewy24/types");
|
|
7
|
+
const BLIK_PROVIDER_ID = `pp_${types_1.PaymentProviderKeys.P24_BLIK}_przelewy24`;
|
|
8
|
+
const blikChargeSchema = zod_1.z.object({
|
|
9
|
+
token: zod_1.z.string().min(1, "Token is required").max(200, "Token is too long"),
|
|
10
|
+
blikCode: zod_1.z.string().regex(/^\d{6}$/, "BLIK code must be exactly 6 digits"),
|
|
11
|
+
payment_session_id: zod_1.z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1, "Payment session id is required"),
|
|
14
|
+
});
|
|
15
|
+
async function POST(req, res) {
|
|
16
|
+
const validationResult = blikChargeSchema.safeParse(req.body);
|
|
17
|
+
if (!validationResult.success) {
|
|
18
|
+
const errors = validationResult.error.errors.map((err) => `${err.path.join(".")}: ${err.message}`);
|
|
19
|
+
return res.status(400).json({
|
|
20
|
+
error: "Validation failed",
|
|
21
|
+
details: errors,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const { token, blikCode, payment_session_id } = validationResult.data;
|
|
25
|
+
try {
|
|
26
|
+
await (0, charge_helper_1.assertBlikChargeMatchesPaymentSession)(req, payment_session_id, token, BLIK_PROVIDER_ID);
|
|
27
|
+
const provider = (0, charge_helper_1.resolveP24Provider)(req, types_1.PaymentProviderKeys.P24_BLIK);
|
|
28
|
+
const result = await (0, charge_helper_1.handleP24Charge)({
|
|
29
|
+
req,
|
|
30
|
+
paymentSessionId: payment_session_id,
|
|
31
|
+
execute: async () => {
|
|
32
|
+
const response = await provider.chargeBlikPayment(token, blikCode);
|
|
33
|
+
return (0, charge_helper_1.parseP24ChargeResponse)(response);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
return res.status(200).json(result);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const message = error instanceof Error ? error.message : "BLIK payment failed";
|
|
40
|
+
return res.status(400).json({
|
|
41
|
+
error: "BLIK payment failed",
|
|
42
|
+
message,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BheW1lbnRzL2JsaWsvY2hhcmdlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0JBLG9CQWdEQztBQXJFRCw2QkFBd0I7QUFHeEIsNkRBS21DO0FBQ25DLHFFQUFnRjtBQUVoRixNQUFNLGdCQUFnQixHQUFHLE1BQU0sMkJBQW1CLENBQUMsUUFBUSxhQUFhLENBQUM7QUFFekUsTUFBTSxnQkFBZ0IsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2hDLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUM7SUFDM0UsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLG9DQUFvQyxDQUFDO0lBQzNFLGtCQUFrQixFQUFFLE9BQUM7U0FDbEIsTUFBTSxFQUFFO1NBQ1IsR0FBRyxDQUFDLENBQUMsRUFBRSxnQ0FBZ0MsQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFFSSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUNqRCxDQUFDO1FBRUYsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLE9BQU8sRUFBRSxNQUFNO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztJQUV0RSxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUEscURBQXFDLEVBQ3pDLEdBQUcsRUFDSCxrQkFBa0IsRUFDbEIsS0FBSyxFQUNMLGdCQUFnQixDQUNqQixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBa0IsRUFDakMsR0FBRyxFQUNILDJCQUFtQixDQUFDLFFBQVEsQ0FDN0IsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSwrQkFBZSxFQUFDO1lBQ25DLEdBQUc7WUFDSCxnQkFBZ0IsRUFBRSxrQkFBa0I7WUFDcEMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sSUFBQSxzQ0FBc0IsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sT0FBTyxHQUNYLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBRWpFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLHFCQUFxQjtZQUM1QixPQUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,69 @@
|
|
|
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 charge_helper_1 = require("../../utils/charge-helper");
|
|
7
|
+
const types_1 = require("../../../../../providers/przelewy24/types");
|
|
8
|
+
const p24_session_data_1 = require("../../../../../utils/p24-session-data");
|
|
9
|
+
const CARDS_PROVIDER_ID = `pp_${types_1.PaymentProviderKeys.P24_CARDS}_przelewy24`;
|
|
10
|
+
const cardRegisterSchema = zod_1.z.object({
|
|
11
|
+
ref_id: zod_1.z.string().min(1, "Card reference id is required").max(200),
|
|
12
|
+
payment_session_id: zod_1.z.string().min(1, "Payment session id is required"),
|
|
13
|
+
});
|
|
14
|
+
async function POST(req, res) {
|
|
15
|
+
const validationResult = cardRegisterSchema.safeParse(req.body);
|
|
16
|
+
if (!validationResult.success) {
|
|
17
|
+
const errors = validationResult.error.errors.map((err) => `${err.path.join(".")}: ${err.message}`);
|
|
18
|
+
return res.status(400).json({
|
|
19
|
+
error: "Validation failed",
|
|
20
|
+
details: errors,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const { ref_id, payment_session_id } = validationResult.data;
|
|
24
|
+
try {
|
|
25
|
+
const paymentModule = req.scope.resolve(utils_1.Modules.PAYMENT);
|
|
26
|
+
const paymentSession = await paymentModule.retrievePaymentSession(payment_session_id);
|
|
27
|
+
(0, charge_helper_1.assertPaymentSessionProvider)(paymentSession, CARDS_PROVIDER_ID);
|
|
28
|
+
const provider = (0, charge_helper_1.resolveP24Provider)(req, types_1.PaymentProviderKeys.P24_CARDS);
|
|
29
|
+
const result = await provider.registerWithRefId({
|
|
30
|
+
refId: ref_id,
|
|
31
|
+
input: {
|
|
32
|
+
amount: paymentSession.amount,
|
|
33
|
+
currency_code: paymentSession.currency_code,
|
|
34
|
+
context: {
|
|
35
|
+
idempotency_key: (0, charge_helper_1.resolvePaymentSessionIdempotencyKey)(paymentSession),
|
|
36
|
+
},
|
|
37
|
+
data: {
|
|
38
|
+
...(paymentSession.data ?? {}),
|
|
39
|
+
regulation_accept: true,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
await paymentModule.updatePaymentSession({
|
|
44
|
+
id: payment_session_id,
|
|
45
|
+
amount: paymentSession.amount,
|
|
46
|
+
currency_code: paymentSession.currency_code,
|
|
47
|
+
data: (0, p24_session_data_1.normalizeP24SessionData)({
|
|
48
|
+
...(paymentSession.data ?? {}),
|
|
49
|
+
...(result.sessionData ?? {}),
|
|
50
|
+
pending_card_tokenization: false,
|
|
51
|
+
token: result.token,
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
return res.status(200).json({
|
|
55
|
+
success: true,
|
|
56
|
+
token: result.token,
|
|
57
|
+
chargeScriptUrl: result.chargeScriptUrl,
|
|
58
|
+
sessionId: result.sessionId,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const message = error instanceof Error ? error.message : "Card payment failed";
|
|
63
|
+
return res.status(400).json({
|
|
64
|
+
error: "Card payment failed",
|
|
65
|
+
message,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BheW1lbnRzL2NhcmQvY2hhcmdlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLG9CQXNFQztBQXpGRCxxREFBb0Q7QUFDcEQsNkJBQXdCO0FBR3hCLDZEQUltQztBQUNuQyxxRUFBZ0Y7QUFDaEYsNEVBQWdGO0FBRWhGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSwyQkFBbUIsQ0FBQyxTQUFTLGFBQWEsQ0FBQztBQUUzRSxNQUFNLGtCQUFrQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDbEMsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLCtCQUErQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUNuRSxrQkFBa0IsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxnQ0FBZ0MsQ0FBQztDQUN4RSxDQUFDLENBQUM7QUFFSSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWhFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUNqRCxDQUFDO1FBRUYsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZ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
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const charge_helper_1 = require("../../utils/charge-helper");
|
|
6
|
+
const types_1 = require("../../../../../providers/przelewy24/types");
|
|
7
|
+
const statusSchema = zod_1.z.object({
|
|
8
|
+
session_id: zod_1.z.string().min(1),
|
|
9
|
+
provider_key: zod_1.z.nativeEnum(types_1.PaymentProviderKeys).optional(),
|
|
10
|
+
provider_id: zod_1.z.string().min(1).optional(),
|
|
11
|
+
});
|
|
12
|
+
async function POST(req, res) {
|
|
13
|
+
const validationResult = statusSchema.safeParse(req.body);
|
|
14
|
+
if (!validationResult.success) {
|
|
15
|
+
return res.status(400).json({
|
|
16
|
+
error: "Validation failed",
|
|
17
|
+
details: validationResult.error.errors.map((err) => `${err.path.join(".")}: ${err.message}`),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const { session_id, provider_key, provider_id } = validationResult.data;
|
|
21
|
+
try {
|
|
22
|
+
const providerKey = (0, charge_helper_1.resolveP24ProviderKeyForStatus)({
|
|
23
|
+
provider_key,
|
|
24
|
+
provider_id,
|
|
25
|
+
});
|
|
26
|
+
const provider = (0, charge_helper_1.resolveP24Provider)(req, providerKey);
|
|
27
|
+
const { medusaStatus, p24Status } = await provider.queryTransactionStatus(session_id);
|
|
28
|
+
return res.status(200).json({
|
|
29
|
+
session_id,
|
|
30
|
+
p24_status: p24Status,
|
|
31
|
+
status: medusaStatus,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const message = error instanceof Error ? error.message : "Failed to query transaction status";
|
|
36
|
+
return res.status(400).json({
|
|
37
|
+
error: "Failed to query transaction status",
|
|
38
|
+
message,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BheW1lbnRzL3RyYW5zYWN0aW9uL3N0YXR1cy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdCQSxvQkEyQ0M7QUExREQsNkJBQXdCO0FBRXhCLDZEQUltQztBQUNuQyxxRUFBZ0Y7QUFFaEYsTUFBTSxZQUFZLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QixVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0IsWUFBWSxFQUFFLE9BQUMsQ0FBQyxVQUFVLENBQUMsMkJBQW1CLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDMUQsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0NBQzFDLENBQUMsQ0FBQztBQUVJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTFELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsT0FBTyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUN4QyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQ2pEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztJQUV4RSxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFBLDhDQUE4QixFQUFDO1lBQ2pELFlBQVk7WUFDWixXQUFXO1NBQ1osQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBa0IsRUFDakMsR0FBRyxFQUNILFdBQVcsQ0FDWixDQUFDO1FBRUYsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxzQkFBc0IsQ0FDdkUsVUFBVSxDQUNYLENBQUM7UUFFRixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLFVBQVU7WUFDVixVQUFVLEVBQUUsU0FBUztZQUNyQixNQUFNLEVBQUUsWUFBWTtTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sT0FBTyxHQUNYLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG9DQUFvQyxDQUFDO1FBRWhGLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLG9DQUFvQztZQUMzQyxPQUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.markPaymentSessionError = markPaymentSessionError;
|
|
4
|
+
exports.parseP24ChargeResponse = parseP24ChargeResponse;
|
|
5
|
+
exports.handleP24Charge = handleP24Charge;
|
|
6
|
+
exports.resolvePaymentProviderById = resolvePaymentProviderById;
|
|
7
|
+
exports.assertPaymentSessionProvider = assertPaymentSessionProvider;
|
|
8
|
+
exports.resolvePaymentSessionIdempotencyKey = resolvePaymentSessionIdempotencyKey;
|
|
9
|
+
exports.assertBlikChargeMatchesPaymentSession = assertBlikChargeMatchesPaymentSession;
|
|
10
|
+
exports.resolveP24ProviderKeyForStatus = resolveP24ProviderKeyForStatus;
|
|
11
|
+
exports.resolveP24Provider = resolveP24Provider;
|
|
12
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
13
|
+
const p24_errors_1 = require("../../../../utils/p24-errors");
|
|
14
|
+
const types_1 = require("../../../../providers/przelewy24/types");
|
|
15
|
+
async function markPaymentSessionError(req, paymentSessionId, errorMessage) {
|
|
16
|
+
const paymentModule = req.scope.resolve(utils_1.Modules.PAYMENT);
|
|
17
|
+
const session = await paymentModule.retrievePaymentSession(paymentSessionId);
|
|
18
|
+
await paymentModule.updatePaymentSession({
|
|
19
|
+
id: paymentSessionId,
|
|
20
|
+
amount: session.amount,
|
|
21
|
+
currency_code: session.currency_code,
|
|
22
|
+
status: utils_1.PaymentSessionStatus.ERROR,
|
|
23
|
+
data: {
|
|
24
|
+
...(session.data ?? {}),
|
|
25
|
+
error_message: errorMessage,
|
|
26
|
+
failed_at: new Date().toISOString(),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function parseP24ChargeResponse(response) {
|
|
31
|
+
if (response.responseCode !== 0) {
|
|
32
|
+
throw new Error((0, p24_errors_1.buildLocalizedP24ErrorMessage)(response, (typeof response.data?.message === "string"
|
|
33
|
+
? response.data.message
|
|
34
|
+
: response.message) || "Payment charge failed"));
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
orderId: typeof response.data?.orderId === "number"
|
|
38
|
+
? response.data.orderId
|
|
39
|
+
: undefined,
|
|
40
|
+
redirectUrl: typeof response.data?.redirectUrl === "string"
|
|
41
|
+
? response.data.redirectUrl
|
|
42
|
+
: undefined,
|
|
43
|
+
message: typeof response.data?.message === "string"
|
|
44
|
+
? response.data.message
|
|
45
|
+
: undefined,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async function handleP24Charge({ req, paymentSessionId, execute, }) {
|
|
49
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
50
|
+
try {
|
|
51
|
+
const result = await execute();
|
|
52
|
+
return {
|
|
53
|
+
success: true,
|
|
54
|
+
orderId: result.orderId,
|
|
55
|
+
redirectUrl: result.redirectUrl,
|
|
56
|
+
message: result.message,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const message = error instanceof Error ? error.message : "Unknown payment charge error";
|
|
61
|
+
logger.error(`[p24-charge] ${message}`);
|
|
62
|
+
if (paymentSessionId) {
|
|
63
|
+
await markPaymentSessionError(req, paymentSessionId, message).catch((markError) => {
|
|
64
|
+
logger.error(`[p24-charge] Failed to mark payment session ${paymentSessionId} as error: ${markError instanceof Error ? markError.message : "unknown"}`);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function resolvePaymentProviderById(container, providerId) {
|
|
71
|
+
const paymentModule = container.resolve(utils_1.Modules.PAYMENT);
|
|
72
|
+
return paymentModule.__container__.paymentProviderService.retrieveProvider(providerId);
|
|
73
|
+
}
|
|
74
|
+
function assertPaymentSessionProvider(session, expectedProviderId) {
|
|
75
|
+
if (session.provider_id !== expectedProviderId) {
|
|
76
|
+
throw new Error("Payment session provider mismatch");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function resolvePaymentSessionIdempotencyKey(session) {
|
|
80
|
+
const medusaPaymentSessionId = session.data?.medusa_payment_session_id;
|
|
81
|
+
if (typeof medusaPaymentSessionId === "string" &&
|
|
82
|
+
medusaPaymentSessionId.length > 0) {
|
|
83
|
+
return medusaPaymentSessionId;
|
|
84
|
+
}
|
|
85
|
+
return session.id;
|
|
86
|
+
}
|
|
87
|
+
async function assertBlikChargeMatchesPaymentSession(req, paymentSessionId, token, expectedProviderId) {
|
|
88
|
+
const paymentModule = req.scope.resolve(utils_1.Modules.PAYMENT);
|
|
89
|
+
const session = await paymentModule.retrievePaymentSession(paymentSessionId);
|
|
90
|
+
assertPaymentSessionProvider(session, expectedProviderId);
|
|
91
|
+
const sessionToken = typeof session.data?.token === "string" ? session.data.token : undefined;
|
|
92
|
+
if (!sessionToken || sessionToken !== token) {
|
|
93
|
+
throw new Error("Payment session token mismatch");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function isPaymentProviderKey(value) {
|
|
97
|
+
return Object.values(types_1.PaymentProviderKeys).includes(value);
|
|
98
|
+
}
|
|
99
|
+
function resolveProviderKeyFromProviderId(providerId) {
|
|
100
|
+
const match = providerId.match(/^pp_(.+)_przelewy24$/);
|
|
101
|
+
if (match && isPaymentProviderKey(match[1])) {
|
|
102
|
+
return match[1];
|
|
103
|
+
}
|
|
104
|
+
throw new Error("Unsupported payment provider");
|
|
105
|
+
}
|
|
106
|
+
function resolveP24ProviderKeyForStatus(input) {
|
|
107
|
+
const providerKeyFromId = input.provider_id
|
|
108
|
+
? resolveProviderKeyFromProviderId(input.provider_id)
|
|
109
|
+
: undefined;
|
|
110
|
+
if (input.provider_key) {
|
|
111
|
+
if (providerKeyFromId && providerKeyFromId !== input.provider_key) {
|
|
112
|
+
throw new Error("Payment provider mismatch");
|
|
113
|
+
}
|
|
114
|
+
return input.provider_key;
|
|
115
|
+
}
|
|
116
|
+
if (providerKeyFromId) {
|
|
117
|
+
return providerKeyFromId;
|
|
118
|
+
}
|
|
119
|
+
return types_1.PaymentProviderKeys.P24_BLIK;
|
|
120
|
+
}
|
|
121
|
+
function resolveP24Provider(req, providerKey) {
|
|
122
|
+
const providerId = `pp_${providerKey}_przelewy24`;
|
|
123
|
+
return resolvePaymentProviderById(req.scope, providerId);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmdlLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvcGF5bWVudHMvdXRpbHMvY2hhcmdlLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZCQSwwREFtQkM7QUFFRCx3REE0QkM7QUFFRCwwQ0FvQ0M7QUFtQkQsZ0VBV0M7QUFFRCxvRUFPQztBQUVELGtGQWNDO0FBRUQsc0ZBaUJDO0FBMEJELHdFQXFCQztBQUVELGdEQU9DO0FBclBELHFEQUltQztBQUNuQyw2REFBNkU7QUFDN0Usa0VBQTZFO0FBc0J0RSxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLEdBQWtCLEVBQ2xCLGdCQUF3QixFQUN4QixZQUFvQjtJQUVwQixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3RSxNQUFNLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztRQUN2QyxFQUFFLEVBQUUsZ0JBQWdCO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7UUFDcEMsTUFBTSxFQUFFLDRCQUFvQixDQUFDLEtBQUs7UUFDbEMsSUFBSSxFQUFFO1lBQ0osR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLGFBQWEsRUFBRSxZQUFZO1lBQzNCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtTQUNwQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FDcEMsUUFBMkI7SUFFM0IsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsSUFBQSwwQ0FBNkIsRUFDM0IsUUFBUSxFQUNSLENBQUMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxRQUFRO1lBQ3pDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSx1QkFBdUIsQ0FDakQsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLEVBQ0wsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxRQUFRO1lBQ3hDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDdkIsQ0FBQyxDQUFDLFNBQVM7UUFDZixXQUFXLEVBQ1QsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxRQUFRO1lBQzVDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFDM0IsQ0FBQyxDQUFDLFNBQVM7UUFDZixPQUFPLEVBQ0wsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxRQUFRO1lBQ3hDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDdkIsQ0FBQyxDQUFDLFNBQVM7S0FDaEIsQ0FBQztBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsZUFBZSxDQUFDLEVBQ3BDLEdBQUcsRUFDSCxnQkFBZ0IsRUFDaEIsT0FBTyxHQUNXO0lBQ2xCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5FLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxFQUFFLENBQUM7UUFFL0IsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87U0FDeEIsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQ1gsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUM7UUFFMUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUV4QyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUNqRSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNaLE1BQU0sQ0FBQyxLQUFLLENBQ1YsK0NBQStDLGdCQUFnQixjQUM3RCxTQUFTLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUNuRCxFQUFFLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFtQkQsU0FBZ0IsMEJBQTBCLENBQ3hDLFNBQXdCLEVBQ3hCLFVBQWtCO0lBRWxCLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3JDLGVBQU8sQ0FBQyxPQUFPLENBQ2lDLENBQUM7SUFFbkQsT0FBTyxhQUFhLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUN4RSxVQUFVLENBQ1gsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQiw0QkFBNEIsQ0FDMUMsT0FBZ0MsRUFDaEMsa0JBQTBCO0lBRTFCLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN2RCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLG1DQUFtQyxDQUFDLE9BR25EO0lBQ0MsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHlCQUF5QixDQUFDO0lBRXZFLElBQ0UsT0FBTyxzQkFBc0IsS0FBSyxRQUFRO1FBQzFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2pDLENBQUM7UUFDRCxPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVNLEtBQUssVUFBVSxxQ0FBcUMsQ0FDekQsR0FBa0IsRUFDbEIsZ0JBQXdCLEVBQ3hCLEtBQWEsRUFDYixrQkFBMEI7SUFFMUIsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFN0UsNEJBQTRCLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFMUQsTUFBTSxZQUFZLEdBQ2hCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRTNFLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0FBQ0gsQ0FBQztBQVFELFNBQVMsb0JBQW9CLENBQUMsS0FBYTtJQUN6QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsMkJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQ2hELEtBQTRCLENBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FDdkMsVUFBa0I7SUFFbEIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBRXZELElBQUksS0FBSyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBZ0IsOEJBQThCLENBQUMsS0FHOUM7SUFDQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxXQUFXO1FBQ3pDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QixJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixLQUFLLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RCLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU8sMkJBQW1CLENBQUMsUUFBUSxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FDaEMsR0FBa0IsRUFDbEIsV0FBbUI7SUFFbkIsTUFBTSxVQUFVLEdBQUcsTUFBTSxXQUFXLGFBQWEsQ0FBQztJQUVsRCxPQUFPLDBCQUEwQixDQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDOUQsQ0FBQyJ9
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const charge_helper_1 = require("../../utils/charge-helper");
|
|
6
|
+
const types_1 = require("../../../../../providers/przelewy24/types");
|
|
7
|
+
const PL_PHONE_REGEX = /^(\+?48)?\d{9}$/;
|
|
8
|
+
function normalizePolishPhone(phone) {
|
|
9
|
+
const digitsOnly = phone.replace(/\D/g, "");
|
|
10
|
+
if (digitsOnly.length === 9) {
|
|
11
|
+
return `48${digitsOnly}`;
|
|
12
|
+
}
|
|
13
|
+
if (digitsOnly.length === 11 && digitsOnly.startsWith("48")) {
|
|
14
|
+
return digitsOnly;
|
|
15
|
+
}
|
|
16
|
+
throw new Error("Invalid Polish mobile phone number");
|
|
17
|
+
}
|
|
18
|
+
const visaMobileChargeSchema = zod_1.z.object({
|
|
19
|
+
token: zod_1.z.string().min(1, "Token is required").max(200, "Token is too long"),
|
|
20
|
+
phone: zod_1.z
|
|
21
|
+
.string()
|
|
22
|
+
.min(9, "Phone number is required")
|
|
23
|
+
.max(15, "Phone number is too long")
|
|
24
|
+
.regex(PL_PHONE_REGEX, "Invalid Polish mobile phone number"),
|
|
25
|
+
payment_session_id: zod_1.z.string().min(1).optional(),
|
|
26
|
+
});
|
|
27
|
+
async function POST(req, res) {
|
|
28
|
+
const validationResult = visaMobileChargeSchema.safeParse(req.body);
|
|
29
|
+
if (!validationResult.success) {
|
|
30
|
+
const errors = validationResult.error.errors.map((err) => `${err.path.join(".")}: ${err.message}`);
|
|
31
|
+
return res.status(400).json({
|
|
32
|
+
error: "Validation failed",
|
|
33
|
+
details: errors,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const { token, phone, payment_session_id } = validationResult.data;
|
|
37
|
+
try {
|
|
38
|
+
const normalizedPhone = normalizePolishPhone(phone);
|
|
39
|
+
const provider = (0, charge_helper_1.resolveP24Provider)(req, types_1.PaymentProviderKeys.P24_VISA_MOBILE);
|
|
40
|
+
const result = await (0, charge_helper_1.handleP24Charge)({
|
|
41
|
+
req,
|
|
42
|
+
paymentSessionId: payment_session_id,
|
|
43
|
+
execute: async () => {
|
|
44
|
+
const response = await provider.chargeVisaMobilePayment(token, normalizedPhone);
|
|
45
|
+
return (0, charge_helper_1.parseP24ChargeResponse)(response);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return res.status(200).json(result);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const message = error instanceof Error ? error.message : "Visa Mobile payment failed";
|
|
52
|
+
return res.status(400).json({
|
|
53
|
+
error: "Visa Mobile payment failed",
|
|
54
|
+
message,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BheW1lbnRzL3Zpc2EtbW9iaWxlL2NoYXJnZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXFDQSxvQkE2Q0M7QUFqRkQsNkJBQXdCO0FBR3hCLDZEQUltQztBQUNuQyxxRUFBZ0Y7QUFFaEYsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUM7QUFFekMsU0FBUyxvQkFBb0IsQ0FBQyxLQUFhO0lBQ3pDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTVDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sc0JBQXNCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDO0lBQzNFLEtBQUssRUFBRSxPQUFDO1NBQ0wsTUFBTSxFQUFFO1NBQ1IsR0FBRyxDQUFDLENBQUMsRUFBRSwwQkFBMEIsQ0FBQztTQUNsQyxHQUFHLENBQUMsRUFBRSxFQUFFLDBCQUEwQixDQUFDO1NBQ25DLEtBQUssQ0FBQyxjQUFjLEVBQUUsb0NBQW9DLENBQUM7SUFDOUQsa0JBQWtCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDakQsQ0FBQyxDQUFDO0FBRUksS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzlDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDakQsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7SUFFbkUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBa0IsRUFDakMsR0FBRyxFQUNILDJCQUFtQixDQUFDLGVBQWUsQ0FDcEMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSwrQkFBZSxFQUFDO1lBQ25DLEdBQUc7WUFDSCxnQkFBZ0IsRUFBRSxrQkFBa0I7WUFDcEMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyx1QkFBdUIsQ0FDckQsS0FBSyxFQUNMLGVBQWUsQ0FDaEIsQ0FBQztnQkFDRixPQUFPLElBQUEsc0NBQXNCLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLE9BQU8sR0FDWCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQztRQUV4RSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLEtBQUssRUFBRSw0QkFBNEI7WUFDbkMsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = reconcileP24PaymentsJob;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
8
|
+
const charge_helper_1 = require("../api/store/payments/utils/charge-helper");
|
|
9
|
+
const payment_job_errors_1 = require("../utils/payment-job-errors");
|
|
10
|
+
const P24_PROVIDER_PREFIX = 'pp_p24';
|
|
11
|
+
const RECONCILE_AFTER_MINUTES = 5;
|
|
12
|
+
const RECONCILE_MAX_AGE_HOURS = 48;
|
|
13
|
+
const RECONCILE_BATCH_SIZE = 50;
|
|
14
|
+
const RECONCILEABLE_STATUSES = ['pending', 'requires_more', 'authorized'];
|
|
15
|
+
function hasRegisteredP24Transaction(sessionData) {
|
|
16
|
+
if (sessionData.pending_card_tokenization === true) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return Boolean(sessionData.token ||
|
|
20
|
+
sessionData.order_id ||
|
|
21
|
+
sessionData.orderId);
|
|
22
|
+
}
|
|
23
|
+
async function reconcileP24PaymentsJob(container) {
|
|
24
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
25
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
26
|
+
const cutoff = new Date(Date.now() - RECONCILE_AFTER_MINUTES * 60 * 1000);
|
|
27
|
+
const maxAge = new Date(Date.now() - RECONCILE_MAX_AGE_HOURS * 60 * 60 * 1000);
|
|
28
|
+
const { data: paymentSessions } = await query.graph({
|
|
29
|
+
entity: 'payment_session',
|
|
30
|
+
fields: [
|
|
31
|
+
'id',
|
|
32
|
+
'status',
|
|
33
|
+
'provider_id',
|
|
34
|
+
'data',
|
|
35
|
+
'amount',
|
|
36
|
+
'updated_at',
|
|
37
|
+
'deleted_at',
|
|
38
|
+
'payment_collection.payments.id',
|
|
39
|
+
'payment_collection.payments.captured_at',
|
|
40
|
+
],
|
|
41
|
+
filters: {
|
|
42
|
+
provider_id: { $like: `${P24_PROVIDER_PREFIX}%` },
|
|
43
|
+
status: { $in: [...RECONCILEABLE_STATUSES] },
|
|
44
|
+
deleted_at: null,
|
|
45
|
+
updated_at: {
|
|
46
|
+
$lte: cutoff.toISOString(),
|
|
47
|
+
$gte: maxAge.toISOString(),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
pagination: {
|
|
51
|
+
take: RECONCILE_BATCH_SIZE,
|
|
52
|
+
order: {
|
|
53
|
+
updated_at: 'DESC',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
let reconciled = 0;
|
|
58
|
+
for (const session of paymentSessions ?? []) {
|
|
59
|
+
const sessionData = (session.data ?? {});
|
|
60
|
+
if (!hasRegisteredP24Transaction(sessionData)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const p24SessionId = sessionData.session_id ||
|
|
64
|
+
sessionData.sessionId ||
|
|
65
|
+
session.id;
|
|
66
|
+
try {
|
|
67
|
+
const providerId = session.provider_id;
|
|
68
|
+
const provider = (0, charge_helper_1.resolvePaymentProviderById)(container, providerId);
|
|
69
|
+
const { medusaStatus } = await provider.queryTransactionStatus(p24SessionId);
|
|
70
|
+
if (medusaStatus !== 'captured' && medusaStatus !== 'authorized') {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const payments = session.payment_collection?.payments ?? [];
|
|
74
|
+
const hasCapturedPayment = payments.some((payment) => Boolean(payment?.captured_at));
|
|
75
|
+
if (hasCapturedPayment) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
await (0, core_flows_1.processPaymentWorkflow)(container).run({
|
|
79
|
+
input: {
|
|
80
|
+
action: utils_2.PaymentActions.SUCCESSFUL,
|
|
81
|
+
data: {
|
|
82
|
+
session_id: session.id,
|
|
83
|
+
amount: session.amount,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
reconciled += 1;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const message = (0, payment_job_errors_1.getJobErrorMessage)(error);
|
|
91
|
+
if ((0, payment_job_errors_1.isExpectedStalePaymentJobFailure)(error)) {
|
|
92
|
+
logger.debug(`[p24-reconcile] Skipping payment session ${session.id}: ${message}`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
logger.error(`[p24-reconcile] Failed to reconcile payment session ${session.id}: ${message}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (reconciled > 0) {
|
|
99
|
+
logger.info(`[p24-reconcile] Reconciled ${reconciled} payment session(s)`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.config = {
|
|
103
|
+
name: 'reconcile-p24-payments',
|
|
104
|
+
schedule: '*/5 * * * *',
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25jaWxlLXAyNC1wYXltZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3JlY29uY2lsZS1wMjQtcGF5bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBZ0NBLDBDQTJHQztBQTFJRCxxREFBcUU7QUFDckUsNERBQW9FO0FBQ3BFLHFEQUEwRDtBQUUxRCw2RUFBOEg7QUFDOUgsb0VBR29DO0FBRXBDLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFBO0FBQ3BDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFBO0FBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFBO0FBQ2xDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFBO0FBRS9CLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBVSxDQUFBO0FBRWxGLFNBQVMsMkJBQTJCLENBQ2xDLFdBQW9DO0lBRXBDLElBQUksV0FBVyxDQUFDLHlCQUF5QixLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25ELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUNaLFdBQVcsQ0FBQyxLQUFLO1FBQ2YsV0FBVyxDQUFDLFFBQVE7UUFDcEIsV0FBVyxDQUFDLE9BQU8sQ0FDdEIsQ0FBQTtBQUNILENBQUM7QUFFYyxLQUFLLFVBQVUsdUJBQXVCLENBQ25ELFNBQTBCO0lBRTFCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lB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
|