@bayarkit/testing 0.0.0 → 0.1.0
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 +26 -1
- package/dist/cli/2c2p.d.ts +4 -0
- package/dist/cli/2c2p.d.ts.map +1 -0
- package/dist/cli/2c2p.js +7 -0
- package/dist/cli/2c2p.js.map +1 -0
- package/dist/cli/bayarcash.d.ts +4 -0
- package/dist/cli/bayarcash.d.ts.map +1 -0
- package/dist/cli/bayarcash.js +11 -0
- package/dist/cli/bayarcash.js.map +1 -0
- package/dist/cli/billplz.d.ts +4 -0
- package/dist/cli/billplz.d.ts.map +1 -0
- package/dist/cli/billplz.js +11 -0
- package/dist/cli/billplz.js.map +1 -0
- package/dist/cli/chip.d.ts +4 -0
- package/dist/cli/chip.d.ts.map +1 -0
- package/dist/cli/chip.js +7 -0
- package/dist/cli/chip.js.map +1 -0
- package/dist/cli/curlec.d.ts +4 -0
- package/dist/cli/curlec.d.ts.map +1 -0
- package/dist/cli/curlec.js +11 -0
- package/dist/cli/curlec.js.map +1 -0
- package/dist/cli/eghl.d.ts +4 -0
- package/dist/cli/eghl.d.ts.map +1 -0
- package/dist/cli/eghl.js +7 -0
- package/dist/cli/eghl.js.map +1 -0
- package/dist/cli/fiuu.d.ts +4 -0
- package/dist/cli/fiuu.d.ts.map +1 -0
- package/dist/cli/fiuu.js +17 -0
- package/dist/cli/fiuu.js.map +1 -0
- package/dist/cli/gkash.d.ts +4 -0
- package/dist/cli/gkash.d.ts.map +1 -0
- package/dist/cli/gkash.js +7 -0
- package/dist/cli/gkash.js.map +1 -0
- package/dist/cli/hitpay.d.ts +4 -0
- package/dist/cli/hitpay.d.ts.map +1 -0
- package/dist/cli/hitpay.js +7 -0
- package/dist/cli/hitpay.js.map +1 -0
- package/dist/cli/ipay88.d.ts +4 -0
- package/dist/cli/ipay88.d.ts.map +1 -0
- package/dist/cli/ipay88.js +7 -0
- package/dist/cli/ipay88.js.map +1 -0
- package/dist/cli/senangpay.d.ts +4 -0
- package/dist/cli/senangpay.d.ts.map +1 -0
- package/dist/cli/senangpay.js +17 -0
- package/dist/cli/senangpay.js.map +1 -0
- package/dist/cli/stripe.d.ts +4 -0
- package/dist/cli/stripe.d.ts.map +1 -0
- package/dist/cli/stripe.js +7 -0
- package/dist/cli/stripe.js.map +1 -0
- package/dist/cli/toyyibpay.d.ts +4 -0
- package/dist/cli/toyyibpay.d.ts.map +1 -0
- package/dist/cli/toyyibpay.js +7 -0
- package/dist/cli/toyyibpay.js.map +1 -0
- package/dist/cli/types.d.ts +7 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/xendit.d.ts +4 -0
- package/dist/cli/xendit.d.ts.map +1 -0
- package/dist/cli/xendit.js +7 -0
- package/dist/cli/xendit.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +46 -0
- package/dist/cli.js.map +1 -0
- package/dist/conformance.d.ts +13 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +166 -0
- package/dist/conformance.js.map +1 -0
- package/dist/control.d.ts +6 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +46 -0
- package/dist/control.js.map +1 -0
- package/dist/fakes/2c2p.d.ts +21 -0
- package/dist/fakes/2c2p.d.ts.map +1 -0
- package/dist/fakes/2c2p.js +287 -0
- package/dist/fakes/2c2p.js.map +1 -0
- package/dist/fakes/bayarcash.d.ts +15 -0
- package/dist/fakes/bayarcash.d.ts.map +1 -0
- package/dist/fakes/bayarcash.js +133 -0
- package/dist/fakes/bayarcash.js.map +1 -0
- package/dist/fakes/billplz.d.ts +20 -0
- package/dist/fakes/billplz.d.ts.map +1 -0
- package/dist/fakes/billplz.js +233 -0
- package/dist/fakes/billplz.js.map +1 -0
- package/dist/fakes/chip.d.ts +18 -0
- package/dist/fakes/chip.d.ts.map +1 -0
- package/dist/fakes/chip.js +227 -0
- package/dist/fakes/chip.js.map +1 -0
- package/dist/fakes/curlec.d.ts +30 -0
- package/dist/fakes/curlec.d.ts.map +1 -0
- package/dist/fakes/curlec.js +396 -0
- package/dist/fakes/curlec.js.map +1 -0
- package/dist/fakes/eghl.d.ts +36 -0
- package/dist/fakes/eghl.d.ts.map +1 -0
- package/dist/fakes/eghl.js +267 -0
- package/dist/fakes/eghl.js.map +1 -0
- package/dist/fakes/fiuu.d.ts +27 -0
- package/dist/fakes/fiuu.d.ts.map +1 -0
- package/dist/fakes/fiuu.js +230 -0
- package/dist/fakes/fiuu.js.map +1 -0
- package/dist/fakes/gkash.d.ts +18 -0
- package/dist/fakes/gkash.d.ts.map +1 -0
- package/dist/fakes/gkash.js +193 -0
- package/dist/fakes/gkash.js.map +1 -0
- package/dist/fakes/hitpay.d.ts +36 -0
- package/dist/fakes/hitpay.d.ts.map +1 -0
- package/dist/fakes/hitpay.js +233 -0
- package/dist/fakes/hitpay.js.map +1 -0
- package/dist/fakes/ipay88.d.ts +16 -0
- package/dist/fakes/ipay88.d.ts.map +1 -0
- package/dist/fakes/ipay88.js +195 -0
- package/dist/fakes/ipay88.js.map +1 -0
- package/dist/fakes/senangpay.d.ts +51 -0
- package/dist/fakes/senangpay.d.ts.map +1 -0
- package/dist/fakes/senangpay.js +255 -0
- package/dist/fakes/senangpay.js.map +1 -0
- package/dist/fakes/stripe.d.ts +26 -0
- package/dist/fakes/stripe.d.ts.map +1 -0
- package/dist/fakes/stripe.js +243 -0
- package/dist/fakes/stripe.js.map +1 -0
- package/dist/fakes/toyyibpay.d.ts +14 -0
- package/dist/fakes/toyyibpay.d.ts.map +1 -0
- package/dist/fakes/toyyibpay.js +138 -0
- package/dist/fakes/toyyibpay.js.map +1 -0
- package/dist/fakes/types.d.ts +19 -0
- package/dist/fakes/types.d.ts.map +1 -0
- package/dist/fakes/types.js +3 -0
- package/dist/fakes/types.js.map +1 -0
- package/dist/fakes/xendit.d.ts +36 -0
- package/dist/fakes/xendit.d.ts.map +1 -0
- package/dist/fakes/xendit.js +300 -0
- package/dist/fakes/xendit.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -2
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fake Razorpay Curlec API (Payment Links + Orders), built from the official docs in `gateways/curlec/spec.md`
|
|
3
|
+
* (curlec.com/docs `.md` exports, read 23 October 2026). NOT yet measured against a Test-mode account: when someone
|
|
4
|
+
* does, change this file first so it answers like the real thing, then the adapter.
|
|
5
|
+
*
|
|
6
|
+
* What it checks, and where each rule comes from (spec keys in brackets):
|
|
7
|
+
* - auth: `Authorization: Basic base64(key_id:key_secret)`, the scheme spelled exactly `Basic` [D2]. A bad header is
|
|
8
|
+
* answered 401 `{ error: { code: 'BAD_REQUEST_ERROR', description: 'Authentication failed' } }` (ASSUMED: OC lists
|
|
9
|
+
* "Authentication failed." under 400, AU says 401; the adapter treats both as "an error is an error");
|
|
10
|
+
* - JSON bodies and answers; errors `{ error: { code, description, source, step, reason, metadata, field? } }` [OC, PLC];
|
|
11
|
+
* - `POST /v1/payment_links`: `amount` a JSON integer ≥ 100, `reference_id` ≤ 40 and unique, `callback_method: get`
|
|
12
|
+
* with `callback_url`, `expire_by` ≥ 15 min ahead, `customer.contact` 8–14 chars, unknown fields refused [PLC];
|
|
13
|
+
* - `POST /v1/orders`: `amount` a JSON integer ≥ 100, `receipt` ≤ 40 ASCII and unique ("Duplicate request") [OC];
|
|
14
|
+
* - a link gets its order only when the customer opens it (the official `payment_link.paid` sample has the order
|
|
15
|
+
* created after the link); the order's `receipt` is the link's `reference_id` (same sample), and the fetched link
|
|
16
|
+
* then carries `order_id` (fetch-id-standard sample);
|
|
17
|
+
* - order status `created` → `attempted` → `paid` [OC]; link status `created` → `paid` [PLE];
|
|
18
|
+
* - webhooks: JSON POST, `X-Razorpay-Signature` = hex HMAC-SHA256(webhook secret, RAW body), plus
|
|
19
|
+
* `x-razorpay-event-id` [WV]. The body is indented so a handler that re-serialises the parsed JSON (the official
|
|
20
|
+
* Node sample, WV L134) gets different bytes and fails;
|
|
21
|
+
* - Payment Link redirect: GET query signed with the API key secret over
|
|
22
|
+
* `plink_id|reference_id|status|payment_id` [PLA]; Checkout callback: POST form signed with the API key secret over
|
|
23
|
+
* `order_id|payment_id` [CK].
|
|
24
|
+
*/
|
|
25
|
+
import { createHmac, randomBytes } from 'node:crypto';
|
|
26
|
+
import { createServer } from 'node:http';
|
|
27
|
+
import { flip } from './types.js';
|
|
28
|
+
/** hex(HMAC-SHA256(secret, message)), written independently of the adapter. */
|
|
29
|
+
const hmacHex = (secret, message) => createHmac('sha256', secret).update(message, 'utf8').digest('hex');
|
|
30
|
+
/** Webhook signature: the RAW body, keyed with the Dashboard webhook secret [WV L138-153]. */
|
|
31
|
+
export const curlecWebhookSignature = (webhookSecret, rawBody) => hmacHex(webhookSecret, rawBody);
|
|
32
|
+
const randomId = (prefix) => `${prefix}${randomBytes(7).toString('hex')}`;
|
|
33
|
+
const LINK_FIELDS = new Set([
|
|
34
|
+
'amount',
|
|
35
|
+
'currency',
|
|
36
|
+
'accept_partial',
|
|
37
|
+
'first_min_partial_amount',
|
|
38
|
+
'upi_link',
|
|
39
|
+
'description',
|
|
40
|
+
'reference_id',
|
|
41
|
+
'customer',
|
|
42
|
+
'expire_by',
|
|
43
|
+
'notify',
|
|
44
|
+
'notes',
|
|
45
|
+
'callback_url',
|
|
46
|
+
'callback_method',
|
|
47
|
+
'reminder_enable',
|
|
48
|
+
]);
|
|
49
|
+
export async function startFakeCurlec(opts) {
|
|
50
|
+
const links = new Map();
|
|
51
|
+
const orders = new Map();
|
|
52
|
+
/** order id → captured payment id (kept apart so the order entity has only documented fields). */
|
|
53
|
+
const paid = new Map();
|
|
54
|
+
const references = new Set();
|
|
55
|
+
const receipts = new Set();
|
|
56
|
+
const requests = [];
|
|
57
|
+
const now = () => Math.floor(Date.now() / 1000);
|
|
58
|
+
const basic = `Basic ${Buffer.from(`${opts.keyId}:${opts.keySecret}`).toString('base64')}`;
|
|
59
|
+
const error = (description, field) => ({
|
|
60
|
+
error: {
|
|
61
|
+
code: 'BAD_REQUEST_ERROR',
|
|
62
|
+
description,
|
|
63
|
+
source: 'business',
|
|
64
|
+
step: 'payment_initiation',
|
|
65
|
+
reason: 'input_validation_failed',
|
|
66
|
+
metadata: {},
|
|
67
|
+
...(field ? { field } : {}),
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
const server = createServer((req, res) => {
|
|
71
|
+
let raw = '';
|
|
72
|
+
req.on('data', (d) => {
|
|
73
|
+
raw += d;
|
|
74
|
+
});
|
|
75
|
+
req.on('end', () => {
|
|
76
|
+
const path = (req.url ?? '').split('?')[0] ?? '';
|
|
77
|
+
let body = null;
|
|
78
|
+
if (raw) {
|
|
79
|
+
try {
|
|
80
|
+
body = JSON.parse(raw);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
body = Symbol.for('bad-json');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
requests.push({ method: req.method ?? '', path, body, headers: req.headers });
|
|
87
|
+
const send = (status, o) => {
|
|
88
|
+
res.writeHead(status, { 'content-type': 'application/json' });
|
|
89
|
+
res.end(JSON.stringify(o));
|
|
90
|
+
};
|
|
91
|
+
if (req.headers.authorization !== basic)
|
|
92
|
+
return send(401, error('Authentication failed'));
|
|
93
|
+
if (typeof body === 'symbol')
|
|
94
|
+
return send(400, error('EOF'));
|
|
95
|
+
const b = (body ?? {});
|
|
96
|
+
if (req.method === 'POST' && path === '/v1/payment_links')
|
|
97
|
+
return send(...createLink(b));
|
|
98
|
+
if (req.method === 'POST' && path === '/v1/orders')
|
|
99
|
+
return send(...createOrder(b));
|
|
100
|
+
const link = /^\/v1\/payment_links\/([A-Za-z0-9_]+)$/.exec(path);
|
|
101
|
+
if (req.method === 'GET' && link) {
|
|
102
|
+
const l = links.get(link[1] ?? '');
|
|
103
|
+
return l ? send(200, l) : send(400, error('The id provided does not exist'));
|
|
104
|
+
}
|
|
105
|
+
const order = /^\/v1\/orders\/([A-Za-z0-9_]+)$/.exec(path);
|
|
106
|
+
if (req.method === 'GET' && order) {
|
|
107
|
+
const o = orders.get(order[1] ?? '');
|
|
108
|
+
return o ? send(200, o) : send(400, error('The id provided does not exist'));
|
|
109
|
+
}
|
|
110
|
+
return send(404, error('The requested URL was not found on the server.'));
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
function validAmount(amount, field = 'amount') {
|
|
114
|
+
if (amount === undefined)
|
|
115
|
+
return `${field}: cannot be blank.`;
|
|
116
|
+
if (typeof amount !== 'number' || !Number.isInteger(amount))
|
|
117
|
+
return 'The amount must be an integer.';
|
|
118
|
+
if (amount < 100)
|
|
119
|
+
return 'The amount must be at least MYR 1.00';
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function createLink(b) {
|
|
123
|
+
const extra = Object.keys(b).filter((k) => !LINK_FIELDS.has(k));
|
|
124
|
+
if (extra.length)
|
|
125
|
+
return [400, error('extra fields sent.', extra[0])];
|
|
126
|
+
const bad = validAmount(b.amount);
|
|
127
|
+
if (bad)
|
|
128
|
+
return [400, error(bad, 'amount')];
|
|
129
|
+
if ((b.currency ?? 'MYR') !== 'MYR')
|
|
130
|
+
return [400, error('amount: currency: wrong input field', 'currency')];
|
|
131
|
+
const ref = b.reference_id;
|
|
132
|
+
if (ref !== undefined) {
|
|
133
|
+
if (typeof ref !== 'string' || ref.length > 40)
|
|
134
|
+
return [400, error('reference_id: the length must be no more than 40.', 'reference_id')];
|
|
135
|
+
if (references.has(ref))
|
|
136
|
+
return [400, error('payment link creation with reference ID already attempted', 'reference_id')];
|
|
137
|
+
}
|
|
138
|
+
if (b.callback_url !== undefined) {
|
|
139
|
+
if (typeof b.callback_url !== 'string' || !/^https?:\/\//.test(b.callback_url))
|
|
140
|
+
return [400, error('callback_url: URL should be sent in callback_url field.', 'callback_url')];
|
|
141
|
+
if (b.callback_method !== 'get')
|
|
142
|
+
return [400, error('callback_method: must be a valid value.', 'callback_method')];
|
|
143
|
+
}
|
|
144
|
+
if (b.expire_by !== undefined) {
|
|
145
|
+
if (typeof b.expire_by !== 'number' || !Number.isInteger(b.expire_by))
|
|
146
|
+
return [400, error('incorrect JSON object received - faulty key: expire_by.', 'expire_by')];
|
|
147
|
+
if (b.expire_by < now() + 15 * 60)
|
|
148
|
+
return [400, error('timestamp must be atleast 15 minutes in future', 'expire_by')];
|
|
149
|
+
}
|
|
150
|
+
const customer = (b.customer ?? {});
|
|
151
|
+
if (customer.contact !== undefined) {
|
|
152
|
+
const c = String(customer.contact);
|
|
153
|
+
if (c.length < 8 || c.length > 14)
|
|
154
|
+
return [400, error('contact: the length must be between 8 and 14.', 'contact')];
|
|
155
|
+
}
|
|
156
|
+
if (b.accept_partial === false && b.first_min_partial_amount !== undefined)
|
|
157
|
+
return [
|
|
158
|
+
400,
|
|
159
|
+
error('first_min_partial_amount: amount should be minimum 100', 'first_min_partial_amount'),
|
|
160
|
+
];
|
|
161
|
+
if (typeof ref === 'string')
|
|
162
|
+
references.add(ref);
|
|
163
|
+
const id = randomId('plink_');
|
|
164
|
+
const created = now();
|
|
165
|
+
const link = {
|
|
166
|
+
id,
|
|
167
|
+
accept_partial: b.accept_partial === true,
|
|
168
|
+
amount: b.amount,
|
|
169
|
+
amount_paid: 0,
|
|
170
|
+
callback_method: b.callback_method ?? null,
|
|
171
|
+
callback_url: b.callback_url ?? null,
|
|
172
|
+
cancelled_at: 0,
|
|
173
|
+
created_at: created,
|
|
174
|
+
currency: 'MYR',
|
|
175
|
+
customer,
|
|
176
|
+
description: b.description ?? '',
|
|
177
|
+
expire_by: b.expire_by ?? 0,
|
|
178
|
+
expired_at: 0,
|
|
179
|
+
first_min_partial_amount: 0,
|
|
180
|
+
notes: b.notes ?? null,
|
|
181
|
+
notify: b.notify ?? { email: false, sms: false },
|
|
182
|
+
payments: null,
|
|
183
|
+
reference_id: ref ?? '',
|
|
184
|
+
reminder_enable: b.reminder_enable === true,
|
|
185
|
+
reminders: [],
|
|
186
|
+
short_url: `https://rzp.io/i/${id.slice(6)}`,
|
|
187
|
+
status: 'created',
|
|
188
|
+
updated_at: created,
|
|
189
|
+
user_id: '',
|
|
190
|
+
};
|
|
191
|
+
links.set(id, link);
|
|
192
|
+
return [200, link];
|
|
193
|
+
}
|
|
194
|
+
function newOrder(amount, receipt, notes) {
|
|
195
|
+
const id = randomId('order_');
|
|
196
|
+
const order = {
|
|
197
|
+
id,
|
|
198
|
+
entity: 'order',
|
|
199
|
+
amount,
|
|
200
|
+
amount_paid: 0,
|
|
201
|
+
amount_due: amount,
|
|
202
|
+
currency: 'MYR',
|
|
203
|
+
receipt,
|
|
204
|
+
offer_id: null,
|
|
205
|
+
status: 'created',
|
|
206
|
+
attempts: 0,
|
|
207
|
+
notes: notes ?? [],
|
|
208
|
+
created_at: now(),
|
|
209
|
+
};
|
|
210
|
+
orders.set(id, order);
|
|
211
|
+
return order;
|
|
212
|
+
}
|
|
213
|
+
function createOrder(b) {
|
|
214
|
+
const bad = validAmount(b.amount);
|
|
215
|
+
if (bad)
|
|
216
|
+
return [400, error(bad, 'amount')];
|
|
217
|
+
if (b.currency !== 'MYR')
|
|
218
|
+
return [400, error('currency: validation_failure: BAD_REQUEST_INVALID_CURRENCY.', 'currency')];
|
|
219
|
+
const receipt = b.receipt;
|
|
220
|
+
if (receipt !== undefined) {
|
|
221
|
+
if (typeof receipt !== 'string' || receipt.length > 40)
|
|
222
|
+
return [400, error('receipt: the length must be no more than 40.', 'receipt')];
|
|
223
|
+
if (!/^[\x20-\x7e]*$/.test(receipt))
|
|
224
|
+
return [
|
|
225
|
+
400,
|
|
226
|
+
error('The receipt: validation_failure: BAD_REQUEST_ENCODING_VALIDATION_FAILED.', 'receipt'),
|
|
227
|
+
];
|
|
228
|
+
if (receipts.has(receipt))
|
|
229
|
+
return [400, error('Duplicate request. This request has already been processed.')];
|
|
230
|
+
receipts.add(receipt);
|
|
231
|
+
}
|
|
232
|
+
return [200, newOrder(b.amount, receipt ?? null, b.notes)];
|
|
233
|
+
}
|
|
234
|
+
await new Promise((r) => server.listen(0, '127.0.0.1', r));
|
|
235
|
+
const url = `http://127.0.0.1:${server.address().port}`;
|
|
236
|
+
const find = (id) => {
|
|
237
|
+
const e = links.get(id) ?? orders.get(id);
|
|
238
|
+
if (!e)
|
|
239
|
+
throw new Error(`fake Curlec: no payment link or order ${id}`);
|
|
240
|
+
return e;
|
|
241
|
+
};
|
|
242
|
+
/** The order behind an id: the order itself, or the link's (created, `attempted`, when the customer opens it). */
|
|
243
|
+
function orderOf(id) {
|
|
244
|
+
const e = find(id);
|
|
245
|
+
if (!id.startsWith('plink_'))
|
|
246
|
+
return e;
|
|
247
|
+
const existing = typeof e.order_id === 'string' ? orders.get(e.order_id) : undefined;
|
|
248
|
+
if (existing)
|
|
249
|
+
return existing;
|
|
250
|
+
const order = newOrder(e.amount, String(e.reference_id ?? ''), []);
|
|
251
|
+
e.order_id = order.id;
|
|
252
|
+
return order;
|
|
253
|
+
}
|
|
254
|
+
function attempt(id) {
|
|
255
|
+
const order = orderOf(id);
|
|
256
|
+
if (order.status === 'created')
|
|
257
|
+
order.status = 'attempted';
|
|
258
|
+
order.attempts = order.attempts + 1;
|
|
259
|
+
return order;
|
|
260
|
+
}
|
|
261
|
+
/** A captured payment entity for this order, as the webhook samples show it [WO, WP]. */
|
|
262
|
+
const paymentFor = (order) => {
|
|
263
|
+
const id = paid.get(order.id) ?? randomId('pay_');
|
|
264
|
+
return {
|
|
265
|
+
id,
|
|
266
|
+
entity: 'payment',
|
|
267
|
+
amount: order.amount,
|
|
268
|
+
currency: 'MYR',
|
|
269
|
+
status: 'captured',
|
|
270
|
+
order_id: order.id,
|
|
271
|
+
invoice_id: null,
|
|
272
|
+
international: false,
|
|
273
|
+
method: 'fpx',
|
|
274
|
+
amount_refunded: 0,
|
|
275
|
+
refund_status: null,
|
|
276
|
+
captured: true,
|
|
277
|
+
description: null,
|
|
278
|
+
card_id: null,
|
|
279
|
+
bank: 'TEST0021',
|
|
280
|
+
wallet: null,
|
|
281
|
+
email: 'void@curlec.example',
|
|
282
|
+
contact: '+60123456789',
|
|
283
|
+
notes: [],
|
|
284
|
+
fee: 2,
|
|
285
|
+
tax: 0,
|
|
286
|
+
error_code: null,
|
|
287
|
+
error_description: null,
|
|
288
|
+
created_at: now(),
|
|
289
|
+
};
|
|
290
|
+
};
|
|
291
|
+
return {
|
|
292
|
+
url,
|
|
293
|
+
requests,
|
|
294
|
+
entity: (id) => links.get(id) ?? orders.get(id),
|
|
295
|
+
attempt,
|
|
296
|
+
markPaid(id) {
|
|
297
|
+
const order = attempt(id);
|
|
298
|
+
const payment = paymentFor(order);
|
|
299
|
+
paid.set(order.id, payment.id);
|
|
300
|
+
order.status = 'paid';
|
|
301
|
+
order.amount_paid = order.amount;
|
|
302
|
+
order.amount_due = 0;
|
|
303
|
+
const link = links.get(id);
|
|
304
|
+
if (link) {
|
|
305
|
+
link.status = 'paid';
|
|
306
|
+
link.amount_paid = link.amount;
|
|
307
|
+
link.updated_at = now();
|
|
308
|
+
link.payments = [
|
|
309
|
+
{
|
|
310
|
+
amount: payment.amount,
|
|
311
|
+
created_at: payment.created_at,
|
|
312
|
+
method: 'fpx',
|
|
313
|
+
payment_id: payment.id,
|
|
314
|
+
plink_id: link.id,
|
|
315
|
+
status: 'captured',
|
|
316
|
+
updated_at: now(),
|
|
317
|
+
},
|
|
318
|
+
];
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
/**
|
|
322
|
+
* A webhook claiming payment (even before `markPaid`; the fake's own records stay as they are): `payment_link.paid`
|
|
323
|
+
* for a link, `order.paid` for an order. `override.event` changes the event; other keys change the payment entity.
|
|
324
|
+
*/
|
|
325
|
+
callbackFor(id, override = {}) {
|
|
326
|
+
const { event: eventName, ...fields } = override;
|
|
327
|
+
const order = orderOf(id);
|
|
328
|
+
const link = links.get(id);
|
|
329
|
+
const payment = { ...paymentFor(order), ...fields };
|
|
330
|
+
const claimedOrder = { ...order, status: 'paid', amount_paid: order.amount, amount_due: 0 };
|
|
331
|
+
const payload = {
|
|
332
|
+
payment: { entity: payment },
|
|
333
|
+
order: { entity: claimedOrder },
|
|
334
|
+
};
|
|
335
|
+
if (link)
|
|
336
|
+
payload.payment_link = { entity: { ...link, status: 'paid', amount_paid: link.amount } };
|
|
337
|
+
const event = {
|
|
338
|
+
entity: 'event',
|
|
339
|
+
account_id: 'acc_FakeCurlec0001',
|
|
340
|
+
event: eventName ?? (link ? 'payment_link.paid' : 'order.paid'),
|
|
341
|
+
contains: link ? ['payment_link', 'order', 'payment'] : ['payment', 'order'],
|
|
342
|
+
payload,
|
|
343
|
+
created_at: now(),
|
|
344
|
+
};
|
|
345
|
+
const rawBody = JSON.stringify(event, null, 2);
|
|
346
|
+
return {
|
|
347
|
+
fields: {},
|
|
348
|
+
rawBody,
|
|
349
|
+
headers: {
|
|
350
|
+
'content-type': 'application/json',
|
|
351
|
+
'x-razorpay-event-id': randomId('evt_'),
|
|
352
|
+
'x-razorpay-signature': curlecWebhookSignature(opts.webhookSecret, rawBody),
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
},
|
|
356
|
+
redirectFor(id, override = {}) {
|
|
357
|
+
const link = links.get(id);
|
|
358
|
+
if (!link)
|
|
359
|
+
throw new Error(`fake Curlec: no payment link ${id}`);
|
|
360
|
+
const order = orderOf(id);
|
|
361
|
+
const fields = {
|
|
362
|
+
razorpay_payment_id: paid.get(order.id) ?? randomId('pay_'),
|
|
363
|
+
razorpay_payment_link_id: link.id,
|
|
364
|
+
razorpay_payment_link_reference_id: String(link.reference_id ?? ''),
|
|
365
|
+
razorpay_payment_link_status: 'paid',
|
|
366
|
+
...override,
|
|
367
|
+
};
|
|
368
|
+
fields.razorpay_signature = hmacHex(opts.keySecret, `${fields.razorpay_payment_link_id}|${fields.razorpay_payment_link_reference_id}|${fields.razorpay_payment_link_status}|${fields.razorpay_payment_id}`);
|
|
369
|
+
return { fields, rawBody: '', headers: {} };
|
|
370
|
+
},
|
|
371
|
+
checkoutCallbackFor(orderId, override = {}) {
|
|
372
|
+
const order = orders.get(orderId);
|
|
373
|
+
if (!order)
|
|
374
|
+
throw new Error(`fake Curlec: no order ${orderId}`);
|
|
375
|
+
const fields = {
|
|
376
|
+
razorpay_payment_id: paid.get(order.id) ?? randomId('pay_'),
|
|
377
|
+
razorpay_order_id: order.id,
|
|
378
|
+
...override,
|
|
379
|
+
};
|
|
380
|
+
fields.razorpay_signature = hmacHex(opts.keySecret, `${fields.razorpay_order_id}|${fields.razorpay_payment_id}`);
|
|
381
|
+
return {
|
|
382
|
+
fields,
|
|
383
|
+
rawBody: new URLSearchParams(fields).toString(),
|
|
384
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
385
|
+
};
|
|
386
|
+
},
|
|
387
|
+
tamper: (cb) => cb.headers['x-razorpay-signature'] !== undefined
|
|
388
|
+
? {
|
|
389
|
+
...cb,
|
|
390
|
+
headers: { ...cb.headers, 'x-razorpay-signature': flip(cb.headers['x-razorpay-signature']) },
|
|
391
|
+
}
|
|
392
|
+
: { ...cb, fields: { ...cb.fields, razorpay_signature: flip(cb.fields.razorpay_signature ?? '') } },
|
|
393
|
+
close: () => new Promise((r) => server.close(() => r())),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=curlec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curlec.js","sourceRoot":"","sources":["../../src/fakes/curlec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type FakeGateway } from './types.js';
|
|
2
|
+
export interface EghlPayment {
|
|
3
|
+
PaymentID: string;
|
|
4
|
+
OrderNumber: string;
|
|
5
|
+
Amount: string;
|
|
6
|
+
CurrencyCode: string;
|
|
7
|
+
/** PymtMethod sent in the SALE (`ANY`). */
|
|
8
|
+
sentMethod: string;
|
|
9
|
+
/** PymtMethod the buyer paid with, once paid. */
|
|
10
|
+
paidMethod?: string;
|
|
11
|
+
TxnID: string;
|
|
12
|
+
AuthCode: string;
|
|
13
|
+
TxnStatus: string;
|
|
14
|
+
TxnMessage: string;
|
|
15
|
+
Param6: string;
|
|
16
|
+
Param7: string;
|
|
17
|
+
/** True when a SALE request actually arrived (false = opened from the id by markPaid/callbackFor). */
|
|
18
|
+
fromSale: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface FakeEghl extends FakeGateway {
|
|
21
|
+
/** Every request received, fields as decoded from the query string or the form body. */
|
|
22
|
+
requests: {
|
|
23
|
+
method: string;
|
|
24
|
+
path: string;
|
|
25
|
+
fields: Record<string, string>;
|
|
26
|
+
}[];
|
|
27
|
+
/** The fake's own record of a payment, by PaymentID; mutate it to set statuses a test needs. */
|
|
28
|
+
payment(paymentId: string): EghlPayment | undefined;
|
|
29
|
+
}
|
|
30
|
+
export declare function startFakeEghl(opts: {
|
|
31
|
+
serviceId: string;
|
|
32
|
+
password: string;
|
|
33
|
+
/** Which PymtMethod a QUERY must carry: the one paid with (default), or always the one sent in the SALE. */
|
|
34
|
+
queryMethod?: 'paid' | 'sent';
|
|
35
|
+
}): Promise<FakeEghl>;
|
|
36
|
+
//# sourceMappingURL=eghl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eghl.d.ts","sourceRoot":"","sources":["../../src/fakes/eghl.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,KAAK,WAAW,EAAQ,MAAM,YAAY,CAAA;AAkDnD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,sGAAsG;IACtG,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,QAAS,SAAQ,WAAW;IAC3C,wFAAwF;IACxF,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,CAAA;IAC5E,gGAAgG;IAChG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAA;CACpD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC9B,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgNpB"}
|