@gmisoftware/przelewy24-payments-medusa 0.1.2 → 0.1.3
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,51 @@
|
|
|
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 tokenizationIntentSchema = zod_1.z.object({
|
|
9
|
+
amount: zod_1.z.number().positive("Amount must be greater than 0"),
|
|
10
|
+
currency_code: zod_1.z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1, "Currency code is required")
|
|
13
|
+
.max(10, "Currency code is too long"),
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Returns the data required to render the P24 card tokenization iframe without
|
|
17
|
+
* creating a payment session, payment collection, or P24 transaction.
|
|
18
|
+
*
|
|
19
|
+
* This lets the storefront mount the card widget the moment the customer
|
|
20
|
+
* selects "Cards" (e.g. during order-change settlement) while deferring any
|
|
21
|
+
* real commitment until the customer actually pays.
|
|
22
|
+
*/
|
|
23
|
+
async function POST(req, res) {
|
|
24
|
+
const validationResult = tokenizationIntentSchema.safeParse(req.body);
|
|
25
|
+
if (!validationResult.success) {
|
|
26
|
+
const errors = validationResult.error.errors.map((err) => `${err.path.join(".")}: ${err.message}`);
|
|
27
|
+
return res.status(400).json({
|
|
28
|
+
error: "Validation failed",
|
|
29
|
+
details: errors,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const { amount, currency_code } = validationResult.data;
|
|
33
|
+
try {
|
|
34
|
+
const provider = (0, charge_helper_1.resolveP24Provider)(req, types_1.PaymentProviderKeys.P24_CARDS);
|
|
35
|
+
const intent = provider.createCardTokenizationIntent({
|
|
36
|
+
amount,
|
|
37
|
+
currency_code,
|
|
38
|
+
});
|
|
39
|
+
return res.status(200).json(intent);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
43
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
44
|
+
logger.error(`[p24-card-tokenization-intent] ${message}`);
|
|
45
|
+
return res.status(500).json({
|
|
46
|
+
error: "Card tokenization intent failed",
|
|
47
|
+
message: "Failed to create card tokenization intent",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BheW1lbnRzL2NhcmQvdG9rZW5pemF0aW9uLWludGVudC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdCQSxvQkF3Q0M7QUEvREQscURBQXNFO0FBQ3RFLDZCQUF3QjtBQUd4Qiw2REFBK0Q7QUFDL0QscUVBQWdGO0FBRWhGLE1BQU0sd0JBQXdCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN4QyxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQztJQUM1RCxhQUFhLEVBQUUsT0FBQztTQUNiLE1BQU0sRUFBRTtTQUNSLEdBQUcsQ0FBQyxDQUFDLEVBQUUsMkJBQTJCLENBQUM7U0FDbkMsR0FBRyxDQUFDLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQztDQUN4QyxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0ksS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzlDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDakQsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7SUFFeEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQ0FBa0IsRUFDakMsR0FBRyxFQUNILDJCQUFtQixDQUFDLFNBQVMsQ0FDOUIsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQztZQUNuRCxNQUFNO1lBQ04sYUFBYTtTQUNkLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLE9BQU8sR0FDWCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFFM0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUUxRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLEtBQUssRUFBRSxpQ0FBaUM7WUFDeEMsT0FBTyxFQUFFLDJDQUEyQztTQUNyRCxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
6
7
|
const get_smallest_unit_1 = require("../../../utils/get-smallest-unit");
|
|
7
8
|
const p24_session_data_1 = require("../../../utils/p24-session-data");
|
|
8
9
|
const p24_base_1 = __importDefault(require("../core/p24-base"));
|
|
@@ -55,6 +56,10 @@ class P24CardsService extends p24_base_1.default {
|
|
|
55
56
|
id: p24SessionId,
|
|
56
57
|
data: (0, p24_session_data_1.normalizeP24SessionData)({
|
|
57
58
|
session_id: p24SessionId,
|
|
59
|
+
// Persist the P24 session id so the later transaction/register
|
|
60
|
+
// (POST /card/charge) reuses the exact session the widget tokenized
|
|
61
|
+
// against, regardless of the Medusa payment session idempotency key.
|
|
62
|
+
p24_session_id: p24SessionId,
|
|
58
63
|
medusa_payment_session_id: sessionId,
|
|
59
64
|
merchant_id: parseInt(this.options_.merchant_id),
|
|
60
65
|
card_tokenization_sign: tokenizationSign,
|
|
@@ -105,9 +110,29 @@ class P24CardsService extends p24_base_1.default {
|
|
|
105
110
|
sessionData: initiated.data,
|
|
106
111
|
};
|
|
107
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Build the data needed to render the P24 card tokenization iframe WITHOUT
|
|
115
|
+
* creating a payment session or P24 transaction.
|
|
116
|
+
*
|
|
117
|
+
* The tokenization signature only depends on `merchantId + sessionId + crc`
|
|
118
|
+
* (not the amount), so this is a pure, side-effect-free computation. The
|
|
119
|
+
* returned `session_id` must later be passed back (as `p24_session_id`) when
|
|
120
|
+
* the payment session is created so `transaction/register` reuses the same
|
|
121
|
+
* P24 session the widget tokenized against.
|
|
122
|
+
*/
|
|
123
|
+
createCardTokenizationIntent({ amount, currency_code, }) {
|
|
124
|
+
const sessionId = (0, crypto_1.randomUUID)();
|
|
125
|
+
return {
|
|
126
|
+
merchant_id: parseInt(this.options_.merchant_id),
|
|
127
|
+
session_id: sessionId,
|
|
128
|
+
card_tokenization_sign: this.p24Api.generateCardTokenizationSign(sessionId),
|
|
129
|
+
amount_grosze: (0, get_smallest_unit_1.getSmallestUnit)(Number(amount), currency_code),
|
|
130
|
+
currency_code,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
108
133
|
getCardTokenizationScriptUrl() {
|
|
109
134
|
return this.p24Api.getCardTokenizationScriptUrl();
|
|
110
135
|
}
|
|
111
136
|
}
|
|
112
137
|
exports.default = P24CardsService;
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDI0LWNhcmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9wcnplbGV3eTI0L3NlcnZpY2VzL3AyNC1jYXJkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFvQztBQU9wQyx3RUFBbUU7QUFDbkUsc0VBQTBFO0FBQzFFLGdFQUF1QztBQUN2QyxvQ0FLa0I7QUFDbEIsa0VBQThEO0FBRTlELE1BQU0sZUFBZ0IsU0FBUSxrQkFBTztJQUNuQyxNQUFNLENBQUMsVUFBVSxHQUFHLDJCQUFtQixDQUFDLFNBQVMsQ0FBQztJQUVqQyxhQUFhLENBQWU7SUFFN0MsWUFBWSxNQUErQixFQUFFLE9BQXFCO1FBQ2hFLE1BQU0saUJBQWlCLEdBQWlCO1lBQ3RDLEdBQUcsT0FBTztZQUNWLE9BQU8sRUFBRSxJQUFBLDhCQUFhLEVBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUN2QyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksSUFBSSw0QkFBb0I7WUFDMUQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksSUFBSTtTQUN6QyxDQUFDO1FBRUYsS0FBSyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksNEJBQW9CO1lBQ2hFLFdBQVcsRUFBRSw2Q0FBNkM7WUFDMUQsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxJQUFJLElBQUk7U0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFUyxjQUFjO1FBQ3RCLE9BQU8sMkJBQW1CLENBQUMsU0FBUyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUNuQixLQUEyQjtRQUUzQixN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
|
package/package.json
CHANGED