telebirr-nodejs 1.0.2 → 1.0.4

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/README.md CHANGED
@@ -8,26 +8,30 @@ A simple, opinionated Node.js SDK for integrating **Telebirr C2B payments** with
8
8
 
9
9
  ```bash
10
10
  npm install telebirr-nodejs
11
+ ```
12
+
11
13
  Required Configuration
12
14
  Telebirr requires credentials and callback URLs.
13
15
  You should never hard-code secrets. Always load them from process.env.
14
16
 
15
17
  Required Credentials
16
- Name Description
17
- FABRIC_APP_ID Fabric application ID
18
- FABRIC_APP_SECRET Fabric application secret
19
- MERCHANT_APP_ID Merchant application ID
20
- MERCHANT_CODE Merchant code
21
- MERCHANT_PRIVATE_KEY RSA private key (PEM string)
18
+ | Name | Description |
19
+ | ---------------------- | ---------------------------- |
20
+ | `FABRIC_APP_ID` | Fabric application ID |
21
+ | `FABRIC_APP_SECRET` | Fabric application secret |
22
+ | `MERCHANT_APP_ID` | Merchant application ID |
23
+ | `MERCHANT_CODE` | Merchant code |
24
+ | `MERCHANT_PRIVATE_KEY` | RSA private key (PEM string) |
22
25
 
23
26
  Required URLs
24
- Name Description
25
- TELEBIRR_NOTIFY_URL Server-to-server callback URL
26
- TELEBIRR_REDIRECT_URL User redirect URL after payment
27
+ | Name | Description |
28
+ | ----------------------- | ------------------------------- |
29
+ | `TELEBIRR_NOTIFY_URL` | Server-to-server callback URL |
30
+ | `TELEBIRR_REDIRECT_URL` | User redirect URL after payment |
27
31
 
28
32
  Basic Setup
29
- ts
30
- Copy code
33
+
34
+ ```bash
31
35
  import { TelebirrClient } from "telebirr-nodejs";
32
36
 
33
37
  const client = new TelebirrClient({
@@ -46,15 +50,22 @@ const client = new TelebirrClient({
46
50
  http: true, // allow HTTP in simulator mode
47
51
  IntegrationOption: "C2B",
48
52
  });
53
+
54
+ ```
55
+
49
56
  Important
50
57
  MERCHANT_PRIVATE_KEY must be the full PEM string, including:
51
58
 
52
- vbnet
53
- Copy code
59
+ ```bash
60
+
54
61
  -----BEGIN RSA PRIVATE KEY-----
55
62
  ...
56
63
  -----END RSA PRIVATE KEY-----
64
+
65
+ ```
66
+
57
67
  Example API Routes
68
+
58
69
  Below is a complete demo using three routes:
59
70
 
60
71
  POST /payment/initiate
@@ -66,82 +77,71 @@ POST /payment/refund
66
77
  Initiate Payment
67
78
  Creates an order and redirects the user to the Telebirr checkout page.
68
79
 
69
- ts
70
- Copy code
80
+ ```bash
71
81
  app.post("/payment/initiate", async (req, res) => {
72
- const checkoutUrl = await client.preOrder({
73
- merchOrderId: "order123",
74
- title: "Phone",
75
- amount: "12",
76
- callbackInfo: "from web checkout",
77
- });
78
-
79
- res.redirect(checkoutUrl);
82
+ const checkoutUrl = await client.preOrder({
83
+ merchOrderId: "order123",
84
+ title: "Phone",
85
+ amount: "12",
86
+ callbackInfo: "from web checkout",
80
87
  });
81
- What happens internally
82
- Fabric token is fetched and cached
83
-
84
- Order is signed and created
85
88
 
86
- Checkout URL is generated
89
+ res.redirect(checkoutUrl);
90
+ });
87
91
 
88
- User is redirected to Telebirr
92
+ ```
89
93
 
90
94
  If you are using a frontend framework (for example React) and do not want to lose application state, return the checkout URL as JSON and let the frontend handle the redirection.
91
95
 
92
96
  Query Payment Status
93
97
  Used to check the payment result using the merchant order ID.
94
98
 
95
- ts
96
- Copy code
99
+ ```bash
97
100
  app.get("/payment/status/:merchOrderId", async (req, res) => {
98
- const { merchOrderId } = req.params;
101
+ const { merchOrderId } = req.params;
99
102
 
100
- const info = await client.queryOrder(merchOrderId);
103
+ const info = await client.queryOrder(merchOrderId);
101
104
 
102
- res.json(info);
105
+ res.json(info);
103
106
  });
104
- Typical Use Cases
105
- Payment confirmation pages
106
-
107
- Background reconciliation jobs
108
-
109
- Admin dashboards
107
+ ```
110
108
 
111
109
  Refund Payment
112
110
  Refunds a completed transaction.
113
111
 
114
- ts
115
- Copy code
112
+ ```bash
113
+
116
114
  app.post("/payment/refund", async (req, res) => {
117
- const refundData = await client.refundOrder({
118
- merchOrderId: "order123",
119
- refundRequestNo: "original-transaction-id",
120
- refundReason: "customer request",
121
- amount: "12",
122
- });
123
-
124
- res.json(refundData);
115
+ const refundData = await client.refundOrder({
116
+ merchOrderId: "order123",
117
+ refundRequestNo: "original-transaction-id",
118
+ refundReason: "customer request",
119
+ amount: "12",
125
120
  });
126
- Notes
127
- refundRequestNo must be unique
121
+
122
+ res.json(refundData);
123
+ });
124
+
125
+ ```
128
126
 
129
127
  Refund amount must not exceed the original payment amount
130
128
 
131
129
  Simulator Mode
130
+
132
131
  To use the simulator provided by this package, set the mode to simulate.
133
132
 
134
- ts
135
- Copy code
133
+ ```bash
136
134
  import { TelebirrClient } from "telebirr-nodejs";
137
135
 
138
136
  const client = new TelebirrClient({
139
- mode: "simulate",
140
- notifyUrl: "https://example.com/notify",
141
- redirectUrl: "https://example.com/redirect",
142
- http: true,
143
- IntegrationOption: "C2B",
137
+ mode: "simulate",
138
+ notifyUrl: "https://example.com/notify",
139
+ redirectUrl: "https://example.com/redirect",
140
+ http: true,
141
+ IntegrationOption: "C2B",
144
142
  });
143
+ ```
144
+
145
145
  This simulator is for learning and development purposes only.
146
146
  The simulation server is provided by this package, not by Telebirr.
147
147
 
@@ -168,17 +168,18 @@ https://developer.ethiotelecom.et/docs/H5%20C2B%20Web%20Payment%20Integration%20
168
168
  RSA Key Generation
169
169
  You can generate private and public keys instantly.
170
170
 
171
- ts
172
- Copy code
171
+ ```bash
173
172
  import { generateKeys } from "telebirr-nodejs";
174
173
 
175
174
  generateKeys({
176
- dir: process.cwd(),
177
- privateKeyName: "telefy_private.pem",
178
- publicKeyName: "telefy_public.pem",
179
- overwrite: false,
175
+ dir: process.cwd(),
176
+ privateKeyName: "telefy_private.pem",
177
+ publicKeyName: "telefy_public.pem",
178
+ overwrite: false,
180
179
  });
180
+
181
+ ```
182
+
181
183
  This will generate two .pem files in your root directory.
182
184
 
183
185
  The merchantPrivateKey option always accepts a string, so you must read the private key file using Node.js fs and pass the value to the client configuration.
184
- ```
package/dist/index.cjs CHANGED
@@ -66,13 +66,9 @@ var TELEBIRR_URLS = {
66
66
  webBase: "https://telebirrappcube.ethiomobilemoney.et:38443/payment/web/paygate?"
67
67
  },
68
68
  simulate: {
69
- apiBase: "http://localhost:3000",
70
- webBase: "http://localhost:3000/web/?"
69
+ apiBase: "https://telebirr-node-simulator.onrender.com",
70
+ webBase: "https://telebirr-node-simulator.onrender.com/web/?"
71
71
  }
72
- // simulate: {
73
- // apiBase: "https://telebirr-node-simulator.onrender.com",
74
- // webBase: "https://telebirr-node-simulator.onrender.com/web/?",
75
- // },
76
72
  };
77
73
  var CHECKOUT_OTHER_PARAMS = "&version=1.0&trade_type=Checkout";
78
74
 
@@ -1 +1 @@
1
- {"version":3,"sources":["c:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs"],"names":[],"mappings":"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;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs","sourcesContent":[null]}
1
+ {"version":3,"sources":["c:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs"],"names":[],"mappings":"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;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs","sourcesContent":[null]}
package/dist/index.js CHANGED
@@ -66,13 +66,9 @@ var TELEBIRR_URLS = {
66
66
  webBase: "https://telebirrappcube.ethiomobilemoney.et:38443/payment/web/paygate?"
67
67
  },
68
68
  simulate: {
69
- apiBase: "http://localhost:3000",
70
- webBase: "http://localhost:3000/web/?"
69
+ apiBase: "https://telebirr-node-simulator.onrender.com",
70
+ webBase: "https://telebirr-node-simulator.onrender.com/web/?"
71
71
  }
72
- // simulate: {
73
- // apiBase: "https://telebirr-node-simulator.onrender.com",
74
- // webBase: "https://telebirr-node-simulator.onrender.com/web/?",
75
- // },
76
72
  };
77
73
  var CHECKOUT_OTHER_PARAMS = "&version=1.0&trade_type=Checkout";
78
74
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/credentials.ts","../src/utils/keys.ts","../src/services/requestToken.ts","../src/constants/urls.ts","../src/services/requestCreateOrder.ts","../src/utils/nonce.ts","../src/utils/timestamp.ts","../src/utils/signature.ts","../src/services/requestRefundOrder.ts","../src/services/requestQueryOrder.ts","../src/client.ts"],"sourcesContent":["import fs from \"fs\";\r\nimport { randomUUID, randomBytes } from \"crypto\";\r\nimport { customAlphabet } from \"nanoid\";\r\nimport { generateKeys } from \"./keys\";\r\n\r\nconst numeric16 = customAlphabet(\"0123456789\", 16);\r\nconst numeric6 = customAlphabet(\"0123456789\", 6);\r\n\r\nexport interface SimulatorCredentials {\r\n fabricAppId: string;\r\n fabricAppSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n merchantPrivateKey: string;\r\n}\r\n\r\nexport function generateCredentials(): SimulatorCredentials {\r\n const { privateKeyPath } = generateKeys();\r\n\r\n const merchantPrivateKey = fs.readFileSync(privateKeyPath, \"utf8\");\r\n\r\n return {\r\n fabricAppId: randomUUID(),\r\n fabricAppSecret: randomBytes(16).toString(\"hex\"),\r\n merchantAppId: numeric16(),\r\n merchantCode: numeric6(),\r\n merchantPrivateKey,\r\n };\r\n}\r\n","import { generateKeyPairSync } from \"crypto\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\n\r\nexport interface KeyPairOptions {\r\n dir?: string; // default: process.cwd()\r\n privateKeyName?: string;\r\n publicKeyName?: string;\r\n overwrite?: boolean; // default: false\r\n}\r\n\r\nexport function generateKeys(options: KeyPairOptions = {}): {\r\n privateKeyPath: string;\r\n publicKeyPath: string;\r\n} {\r\n const {\r\n dir = process.cwd(),\r\n privateKeyName = \"telebirr_private.pem\",\r\n publicKeyName = \"telebirr_public.pem\",\r\n overwrite = false,\r\n } = options;\r\n\r\n const privateKeyPath = path.join(dir, privateKeyName);\r\n const publicKeyPath = path.join(dir, publicKeyName);\r\n\r\n const exists = fs.existsSync(privateKeyPath) && fs.existsSync(publicKeyPath);\r\n\r\n if (exists && !overwrite) {\r\n return { privateKeyPath, publicKeyPath };\r\n }\r\n\r\n const { privateKey, publicKey } = generateKeyPairSync(\"rsa\", {\r\n modulusLength: 2048,\r\n publicKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n privateKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n });\r\n\r\n fs.writeFileSync(privateKeyPath, privateKey, { mode: 0o600 });\r\n fs.writeFileSync(publicKeyPath, publicKey);\r\n\r\n return { privateKeyPath, publicKeyPath };\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\nimport { TelebirrConfig } from \"../types/telebirrConfig\";\r\n\r\nexport function requestToken(config: TelebirrConfig) {\r\n const isHttps = TELEBIRR_URLS[config.mode].apiBase.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n ` ${TELEBIRR_URLS[config.mode].apiBase}/payment/v1/token`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-APP-Key\": config.appId,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let body = \"\";\r\n\r\n res.on(\"data\", (chunk) => (body += chunk));\r\n res.on(\"end\", () => resolve(body));\r\n }\r\n );\r\n\r\n req.on(\"error\", reject);\r\n req.write(JSON.stringify({ appSecret: config.appSecret }));\r\n req.end();\r\n });\r\n}\r\n\r\n// import { AxiosInstance } from \"axios\";\r\n// import {\r\n// ApplyFabricTokenRequest,\r\n// FabricTokenResponse,\r\n// } from \"../types/fabricToken\";\r\n\r\n// export async function applyFabricToken(\r\n// client: AxiosInstance,\r\n// payload: ApplyFabricTokenRequest\r\n// ): Promise<typeof FabricTokenResponse | void> {\r\n// const appSecret = payload.appSecret;\r\n// try {\r\n// const response = await client.post<typeof FabricTokenResponse | void>(\r\n// \"/payment/v1/token\",\r\n// { appSecret }\r\n// );\r\n\r\n// return response.data;\r\n// } catch (error) {\r\n// console.log(error);\r\n// }\r\n// }\r\n","export const TELEBIRR_URLS = {\r\n sandbox: {\r\n apiBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/payment/web/paygate?\",\r\n },\r\n production: {\r\n apiBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/payment/web/paygate?\",\r\n },\r\n simulate: {\r\n apiBase: \"http://localhost:3000\",\r\n webBase: \"http://localhost:3000/web/?\",\r\n },\r\n // simulate: {\r\n // apiBase: \"https://telebirr-node-simulator.onrender.com\",\r\n // webBase: \"https://telebirr-node-simulator.onrender.com/web/?\",\r\n // },\r\n};\r\n\r\nexport const CHECKOUT_OTHER_PARAMS = \"&version=1.0&trade_type=Checkout\";\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n GenerateCheckoutUrlInput,\r\n CreateOrderResponse,\r\n TelebirrPreorderRequest,\r\n} from \"../types/createOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode, IntegrationOption } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestCreateOrder(\r\n fabricToken: string,\r\n input: GenerateCheckoutUrlInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n privateKey: string;\r\n http: boolean;\r\n integrationOption: IntegrationOption;\r\n }\r\n): Promise<{\r\n data: CreateOrderResponse;\r\n status: number;\r\n headers: http.IncomingHttpHeaders;\r\n}> {\r\n const reqBody: TelebirrPreorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.preorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n notify_url: config.notifyUrl,\r\n redirect_url: config.redirectUrl,\r\n trade_type: \"Checkout\",\r\n title: input.title,\r\n total_amount: input.amount,\r\n trans_currency: \"ETB\",\r\n timeout_express: \"120m\",\r\n business_type: \"BuyGoods\",\r\n payee_type: \"3000\",\r\n payee_identifier: config.merchantCode,\r\n payee_identifier_type: \"04\",\r\n callback_info: \"From web\",\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/preOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n // keep raw string if JSON parsing fails\r\n }\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr preorder request failed\",\r\n status,\r\n data: parsed,\r\n headers: res.headers,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n status,\r\n headers: res.headers,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr preorder network error\",\r\n cause: err,\r\n code: (err as any).code,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { randomBytes } from \"crypto\";\r\n\r\nexport function createNonceStr(): string {\r\n const bytes = Math.ceil(16);\r\n return randomBytes(bytes).toString(\"hex\").slice(0, 32);\r\n}\r\n","export function createTimestamp(): string {\r\n return Math.floor(Date.now() / 1000).toString();\r\n}\r\n","import crypto from \"crypto\";\r\n\r\nfunction flattenParams(params: Record<string, any>): Record<string, string> {\r\n const flat: Record<string, string> = {};\r\n\r\n for (const key in params) {\r\n const value = params[key];\r\n\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n value === \"\" ||\r\n key === \"sign\" ||\r\n key === \"signType\" ||\r\n key === \"sign_type\"\r\n ) {\r\n continue;\r\n }\r\n\r\n if (key === \"biz_content\" && typeof value === \"object\") {\r\n for (const bizKey in value) {\r\n const bizValue = value[bizKey];\r\n if (bizValue !== undefined && bizValue !== null && bizValue !== \"\") {\r\n flat[bizKey] = String(bizValue);\r\n }\r\n }\r\n } else {\r\n flat[key] = String(value);\r\n }\r\n }\r\n\r\n return flat;\r\n}\r\n\r\nexport function buildSignString(params: Record<string, any>): string {\r\n const flat = flattenParams(params);\r\n\r\n return Object.keys(flat)\r\n .sort()\r\n .map((key) => `${key}=${flat[key]}`)\r\n .join(\"&\");\r\n}\r\n\r\nexport function signRequest(\r\n data: Record<string, any>,\r\n privateKey: string\r\n): string {\r\n const signString = buildSignString(data);\r\n\r\n return crypto\r\n .createSign(\"RSA-SHA256\")\r\n .update(signString, \"utf8\")\r\n .sign(privateKey, \"base64\");\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode, IntegrationOption } from \"../types/telebirrConfig\";\r\nimport {\r\n RefundInput,\r\n RefundResponse,\r\n TelebirrRefundRequest,\r\n} from \"../types/refund\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestRefund(\r\n fabricToken: string,\r\n input: RefundInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n http: boolean;\r\n integrationOption: IntegrationOption;\r\n }\r\n): Promise<{\r\n data: RefundResponse;\r\n status: number;\r\n headers: http.IncomingHttpHeaders;\r\n}> {\r\n const reqBody: TelebirrRefundRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.refund\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n trans_currency: \"ETB\",\r\n actual_amount: input.amount,\r\n refund_request_no: input.refundRequestNo,\r\n refund_reason: input.refundReason,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/refund`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n // keep raw string if JSON parsing fails\r\n }\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr refund request failed\",\r\n status,\r\n data: parsed,\r\n headers: res.headers,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n status,\r\n headers: res.headers,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr refund network error\",\r\n cause: err,\r\n code: (err as any).code,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n TelebirrQueryorderRequest,\r\n QueryOrderResponse,\r\n} from \"../types/queryOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode, IntegrationOption } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestQueryOrder(\r\n fabricToken: string,\r\n merchOrderId: string,\r\n config: {\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n mode: TelebirrMode;\r\n http: boolean;\r\n integrationOption: IntegrationOption;\r\n }\r\n): Promise<{\r\n data: QueryOrderResponse;\r\n status: number;\r\n headers: http.IncomingHttpHeaders;\r\n}> {\r\n const reqBody: TelebirrQueryorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.queryorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: merchOrderId,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/queryOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n // keep raw if parsing fails\r\n }\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr queryOrder request failed\",\r\n status,\r\n data: parsed,\r\n headers: res.headers,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n status,\r\n headers: res.headers,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr queryOrder network error\",\r\n cause: err,\r\n code: (err as any).code,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { TelebirrConfig } from \"./types/telebirrConfig\";\r\nimport { FabricTokenResponse } from \"./types/fabricToken\";\r\nimport { GenerateCheckoutUrlInput } from \"./types/createOrder\";\r\nimport { generateCredentials } from \"./utils/credentials\";\r\nimport { QueryOrderResponse } from \"./types/queryOrder\";\r\nimport { RefundInput, RefundResponse } from \"./types/refund\";\r\nimport { requestToken } from \"./services/requestToken\";\r\nimport { requestCreateOrder } from \"./services/requestCreateOrder\";\r\nimport { requestRefund } from \"./services/requestRefundOrder\";\r\nimport { requestQueryOrder } from \"./services/requestQueryOrder\";\r\nimport { TELEBIRR_URLS, CHECKOUT_OTHER_PARAMS } from \"./constants/urls\";\r\nimport { signRequest } from \"./utils/signature\";\r\nimport { createTimestamp } from \"./utils/timestamp\";\r\nimport { createNonceStr } from \"./utils/nonce\";\r\n\r\nexport class TelebirrClient {\r\n private token?: typeof FabricTokenResponse;\r\n private config: TelebirrConfig;\r\n\r\n constructor(config: TelebirrConfig) {\r\n if (config.mode === \"simulate\") {\r\n const creds = generateCredentials();\r\n\r\n this.config = {\r\n ...config,\r\n appId: config.appId ?? creds.fabricAppId,\r\n appSecret: config.appSecret ?? creds.fabricAppSecret,\r\n merchantAppId: config.merchantAppId ?? creds.merchantAppId,\r\n merchantCode: config.merchantCode ?? creds.merchantCode,\r\n privateKey: creds.merchantPrivateKey,\r\n };\r\n } else {\r\n this.config = config;\r\n }\r\n }\r\n\r\n async getFabricToken(): Promise<any> {\r\n if (this.token && !this.isTokenExpired(this.token)) {\r\n return this.token;\r\n }\r\n\r\n let token: any = await requestToken(this.config);\r\n token = JSON.parse(token);\r\n if (!token) return;\r\n this.token = token;\r\n return token;\r\n }\r\n\r\n private createCheckoutUrl(prepayId: string): string {\r\n const map = {\r\n appid: this.config.merchantAppId,\r\n merch_code: this.config.merchantCode,\r\n nonce_str: createNonceStr(),\r\n prepay_id: prepayId,\r\n timestamp: createTimestamp(),\r\n };\r\n\r\n const sign = signRequest(map, this.config.privateKey);\r\n\r\n const rawRequest = [\r\n `appid=${map.appid}`,\r\n `merch_code=${map.merch_code}`,\r\n `nonce_str=${map.nonce_str}`,\r\n `prepay_id=${map.prepay_id}`,\r\n `timestamp=${map.timestamp}`,\r\n `sign=${sign}`,\r\n `sign_type=SHA256WithRSA`,\r\n ].join(\"&\");\r\n\r\n const webBase = TELEBIRR_URLS[this.config.mode].webBase;\r\n\r\n return webBase + rawRequest + CHECKOUT_OTHER_PARAMS;\r\n }\r\n async preOrder(input: GenerateCheckoutUrlInput): Promise<string | void> {\r\n const token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n let response: any = await requestCreateOrder(\r\n token.token,\r\n input,\r\n this.config\r\n );\r\n if (!response) return;\r\n\r\n return this.createCheckoutUrl(response.data.biz_content.prepay_id);\r\n }\r\n\r\n async queryOrder(input: string): Promise<QueryOrderResponse | void> {\r\n let token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n const response: any = await requestQueryOrder(\r\n token.token,\r\n input,\r\n this.config\r\n );\r\n\r\n return response.data;\r\n }\r\n async refundOrder(input: RefundInput): Promise<RefundResponse | void> {\r\n const token = await this.getFabricToken();\r\n if (!token) return;\r\n const response: any = await requestRefund(token.token, input, this.config);\r\n\r\n return response.data;\r\n }\r\n\r\n private static readonly TOKEN_EXPIRY_SAFETY_WINDOW_MS = 5 * 60 * 1000;\r\n\r\n private isTokenExpired(token?: typeof FabricTokenResponse): boolean {\r\n if (!token) {\r\n return true;\r\n }\r\n\r\n const now = Date.now();\r\n const expiry = this.parseTelebirrDate(token.expirationDate).getTime();\r\n\r\n return now >= expiry - TelebirrClient.TOKEN_EXPIRY_SAFETY_WINDOW_MS;\r\n }\r\n\r\n private parseTelebirrDate(value: string): Date {\r\n const year = Number(value.slice(0, 4));\r\n const month = Number(value.slice(4, 6)) - 1;\r\n const day = Number(value.slice(6, 8));\r\n const hour = Number(value.slice(8, 10));\r\n const minute = Number(value.slice(10, 12));\r\n const second = Number(value.slice(12, 14));\r\n\r\n return new Date(Date.UTC(year, month, day, hour, minute, second));\r\n }\r\n}\r\n"],"mappings":"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","names":["fs","fs","http","https","randomBytes","https","http","http","https","https","http","http","https","https","http"]}
1
+ {"version":3,"sources":["../src/utils/credentials.ts","../src/utils/keys.ts","../src/services/requestToken.ts","../src/constants/urls.ts","../src/services/requestCreateOrder.ts","../src/utils/nonce.ts","../src/utils/timestamp.ts","../src/utils/signature.ts","../src/services/requestRefundOrder.ts","../src/services/requestQueryOrder.ts","../src/client.ts"],"sourcesContent":["import fs from \"fs\";\r\nimport { randomUUID, randomBytes } from \"crypto\";\r\nimport { customAlphabet } from \"nanoid\";\r\nimport { generateKeys } from \"./keys\";\r\n\r\nconst numeric16 = customAlphabet(\"0123456789\", 16);\r\nconst numeric6 = customAlphabet(\"0123456789\", 6);\r\n\r\nexport interface SimulatorCredentials {\r\n fabricAppId: string;\r\n fabricAppSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n merchantPrivateKey: string;\r\n}\r\n\r\nexport function generateCredentials(): SimulatorCredentials {\r\n const { privateKeyPath } = generateKeys();\r\n\r\n const merchantPrivateKey = fs.readFileSync(privateKeyPath, \"utf8\");\r\n\r\n return {\r\n fabricAppId: randomUUID(),\r\n fabricAppSecret: randomBytes(16).toString(\"hex\"),\r\n merchantAppId: numeric16(),\r\n merchantCode: numeric6(),\r\n merchantPrivateKey,\r\n };\r\n}\r\n","import { generateKeyPairSync } from \"crypto\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\n\r\nexport interface KeyPairOptions {\r\n dir?: string; // default: process.cwd()\r\n privateKeyName?: string;\r\n publicKeyName?: string;\r\n overwrite?: boolean; // default: false\r\n}\r\n\r\nexport function generateKeys(options: KeyPairOptions = {}): {\r\n privateKeyPath: string;\r\n publicKeyPath: string;\r\n} {\r\n const {\r\n dir = process.cwd(),\r\n privateKeyName = \"telebirr_private.pem\",\r\n publicKeyName = \"telebirr_public.pem\",\r\n overwrite = false,\r\n } = options;\r\n\r\n const privateKeyPath = path.join(dir, privateKeyName);\r\n const publicKeyPath = path.join(dir, publicKeyName);\r\n\r\n const exists = fs.existsSync(privateKeyPath) && fs.existsSync(publicKeyPath);\r\n\r\n if (exists && !overwrite) {\r\n return { privateKeyPath, publicKeyPath };\r\n }\r\n\r\n const { privateKey, publicKey } = generateKeyPairSync(\"rsa\", {\r\n modulusLength: 2048,\r\n publicKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n privateKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n });\r\n\r\n fs.writeFileSync(privateKeyPath, privateKey, { mode: 0o600 });\r\n fs.writeFileSync(publicKeyPath, publicKey);\r\n\r\n return { privateKeyPath, publicKeyPath };\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\nimport { TelebirrConfig } from \"../types/telebirrConfig\";\r\n\r\nexport function requestToken(config: TelebirrConfig) {\r\n const isHttps = TELEBIRR_URLS[config.mode].apiBase.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n ` ${TELEBIRR_URLS[config.mode].apiBase}/payment/v1/token`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-APP-Key\": config.appId,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let body = \"\";\r\n\r\n res.on(\"data\", (chunk) => (body += chunk));\r\n res.on(\"end\", () => resolve(body));\r\n }\r\n );\r\n\r\n req.on(\"error\", reject);\r\n req.write(JSON.stringify({ appSecret: config.appSecret }));\r\n req.end();\r\n });\r\n}\r\n\r\n// import { AxiosInstance } from \"axios\";\r\n// import {\r\n// ApplyFabricTokenRequest,\r\n// FabricTokenResponse,\r\n// } from \"../types/fabricToken\";\r\n\r\n// export async function applyFabricToken(\r\n// client: AxiosInstance,\r\n// payload: ApplyFabricTokenRequest\r\n// ): Promise<typeof FabricTokenResponse | void> {\r\n// const appSecret = payload.appSecret;\r\n// try {\r\n// const response = await client.post<typeof FabricTokenResponse | void>(\r\n// \"/payment/v1/token\",\r\n// { appSecret }\r\n// );\r\n\r\n// return response.data;\r\n// } catch (error) {\r\n// console.log(error);\r\n// }\r\n// }\r\n","export const TELEBIRR_URLS = {\r\n sandbox: {\r\n apiBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/payment/web/paygate?\",\r\n },\r\n production: {\r\n apiBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/payment/web/paygate?\",\r\n },\r\n simulate: {\r\n apiBase: \"https://telebirr-node-simulator.onrender.com\",\r\n webBase: \"https://telebirr-node-simulator.onrender.com/web/?\",\r\n },\r\n};\r\n\r\nexport const CHECKOUT_OTHER_PARAMS = \"&version=1.0&trade_type=Checkout\";\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n GenerateCheckoutUrlInput,\r\n CreateOrderResponse,\r\n TelebirrPreorderRequest,\r\n} from \"../types/createOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode, IntegrationOption } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestCreateOrder(\r\n fabricToken: string,\r\n input: GenerateCheckoutUrlInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n privateKey: string;\r\n http: boolean;\r\n integrationOption: IntegrationOption;\r\n }\r\n): Promise<{\r\n data: CreateOrderResponse;\r\n status: number;\r\n headers: http.IncomingHttpHeaders;\r\n}> {\r\n const reqBody: TelebirrPreorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.preorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n notify_url: config.notifyUrl,\r\n redirect_url: config.redirectUrl,\r\n trade_type: \"Checkout\",\r\n title: input.title,\r\n total_amount: input.amount,\r\n trans_currency: \"ETB\",\r\n timeout_express: \"120m\",\r\n business_type: \"BuyGoods\",\r\n payee_type: \"3000\",\r\n payee_identifier: config.merchantCode,\r\n payee_identifier_type: \"04\",\r\n callback_info: \"From web\",\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/preOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n // keep raw string if JSON parsing fails\r\n }\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr preorder request failed\",\r\n status,\r\n data: parsed,\r\n headers: res.headers,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n status,\r\n headers: res.headers,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr preorder network error\",\r\n cause: err,\r\n code: (err as any).code,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { randomBytes } from \"crypto\";\r\n\r\nexport function createNonceStr(): string {\r\n const bytes = Math.ceil(16);\r\n return randomBytes(bytes).toString(\"hex\").slice(0, 32);\r\n}\r\n","export function createTimestamp(): string {\r\n return Math.floor(Date.now() / 1000).toString();\r\n}\r\n","import crypto from \"crypto\";\r\n\r\nfunction flattenParams(params: Record<string, any>): Record<string, string> {\r\n const flat: Record<string, string> = {};\r\n\r\n for (const key in params) {\r\n const value = params[key];\r\n\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n value === \"\" ||\r\n key === \"sign\" ||\r\n key === \"signType\" ||\r\n key === \"sign_type\"\r\n ) {\r\n continue;\r\n }\r\n\r\n if (key === \"biz_content\" && typeof value === \"object\") {\r\n for (const bizKey in value) {\r\n const bizValue = value[bizKey];\r\n if (bizValue !== undefined && bizValue !== null && bizValue !== \"\") {\r\n flat[bizKey] = String(bizValue);\r\n }\r\n }\r\n } else {\r\n flat[key] = String(value);\r\n }\r\n }\r\n\r\n return flat;\r\n}\r\n\r\nexport function buildSignString(params: Record<string, any>): string {\r\n const flat = flattenParams(params);\r\n\r\n return Object.keys(flat)\r\n .sort()\r\n .map((key) => `${key}=${flat[key]}`)\r\n .join(\"&\");\r\n}\r\n\r\nexport function signRequest(\r\n data: Record<string, any>,\r\n privateKey: string\r\n): string {\r\n const signString = buildSignString(data);\r\n\r\n return crypto\r\n .createSign(\"RSA-SHA256\")\r\n .update(signString, \"utf8\")\r\n .sign(privateKey, \"base64\");\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode, IntegrationOption } from \"../types/telebirrConfig\";\r\nimport {\r\n RefundInput,\r\n RefundResponse,\r\n TelebirrRefundRequest,\r\n} from \"../types/refund\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestRefund(\r\n fabricToken: string,\r\n input: RefundInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n http: boolean;\r\n integrationOption: IntegrationOption;\r\n }\r\n): Promise<{\r\n data: RefundResponse;\r\n status: number;\r\n headers: http.IncomingHttpHeaders;\r\n}> {\r\n const reqBody: TelebirrRefundRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.refund\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n trans_currency: \"ETB\",\r\n actual_amount: input.amount,\r\n refund_request_no: input.refundRequestNo,\r\n refund_reason: input.refundReason,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/refund`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n // keep raw string if JSON parsing fails\r\n }\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr refund request failed\",\r\n status,\r\n data: parsed,\r\n headers: res.headers,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n status,\r\n headers: res.headers,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr refund network error\",\r\n cause: err,\r\n code: (err as any).code,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n TelebirrQueryorderRequest,\r\n QueryOrderResponse,\r\n} from \"../types/queryOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode, IntegrationOption } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestQueryOrder(\r\n fabricToken: string,\r\n merchOrderId: string,\r\n config: {\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n mode: TelebirrMode;\r\n http: boolean;\r\n integrationOption: IntegrationOption;\r\n }\r\n): Promise<{\r\n data: QueryOrderResponse;\r\n status: number;\r\n headers: http.IncomingHttpHeaders;\r\n}> {\r\n const reqBody: TelebirrQueryorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.queryorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: merchOrderId,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/queryOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n // keep raw if parsing fails\r\n }\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr queryOrder request failed\",\r\n status,\r\n data: parsed,\r\n headers: res.headers,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n status,\r\n headers: res.headers,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr queryOrder network error\",\r\n cause: err,\r\n code: (err as any).code,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { TelebirrConfig } from \"./types/telebirrConfig\";\r\nimport { FabricTokenResponse } from \"./types/fabricToken\";\r\nimport { GenerateCheckoutUrlInput } from \"./types/createOrder\";\r\nimport { generateCredentials } from \"./utils/credentials\";\r\nimport { QueryOrderResponse } from \"./types/queryOrder\";\r\nimport { RefundInput, RefundResponse } from \"./types/refund\";\r\nimport { requestToken } from \"./services/requestToken\";\r\nimport { requestCreateOrder } from \"./services/requestCreateOrder\";\r\nimport { requestRefund } from \"./services/requestRefundOrder\";\r\nimport { requestQueryOrder } from \"./services/requestQueryOrder\";\r\nimport { TELEBIRR_URLS, CHECKOUT_OTHER_PARAMS } from \"./constants/urls\";\r\nimport { signRequest } from \"./utils/signature\";\r\nimport { createTimestamp } from \"./utils/timestamp\";\r\nimport { createNonceStr } from \"./utils/nonce\";\r\n\r\nexport class TelebirrClient {\r\n private token?: typeof FabricTokenResponse;\r\n private config: TelebirrConfig;\r\n\r\n constructor(config: TelebirrConfig) {\r\n if (config.mode === \"simulate\") {\r\n const creds = generateCredentials();\r\n\r\n this.config = {\r\n ...config,\r\n appId: config.appId ?? creds.fabricAppId,\r\n appSecret: config.appSecret ?? creds.fabricAppSecret,\r\n merchantAppId: config.merchantAppId ?? creds.merchantAppId,\r\n merchantCode: config.merchantCode ?? creds.merchantCode,\r\n privateKey: creds.merchantPrivateKey,\r\n };\r\n } else {\r\n this.config = config;\r\n }\r\n }\r\n\r\n async getFabricToken(): Promise<any> {\r\n if (this.token && !this.isTokenExpired(this.token)) {\r\n return this.token;\r\n }\r\n\r\n let token: any = await requestToken(this.config);\r\n token = JSON.parse(token);\r\n if (!token) return;\r\n this.token = token;\r\n return token;\r\n }\r\n\r\n private createCheckoutUrl(prepayId: string): string {\r\n const map = {\r\n appid: this.config.merchantAppId,\r\n merch_code: this.config.merchantCode,\r\n nonce_str: createNonceStr(),\r\n prepay_id: prepayId,\r\n timestamp: createTimestamp(),\r\n };\r\n\r\n const sign = signRequest(map, this.config.privateKey);\r\n\r\n const rawRequest = [\r\n `appid=${map.appid}`,\r\n `merch_code=${map.merch_code}`,\r\n `nonce_str=${map.nonce_str}`,\r\n `prepay_id=${map.prepay_id}`,\r\n `timestamp=${map.timestamp}`,\r\n `sign=${sign}`,\r\n `sign_type=SHA256WithRSA`,\r\n ].join(\"&\");\r\n\r\n const webBase = TELEBIRR_URLS[this.config.mode].webBase;\r\n\r\n return webBase + rawRequest + CHECKOUT_OTHER_PARAMS;\r\n }\r\n async preOrder(input: GenerateCheckoutUrlInput): Promise<string | void> {\r\n const token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n let response: any = await requestCreateOrder(\r\n token.token,\r\n input,\r\n this.config\r\n );\r\n if (!response) return;\r\n\r\n return this.createCheckoutUrl(response.data.biz_content.prepay_id);\r\n }\r\n\r\n async queryOrder(input: string): Promise<QueryOrderResponse | void> {\r\n let token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n const response: any = await requestQueryOrder(\r\n token.token,\r\n input,\r\n this.config\r\n );\r\n\r\n return response.data;\r\n }\r\n async refundOrder(input: RefundInput): Promise<RefundResponse | void> {\r\n const token = await this.getFabricToken();\r\n if (!token) return;\r\n const response: any = await requestRefund(token.token, input, this.config);\r\n\r\n return response.data;\r\n }\r\n\r\n private static readonly TOKEN_EXPIRY_SAFETY_WINDOW_MS = 5 * 60 * 1000;\r\n\r\n private isTokenExpired(token?: typeof FabricTokenResponse): boolean {\r\n if (!token) {\r\n return true;\r\n }\r\n\r\n const now = Date.now();\r\n const expiry = this.parseTelebirrDate(token.expirationDate).getTime();\r\n\r\n return now >= expiry - TelebirrClient.TOKEN_EXPIRY_SAFETY_WINDOW_MS;\r\n }\r\n\r\n private parseTelebirrDate(value: string): Date {\r\n const year = Number(value.slice(0, 4));\r\n const month = Number(value.slice(4, 6)) - 1;\r\n const day = Number(value.slice(6, 8));\r\n const hour = Number(value.slice(8, 10));\r\n const minute = Number(value.slice(10, 12));\r\n const second = Number(value.slice(12, 14));\r\n\r\n return new Date(Date.UTC(year, month, day, hour, minute, second));\r\n }\r\n}\r\n"],"mappings":"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","names":["fs","fs","http","https","randomBytes","https","http","http","https","https","http","http","https","https","http"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "telebirr-nodejs",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Unofficial Telebirr Node.js SDK.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",