@crediblemark/buayar 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -251
- package/dist/index.d.mts +21 -4
- package/dist/index.d.ts +21 -4
- package/dist/index.js +113 -61
- package/dist/index.mjs +99 -47
- package/package.json +43 -2
package/dist/index.mjs
CHANGED
|
@@ -416,7 +416,19 @@ function hmacSha256(data, secret) {
|
|
|
416
416
|
}
|
|
417
417
|
function safeCompare(a, b) {
|
|
418
418
|
if (typeof a !== "string" || typeof b !== "string") return false;
|
|
419
|
-
|
|
419
|
+
if (!a && !b) return true;
|
|
420
|
+
if (!a || !b) return false;
|
|
421
|
+
const isHexA = /^[0-9a-fA-F]+$/.test(a);
|
|
422
|
+
const isHexB = /^[0-9a-fA-F]+$/.test(b);
|
|
423
|
+
let strA = a;
|
|
424
|
+
let strB = b;
|
|
425
|
+
if (isHexA && isHexB && a.length === b.length) {
|
|
426
|
+
strA = a.toLowerCase();
|
|
427
|
+
strB = b.toLowerCase();
|
|
428
|
+
}
|
|
429
|
+
const hashA = crypto.createHash("sha256").update(strA).digest();
|
|
430
|
+
const hashB = crypto.createHash("sha256").update(strB).digest();
|
|
431
|
+
return crypto.timingSafeEqual(hashA, hashB);
|
|
420
432
|
}
|
|
421
433
|
|
|
422
434
|
// src/providers/duitku/signature.ts
|
|
@@ -1911,7 +1923,7 @@ function getXenditAuthHeader(secretKey) {
|
|
|
1911
1923
|
return `Basic ${token}`;
|
|
1912
1924
|
}
|
|
1913
1925
|
function verifyXenditWebhookToken(headerToken, expectedToken) {
|
|
1914
|
-
if (!headerToken || !expectedToken) return
|
|
1926
|
+
if (!headerToken || !expectedToken) return false;
|
|
1915
1927
|
return safeCompare(headerToken, expectedToken);
|
|
1916
1928
|
}
|
|
1917
1929
|
|
|
@@ -2099,8 +2111,14 @@ var XenditProvider = class extends BasePaymentProvider {
|
|
|
2099
2111
|
const orderId = body.external_id || body.reference_id || body.data?.reference_id || body.id || "";
|
|
2100
2112
|
const amount = body.paid_amount || body.amount || body.data?.amount || 0;
|
|
2101
2113
|
const status = isPaid ? "paid" : isPending ? "pending" : isExpired ? "expired" : "failed";
|
|
2114
|
+
const webhookToken = config.extra?.webhookToken;
|
|
2115
|
+
const headerToken = config.extra?.callbackToken || config.extra?.headers?.["x-callback-token"] || config.extra?.headers?.["X-Callback-Token"];
|
|
2116
|
+
let isValid = true;
|
|
2117
|
+
if (webhookToken || headerToken) {
|
|
2118
|
+
isValid = verifyXenditWebhookToken(headerToken, webhookToken);
|
|
2119
|
+
}
|
|
2102
2120
|
return {
|
|
2103
|
-
isValid
|
|
2121
|
+
isValid,
|
|
2104
2122
|
provider: "xendit",
|
|
2105
2123
|
orderId: String(orderId),
|
|
2106
2124
|
amount: Number(amount) || 0,
|
|
@@ -2378,11 +2396,12 @@ function verifyDokuWebhookSignature(headers, body, clientId, secretKey, requestT
|
|
|
2378
2396
|
const reqId = headers["request-id"] || headers["Request-Id"] || "";
|
|
2379
2397
|
const reqTimestamp = headers["request-timestamp"] || headers["Request-Timestamp"] || "";
|
|
2380
2398
|
const incomingSignature = headers["signature"] || headers["Signature"] || "";
|
|
2381
|
-
if (!incomingSignature || !secretKey) return
|
|
2399
|
+
if (!incomingSignature || !secretKey) return false;
|
|
2400
|
+
const target = headers["request-target"] || headers["Request-Target"] || requestTarget;
|
|
2382
2401
|
let component = `Client-Id:${reqClientId || clientId}
|
|
2383
2402
|
Request-Id:${reqId}
|
|
2384
2403
|
Request-Timestamp:${reqTimestamp}
|
|
2385
|
-
Request-Target:${
|
|
2404
|
+
Request-Target:${target}`;
|
|
2386
2405
|
if (body) {
|
|
2387
2406
|
const rawBody = typeof body === "string" ? body : JSON.stringify(body);
|
|
2388
2407
|
const digest = crypto2.createHash("sha256").update(rawBody).digest("base64");
|
|
@@ -2606,8 +2625,16 @@ var DokuProvider = class extends BasePaymentProvider {
|
|
|
2606
2625
|
const orderId = body.order?.invoice_number || body.invoice_number || body.order_id || "";
|
|
2607
2626
|
const amount = body.order?.amount || body.amount || 0;
|
|
2608
2627
|
const status = isPaid ? "paid" : isPending ? "pending" : isExpired ? "expired" : "failed";
|
|
2628
|
+
const secretKey = config.secretKey || config.apiKey || "";
|
|
2629
|
+
const headers = config.extra?.headers || {};
|
|
2630
|
+
const signature = headers["signature"] || headers["Signature"] || config.extra?.dokuSignature || config.extra?.signatureHeader;
|
|
2631
|
+
const clientId = config.merchantCode || config.clientKey || "";
|
|
2632
|
+
let isValid = true;
|
|
2633
|
+
if (signature || headers && (headers["request-id"] || headers["Request-Id"])) {
|
|
2634
|
+
isValid = verifyDokuWebhookSignature(headers, body, clientId, secretKey);
|
|
2635
|
+
}
|
|
2609
2636
|
return {
|
|
2610
|
-
isValid
|
|
2637
|
+
isValid,
|
|
2611
2638
|
provider: "doku",
|
|
2612
2639
|
orderId: String(orderId),
|
|
2613
2640
|
amount: Number(amount) || 0,
|
|
@@ -2864,7 +2891,7 @@ function generatePrismalinkSignature(merchantId, orderId, amount, secretKey) {
|
|
|
2864
2891
|
return sha256(raw);
|
|
2865
2892
|
}
|
|
2866
2893
|
function verifyPrismalinkSignature(merchantId, orderId, amount, secretKey, incomingSignature) {
|
|
2867
|
-
if (!incomingSignature || !secretKey) return
|
|
2894
|
+
if (!incomingSignature || !secretKey) return false;
|
|
2868
2895
|
const computed = generatePrismalinkSignature(merchantId, orderId, amount, secretKey);
|
|
2869
2896
|
return safeCompare(incomingSignature, computed);
|
|
2870
2897
|
}
|
|
@@ -3255,7 +3282,7 @@ function generateFaspaySignature(userId, password, billNo) {
|
|
|
3255
3282
|
return crypto3.createHash("sha1").update(md5Hash).digest("hex");
|
|
3256
3283
|
}
|
|
3257
3284
|
function verifyFaspaySignature(userId, password, billNo, paymentStatusCode, incomingSignature) {
|
|
3258
|
-
if (!incomingSignature || !password) return
|
|
3285
|
+
if (!incomingSignature || !password) return false;
|
|
3259
3286
|
const md5Hash = crypto3.createHash("md5").update(`${userId}${password}${billNo}${paymentStatusCode}`).digest("hex");
|
|
3260
3287
|
const computed = crypto3.createHash("sha1").update(md5Hash).digest("hex");
|
|
3261
3288
|
const simpleComputed = generateFaspaySignature(userId, password, billNo);
|
|
@@ -3676,9 +3703,9 @@ function generateFinpaySignature(merchantId, orderId, amount, merchantKey) {
|
|
|
3676
3703
|
return crypto4.createHmac("sha512", merchantKey).update(data).digest("hex");
|
|
3677
3704
|
}
|
|
3678
3705
|
function verifyFinpaySignature(merchantId, orderId, amount, merchantKey, incomingSignature) {
|
|
3679
|
-
if (!incomingSignature || !merchantKey) return
|
|
3706
|
+
if (!incomingSignature || !merchantKey) return false;
|
|
3680
3707
|
const computed = generateFinpaySignature(merchantId, orderId, amount, merchantKey);
|
|
3681
|
-
return safeCompare(incomingSignature
|
|
3708
|
+
return safeCompare(incomingSignature, computed);
|
|
3682
3709
|
}
|
|
3683
3710
|
|
|
3684
3711
|
// src/providers/finpay/provider.ts
|
|
@@ -4063,9 +4090,9 @@ function generateNicepayToken(timeStamp, iMid, referenceNo, amt, merchantKey) {
|
|
|
4063
4090
|
return sha256(raw);
|
|
4064
4091
|
}
|
|
4065
4092
|
function verifyNicepayWebhook(timeStamp, iMid, referenceNo, amt, merchantKey, incomingToken) {
|
|
4066
|
-
if (!incomingToken || !merchantKey) return
|
|
4093
|
+
if (!incomingToken || !merchantKey) return false;
|
|
4067
4094
|
const computed = generateNicepayToken(timeStamp, iMid, referenceNo, amt, merchantKey);
|
|
4068
|
-
return safeCompare(incomingToken
|
|
4095
|
+
return safeCompare(incomingToken, computed);
|
|
4069
4096
|
}
|
|
4070
4097
|
|
|
4071
4098
|
// src/providers/nicepay/provider.ts
|
|
@@ -4492,9 +4519,9 @@ function generateOyHeaders(username, apiKey) {
|
|
|
4492
4519
|
};
|
|
4493
4520
|
}
|
|
4494
4521
|
function verifyOyWebhook(headers, expectedUsername) {
|
|
4495
|
-
if (!expectedUsername) return
|
|
4522
|
+
if (!expectedUsername) return false;
|
|
4496
4523
|
const username = headers["x-oy-username"] || headers["X-Oy-Username"] || "";
|
|
4497
|
-
if (!username) return
|
|
4524
|
+
if (!username) return false;
|
|
4498
4525
|
return safeCompare(username.toLowerCase(), expectedUsername.toLowerCase());
|
|
4499
4526
|
}
|
|
4500
4527
|
|
|
@@ -4656,7 +4683,7 @@ var OyProvider = class extends BasePaymentProvider {
|
|
|
4656
4683
|
}
|
|
4657
4684
|
}
|
|
4658
4685
|
async verifyCallback(body, config) {
|
|
4659
|
-
const username = config.clientKey || config.merchantCode || config.merchantId || "";
|
|
4686
|
+
const username = config.clientKey || config.merchantCode || config.merchantId || config.extra?.username || "";
|
|
4660
4687
|
const orderId = body.partner_tx_id || body.partner_trx_id || body.trx_id || "";
|
|
4661
4688
|
const amount = body.amount || body.settlement_amount || 0;
|
|
4662
4689
|
const rawStatus = (body.status || body.tx_status || "").toUpperCase();
|
|
@@ -4665,8 +4692,14 @@ var OyProvider = class extends BasePaymentProvider {
|
|
|
4665
4692
|
const isExpired = rawStatus === "EXPIRED";
|
|
4666
4693
|
const isFailed = rawStatus === "FAILED" || !isPaid && !isPending && !isExpired;
|
|
4667
4694
|
const status = isPaid ? "paid" : isPending ? "pending" : isExpired ? "expired" : "failed";
|
|
4695
|
+
const headers = config.extra?.headers || {};
|
|
4696
|
+
const oyUsernameHeader = headers["x-oy-username"] || headers["X-Oy-Username"] || config.extra?.oyUsername;
|
|
4697
|
+
let isValid = true;
|
|
4698
|
+
if (oyUsernameHeader || username && headers && Object.keys(headers).length > 0) {
|
|
4699
|
+
isValid = verifyOyWebhook(headers, username);
|
|
4700
|
+
}
|
|
4668
4701
|
return {
|
|
4669
|
-
isValid
|
|
4702
|
+
isValid,
|
|
4670
4703
|
provider: "oy",
|
|
4671
4704
|
orderId: String(orderId),
|
|
4672
4705
|
amount: Number(amount) || 0,
|
|
@@ -4926,13 +4959,16 @@ function serializeStripeParams(obj, prefix = "") {
|
|
|
4926
4959
|
}
|
|
4927
4960
|
function verifyStripeWebhook(rawPayload, signatureHeader, webhookSecret, toleranceSeconds = 300) {
|
|
4928
4961
|
if (!signatureHeader || !webhookSecret) {
|
|
4929
|
-
return
|
|
4962
|
+
return false;
|
|
4930
4963
|
}
|
|
4931
4964
|
const items = signatureHeader.split(",");
|
|
4932
4965
|
let timestamp = "";
|
|
4933
4966
|
const signatures = [];
|
|
4934
4967
|
for (const item of items) {
|
|
4935
|
-
const
|
|
4968
|
+
const eqIdx = item.indexOf("=");
|
|
4969
|
+
if (eqIdx === -1) continue;
|
|
4970
|
+
const key = item.slice(0, eqIdx).trim();
|
|
4971
|
+
const value = item.slice(eqIdx + 1).trim();
|
|
4936
4972
|
if (key === "t") {
|
|
4937
4973
|
timestamp = value;
|
|
4938
4974
|
} else if (key === "v1") {
|
|
@@ -4942,10 +4978,18 @@ function verifyStripeWebhook(rawPayload, signatureHeader, webhookSecret, toleran
|
|
|
4942
4978
|
if (!timestamp || signatures.length === 0) {
|
|
4943
4979
|
return false;
|
|
4944
4980
|
}
|
|
4981
|
+
const tsNum = Number(timestamp);
|
|
4982
|
+
if (Number.isNaN(tsNum) || tsNum <= 0) {
|
|
4983
|
+
return false;
|
|
4984
|
+
}
|
|
4985
|
+
const nowSec = Math.floor(Date.now() / 1e3);
|
|
4986
|
+
if (Math.abs(nowSec - tsNum) > toleranceSeconds) {
|
|
4987
|
+
return false;
|
|
4988
|
+
}
|
|
4945
4989
|
const payloadString = typeof rawPayload === "string" ? rawPayload : JSON.stringify(rawPayload);
|
|
4946
4990
|
const signedPayload = `${timestamp}.${payloadString}`;
|
|
4947
4991
|
const expectedSignature = hmacSha256(signedPayload, webhookSecret);
|
|
4948
|
-
return signatures.some((sig) => safeCompare(sig
|
|
4992
|
+
return signatures.some((sig) => safeCompare(sig, expectedSignature));
|
|
4949
4993
|
}
|
|
4950
4994
|
|
|
4951
4995
|
// src/providers/stripe/provider.ts
|
|
@@ -5571,7 +5615,8 @@ function verifyAdyenWebhook(notificationItem, hmacKey) {
|
|
|
5571
5615
|
const signedData = fields.join(":");
|
|
5572
5616
|
const keyBytes = Buffer.from(hmacKey, "hex");
|
|
5573
5617
|
const expected = createHmac("sha256", keyBytes).update(signedData, "utf8").digest("base64");
|
|
5574
|
-
|
|
5618
|
+
const provided = notificationItem.additionalData?.hmacSignature || "";
|
|
5619
|
+
return safeCompare(expected, provided);
|
|
5575
5620
|
} catch {
|
|
5576
5621
|
return false;
|
|
5577
5622
|
}
|
|
@@ -5684,7 +5729,7 @@ var AdyenProvider = class extends BasePaymentProvider {
|
|
|
5684
5729
|
const hmacKey = config.extra?.hmacKey || config.secretKey || "";
|
|
5685
5730
|
const notificationItems = body?.notificationItems || [body];
|
|
5686
5731
|
const item = notificationItems[0]?.NotificationRequestItem || notificationItems[0] || body;
|
|
5687
|
-
const isValid = hmacKey ? verifyAdyenWebhook(item, hmacKey) :
|
|
5732
|
+
const isValid = hmacKey ? verifyAdyenWebhook(item, hmacKey) : false;
|
|
5688
5733
|
const eventCode = (item.eventCode || "").toUpperCase();
|
|
5689
5734
|
const success = item.success === "true" || item.success === true;
|
|
5690
5735
|
const orderId = item.merchantReference || item.pspReference || "";
|
|
@@ -5808,7 +5853,7 @@ function verifyCheckoutComWebhook(body, signatureHeader, secret) {
|
|
|
5808
5853
|
try {
|
|
5809
5854
|
const expected = createHmac2("sha256", secret).update(body, "utf8").digest("hex");
|
|
5810
5855
|
const provided = signatureHeader.replace(/^sha256=/, "");
|
|
5811
|
-
return expected
|
|
5856
|
+
return safeCompare(expected, provided);
|
|
5812
5857
|
} catch {
|
|
5813
5858
|
return false;
|
|
5814
5859
|
}
|
|
@@ -5909,7 +5954,7 @@ var CheckoutComProvider = class extends BasePaymentProvider {
|
|
|
5909
5954
|
const signatureHeader = config.extra?.signatureHeader || "";
|
|
5910
5955
|
const rawBody = typeof body === "string" ? body : JSON.stringify(body);
|
|
5911
5956
|
const parsedBody = typeof body === "string" ? JSON.parse(body) : body;
|
|
5912
|
-
const isValid = signatureHeader ? verifyCheckoutComWebhook(rawBody, signatureHeader, webhookSecret) :
|
|
5957
|
+
const isValid = signatureHeader ? verifyCheckoutComWebhook(rawBody, signatureHeader, webhookSecret) : false;
|
|
5913
5958
|
const eventType = parsedBody?.type || "";
|
|
5914
5959
|
const data = parsedBody?.data || parsedBody;
|
|
5915
5960
|
const orderId = data?.reference || data?.metadata?.order_id || data?.id || "";
|
|
@@ -6031,7 +6076,7 @@ function verifyRazorpayWebhook(rawBody, signature, webhookSecret) {
|
|
|
6031
6076
|
if (!webhookSecret || !signature || !rawBody) return false;
|
|
6032
6077
|
try {
|
|
6033
6078
|
const expected = createHmac3("sha256", webhookSecret).update(rawBody).digest("hex");
|
|
6034
|
-
return expected
|
|
6079
|
+
return safeCompare(expected, signature);
|
|
6035
6080
|
} catch {
|
|
6036
6081
|
return false;
|
|
6037
6082
|
}
|
|
@@ -6140,7 +6185,7 @@ var RazorpayProvider = class extends BasePaymentProvider {
|
|
|
6140
6185
|
const signatureHeader = config.extra?.signatureHeader || "";
|
|
6141
6186
|
const rawBody = typeof body === "string" ? body : JSON.stringify(body);
|
|
6142
6187
|
const parsedBody = typeof body === "string" ? JSON.parse(body) : body;
|
|
6143
|
-
const isValid = signatureHeader ? verifyRazorpayWebhook(rawBody, signatureHeader, webhookSecret) :
|
|
6188
|
+
const isValid = signatureHeader ? verifyRazorpayWebhook(rawBody, signatureHeader, webhookSecret) : false;
|
|
6144
6189
|
const eventType = parsedBody?.event || "";
|
|
6145
6190
|
const payload = parsedBody?.payload;
|
|
6146
6191
|
const paymentEntity = payload?.payment?.entity || payload?.payment_link?.entity || parsedBody;
|
|
@@ -6262,7 +6307,7 @@ function verifySquareWebhook(rawBody, signatureHeader, signatureKey, notificatio
|
|
|
6262
6307
|
try {
|
|
6263
6308
|
const payload = notificationUrl + rawBody;
|
|
6264
6309
|
const expected = createHmac4("sha256", signatureKey).update(payload).digest("base64");
|
|
6265
|
-
return expected
|
|
6310
|
+
return safeCompare(expected, signatureHeader);
|
|
6266
6311
|
} catch {
|
|
6267
6312
|
return false;
|
|
6268
6313
|
}
|
|
@@ -6382,7 +6427,7 @@ var SquareProvider = class extends BasePaymentProvider {
|
|
|
6382
6427
|
const notificationUrl = config.callbackUrl || config.extra?.notificationUrl || "";
|
|
6383
6428
|
const rawBody = typeof body === "string" ? body : JSON.stringify(body);
|
|
6384
6429
|
const parsedBody = typeof body === "string" ? JSON.parse(body) : body;
|
|
6385
|
-
const isValid = signatureHeader ? verifySquareWebhook(rawBody, signatureHeader, signatureKey, notificationUrl) :
|
|
6430
|
+
const isValid = signatureHeader ? verifySquareWebhook(rawBody, signatureHeader, signatureKey, notificationUrl) : false;
|
|
6386
6431
|
const eventType = parsedBody?.type || "";
|
|
6387
6432
|
const data = parsedBody?.data?.object || parsedBody?.data || parsedBody;
|
|
6388
6433
|
const payment = data?.payment || data;
|
|
@@ -6512,12 +6557,13 @@ function verifyPayuWebhook(rawBody, signatureHeader, md5Key) {
|
|
|
6512
6557
|
}
|
|
6513
6558
|
const providedSig = parts["signature"];
|
|
6514
6559
|
const algorithm = (parts["algorithm"] || "MD5").toUpperCase();
|
|
6560
|
+
if (!providedSig) return false;
|
|
6515
6561
|
if (algorithm === "MD5") {
|
|
6516
6562
|
const expected = createHash("md5").update(rawBody + md5Key).digest("hex");
|
|
6517
|
-
return expected
|
|
6563
|
+
return safeCompare(expected, providedSig);
|
|
6518
6564
|
} else if (algorithm === "SHA-256") {
|
|
6519
6565
|
const expected = createHash("sha256").update(rawBody + md5Key).digest("hex");
|
|
6520
|
-
return expected
|
|
6566
|
+
return safeCompare(expected, providedSig);
|
|
6521
6567
|
}
|
|
6522
6568
|
return false;
|
|
6523
6569
|
} catch {
|
|
@@ -6655,7 +6701,7 @@ var PayuProvider = class extends BasePaymentProvider {
|
|
|
6655
6701
|
const signatureHeader = config.extra?.signatureHeader || "";
|
|
6656
6702
|
const rawBody = typeof body === "string" ? body : JSON.stringify(body);
|
|
6657
6703
|
const parsedBody = typeof body === "string" ? JSON.parse(body) : body;
|
|
6658
|
-
const isValid = signatureHeader ? verifyPayuWebhook(rawBody, signatureHeader, md5Key) :
|
|
6704
|
+
const isValid = signatureHeader ? verifyPayuWebhook(rawBody, signatureHeader, md5Key) : false;
|
|
6659
6705
|
const order = parsedBody?.order || parsedBody;
|
|
6660
6706
|
const orderId = order.extOrderId || order.orderId || "";
|
|
6661
6707
|
const amount = Number(order.totalAmount || 0);
|
|
@@ -6802,7 +6848,7 @@ function verifyBraintreeWebhook(btSignature, btPayload, privateKey) {
|
|
|
6802
6848
|
const payload = Buffer.from(btPayload, "base64").toString("utf8");
|
|
6803
6849
|
const secretHash = createHash2("sha1").update(privateKey).digest("hex");
|
|
6804
6850
|
const expected = createHmac6("sha1", secretHash).update(payload).digest("hex");
|
|
6805
|
-
return expected
|
|
6851
|
+
return safeCompare(expected, providedHmac);
|
|
6806
6852
|
} catch {
|
|
6807
6853
|
return false;
|
|
6808
6854
|
}
|
|
@@ -6908,7 +6954,7 @@ var BraintreeProvider = class extends BasePaymentProvider {
|
|
|
6908
6954
|
const privateKey = config.apiKey || config.secretKey || "";
|
|
6909
6955
|
const btSignature = config.extra?.btSignature || "";
|
|
6910
6956
|
const btPayload = config.extra?.btPayload || "";
|
|
6911
|
-
const isValid = btSignature && btPayload ? verifyBraintreeWebhook(btSignature, btPayload, privateKey) :
|
|
6957
|
+
const isValid = btSignature && btPayload ? verifyBraintreeWebhook(btSignature, btPayload, privateKey) : false;
|
|
6912
6958
|
const parsedBody = typeof body === "string" ? JSON.parse(body) : body;
|
|
6913
6959
|
const subject = parsedBody?.subject || parsedBody;
|
|
6914
6960
|
const transaction = subject?.transaction || subject?.disbursement || parsedBody;
|
|
@@ -7040,8 +7086,8 @@ function verifyTwoCheckoutWebhook(secretWord, saleId, productId, invoiceId, prov
|
|
|
7040
7086
|
if (!secretWord || !providedHash) return false;
|
|
7041
7087
|
try {
|
|
7042
7088
|
const raw = secretWord + saleId + productId + invoiceId;
|
|
7043
|
-
const expected = createHash3("md5").update(raw).digest("hex")
|
|
7044
|
-
return expected
|
|
7089
|
+
const expected = createHash3("md5").update(raw).digest("hex");
|
|
7090
|
+
return safeCompare(expected, providedHash);
|
|
7045
7091
|
} catch {
|
|
7046
7092
|
return false;
|
|
7047
7093
|
}
|
|
@@ -7140,7 +7186,7 @@ var TwoCheckoutProvider = class extends BasePaymentProvider {
|
|
|
7140
7186
|
const productId = parsedBody?.IPN_PID?.[0] || parsedBody?.product_id || "";
|
|
7141
7187
|
const invoiceId = parsedBody?.IPN_PNAME?.[0] || parsedBody?.invoice_id || "";
|
|
7142
7188
|
const providedHash = parsedBody?.HASH || parsedBody?.hash || "";
|
|
7143
|
-
const isValid = secretWord ? verifyTwoCheckoutWebhook(secretWord, saleId, productId, invoiceId, providedHash) :
|
|
7189
|
+
const isValid = secretWord ? verifyTwoCheckoutWebhook(secretWord, saleId, productId, invoiceId, providedHash) : false;
|
|
7144
7190
|
const orderId = parsedBody?.REFNOEXT || parsedBody?.ext_ref_no || parsedBody?.SALE_ID || "";
|
|
7145
7191
|
const amount = Math.round(Number(parsedBody?.IPN_TOTAL_GENERAL || parsedBody?.total || 0) * 100);
|
|
7146
7192
|
const statusRaw = (parsedBody?.ORDERSTATUS || parsedBody?.order_status || "").toUpperCase();
|
|
@@ -8830,7 +8876,7 @@ function resolveConfigFromEnv(customConfig) {
|
|
|
8830
8876
|
merchantCode = merchantCode || env.IPAYMU_VA || env.IPAYMU_MERCHANT_CODE || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
|
|
8831
8877
|
} else if (provider === "doku") {
|
|
8832
8878
|
merchantCode = merchantCode || env.DOKU_CLIENT_ID || env.DOKU_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
|
|
8833
|
-
clientKey = clientKey || env.DOKU_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
|
|
8879
|
+
clientKey = clientKey || customConfig?.merchantCode || env.DOKU_CLIENT_ID || env.BUAYAR_CLIENT_KEY;
|
|
8834
8880
|
} else if (provider === "prismalink") {
|
|
8835
8881
|
merchantCode = merchantCode || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
|
|
8836
8882
|
merchantId = merchantId || env.PRISMALINK_MERCHANT_ID || env.BUAYAR_MERCHANT_ID;
|
|
@@ -8846,7 +8892,7 @@ function resolveConfigFromEnv(customConfig) {
|
|
|
8846
8892
|
merchantId = merchantId || env.NICEPAY_IMID || env.BUAYAR_MERCHANT_ID;
|
|
8847
8893
|
} else if (provider === "oy" || provider === "oyindonesia") {
|
|
8848
8894
|
merchantCode = merchantCode || env.OY_USERNAME || env.BUAYAR_MERCHANT_CODE || env.PG_MERCHANT_CODE || env.PAYMENT_MERCHANT_CODE;
|
|
8849
|
-
clientKey = clientKey || env.OY_USERNAME || env.BUAYAR_CLIENT_KEY;
|
|
8895
|
+
clientKey = clientKey || customConfig?.merchantCode || env.OY_USERNAME || env.BUAYAR_CLIENT_KEY;
|
|
8850
8896
|
} else if (provider === "stripe") {
|
|
8851
8897
|
clientKey = clientKey || env.STRIPE_PUBLIC_KEY || env.STRIPE_PUBLISHABLE_KEY || env.BUAYAR_CLIENT_KEY || env.BUAYAR_PUBLIC_KEY;
|
|
8852
8898
|
merchantCode = merchantCode || clientKey || "stripe";
|
|
@@ -8882,12 +8928,12 @@ function resolveConfigFromEnv(customConfig) {
|
|
|
8882
8928
|
const projectId = customConfig?.projectId || env.BUAYAR_PROJECT_ID || env.PG_PROJECT_ID || env.PROJECT_ID || env.SQUARE_LOCATION_ID;
|
|
8883
8929
|
const publicKey = customConfig?.publicKey || env.BUAYAR_PUBLIC_KEY || env.PG_PUBLIC_KEY || env.PUBLIC_KEY || env.STRIPE_PUBLIC_KEY || env.STRIPE_PUBLISHABLE_KEY || env.CHECKOUTCOM_PUBLIC_KEY;
|
|
8884
8930
|
const privateKey = customConfig?.privateKey || env.BUAYAR_PRIVATE_KEY || env.PG_PRIVATE_KEY || env.PRIVATE_KEY || env.BRAINTREE_PRIVATE_KEY;
|
|
8885
|
-
const secretKey = customConfig?.secretKey || env.BUAYAR_SECRET_KEY || env.PG_SECRET_KEY || env.SECRET_KEY || env.XENDIT_SECRET_KEY || env.DOKU_SECRET_KEY || env.PRISMALINK_SECRET_KEY || env.FASPAY_PASSWORD || env.FINPAY_MERCHANT_KEY || env.NICEPAY_KEY || env.OY_API_KEY || env.STRIPE_SECRET_KEY || env.PAYPAL_CLIENT_SECRET || env.CHECKOUTCOM_SECRET_KEY || env.RAZORPAY_KEY_SECRET || env.SQUARE_ACCESS_TOKEN || env.BRAINTREE_PRIVATE_KEY || env.TWOCHECKOUT_SECRET_KEY;
|
|
8931
|
+
const secretKey = customConfig?.secretKey || customConfig?.apiKey || customConfig?.serverKey || env.BUAYAR_SECRET_KEY || env.PG_SECRET_KEY || env.SECRET_KEY || env.XENDIT_SECRET_KEY || env.DOKU_SECRET_KEY || env.PRISMALINK_SECRET_KEY || env.FASPAY_PASSWORD || env.FINPAY_MERCHANT_KEY || env.NICEPAY_KEY || env.OY_API_KEY || env.STRIPE_SECRET_KEY || env.PAYPAL_CLIENT_SECRET || env.CHECKOUTCOM_SECRET_KEY || env.RAZORPAY_KEY_SECRET || env.SQUARE_ACCESS_TOKEN || env.BRAINTREE_PRIVATE_KEY || env.TWOCHECKOUT_SECRET_KEY;
|
|
8886
8932
|
const callbackUrl = customConfig?.callbackUrl || env.BUAYAR_CALLBACK_URL || env.PG_CALLBACK_URL || env.PAYMENT_CALLBACK_URL;
|
|
8887
8933
|
const returnUrl = customConfig?.returnUrl || env.BUAYAR_RETURN_URL || env.PG_RETURN_URL || env.PAYMENT_RETURN_URL;
|
|
8888
8934
|
const extra = {
|
|
8889
8935
|
webhookToken: env.XENDIT_WEBHOOK_TOKEN || env.BUAYAR_WEBHOOK_TOKEN,
|
|
8890
|
-
webhookSecret: env.STRIPE_WEBHOOK_SECRET || env.CHECKOUTCOM_WEBHOOK_SECRET || env.BUAYAR_WEBHOOK_SECRET,
|
|
8936
|
+
webhookSecret: env.STRIPE_WEBHOOK_SECRET || env.CHECKOUTCOM_WEBHOOK_SECRET || env.RAZORPAY_WEBHOOK_SECRET || env.BUAYAR_WEBHOOK_SECRET,
|
|
8891
8937
|
merchantName: env.FASPAY_MERCHANT_NAME || env.BUAYAR_MERCHANT_NAME,
|
|
8892
8938
|
userId: env.FASPAY_USER_ID,
|
|
8893
8939
|
iMid: env.NICEPAY_IMID,
|
|
@@ -8993,38 +9039,46 @@ var Buayar = class {
|
|
|
8993
9039
|
async verifyWebhook(payload, headers, configOverride) {
|
|
8994
9040
|
const mergedConfig = { ...this.config, ...configOverride };
|
|
8995
9041
|
if (headers) {
|
|
9042
|
+
if (!mergedConfig.extra) mergedConfig.extra = {};
|
|
9043
|
+
mergedConfig.extra.headers = headers;
|
|
8996
9044
|
const stripeSig = headers["stripe-signature"] || headers["Stripe-Signature"];
|
|
8997
9045
|
if (stripeSig) {
|
|
8998
|
-
if (!mergedConfig.extra) mergedConfig.extra = {};
|
|
8999
9046
|
mergedConfig.extra.signatureHeader = Array.isArray(stripeSig) ? stripeSig[0] : stripeSig;
|
|
9000
9047
|
}
|
|
9001
9048
|
const ckoSig = headers["cko-signature"] || headers["Cko-Signature"];
|
|
9002
9049
|
if (ckoSig) {
|
|
9003
|
-
if (!mergedConfig.extra) mergedConfig.extra = {};
|
|
9004
9050
|
mergedConfig.extra.signatureHeader = Array.isArray(ckoSig) ? ckoSig[0] : ckoSig;
|
|
9005
9051
|
}
|
|
9006
9052
|
const rzpSig = headers["x-razorpay-signature"] || headers["X-Razorpay-Signature"];
|
|
9007
9053
|
if (rzpSig) {
|
|
9008
|
-
if (!mergedConfig.extra) mergedConfig.extra = {};
|
|
9009
9054
|
mergedConfig.extra.signatureHeader = Array.isArray(rzpSig) ? rzpSig[0] : rzpSig;
|
|
9010
9055
|
}
|
|
9011
9056
|
const squareSig = headers["x-square-hmacsha256-signature"] || headers["x-square-signature"];
|
|
9012
9057
|
if (squareSig) {
|
|
9013
|
-
if (!mergedConfig.extra) mergedConfig.extra = {};
|
|
9014
9058
|
mergedConfig.extra.signatureHeader = Array.isArray(squareSig) ? squareSig[0] : squareSig;
|
|
9015
9059
|
}
|
|
9016
9060
|
const payuSig = headers["openpayu-signature"] || headers["OpenPayU-Signature"];
|
|
9017
9061
|
if (payuSig) {
|
|
9018
|
-
if (!mergedConfig.extra) mergedConfig.extra = {};
|
|
9019
9062
|
mergedConfig.extra.signatureHeader = Array.isArray(payuSig) ? payuSig[0] : payuSig;
|
|
9020
9063
|
}
|
|
9021
9064
|
const btSig = headers["bt_signature"];
|
|
9022
9065
|
const btPayload = headers["bt_payload"];
|
|
9023
9066
|
if (btSig && btPayload) {
|
|
9024
|
-
if (!mergedConfig.extra) mergedConfig.extra = {};
|
|
9025
9067
|
mergedConfig.extra.btSignature = Array.isArray(btSig) ? btSig[0] : btSig;
|
|
9026
9068
|
mergedConfig.extra.btPayload = Array.isArray(btPayload) ? btPayload[0] : btPayload;
|
|
9027
9069
|
}
|
|
9070
|
+
const xenditToken = headers["x-callback-token"] || headers["X-Callback-Token"];
|
|
9071
|
+
if (xenditToken) {
|
|
9072
|
+
mergedConfig.extra.callbackToken = Array.isArray(xenditToken) ? xenditToken[0] : xenditToken;
|
|
9073
|
+
}
|
|
9074
|
+
const dokuSig = headers["signature"] || headers["Signature"];
|
|
9075
|
+
if (dokuSig) {
|
|
9076
|
+
mergedConfig.extra.dokuSignature = Array.isArray(dokuSig) ? dokuSig[0] : dokuSig;
|
|
9077
|
+
}
|
|
9078
|
+
const oyUser = headers["x-oy-username"] || headers["X-Oy-Username"];
|
|
9079
|
+
if (oyUser) {
|
|
9080
|
+
mergedConfig.extra.oyUsername = Array.isArray(oyUser) ? oyUser[0] : oyUser;
|
|
9081
|
+
}
|
|
9028
9082
|
}
|
|
9029
9083
|
let providerName = configOverride?.provider || this.provider;
|
|
9030
9084
|
if (payload) {
|
|
@@ -9058,8 +9112,6 @@ var Buayar = class {
|
|
|
9058
9112
|
providerName = "adyen";
|
|
9059
9113
|
} else if (payload.type && payload.data?._links && (payload.type.startsWith("payment_") || payload.type.startsWith("refund_"))) {
|
|
9060
9114
|
providerName = "checkoutcom";
|
|
9061
|
-
} else if (payload.event && payload.payload?.payment?.entity) {
|
|
9062
|
-
providerName = "razorpay";
|
|
9063
9115
|
} else if (payload.type && payload.data?.object?.status && payload.merchant_id) {
|
|
9064
9116
|
providerName = "square";
|
|
9065
9117
|
} else if (payload.order && payload.order?.status && payload.order?.extOrderId) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crediblemark/buayar",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Unified Payment Gateway SDK for Node.js
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Unified Payment Gateway SDK for Node.js & TypeScript — 19 providers (Midtrans, Xendit, Duitku, Stripe, PayPal, Adyen, Razorpay, Square, Checkout.com, PayU, Braintree, 2Checkout, DOKU, iPaymu, PrismaLink, Faspay, Finpay, Nicepay, OY!) with zero-code switching via .env",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -13,11 +13,51 @@
|
|
|
13
13
|
},
|
|
14
14
|
"./package.json": "./package.json"
|
|
15
15
|
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"payment-gateway",
|
|
18
|
+
"payment",
|
|
19
|
+
"sdk",
|
|
20
|
+
"unified-payment",
|
|
21
|
+
"midtrans",
|
|
22
|
+
"xendit",
|
|
23
|
+
"duitku",
|
|
24
|
+
"stripe",
|
|
25
|
+
"paypal",
|
|
26
|
+
"adyen",
|
|
27
|
+
"razorpay",
|
|
28
|
+
"square",
|
|
29
|
+
"checkout.com",
|
|
30
|
+
"payu",
|
|
31
|
+
"braintree",
|
|
32
|
+
"2checkout",
|
|
33
|
+
"doku",
|
|
34
|
+
"ipaymu",
|
|
35
|
+
"prismalink",
|
|
36
|
+
"faspay",
|
|
37
|
+
"finpay",
|
|
38
|
+
"nicepay",
|
|
39
|
+
"oy-indonesia",
|
|
40
|
+
"virtual-account",
|
|
41
|
+
"qris",
|
|
42
|
+
"ewallet",
|
|
43
|
+
"webhook",
|
|
44
|
+
"typescript",
|
|
45
|
+
"nodejs",
|
|
46
|
+
"indonesia",
|
|
47
|
+
"payment-indonesia",
|
|
48
|
+
"zero-code",
|
|
49
|
+
"pg-switcher",
|
|
50
|
+
"buayar"
|
|
51
|
+
],
|
|
16
52
|
"files": [
|
|
17
53
|
"dist",
|
|
18
54
|
"package.json",
|
|
19
55
|
"README.md"
|
|
20
56
|
],
|
|
57
|
+
"homepage": "https://github.com/crediblemark-official/Buayar#readme",
|
|
58
|
+
"bugs": {
|
|
59
|
+
"url": "https://github.com/crediblemark-official/Buayar/issues"
|
|
60
|
+
},
|
|
21
61
|
"repository": {
|
|
22
62
|
"type": "git",
|
|
23
63
|
"url": "https://github.com/crediblemark-official/Buayar.git"
|
|
@@ -37,3 +77,4 @@
|
|
|
37
77
|
"typescript": "^5.9.3"
|
|
38
78
|
}
|
|
39
79
|
}
|
|
80
|
+
|