@enomshop/paystack 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.
@@ -0,0 +1,70 @@
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: "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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wYXlzdGFjay1wYXltZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3N5bmMtcGF5c3RhY2stcGF5bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBT0EsdUNBaUVDO0FBdkVELHFEQUFvRDtBQUNwRCwrREFBdUM7QUFFdkMsaURBQWlEO0FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRWpFLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxTQUEwQjtJQUMzRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBRWpELElBQUksQ0FBQztRQUNMLGFBQWE7UUFDYixNQUFNLFFBQVEsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFlBQVksQ0FBQztZQUN2RCxFQUFFLEVBQUUsVUFBVTtTQUNmLENBQUMsQ0FBQztRQUVELGdFQUFnRTtRQUNoRSx1REFBdUQ7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVoRSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUNyQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLENBQUMsV0FBVztZQUNkLENBQUMsQ0FBQyxDQUFDLFdBQVc7WUFDZCxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFpQixDQUFDLEdBQUcsaUJBQWlCLENBQ3BFLENBQUM7UUFFRixJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ3pELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxNQUFNLDRCQUE0QixDQUFDLENBQUM7UUFFekUsNkJBQTZCO1FBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksa0JBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUE2QixDQUFDLENBQUM7UUFFekUsS0FBSyxNQUFNLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxhQUF1QixDQUFDO2dCQUNwRCxJQUFJLENBQUMsS0FBSztvQkFBRSxTQUFTO2dCQUVyQiw2Q0FBNkM7Z0JBQzdDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFbEUsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsT0FBTyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztvQkFFbEUsbUNBQW1DO29CQUNuQyxNQUFNLG9CQUFvQixDQUFDLGNBQWMsQ0FBQzt3QkFDeEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFO3dCQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07cUJBQ3ZCLENBQUMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUMvRSxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxPQUFPLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO29CQUNuRiwwRUFBMEU7b0JBQzFFLHdEQUF3RDtnQkFDMUQsQ0FBQztnQkFFRCw0RUFBNEU7Z0JBQzVFLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5CLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsUUFBUSxFQUFFLGNBQWMsRUFBRSx3QkFBd0I7Q0FDbkQsQ0FBQyJ9
@@ -0,0 +1,95 @@
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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
@@ -0,0 +1,284 @@
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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
@@ -0,0 +1,9 @@
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