@enomshop/paystack 1.0.4 → 1.0.6
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/package.json +2 -2
- package/.medusa/server/src/admin/index.js +0 -344
- package/.medusa/server/src/admin/index.mjs +0 -345
- package/.medusa/server/src/api/admin/orders/[id]/manual-payment/route.js +0 -45
- package/.medusa/server/src/api/admin/paystack/dashboard/route.js +0 -132
- package/.medusa/server/src/api/admin/plugin/route.js +0 -7
- package/.medusa/server/src/api/store/orders/[id]/paystack-payment/route.js +0 -55
- package/.medusa/server/src/api/store/plugin/route.js +0 -7
- package/.medusa/server/src/index.js +0 -3
- package/.medusa/server/src/jobs/sync-paystack-payments.js +0 -70
- package/.medusa/server/src/lib/paystack.js +0 -95
- package/.medusa/server/src/providers/paystack/index.js +0 -11
- package/.medusa/server/src/services/paystack-payment-processor.js +0 -284
- package/.medusa/server/src/utils/currencyCode.js +0 -9
|
@@ -1,70 +0,0 @@
|
|
|
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
|
-
exports.config = void 0;
|
|
7
|
-
exports.default = syncPaystackPayments;
|
|
8
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
-
const paystack_1 = __importDefault(require("../lib/paystack"));
|
|
10
|
-
// Helper to prevent hitting Paystack rate limits
|
|
11
|
-
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
12
|
-
async function syncPaystackPayments(container) {
|
|
13
|
-
const paymentModuleService = container.resolve(utils_1.Modules.PAYMENT);
|
|
14
|
-
const logger = container.resolve("logger");
|
|
15
|
-
logger.info("Starting Paystack payment sync...");
|
|
16
|
-
try {
|
|
17
|
-
// @ts-ignore
|
|
18
|
-
const payments = await paymentModuleService.listPayments({
|
|
19
|
-
id: "pp_paystack",
|
|
20
|
-
});
|
|
21
|
-
// 2. Filter for pending payments that are OLDER than 15 minutes
|
|
22
|
-
// This prevents race conditions with incoming webhooks
|
|
23
|
-
const fifteenMinutesAgo = new Date(Date.now() - 15 * 60 * 1000);
|
|
24
|
-
const pendingPayments = payments.filter((p) => !p.captured_at &&
|
|
25
|
-
!p.canceled_at &&
|
|
26
|
-
p.created_at && new Date(p.created_at) < fifteenMinutesAgo);
|
|
27
|
-
if (pendingPayments.length === 0) {
|
|
28
|
-
logger.info("No stale pending Paystack payments found.");
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
logger.info(`Found ${pendingPayments.length} stale payments to verify.`);
|
|
32
|
-
// Initialize Paystack client
|
|
33
|
-
const paystack = new paystack_1.default(process.env.PAYSTACK_SECRET_KEY);
|
|
34
|
-
for (const payment of pendingPayments) {
|
|
35
|
-
try {
|
|
36
|
-
const txRef = payment.data?.paystackTxRef;
|
|
37
|
-
if (!txRef)
|
|
38
|
-
continue;
|
|
39
|
-
// 3. Verify transaction status with Paystack
|
|
40
|
-
const { data, status } = await paystack.transaction.verify(txRef);
|
|
41
|
-
if (status && data.status === "success") {
|
|
42
|
-
logger.info(`Capturing payment ${payment.id} from Paystack sync`);
|
|
43
|
-
// 4. Capture the payment in Medusa
|
|
44
|
-
await paymentModuleService.capturePayment({
|
|
45
|
-
payment_id: payment.id,
|
|
46
|
-
amount: payment.amount,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
else if (status && (data.status === "failed" || data.status === "abandoned")) {
|
|
50
|
-
logger.info(`Canceling failed/abandoned payment ${payment.id} from Paystack sync`);
|
|
51
|
-
// Optional: You can cancel the payment in Medusa to clean up the database
|
|
52
|
-
// await paymentModuleService.cancelPayment(payment.id);
|
|
53
|
-
}
|
|
54
|
-
// 5. Sleep for 200ms to respect Paystack API rate limits (approx 5 req/sec)
|
|
55
|
-
await sleep(200);
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
logger.error(`Error syncing Paystack payment ${payment.id}:`, error);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
logger.error("Error running Paystack payment sync job:", error);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
exports.config = {
|
|
67
|
-
name: "sync-paystack-payments",
|
|
68
|
-
schedule: "*/15 * * * *", // Runs every 15 minutes
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wYXlzdGFjay1wYXltZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3N5bmMtcGF5c3RhY2stcGF5bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBT0EsdUNBaUVDO0FBdkVELHFEQUFvRDtBQUNwRCwrREFBdUM7QUFFdkMsaURBQWlEO0FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRWpFLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxTQUEwQjtJQUMzRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBRWpELElBQUksQ0FBQztRQUNMLGFBQWE7UUFDYixNQUFNLFFBQVEsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFlBQVksQ0FBQztZQUN2RCxFQUFFLEVBQUUsYUFBYTtTQUNsQixDQUFDLENBQUM7UUFFRCxnRUFBZ0U7UUFDaEUsdURBQXVEO1FBQ3ZELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFaEUsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FDckMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxDQUFDLFdBQVc7WUFDZCxDQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ2QsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBaUIsQ0FBQyxHQUFHLGlCQUFpQixDQUNwRSxDQUFDO1FBRUYsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUN6RCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxlQUFlLENBQUMsTUFBTSw0QkFBNEIsQ0FBQyxDQUFDO1FBRXpFLDZCQUE2QjtRQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLGtCQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBNkIsQ0FBQyxDQUFDO1FBRXpFLEtBQUssTUFBTSxPQUFPLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsYUFBdUIsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLEtBQUs7b0JBQUUsU0FBUztnQkFFckIsNkNBQTZDO2dCQUM3QyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRWxFLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLE9BQU8sQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7b0JBRWxFLG1DQUFtQztvQkFDbkMsTUFBTSxvQkFBb0IsQ0FBQyxjQUFjLENBQUM7d0JBQ3hDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTt3QkFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO3FCQUN2QixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDL0UsTUFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsT0FBTyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztvQkFDbkYsMEVBQTBFO29CQUMxRSx3REFBd0Q7Z0JBQzFELENBQUM7Z0JBRUQsNEVBQTRFO2dCQUM1RSxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsd0JBQXdCO0lBQzlCLFFBQVEsRUFBRSxjQUFjLEVBQUUsd0JBQXdCO0NBQ25ELENBQUMifQ==
|
|
@@ -1,95 +0,0 @@
|
|
|
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
|
-
exports.PAYSTACK_API_PATH = void 0;
|
|
7
|
-
const axios_1 = __importDefault(require("axios"));
|
|
8
|
-
const axios_retry_1 = __importDefault(require("axios-retry"));
|
|
9
|
-
exports.PAYSTACK_API_PATH = "https://api.paystack.co";
|
|
10
|
-
class Paystack {
|
|
11
|
-
constructor(apiKey, options) {
|
|
12
|
-
this.transaction = {
|
|
13
|
-
get: ({ id }) => this.requestPaystackAPI({
|
|
14
|
-
path: "/transaction/" + id,
|
|
15
|
-
method: "GET",
|
|
16
|
-
}),
|
|
17
|
-
list: (query) => this.requestPaystackAPI({
|
|
18
|
-
path: "/transaction",
|
|
19
|
-
method: "GET",
|
|
20
|
-
query: query,
|
|
21
|
-
}),
|
|
22
|
-
balance: () => this.requestPaystackAPI({
|
|
23
|
-
path: "/balance",
|
|
24
|
-
method: "GET",
|
|
25
|
-
}),
|
|
26
|
-
verify: (reference) => this.requestPaystackAPI({
|
|
27
|
-
path: "/transaction/verify/" + reference,
|
|
28
|
-
method: "GET",
|
|
29
|
-
}),
|
|
30
|
-
totals: () => this.requestPaystackAPI({
|
|
31
|
-
path: "/transaction/totals",
|
|
32
|
-
method: "GET",
|
|
33
|
-
}),
|
|
34
|
-
initialize: ({ amount, email, currency, reference, callback_url, metadata, }) => this.requestPaystackAPI({
|
|
35
|
-
path: "/transaction/initialize",
|
|
36
|
-
method: "POST",
|
|
37
|
-
body: {
|
|
38
|
-
amount,
|
|
39
|
-
email,
|
|
40
|
-
currency,
|
|
41
|
-
reference,
|
|
42
|
-
callback_url,
|
|
43
|
-
metadata: metadata ? JSON.stringify(metadata) : undefined,
|
|
44
|
-
},
|
|
45
|
-
}),
|
|
46
|
-
};
|
|
47
|
-
this.refund = {
|
|
48
|
-
create: ({ transaction, amount, }) => this.requestPaystackAPI({
|
|
49
|
-
path: "/refund",
|
|
50
|
-
method: "POST",
|
|
51
|
-
body: {
|
|
52
|
-
transaction,
|
|
53
|
-
amount,
|
|
54
|
-
},
|
|
55
|
-
}),
|
|
56
|
-
};
|
|
57
|
-
this.apiKey = apiKey;
|
|
58
|
-
this.axiosInstance = axios_1.default.create({
|
|
59
|
-
baseURL: exports.PAYSTACK_API_PATH,
|
|
60
|
-
headers: {
|
|
61
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
62
|
-
"Content-Type": "application/json",
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
if (options?.disable_retries !== true) {
|
|
66
|
-
(0, axios_retry_1.default)(this.axiosInstance, {
|
|
67
|
-
retries: 3,
|
|
68
|
-
// Enables retries on network errors, idempotent http methods, and 5xx errors
|
|
69
|
-
retryCondition: axios_retry_1.default.isNetworkOrIdempotentRequestError,
|
|
70
|
-
// Exponential backoff with jitter
|
|
71
|
-
retryDelay: axios_retry_1.default.exponentialDelay,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async requestPaystackAPI(request) {
|
|
76
|
-
const options = {
|
|
77
|
-
method: request.method,
|
|
78
|
-
url: request.path,
|
|
79
|
-
params: request.query,
|
|
80
|
-
data: request.body,
|
|
81
|
-
};
|
|
82
|
-
try {
|
|
83
|
-
const res = await this.axiosInstance(options);
|
|
84
|
-
return res.data;
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
if (axios_1.default.isAxiosError(error)) {
|
|
88
|
-
throw new Error(`Error from Paystack API with status code ${error.response?.status}: ${error.response?.data?.message}`);
|
|
89
|
-
}
|
|
90
|
-
throw error;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
exports.default = Paystack;
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5c3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BheXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUFpRTtBQUNqRSw4REFBcUM7QUFFeEIsUUFBQSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQztBQW1DM0QsTUFBcUIsUUFBUTtJQUszQixZQUFZLE1BQWMsRUFBRSxPQUFnQztRQTJDNUQsZ0JBQVcsR0FBRztZQUNaLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFrQixFQUFFLEVBQUUsQ0FDOUIsSUFBSSxDQUFDLGtCQUFrQixDQU1yQjtnQkFDQSxJQUFJLEVBQUUsZUFBZSxHQUFHLEVBQUU7Z0JBQzFCLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQztZQUNKLElBQUksRUFBRSxDQUFDLEtBQTRELEVBQUUsRUFBRSxDQUNyRSxJQUFJLENBQUMsa0JBQWtCLENBZXJCO2dCQUNBLElBQUksRUFBRSxjQUFjO2dCQUNwQixNQUFNLEVBQUUsS0FBSztnQkFDYixLQUFLLEVBQUUsS0FBK0I7YUFDdkMsQ0FBQztZQUNKLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDWixJQUFJLENBQUMsa0JBQWtCLENBRXJCO2dCQUNBLElBQUksRUFBRSxVQUFVO2dCQUNoQixNQUFNLEVBQUUsS0FBSzthQUNkLENBQUM7WUFDSixNQUFNLEVBQUUsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDNUIsSUFBSSxDQUFDLGtCQUFrQixDQWVyQjtnQkFDQSxJQUFJLEVBQUUsc0JBQXNCLEdBQUcsU0FBUztnQkFDeEMsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDO1lBQ0osTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUNYLElBQUksQ0FBQyxrQkFBa0IsQ0FPckI7Z0JBQ0EsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsTUFBTSxFQUFFLEtBQUs7YUFDZCxDQUFDO1lBQ0osVUFBVSxFQUFFLENBQUMsRUFDWCxNQUFN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
|
|
@@ -1,11 +0,0 @@
|
|
|
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 paystack_payment_processor_1 = __importDefault(require("../../services/paystack-payment-processor"));
|
|
8
|
-
exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.PAYMENT, {
|
|
9
|
-
services: [paystack_payment_processor_1.default],
|
|
10
|
-
});
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3BheXN0YWNrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQW9FO0FBQ3BFLDJHQUFpRjtBQUVqRixrQkFBZSxJQUFBLHNCQUFjLEVBQUMsZUFBTyxDQUFDLE9BQU8sRUFBRTtJQUM3QyxRQUFRLEVBQUUsQ0FBQyxvQ0FBd0IsQ0FBQztDQUNyQyxDQUFDLENBQUMifQ==
|
|
@@ -1,284 +0,0 @@
|
|
|
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 crypto_1 = __importDefault(require("crypto"));
|
|
7
|
-
const paystack_1 = __importDefault(require("../lib/paystack"));
|
|
8
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
-
const currencyCode_1 = require("../utils/currencyCode");
|
|
10
|
-
class PaystackPaymentProcessor extends utils_1.AbstractPaymentProvider {
|
|
11
|
-
constructor(cradle, options) {
|
|
12
|
-
super(cradle, options);
|
|
13
|
-
if (!options.secret_key) {
|
|
14
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_ARGUMENT, "The Paystack provider requires the secret_key option");
|
|
15
|
-
}
|
|
16
|
-
this.configuration = options;
|
|
17
|
-
this.paystack = new paystack_1.default(this.configuration.secret_key, {
|
|
18
|
-
disable_retries: options.disable_retries,
|
|
19
|
-
});
|
|
20
|
-
this.debug = Boolean(options.debug);
|
|
21
|
-
this.logger = cradle.logger;
|
|
22
|
-
}
|
|
23
|
-
async initiatePayment(initiatePaymentData) {
|
|
24
|
-
if (this.debug) {
|
|
25
|
-
this.logger.info(`PS_P_Debug: InitiatePayment ${JSON.stringify(initiatePaymentData, null, 2)}`);
|
|
26
|
-
}
|
|
27
|
-
const { data, amount, currency_code } = initiatePaymentData;
|
|
28
|
-
const { email, session_id, order_id, callback_url, ...customMetadata } = (data ?? {});
|
|
29
|
-
const validatedCurrencyCode = (0, currencyCode_1.formatCurrencyCode)(currency_code);
|
|
30
|
-
// Paystack Supported Currencies
|
|
31
|
-
const SUPPORTED_CURRENCIES = ["NGN", "GHS", "ZAR", "USD", "KES", "EGP", "RWF"];
|
|
32
|
-
if (!SUPPORTED_CURRENCIES.includes(validatedCurrencyCode)) {
|
|
33
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Currency ${validatedCurrencyCode} is not supported by Paystack. Supported currencies are: ${SUPPORTED_CURRENCIES.join(", ")}`);
|
|
34
|
-
}
|
|
35
|
-
if (!email) {
|
|
36
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_ARGUMENT, "Email is required to initiate a Paystack payment. Ensure you are providing the email in the context object when calling `initiatePaymentSession` in your Medusa storefront");
|
|
37
|
-
}
|
|
38
|
-
try {
|
|
39
|
-
const { data: psData, status, message, } = await this.paystack.transaction.initialize({
|
|
40
|
-
amount: Math.round(Number(amount)), // FIXED: Medusa amounts are already in lowest denomination
|
|
41
|
-
email,
|
|
42
|
-
currency: validatedCurrencyCode,
|
|
43
|
-
callback_url,
|
|
44
|
-
metadata: {
|
|
45
|
-
session_id,
|
|
46
|
-
order_id,
|
|
47
|
-
...customMetadata,
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
if (status === false) {
|
|
51
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to initiate Paystack payment", message);
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
id: psData.reference,
|
|
55
|
-
status: utils_1.PaymentSessionStatus.PENDING,
|
|
56
|
-
data: {
|
|
57
|
-
paystackTxRef: psData.reference,
|
|
58
|
-
paystackTxAccessCode: psData.access_code,
|
|
59
|
-
paystackTxAuthorizationUrl: psData.authorization_url,
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
if (this.debug) {
|
|
65
|
-
this.logger.error("PS_P_Debug: InitiatePayment: Error", error);
|
|
66
|
-
}
|
|
67
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to initiate Paystack payment", error?.toString() ?? "Unknown error");
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async updatePayment(input) {
|
|
71
|
-
if (this.debug) {
|
|
72
|
-
this.logger.info(`PS_P_Debug: UpdatePayment ${JSON.stringify(input, null, 2)}`);
|
|
73
|
-
}
|
|
74
|
-
const session = await this.initiatePayment(input);
|
|
75
|
-
return {
|
|
76
|
-
data: session.data,
|
|
77
|
-
status: session.status,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
async authorizePayment(input) {
|
|
81
|
-
if (this.debug) {
|
|
82
|
-
this.logger.info(`PS_P_Debug: AuthorizePayment ${JSON.stringify(input, null, 2)}`);
|
|
83
|
-
}
|
|
84
|
-
try {
|
|
85
|
-
const { paystackTxRef } = input.data;
|
|
86
|
-
if (!paystackTxRef) {
|
|
87
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Missing paystackTxRef in payment data.");
|
|
88
|
-
}
|
|
89
|
-
const { status: psStatus, data } = await this.paystack.transaction.verify(paystackTxRef);
|
|
90
|
-
if (this.debug) {
|
|
91
|
-
this.logger.info(`PS_P_Debug: AuthorizePayment: Verification ${JSON.stringify({ psStatus, data }, null, 2)}`);
|
|
92
|
-
}
|
|
93
|
-
if (psStatus === false) {
|
|
94
|
-
return {
|
|
95
|
-
status: utils_1.PaymentSessionStatus.ERROR,
|
|
96
|
-
data: {
|
|
97
|
-
...input.data,
|
|
98
|
-
paystackTxId: data.id,
|
|
99
|
-
paystackTxData: data,
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
switch (data.status) {
|
|
104
|
-
case "success":
|
|
105
|
-
return {
|
|
106
|
-
status: utils_1.PaymentSessionStatus.AUTHORIZED, // MEDUSA V2 COMPLIANT
|
|
107
|
-
data: {
|
|
108
|
-
...input.data,
|
|
109
|
-
paystackTxId: data.id,
|
|
110
|
-
paystackTxData: data,
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
case "failed":
|
|
114
|
-
return {
|
|
115
|
-
status: utils_1.PaymentSessionStatus.ERROR,
|
|
116
|
-
data: {
|
|
117
|
-
...input.data,
|
|
118
|
-
paystackTxId: data.id,
|
|
119
|
-
paystackTxData: data,
|
|
120
|
-
},
|
|
121
|
-
};
|
|
122
|
-
default:
|
|
123
|
-
return {
|
|
124
|
-
status: utils_1.PaymentSessionStatus.PENDING,
|
|
125
|
-
data: {
|
|
126
|
-
...input.data,
|
|
127
|
-
paystackTxId: data.id,
|
|
128
|
-
paystackTxData: data,
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
if (this.debug) {
|
|
135
|
-
this.logger.error("PS_P_Debug: AuthorizePayment: Error", error);
|
|
136
|
-
}
|
|
137
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to authorize payment", error?.toString() ?? "Unknown error");
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
async retrievePayment(input) {
|
|
141
|
-
if (this.debug) {
|
|
142
|
-
this.logger.info(`PS_P_Debug: RetrievePayment ${JSON.stringify(input, null, 2)}`);
|
|
143
|
-
}
|
|
144
|
-
try {
|
|
145
|
-
const { paystackTxId } = input.data;
|
|
146
|
-
if (!paystackTxId) {
|
|
147
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Missing paystackTxId in payment data. This payment has not been authorized.");
|
|
148
|
-
}
|
|
149
|
-
const { data, status, message } = await this.paystack.transaction.get({
|
|
150
|
-
id: paystackTxId,
|
|
151
|
-
});
|
|
152
|
-
if (status === false) {
|
|
153
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to retrieve payment", message);
|
|
154
|
-
}
|
|
155
|
-
return {
|
|
156
|
-
data: {
|
|
157
|
-
...input.data,
|
|
158
|
-
paystackTxData: data,
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
if (this.debug) {
|
|
164
|
-
this.logger.error("PS_P_Debug: RetrievePayment: Error", error);
|
|
165
|
-
}
|
|
166
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to retrieve payment", error?.toString() ?? "Unknown error");
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
async refundPayment(input) {
|
|
170
|
-
if (this.debug) {
|
|
171
|
-
this.logger.info(`PS_P_Debug: RefundPayment ${JSON.stringify(input, null, 2)}`);
|
|
172
|
-
}
|
|
173
|
-
try {
|
|
174
|
-
const { paystackTxId } = input.data;
|
|
175
|
-
if (!paystackTxId) {
|
|
176
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Missing paystackTxId in payment data.");
|
|
177
|
-
}
|
|
178
|
-
const { data, status, message } = await this.paystack.refund.create({
|
|
179
|
-
transaction: paystackTxId,
|
|
180
|
-
amount: Math.round(Number(input.amount)), // FIXED: Medusa amounts are already in lowest denomination
|
|
181
|
-
});
|
|
182
|
-
if (status === false) {
|
|
183
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to refund payment", message);
|
|
184
|
-
}
|
|
185
|
-
return {
|
|
186
|
-
data: {
|
|
187
|
-
...input.data,
|
|
188
|
-
paystackTxData: data,
|
|
189
|
-
},
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
catch (error) {
|
|
193
|
-
if (this.debug) {
|
|
194
|
-
this.logger.error("PS_P_Debug: RefundPayment: Error", error);
|
|
195
|
-
}
|
|
196
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to refund payment", error?.toString() ?? "Unknown error");
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
async getPaymentStatus(input) {
|
|
200
|
-
if (this.debug) {
|
|
201
|
-
this.logger.info(`PS_P_Debug: GetPaymentStatus ${JSON.stringify(input, null, 2)}`);
|
|
202
|
-
}
|
|
203
|
-
const { paystackTxId } = input.data;
|
|
204
|
-
if (!paystackTxId) {
|
|
205
|
-
return { status: utils_1.PaymentSessionStatus.PENDING };
|
|
206
|
-
}
|
|
207
|
-
try {
|
|
208
|
-
const { data, status } = await this.paystack.transaction.get({
|
|
209
|
-
id: paystackTxId,
|
|
210
|
-
});
|
|
211
|
-
if (this.debug) {
|
|
212
|
-
this.logger.info(`PS_P_Debug: GetPaymentStatus: Verification ${JSON.stringify({ status, data }, null, 2)}`);
|
|
213
|
-
}
|
|
214
|
-
if (status === false) {
|
|
215
|
-
return { status: utils_1.PaymentSessionStatus.ERROR };
|
|
216
|
-
}
|
|
217
|
-
switch (data?.status) {
|
|
218
|
-
case "success":
|
|
219
|
-
return { status: utils_1.PaymentSessionStatus.AUTHORIZED };
|
|
220
|
-
case "failed":
|
|
221
|
-
return { status: utils_1.PaymentSessionStatus.ERROR };
|
|
222
|
-
default:
|
|
223
|
-
return { status: utils_1.PaymentSessionStatus.PENDING };
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
if (this.debug) {
|
|
228
|
-
this.logger.error("PS_P_Debug: GetPaymentStatus: Error", error);
|
|
229
|
-
}
|
|
230
|
-
return { status: utils_1.PaymentSessionStatus.ERROR };
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
async getWebhookActionAndData({ data: { event, data }, rawData, headers, }) {
|
|
234
|
-
if (this.debug) {
|
|
235
|
-
this.logger.info(`PS_P_Debug: Handling webhook event ${JSON.stringify({ data, headers }, null, 2)}`);
|
|
236
|
-
}
|
|
237
|
-
const webhookSecretKey = this.configuration.secret_key;
|
|
238
|
-
const hash = crypto_1.default
|
|
239
|
-
.createHmac("sha512", webhookSecretKey)
|
|
240
|
-
.update(rawData)
|
|
241
|
-
.digest("hex");
|
|
242
|
-
if (hash !== headers["x-paystack-signature"]) {
|
|
243
|
-
return {
|
|
244
|
-
action: utils_1.PaymentActions.NOT_SUPPORTED,
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
if (event !== "charge.success") {
|
|
248
|
-
return {
|
|
249
|
-
action: utils_1.PaymentActions.NOT_SUPPORTED,
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
const sessionId = data.metadata?.session_id;
|
|
253
|
-
if (!sessionId) {
|
|
254
|
-
if (this.debug) {
|
|
255
|
-
this.logger.error("PS_P_Debug: No sessionId found in webhook transaction metadata");
|
|
256
|
-
}
|
|
257
|
-
return {
|
|
258
|
-
action: utils_1.PaymentActions.NOT_SUPPORTED,
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
if (this.debug) {
|
|
262
|
-
this.logger.info(`PS_P_Debug: Webhook event is valid ${JSON.stringify({ sessionId, amount: data.amount }, null, 2)}`);
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
action: utils_1.PaymentActions.AUTHORIZED,
|
|
266
|
-
data: {
|
|
267
|
-
session_id: sessionId,
|
|
268
|
-
amount: data.amount,
|
|
269
|
-
},
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
async capturePayment(input) {
|
|
273
|
-
return { data: input.data };
|
|
274
|
-
}
|
|
275
|
-
async cancelPayment(input) {
|
|
276
|
-
return { data: input.data };
|
|
277
|
-
}
|
|
278
|
-
async deletePayment(input) {
|
|
279
|
-
return { data: input.data };
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
PaystackPaymentProcessor.identifier = "paystack";
|
|
283
|
-
exports.default = PaystackPaymentProcessor;
|
|
284
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5c3RhY2stcGF5bWVudC1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcGF5c3RhY2stcGF5bWVudC1wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsK0RBQXVDO0FBd0J2QyxxREFLbUM7QUFDbkMsd0RBQTJEO0FBcUIzRCxNQUFNLHdCQUF5QixTQUFRLCtCQUF1RDtJQVE1RixZQUNFLE1BQW9ELEVBQ3BELE9BQXVDO1FBRXZDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLHNEQUFzRCxDQUN2RCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxrQkFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFO1lBQzFELGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtTQUN6QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUNuQixtQkFBeUM7UUFFekMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCwrQkFBK0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FDOUUsQ0FBQztR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
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatCurrencyCode = formatCurrencyCode;
|
|
4
|
-
function formatCurrencyCode(currencyCode) {
|
|
5
|
-
// Uppercase the currency code
|
|
6
|
-
const formattedCurrencyCode = currencyCode.toUpperCase();
|
|
7
|
-
return formattedCurrencyCode;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3lDb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL2N1cnJlbmN5Q29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGdEQUtDO0FBTEQsU0FBZ0Isa0JBQWtCLENBQUMsWUFBb0I7SUFDckQsOEJBQThCO0lBQzlCLE1BQU0scUJBQXFCLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRXpELE9BQU8scUJBQXFCLENBQUM7QUFDL0IsQ0FBQyJ9
|