@singularity-payments/nextjs 0.1.0 → 1.0.0-alpha.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.
- package/dist/index.d.mts +12 -12
- package/dist/index.d.ts +12 -12
- package/dist/index.js +80 -90
- package/dist/index.mjs +80 -90
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { MpesaClient, MpesaConfig, MpesaClientOptions } from '@singularity-payments/core';
|
|
3
|
-
export { AccountBalanceCallback, B2BCallback, B2CCallback, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
|
|
3
|
+
export { AccountBalanceCallback, AccountBalanceRequest, AccountBalanceResponse, B2BCallback, B2BRequest, B2BResponse, B2CCallback, B2CRequest, B2CResponse, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, GeneralTransactionStatusRequest, GeneralTransactionStatusResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, ReversalRequest, ReversalResponse, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
|
|
4
4
|
|
|
5
5
|
interface RouteHandler {
|
|
6
6
|
POST: (request: NextRequest) => Promise<NextResponse>;
|
|
@@ -11,15 +11,15 @@ interface MpesaRouteHandlers {
|
|
|
11
11
|
c2bConfirmation: RouteHandler;
|
|
12
12
|
b2cResult: RouteHandler;
|
|
13
13
|
b2cTimeout: RouteHandler;
|
|
14
|
+
catchAll: RouteHandler;
|
|
14
15
|
b2bResult: RouteHandler;
|
|
15
16
|
b2bTimeout: RouteHandler;
|
|
16
17
|
balanceResult: RouteHandler;
|
|
17
18
|
balanceTimeout: RouteHandler;
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
transactionStatusResult: RouteHandler;
|
|
20
|
+
transactionStatusTimeout: RouteHandler;
|
|
20
21
|
reversalResult: RouteHandler;
|
|
21
22
|
reversalTimeout: RouteHandler;
|
|
22
|
-
catchAll: RouteHandler;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -28,12 +28,12 @@ interface MpesaRouteHandlers {
|
|
|
28
28
|
declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
* Create M-Pesa instance for
|
|
31
|
+
* Create M-Pesa instance for Next.js
|
|
32
32
|
*
|
|
33
33
|
* @example
|
|
34
34
|
* ```typescript
|
|
35
|
-
* //
|
|
36
|
-
* import { createMpesa } from "@singularity-payments/
|
|
35
|
+
* // lib/mpesa.ts
|
|
36
|
+
* import { createMpesa } from "@singularity-payments/nextjs";
|
|
37
37
|
*
|
|
38
38
|
* export const mpesa = createMpesa({
|
|
39
39
|
* consumerKey: process.env.MPESA_CONSUMER_KEY!,
|
|
@@ -41,7 +41,7 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
|
41
41
|
* passkey: process.env.MPESA_PASSKEY!,
|
|
42
42
|
* shortcode: process.env.MPESA_SHORTCODE!,
|
|
43
43
|
* environment: "sandbox",
|
|
44
|
-
* callbackUrl: `${process.env.
|
|
44
|
+
* callbackUrl: `${process.env.NEXT_PUBLIC_APP_URL}/api/mpesa/callback`
|
|
45
45
|
* }, {
|
|
46
46
|
* callbackOptions: {
|
|
47
47
|
* onSuccess: async (data) => {
|
|
@@ -57,10 +57,10 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
|
57
57
|
*
|
|
58
58
|
* @example
|
|
59
59
|
* ```typescript
|
|
60
|
-
* //
|
|
61
|
-
* import { mpesa } from "
|
|
60
|
+
* // app/api/mpesa/callback/route.ts
|
|
61
|
+
* import { mpesa } from "@/lib/mpesa";
|
|
62
62
|
*
|
|
63
|
-
* export
|
|
63
|
+
* export const { POST } = mpesa.handlers.stkCallback;
|
|
64
64
|
* ```
|
|
65
65
|
*/
|
|
66
66
|
declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions): {
|
|
@@ -69,7 +69,7 @@ declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions):
|
|
|
69
69
|
*/
|
|
70
70
|
client: MpesaClient;
|
|
71
71
|
/**
|
|
72
|
-
* Pre-configured
|
|
72
|
+
* Pre-configured Next.js route handlers for M-Pesa callbacks
|
|
73
73
|
*/
|
|
74
74
|
handlers: MpesaRouteHandlers;
|
|
75
75
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { MpesaClient, MpesaConfig, MpesaClientOptions } from '@singularity-payments/core';
|
|
3
|
-
export { AccountBalanceCallback, B2BCallback, B2CCallback, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
|
|
3
|
+
export { AccountBalanceCallback, AccountBalanceRequest, AccountBalanceResponse, B2BCallback, B2BRequest, B2BResponse, B2CCallback, B2CRequest, B2CResponse, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, GeneralTransactionStatusRequest, GeneralTransactionStatusResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, ReversalRequest, ReversalResponse, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
|
|
4
4
|
|
|
5
5
|
interface RouteHandler {
|
|
6
6
|
POST: (request: NextRequest) => Promise<NextResponse>;
|
|
@@ -11,15 +11,15 @@ interface MpesaRouteHandlers {
|
|
|
11
11
|
c2bConfirmation: RouteHandler;
|
|
12
12
|
b2cResult: RouteHandler;
|
|
13
13
|
b2cTimeout: RouteHandler;
|
|
14
|
+
catchAll: RouteHandler;
|
|
14
15
|
b2bResult: RouteHandler;
|
|
15
16
|
b2bTimeout: RouteHandler;
|
|
16
17
|
balanceResult: RouteHandler;
|
|
17
18
|
balanceTimeout: RouteHandler;
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
transactionStatusResult: RouteHandler;
|
|
20
|
+
transactionStatusTimeout: RouteHandler;
|
|
20
21
|
reversalResult: RouteHandler;
|
|
21
22
|
reversalTimeout: RouteHandler;
|
|
22
|
-
catchAll: RouteHandler;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -28,12 +28,12 @@ interface MpesaRouteHandlers {
|
|
|
28
28
|
declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
* Create M-Pesa instance for
|
|
31
|
+
* Create M-Pesa instance for Next.js
|
|
32
32
|
*
|
|
33
33
|
* @example
|
|
34
34
|
* ```typescript
|
|
35
|
-
* //
|
|
36
|
-
* import { createMpesa } from "@singularity-payments/
|
|
35
|
+
* // lib/mpesa.ts
|
|
36
|
+
* import { createMpesa } from "@singularity-payments/nextjs";
|
|
37
37
|
*
|
|
38
38
|
* export const mpesa = createMpesa({
|
|
39
39
|
* consumerKey: process.env.MPESA_CONSUMER_KEY!,
|
|
@@ -41,7 +41,7 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
|
41
41
|
* passkey: process.env.MPESA_PASSKEY!,
|
|
42
42
|
* shortcode: process.env.MPESA_SHORTCODE!,
|
|
43
43
|
* environment: "sandbox",
|
|
44
|
-
* callbackUrl: `${process.env.
|
|
44
|
+
* callbackUrl: `${process.env.NEXT_PUBLIC_APP_URL}/api/mpesa/callback`
|
|
45
45
|
* }, {
|
|
46
46
|
* callbackOptions: {
|
|
47
47
|
* onSuccess: async (data) => {
|
|
@@ -57,10 +57,10 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
|
57
57
|
*
|
|
58
58
|
* @example
|
|
59
59
|
* ```typescript
|
|
60
|
-
* //
|
|
61
|
-
* import { mpesa } from "
|
|
60
|
+
* // app/api/mpesa/callback/route.ts
|
|
61
|
+
* import { mpesa } from "@/lib/mpesa";
|
|
62
62
|
*
|
|
63
|
-
* export
|
|
63
|
+
* export const { POST } = mpesa.handlers.stkCallback;
|
|
64
64
|
* ```
|
|
65
65
|
*/
|
|
66
66
|
declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions): {
|
|
@@ -69,7 +69,7 @@ declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions):
|
|
|
69
69
|
*/
|
|
70
70
|
client: MpesaClient;
|
|
71
71
|
/**
|
|
72
|
-
* Pre-configured
|
|
72
|
+
* Pre-configured Next.js route handlers for M-Pesa callbacks
|
|
73
73
|
*/
|
|
74
74
|
handlers: MpesaRouteHandlers;
|
|
75
75
|
};
|
package/dist/index.js
CHANGED
|
@@ -127,69 +127,6 @@ function createMpesaHandlers(client) {
|
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
},
|
|
130
|
-
/**
|
|
131
|
-
* B2C timeout handler
|
|
132
|
-
* Handles timeout notifications from M-Pesa for B2C requests
|
|
133
|
-
*/
|
|
134
|
-
b2cTimeout: {
|
|
135
|
-
POST: async (request) => {
|
|
136
|
-
try {
|
|
137
|
-
const body = await request.json();
|
|
138
|
-
console.log("B2C Timeout:", body);
|
|
139
|
-
return import_server.NextResponse.json(
|
|
140
|
-
{
|
|
141
|
-
ResultCode: 0,
|
|
142
|
-
ResultDesc: "Timeout received"
|
|
143
|
-
},
|
|
144
|
-
{ status: 200 }
|
|
145
|
-
);
|
|
146
|
-
} catch (error) {
|
|
147
|
-
console.error("B2C Timeout error:", error);
|
|
148
|
-
return import_server.NextResponse.json(
|
|
149
|
-
{
|
|
150
|
-
ResultCode: 1,
|
|
151
|
-
ResultDesc: "Processing failed"
|
|
152
|
-
},
|
|
153
|
-
{ status: 200 }
|
|
154
|
-
);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
},
|
|
158
|
-
/**
|
|
159
|
-
* Catch-all handler for all M-Pesa webhooks and client-side API requests
|
|
160
|
-
* Routes based on URL path segment
|
|
161
|
-
*
|
|
162
|
-
* Usage: app/api/mpesa/[...mpesa]/route.ts
|
|
163
|
-
* export const { POST } = mpesa.handlers.catchAll;
|
|
164
|
-
*
|
|
165
|
-
* Supported endpoints:
|
|
166
|
-
*
|
|
167
|
-
* WEBHOOKS (from M-Pesa):
|
|
168
|
-
* - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
|
|
169
|
-
* - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
|
|
170
|
-
* - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
|
|
171
|
-
* - /api/mpesa/b2c-result - B2C result callback
|
|
172
|
-
* - /api/mpesa/b2c-timeout - B2C timeout callback
|
|
173
|
-
* - /api/mpesa/b2b-result - B2B result callback
|
|
174
|
-
* - /api/mpesa/b2b-timeout - B2B timeout callback
|
|
175
|
-
* - /api/mpesa/balance-result - Account balance result
|
|
176
|
-
* - /api/mpesa/balance-timeout - Account balance timeout
|
|
177
|
-
* - /api/mpesa/reversal-result - Reversal result
|
|
178
|
-
* - /api/mpesa/reversal-timeout - Reversal timeout
|
|
179
|
-
* - /api/mpesa/status-result - Transaction status result
|
|
180
|
-
* - /api/mpesa/status-timeout - Transaction status timeout
|
|
181
|
-
*
|
|
182
|
-
* CLIENT APIs (from the frontend package, will recode react soon):
|
|
183
|
-
* - /api/mpesa/stk-push - Initiate STK Push request
|
|
184
|
-
* - /api/mpesa/stk-query - Query STK Push status
|
|
185
|
-
* - /api/mpesa/b2c - Initiate B2C payment
|
|
186
|
-
* - /api/mpesa/b2b - Initiate B2B payment
|
|
187
|
-
* - /api/mpesa/balance - Query account balance
|
|
188
|
-
* - /api/mpesa/transaction-status - Query transaction status
|
|
189
|
-
* - /api/mpesa/reversal - Reverse a transaction
|
|
190
|
-
* - /api/mpesa/register-c2b - Register C2B URLs
|
|
191
|
-
* - /api/mpesa/generate-qr - Generate dynamic QR code
|
|
192
|
-
*/
|
|
193
130
|
/**
|
|
194
131
|
* B2B result handler
|
|
195
132
|
* Handles callbacks from M-Pesa after B2B requests
|
|
@@ -198,8 +135,7 @@ function createMpesaHandlers(client) {
|
|
|
198
135
|
POST: async (request) => {
|
|
199
136
|
try {
|
|
200
137
|
const body = await request.json();
|
|
201
|
-
const
|
|
202
|
-
const response = await client.handleB2BResult(body, ipAddress);
|
|
138
|
+
const response = await client.handleB2BCallback(body);
|
|
203
139
|
return import_server.NextResponse.json(response, { status: 200 });
|
|
204
140
|
} catch (error) {
|
|
205
141
|
console.error("B2B Result error:", error);
|
|
@@ -242,21 +178,17 @@ function createMpesaHandlers(client) {
|
|
|
242
178
|
}
|
|
243
179
|
},
|
|
244
180
|
/**
|
|
245
|
-
* Account
|
|
181
|
+
* Account Balance result handler
|
|
246
182
|
* Handles callbacks from M-Pesa after balance query requests
|
|
247
183
|
*/
|
|
248
184
|
balanceResult: {
|
|
249
185
|
POST: async (request) => {
|
|
250
186
|
try {
|
|
251
187
|
const body = await request.json();
|
|
252
|
-
const
|
|
253
|
-
const response = await client.handleAccountBalanceResult(
|
|
254
|
-
body,
|
|
255
|
-
ipAddress
|
|
256
|
-
);
|
|
188
|
+
const response = await client.handleAccountBalanceCallback(body);
|
|
257
189
|
return import_server.NextResponse.json(response, { status: 200 });
|
|
258
190
|
} catch (error) {
|
|
259
|
-
console.error("
|
|
191
|
+
console.error("Balance Result error:", error);
|
|
260
192
|
return import_server.NextResponse.json(
|
|
261
193
|
{
|
|
262
194
|
ResultCode: 1,
|
|
@@ -268,7 +200,7 @@ function createMpesaHandlers(client) {
|
|
|
268
200
|
}
|
|
269
201
|
},
|
|
270
202
|
/**
|
|
271
|
-
* Account
|
|
203
|
+
* Account Balance timeout handler
|
|
272
204
|
* Handles timeout notifications from M-Pesa for balance queries
|
|
273
205
|
*/
|
|
274
206
|
balanceTimeout: {
|
|
@@ -296,18 +228,14 @@ function createMpesaHandlers(client) {
|
|
|
296
228
|
}
|
|
297
229
|
},
|
|
298
230
|
/**
|
|
299
|
-
* Transaction
|
|
300
|
-
* Handles callbacks from M-Pesa after transaction status
|
|
231
|
+
* Transaction Status result handler
|
|
232
|
+
* Handles callbacks from M-Pesa after transaction status queries
|
|
301
233
|
*/
|
|
302
|
-
|
|
234
|
+
transactionStatusResult: {
|
|
303
235
|
POST: async (request) => {
|
|
304
236
|
try {
|
|
305
237
|
const body = await request.json();
|
|
306
|
-
const
|
|
307
|
-
const response = await client.handleTransactionStatusResult(
|
|
308
|
-
body,
|
|
309
|
-
ipAddress
|
|
310
|
-
);
|
|
238
|
+
const response = await client.handleTransactionStatusCallback(body);
|
|
311
239
|
return import_server.NextResponse.json(response, { status: 200 });
|
|
312
240
|
} catch (error) {
|
|
313
241
|
console.error("Transaction Status Result error:", error);
|
|
@@ -322,14 +250,14 @@ function createMpesaHandlers(client) {
|
|
|
322
250
|
}
|
|
323
251
|
},
|
|
324
252
|
/**
|
|
325
|
-
* Transaction
|
|
253
|
+
* Transaction Status timeout handler
|
|
326
254
|
* Handles timeout notifications from M-Pesa for status queries
|
|
327
255
|
*/
|
|
328
|
-
|
|
256
|
+
transactionStatusTimeout: {
|
|
329
257
|
POST: async (request) => {
|
|
330
258
|
try {
|
|
331
259
|
const body = await request.json();
|
|
332
|
-
console.log("Status Timeout:", body);
|
|
260
|
+
console.log("Transaction Status Timeout:", body);
|
|
333
261
|
return import_server.NextResponse.json(
|
|
334
262
|
{
|
|
335
263
|
ResultCode: 0,
|
|
@@ -338,7 +266,7 @@ function createMpesaHandlers(client) {
|
|
|
338
266
|
{ status: 200 }
|
|
339
267
|
);
|
|
340
268
|
} catch (error) {
|
|
341
|
-
console.error("Status Timeout error:", error);
|
|
269
|
+
console.error("Transaction Status Timeout error:", error);
|
|
342
270
|
return import_server.NextResponse.json(
|
|
343
271
|
{
|
|
344
272
|
ResultCode: 1,
|
|
@@ -357,8 +285,7 @@ function createMpesaHandlers(client) {
|
|
|
357
285
|
POST: async (request) => {
|
|
358
286
|
try {
|
|
359
287
|
const body = await request.json();
|
|
360
|
-
const
|
|
361
|
-
const response = await client.handleReversalResult(body, ipAddress);
|
|
288
|
+
const response = await client.handleReversalCallback(body);
|
|
362
289
|
return import_server.NextResponse.json(response, { status: 200 });
|
|
363
290
|
} catch (error) {
|
|
364
291
|
console.error("Reversal Result error:", error);
|
|
@@ -400,6 +327,69 @@ function createMpesaHandlers(client) {
|
|
|
400
327
|
}
|
|
401
328
|
}
|
|
402
329
|
},
|
|
330
|
+
/**
|
|
331
|
+
* B2C timeout handler
|
|
332
|
+
* Handles timeout notifications from M-Pesa for B2C requests
|
|
333
|
+
*/
|
|
334
|
+
b2cTimeout: {
|
|
335
|
+
POST: async (request) => {
|
|
336
|
+
try {
|
|
337
|
+
const body = await request.json();
|
|
338
|
+
console.log("B2C Timeout:", body);
|
|
339
|
+
return import_server.NextResponse.json(
|
|
340
|
+
{
|
|
341
|
+
ResultCode: 0,
|
|
342
|
+
ResultDesc: "Timeout received"
|
|
343
|
+
},
|
|
344
|
+
{ status: 200 }
|
|
345
|
+
);
|
|
346
|
+
} catch (error) {
|
|
347
|
+
console.error("B2C Timeout error:", error);
|
|
348
|
+
return import_server.NextResponse.json(
|
|
349
|
+
{
|
|
350
|
+
ResultCode: 1,
|
|
351
|
+
ResultDesc: "Processing failed"
|
|
352
|
+
},
|
|
353
|
+
{ status: 200 }
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
/**
|
|
359
|
+
* Catch-all handler for all M-Pesa webhooks and client-side API requests
|
|
360
|
+
* Routes based on URL path segment
|
|
361
|
+
*
|
|
362
|
+
* Usage: app/api/mpesa/[...mpesa]/route.ts
|
|
363
|
+
* export const { POST } = mpesa.handlers.catchAll;
|
|
364
|
+
*
|
|
365
|
+
* Supported endpoints:
|
|
366
|
+
*
|
|
367
|
+
* WEBHOOKS (from M-Pesa):
|
|
368
|
+
* - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
|
|
369
|
+
* - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
|
|
370
|
+
* - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
|
|
371
|
+
* - /api/mpesa/b2c-result - B2C result callback
|
|
372
|
+
* - /api/mpesa/b2c-timeout - B2C timeout callback
|
|
373
|
+
* - /api/mpesa/b2b-result - B2B result callback
|
|
374
|
+
* - /api/mpesa/b2b-timeout - B2B timeout callback
|
|
375
|
+
* - /api/mpesa/balance-result - Account balance result
|
|
376
|
+
* - /api/mpesa/balance-timeout - Account balance timeout
|
|
377
|
+
* - /api/mpesa/reversal-result - Reversal result
|
|
378
|
+
* - /api/mpesa/reversal-timeout - Reversal timeout
|
|
379
|
+
* - /api/mpesa/status-result - Transaction status result
|
|
380
|
+
* - /api/mpesa/status-timeout - Transaction status timeout
|
|
381
|
+
*
|
|
382
|
+
* CLIENT APIs (from the frontend package, will recode react soon):
|
|
383
|
+
* - /api/mpesa/stk-push - Initiate STK Push request
|
|
384
|
+
* - /api/mpesa/stk-query - Query STK Push status
|
|
385
|
+
* - /api/mpesa/b2c - Initiate B2C payment
|
|
386
|
+
* - /api/mpesa/b2b - Initiate B2B payment
|
|
387
|
+
* - /api/mpesa/balance - Query account balance
|
|
388
|
+
* - /api/mpesa/transaction-status - Query transaction status
|
|
389
|
+
* - /api/mpesa/reversal - Reverse a transaction
|
|
390
|
+
* - /api/mpesa/register-c2b - Register C2B URLs
|
|
391
|
+
* - /api/mpesa/generate-qr - Generate dynamic QR code
|
|
392
|
+
*/
|
|
403
393
|
catchAll: {
|
|
404
394
|
POST: async (request) => {
|
|
405
395
|
const pathname = request.nextUrl.pathname;
|
|
@@ -434,10 +424,10 @@ function createMpesaHandlers(client) {
|
|
|
434
424
|
return handlers.balanceTimeout.POST(request);
|
|
435
425
|
}
|
|
436
426
|
if (lastSegment === "status-result") {
|
|
437
|
-
return handlers.
|
|
427
|
+
return handlers.transactionStatusResult.POST(request);
|
|
438
428
|
}
|
|
439
429
|
if (lastSegment === "status-timeout") {
|
|
440
|
-
return handlers.
|
|
430
|
+
return handlers.transactionStatusTimeout.POST(request);
|
|
441
431
|
}
|
|
442
432
|
if (lastSegment === "reversal-result") {
|
|
443
433
|
return handlers.reversalResult.POST(request);
|
|
@@ -673,7 +663,7 @@ function createMpesa(config, options) {
|
|
|
673
663
|
*/
|
|
674
664
|
client,
|
|
675
665
|
/**
|
|
676
|
-
* Pre-configured
|
|
666
|
+
* Pre-configured Next.js route handlers for M-Pesa callbacks
|
|
677
667
|
*/
|
|
678
668
|
handlers
|
|
679
669
|
};
|
package/dist/index.mjs
CHANGED
|
@@ -101,69 +101,6 @@ function createMpesaHandlers(client) {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
},
|
|
104
|
-
/**
|
|
105
|
-
* B2C timeout handler
|
|
106
|
-
* Handles timeout notifications from M-Pesa for B2C requests
|
|
107
|
-
*/
|
|
108
|
-
b2cTimeout: {
|
|
109
|
-
POST: async (request) => {
|
|
110
|
-
try {
|
|
111
|
-
const body = await request.json();
|
|
112
|
-
console.log("B2C Timeout:", body);
|
|
113
|
-
return NextResponse.json(
|
|
114
|
-
{
|
|
115
|
-
ResultCode: 0,
|
|
116
|
-
ResultDesc: "Timeout received"
|
|
117
|
-
},
|
|
118
|
-
{ status: 200 }
|
|
119
|
-
);
|
|
120
|
-
} catch (error) {
|
|
121
|
-
console.error("B2C Timeout error:", error);
|
|
122
|
-
return NextResponse.json(
|
|
123
|
-
{
|
|
124
|
-
ResultCode: 1,
|
|
125
|
-
ResultDesc: "Processing failed"
|
|
126
|
-
},
|
|
127
|
-
{ status: 200 }
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
/**
|
|
133
|
-
* Catch-all handler for all M-Pesa webhooks and client-side API requests
|
|
134
|
-
* Routes based on URL path segment
|
|
135
|
-
*
|
|
136
|
-
* Usage: app/api/mpesa/[...mpesa]/route.ts
|
|
137
|
-
* export const { POST } = mpesa.handlers.catchAll;
|
|
138
|
-
*
|
|
139
|
-
* Supported endpoints:
|
|
140
|
-
*
|
|
141
|
-
* WEBHOOKS (from M-Pesa):
|
|
142
|
-
* - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
|
|
143
|
-
* - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
|
|
144
|
-
* - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
|
|
145
|
-
* - /api/mpesa/b2c-result - B2C result callback
|
|
146
|
-
* - /api/mpesa/b2c-timeout - B2C timeout callback
|
|
147
|
-
* - /api/mpesa/b2b-result - B2B result callback
|
|
148
|
-
* - /api/mpesa/b2b-timeout - B2B timeout callback
|
|
149
|
-
* - /api/mpesa/balance-result - Account balance result
|
|
150
|
-
* - /api/mpesa/balance-timeout - Account balance timeout
|
|
151
|
-
* - /api/mpesa/reversal-result - Reversal result
|
|
152
|
-
* - /api/mpesa/reversal-timeout - Reversal timeout
|
|
153
|
-
* - /api/mpesa/status-result - Transaction status result
|
|
154
|
-
* - /api/mpesa/status-timeout - Transaction status timeout
|
|
155
|
-
*
|
|
156
|
-
* CLIENT APIs (from the frontend package, will recode react soon):
|
|
157
|
-
* - /api/mpesa/stk-push - Initiate STK Push request
|
|
158
|
-
* - /api/mpesa/stk-query - Query STK Push status
|
|
159
|
-
* - /api/mpesa/b2c - Initiate B2C payment
|
|
160
|
-
* - /api/mpesa/b2b - Initiate B2B payment
|
|
161
|
-
* - /api/mpesa/balance - Query account balance
|
|
162
|
-
* - /api/mpesa/transaction-status - Query transaction status
|
|
163
|
-
* - /api/mpesa/reversal - Reverse a transaction
|
|
164
|
-
* - /api/mpesa/register-c2b - Register C2B URLs
|
|
165
|
-
* - /api/mpesa/generate-qr - Generate dynamic QR code
|
|
166
|
-
*/
|
|
167
104
|
/**
|
|
168
105
|
* B2B result handler
|
|
169
106
|
* Handles callbacks from M-Pesa after B2B requests
|
|
@@ -172,8 +109,7 @@ function createMpesaHandlers(client) {
|
|
|
172
109
|
POST: async (request) => {
|
|
173
110
|
try {
|
|
174
111
|
const body = await request.json();
|
|
175
|
-
const
|
|
176
|
-
const response = await client.handleB2BResult(body, ipAddress);
|
|
112
|
+
const response = await client.handleB2BCallback(body);
|
|
177
113
|
return NextResponse.json(response, { status: 200 });
|
|
178
114
|
} catch (error) {
|
|
179
115
|
console.error("B2B Result error:", error);
|
|
@@ -216,21 +152,17 @@ function createMpesaHandlers(client) {
|
|
|
216
152
|
}
|
|
217
153
|
},
|
|
218
154
|
/**
|
|
219
|
-
* Account
|
|
155
|
+
* Account Balance result handler
|
|
220
156
|
* Handles callbacks from M-Pesa after balance query requests
|
|
221
157
|
*/
|
|
222
158
|
balanceResult: {
|
|
223
159
|
POST: async (request) => {
|
|
224
160
|
try {
|
|
225
161
|
const body = await request.json();
|
|
226
|
-
const
|
|
227
|
-
const response = await client.handleAccountBalanceResult(
|
|
228
|
-
body,
|
|
229
|
-
ipAddress
|
|
230
|
-
);
|
|
162
|
+
const response = await client.handleAccountBalanceCallback(body);
|
|
231
163
|
return NextResponse.json(response, { status: 200 });
|
|
232
164
|
} catch (error) {
|
|
233
|
-
console.error("
|
|
165
|
+
console.error("Balance Result error:", error);
|
|
234
166
|
return NextResponse.json(
|
|
235
167
|
{
|
|
236
168
|
ResultCode: 1,
|
|
@@ -242,7 +174,7 @@ function createMpesaHandlers(client) {
|
|
|
242
174
|
}
|
|
243
175
|
},
|
|
244
176
|
/**
|
|
245
|
-
* Account
|
|
177
|
+
* Account Balance timeout handler
|
|
246
178
|
* Handles timeout notifications from M-Pesa for balance queries
|
|
247
179
|
*/
|
|
248
180
|
balanceTimeout: {
|
|
@@ -270,18 +202,14 @@ function createMpesaHandlers(client) {
|
|
|
270
202
|
}
|
|
271
203
|
},
|
|
272
204
|
/**
|
|
273
|
-
* Transaction
|
|
274
|
-
* Handles callbacks from M-Pesa after transaction status
|
|
205
|
+
* Transaction Status result handler
|
|
206
|
+
* Handles callbacks from M-Pesa after transaction status queries
|
|
275
207
|
*/
|
|
276
|
-
|
|
208
|
+
transactionStatusResult: {
|
|
277
209
|
POST: async (request) => {
|
|
278
210
|
try {
|
|
279
211
|
const body = await request.json();
|
|
280
|
-
const
|
|
281
|
-
const response = await client.handleTransactionStatusResult(
|
|
282
|
-
body,
|
|
283
|
-
ipAddress
|
|
284
|
-
);
|
|
212
|
+
const response = await client.handleTransactionStatusCallback(body);
|
|
285
213
|
return NextResponse.json(response, { status: 200 });
|
|
286
214
|
} catch (error) {
|
|
287
215
|
console.error("Transaction Status Result error:", error);
|
|
@@ -296,14 +224,14 @@ function createMpesaHandlers(client) {
|
|
|
296
224
|
}
|
|
297
225
|
},
|
|
298
226
|
/**
|
|
299
|
-
* Transaction
|
|
227
|
+
* Transaction Status timeout handler
|
|
300
228
|
* Handles timeout notifications from M-Pesa for status queries
|
|
301
229
|
*/
|
|
302
|
-
|
|
230
|
+
transactionStatusTimeout: {
|
|
303
231
|
POST: async (request) => {
|
|
304
232
|
try {
|
|
305
233
|
const body = await request.json();
|
|
306
|
-
console.log("Status Timeout:", body);
|
|
234
|
+
console.log("Transaction Status Timeout:", body);
|
|
307
235
|
return NextResponse.json(
|
|
308
236
|
{
|
|
309
237
|
ResultCode: 0,
|
|
@@ -312,7 +240,7 @@ function createMpesaHandlers(client) {
|
|
|
312
240
|
{ status: 200 }
|
|
313
241
|
);
|
|
314
242
|
} catch (error) {
|
|
315
|
-
console.error("Status Timeout error:", error);
|
|
243
|
+
console.error("Transaction Status Timeout error:", error);
|
|
316
244
|
return NextResponse.json(
|
|
317
245
|
{
|
|
318
246
|
ResultCode: 1,
|
|
@@ -331,8 +259,7 @@ function createMpesaHandlers(client) {
|
|
|
331
259
|
POST: async (request) => {
|
|
332
260
|
try {
|
|
333
261
|
const body = await request.json();
|
|
334
|
-
const
|
|
335
|
-
const response = await client.handleReversalResult(body, ipAddress);
|
|
262
|
+
const response = await client.handleReversalCallback(body);
|
|
336
263
|
return NextResponse.json(response, { status: 200 });
|
|
337
264
|
} catch (error) {
|
|
338
265
|
console.error("Reversal Result error:", error);
|
|
@@ -374,6 +301,69 @@ function createMpesaHandlers(client) {
|
|
|
374
301
|
}
|
|
375
302
|
}
|
|
376
303
|
},
|
|
304
|
+
/**
|
|
305
|
+
* B2C timeout handler
|
|
306
|
+
* Handles timeout notifications from M-Pesa for B2C requests
|
|
307
|
+
*/
|
|
308
|
+
b2cTimeout: {
|
|
309
|
+
POST: async (request) => {
|
|
310
|
+
try {
|
|
311
|
+
const body = await request.json();
|
|
312
|
+
console.log("B2C Timeout:", body);
|
|
313
|
+
return NextResponse.json(
|
|
314
|
+
{
|
|
315
|
+
ResultCode: 0,
|
|
316
|
+
ResultDesc: "Timeout received"
|
|
317
|
+
},
|
|
318
|
+
{ status: 200 }
|
|
319
|
+
);
|
|
320
|
+
} catch (error) {
|
|
321
|
+
console.error("B2C Timeout error:", error);
|
|
322
|
+
return NextResponse.json(
|
|
323
|
+
{
|
|
324
|
+
ResultCode: 1,
|
|
325
|
+
ResultDesc: "Processing failed"
|
|
326
|
+
},
|
|
327
|
+
{ status: 200 }
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
/**
|
|
333
|
+
* Catch-all handler for all M-Pesa webhooks and client-side API requests
|
|
334
|
+
* Routes based on URL path segment
|
|
335
|
+
*
|
|
336
|
+
* Usage: app/api/mpesa/[...mpesa]/route.ts
|
|
337
|
+
* export const { POST } = mpesa.handlers.catchAll;
|
|
338
|
+
*
|
|
339
|
+
* Supported endpoints:
|
|
340
|
+
*
|
|
341
|
+
* WEBHOOKS (from M-Pesa):
|
|
342
|
+
* - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
|
|
343
|
+
* - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
|
|
344
|
+
* - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
|
|
345
|
+
* - /api/mpesa/b2c-result - B2C result callback
|
|
346
|
+
* - /api/mpesa/b2c-timeout - B2C timeout callback
|
|
347
|
+
* - /api/mpesa/b2b-result - B2B result callback
|
|
348
|
+
* - /api/mpesa/b2b-timeout - B2B timeout callback
|
|
349
|
+
* - /api/mpesa/balance-result - Account balance result
|
|
350
|
+
* - /api/mpesa/balance-timeout - Account balance timeout
|
|
351
|
+
* - /api/mpesa/reversal-result - Reversal result
|
|
352
|
+
* - /api/mpesa/reversal-timeout - Reversal timeout
|
|
353
|
+
* - /api/mpesa/status-result - Transaction status result
|
|
354
|
+
* - /api/mpesa/status-timeout - Transaction status timeout
|
|
355
|
+
*
|
|
356
|
+
* CLIENT APIs (from the frontend package, will recode react soon):
|
|
357
|
+
* - /api/mpesa/stk-push - Initiate STK Push request
|
|
358
|
+
* - /api/mpesa/stk-query - Query STK Push status
|
|
359
|
+
* - /api/mpesa/b2c - Initiate B2C payment
|
|
360
|
+
* - /api/mpesa/b2b - Initiate B2B payment
|
|
361
|
+
* - /api/mpesa/balance - Query account balance
|
|
362
|
+
* - /api/mpesa/transaction-status - Query transaction status
|
|
363
|
+
* - /api/mpesa/reversal - Reverse a transaction
|
|
364
|
+
* - /api/mpesa/register-c2b - Register C2B URLs
|
|
365
|
+
* - /api/mpesa/generate-qr - Generate dynamic QR code
|
|
366
|
+
*/
|
|
377
367
|
catchAll: {
|
|
378
368
|
POST: async (request) => {
|
|
379
369
|
const pathname = request.nextUrl.pathname;
|
|
@@ -408,10 +398,10 @@ function createMpesaHandlers(client) {
|
|
|
408
398
|
return handlers.balanceTimeout.POST(request);
|
|
409
399
|
}
|
|
410
400
|
if (lastSegment === "status-result") {
|
|
411
|
-
return handlers.
|
|
401
|
+
return handlers.transactionStatusResult.POST(request);
|
|
412
402
|
}
|
|
413
403
|
if (lastSegment === "status-timeout") {
|
|
414
|
-
return handlers.
|
|
404
|
+
return handlers.transactionStatusTimeout.POST(request);
|
|
415
405
|
}
|
|
416
406
|
if (lastSegment === "reversal-result") {
|
|
417
407
|
return handlers.reversalResult.POST(request);
|
|
@@ -649,7 +639,7 @@ function createMpesa(config, options) {
|
|
|
649
639
|
*/
|
|
650
640
|
client,
|
|
651
641
|
/**
|
|
652
|
-
* Pre-configured
|
|
642
|
+
* Pre-configured Next.js route handlers for M-Pesa callbacks
|
|
653
643
|
*/
|
|
654
644
|
handlers
|
|
655
645
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@singularity-payments/nextjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-alpha.3",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"next": ">=13.0.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@singularity-payments/core": "0.
|
|
34
|
+
"@singularity-payments/core": "1.0.0-alpha.3"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^25.0.3",
|