telebirr-nodejs 1.0.2 → 1.0.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/README.md +30 -23
- package/dist/index.cjs +2 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,21 +13,23 @@ Telebirr requires credentials and callback URLs.
|
|
|
13
13
|
You should never hard-code secrets. Always load them from process.env.
|
|
14
14
|
|
|
15
15
|
Required Credentials
|
|
16
|
-
Name
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
| Name | Description |
|
|
17
|
+
| ---------------------- | ---------------------------- |
|
|
18
|
+
| `FABRIC_APP_ID` | Fabric application ID |
|
|
19
|
+
| `FABRIC_APP_SECRET` | Fabric application secret |
|
|
20
|
+
| `MERCHANT_APP_ID` | Merchant application ID |
|
|
21
|
+
| `MERCHANT_CODE` | Merchant code |
|
|
22
|
+
| `MERCHANT_PRIVATE_KEY` | RSA private key (PEM string) |
|
|
23
|
+
|
|
22
24
|
|
|
23
25
|
Required URLs
|
|
24
|
-
Name
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
| Name | Description |
|
|
27
|
+
| ----------------------- | ------------------------------- |
|
|
28
|
+
| `TELEBIRR_NOTIFY_URL` | Server-to-server callback URL |
|
|
29
|
+
| `TELEBIRR_REDIRECT_URL` | User redirect URL after payment |
|
|
30
|
+
|
|
27
31
|
|
|
28
32
|
Basic Setup
|
|
29
|
-
ts
|
|
30
|
-
Copy code
|
|
31
33
|
import { TelebirrClient } from "telebirr-nodejs";
|
|
32
34
|
|
|
33
35
|
const client = new TelebirrClient({
|
|
@@ -46,15 +48,19 @@ const client = new TelebirrClient({
|
|
|
46
48
|
http: true, // allow HTTP in simulator mode
|
|
47
49
|
IntegrationOption: "C2B",
|
|
48
50
|
});
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
49
54
|
Important
|
|
50
55
|
MERCHANT_PRIVATE_KEY must be the full PEM string, including:
|
|
51
56
|
|
|
52
|
-
vbnet
|
|
53
|
-
Copy code
|
|
54
57
|
-----BEGIN RSA PRIVATE KEY-----
|
|
55
58
|
...
|
|
56
59
|
-----END RSA PRIVATE KEY-----
|
|
60
|
+
|
|
61
|
+
|
|
57
62
|
Example API Routes
|
|
63
|
+
|
|
58
64
|
Below is a complete demo using three routes:
|
|
59
65
|
|
|
60
66
|
POST /payment/initiate
|
|
@@ -66,8 +72,6 @@ POST /payment/refund
|
|
|
66
72
|
Initiate Payment
|
|
67
73
|
Creates an order and redirects the user to the Telebirr checkout page.
|
|
68
74
|
|
|
69
|
-
ts
|
|
70
|
-
Copy code
|
|
71
75
|
app.post("/payment/initiate", async (req, res) => {
|
|
72
76
|
const checkoutUrl = await client.preOrder({
|
|
73
77
|
merchOrderId: "order123",
|
|
@@ -78,7 +82,10 @@ app.post("/payment/initiate", async (req, res) => {
|
|
|
78
82
|
|
|
79
83
|
res.redirect(checkoutUrl);
|
|
80
84
|
});
|
|
85
|
+
|
|
86
|
+
|
|
81
87
|
What happens internally
|
|
88
|
+
|
|
82
89
|
Fabric token is fetched and cached
|
|
83
90
|
|
|
84
91
|
Order is signed and created
|
|
@@ -92,8 +99,6 @@ If you are using a frontend framework (for example React) and do not want to los
|
|
|
92
99
|
Query Payment Status
|
|
93
100
|
Used to check the payment result using the merchant order ID.
|
|
94
101
|
|
|
95
|
-
ts
|
|
96
|
-
Copy code
|
|
97
102
|
app.get("/payment/status/:merchOrderId", async (req, res) => {
|
|
98
103
|
const { merchOrderId } = req.params;
|
|
99
104
|
|
|
@@ -101,6 +106,8 @@ app.get("/payment/status/:merchOrderId", async (req, res) => {
|
|
|
101
106
|
|
|
102
107
|
res.json(info);
|
|
103
108
|
});
|
|
109
|
+
|
|
110
|
+
|
|
104
111
|
Typical Use Cases
|
|
105
112
|
Payment confirmation pages
|
|
106
113
|
|
|
@@ -111,8 +118,6 @@ Admin dashboards
|
|
|
111
118
|
Refund Payment
|
|
112
119
|
Refunds a completed transaction.
|
|
113
120
|
|
|
114
|
-
ts
|
|
115
|
-
Copy code
|
|
116
121
|
app.post("/payment/refund", async (req, res) => {
|
|
117
122
|
const refundData = await client.refundOrder({
|
|
118
123
|
merchOrderId: "order123",
|
|
@@ -123,16 +128,16 @@ app.post("/payment/refund", async (req, res) => {
|
|
|
123
128
|
|
|
124
129
|
res.json(refundData);
|
|
125
130
|
});
|
|
131
|
+
|
|
126
132
|
Notes
|
|
127
133
|
refundRequestNo must be unique
|
|
128
134
|
|
|
129
135
|
Refund amount must not exceed the original payment amount
|
|
130
136
|
|
|
131
137
|
Simulator Mode
|
|
138
|
+
|
|
132
139
|
To use the simulator provided by this package, set the mode to simulate.
|
|
133
140
|
|
|
134
|
-
ts
|
|
135
|
-
Copy code
|
|
136
141
|
import { TelebirrClient } from "telebirr-nodejs";
|
|
137
142
|
|
|
138
143
|
const client = new TelebirrClient({
|
|
@@ -142,6 +147,8 @@ const client = new TelebirrClient({
|
|
|
142
147
|
http: true,
|
|
143
148
|
IntegrationOption: "C2B",
|
|
144
149
|
});
|
|
150
|
+
|
|
151
|
+
|
|
145
152
|
This simulator is for learning and development purposes only.
|
|
146
153
|
The simulation server is provided by this package, not by Telebirr.
|
|
147
154
|
|
|
@@ -168,8 +175,6 @@ https://developer.ethiotelecom.et/docs/H5%20C2B%20Web%20Payment%20Integration%20
|
|
|
168
175
|
RSA Key Generation
|
|
169
176
|
You can generate private and public keys instantly.
|
|
170
177
|
|
|
171
|
-
ts
|
|
172
|
-
Copy code
|
|
173
178
|
import { generateKeys } from "telebirr-nodejs";
|
|
174
179
|
|
|
175
180
|
generateKeys({
|
|
@@ -178,6 +183,8 @@ generateKeys({
|
|
|
178
183
|
publicKeyName: "telefy_public.pem",
|
|
179
184
|
overwrite: false,
|
|
180
185
|
});
|
|
186
|
+
|
|
187
|
+
|
|
181
188
|
This will generate two .pem files in your root directory.
|
|
182
189
|
|
|
183
190
|
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.
|
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: "
|
|
70
|
-
webBase: "
|
|
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.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["c:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs"],"names":[],"mappings":"AAAA;AACA,gEAAoB;AACpB,gFAAgD;AAChD,gCAAuC;AACvC;AACA;AACA;AACA;AACA,wEAAuB;AACvB,SAAS,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;AACpC,EAAE,MAAM;AACR,IAAI,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACvB,IAAI,eAAe,EAAE,sBAAsB;AAC3C,IAAI,cAAc,EAAE,qBAAqB;AACzC,IAAI,UAAU,EAAE;AAChB,EAAE,EAAE,EAAE,OAAO;AACb,EAAE,MAAM,eAAe,EAAE,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC;AACvD,EAAE,MAAM,cAAc,EAAE,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;AACrD,EAAE,MAAM,OAAO,EAAE,YAAE,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC;AAC9E,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,EAAE;AAC5B,IAAI,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;AAC5C,EAAE;AACF,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,yCAAmB,KAAM,EAAE;AAC/D,IAAI,aAAa,EAAE,IAAI;AACvB,IAAI,iBAAiB,EAAE;AACvB,MAAM,IAAI,EAAE,OAAO;AACnB,MAAM,MAAM,EAAE;AACd,IAAI,CAAC;AACL,IAAI,kBAAkB,EAAE;AACxB,MAAM,IAAI,EAAE,OAAO;AACnB,MAAM,MAAM,EAAE;AACd,IAAI;AACJ,EAAE,CAAC,CAAC;AACJ,EAAE,YAAE,CAAC,aAAa,CAAC,cAAc,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7D,EAAE,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;AAC5C,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC;AAC1C;AACA;AACA;AACA,IAAI,UAAU,EAAE,oCAAc,YAAa,EAAE,EAAE,CAAC;AAChD,IAAI,SAAS,EAAE,oCAAc,YAAa,EAAE,CAAC,CAAC;AAC9C,SAAS,mBAAmB,CAAC,EAAE;AAC/B,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,YAAY,CAAC,CAAC;AAC3C,EAAE,MAAM,mBAAmB,EAAE,YAAG,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC;AACrE,EAAE,OAAO;AACT,IAAI,WAAW,EAAE,gCAAU,CAAE;AAC7B,IAAI,eAAe,EAAE,iCAAW,EAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpD,IAAI,aAAa,EAAE,SAAS,CAAC,CAAC;AAC9B,IAAI,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC5B,IAAI;AACJ,EAAE,CAAC;AACH;AACA;AACA;AACA,wEAAuB;AACvB,4EAAyB;AACzB;AACA;AACA,IAAI,cAAc,EAAE;AACpB,EAAE,OAAO,EAAE;AACX,IAAI,OAAO,EAAE,0EAA0E;AACvF,IAAI,OAAO,EAAE;AACb,EAAE,CAAC;AACH,EAAE,UAAU,EAAE;AACd,IAAI,OAAO,EAAE,6EAA6E;AAC1F,IAAI,OAAO,EAAE;AACb,EAAE,CAAC;AACH,EAAE,QAAQ,EAAE;AACZ,IAAI,OAAO,EAAE,
|
|
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: "
|
|
70
|
-
webBase: "
|
|
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"]}
|