@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/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
- return a.toLowerCase() === b.toLowerCase();
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 true;
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: true,
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 true;
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:${requestTarget}`;
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: true,
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 true;
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 true;
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 true;
3706
+ if (!incomingSignature || !merchantKey) return false;
3680
3707
  const computed = generateFinpaySignature(merchantId, orderId, amount, merchantKey);
3681
- return safeCompare(incomingSignature.toLowerCase(), computed.toLowerCase());
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 true;
4093
+ if (!incomingToken || !merchantKey) return false;
4067
4094
  const computed = generateNicepayToken(timeStamp, iMid, referenceNo, amt, merchantKey);
4068
- return safeCompare(incomingToken.toLowerCase(), computed.toLowerCase());
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 true;
4522
+ if (!expectedUsername) return false;
4496
4523
  const username = headers["x-oy-username"] || headers["X-Oy-Username"] || "";
4497
- if (!username) return true;
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: true,
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 true;
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 [key, value] = item.trim().split("=");
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.toLowerCase(), expectedSignature.toLowerCase()));
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
- return expected === notificationItem.additionalData?.hmacSignature;
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) : true;
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 === provided;
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) : true;
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 === signature;
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) : true;
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 === signatureHeader;
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) : true;
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 === providedSig;
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 === providedSig;
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) : true;
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 === providedHmac;
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) : true;
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").toUpperCase();
7044
- return expected === (providedHash || "").toUpperCase();
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) : true;
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.0",
4
- "description": "Unified Payment Gateway SDK for Node.js and TypeScript supporting multiple providers",
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
+