@agent-cards/sdk 0.23.21 → 0.23.23
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/CHANGELOG.md +36 -0
- package/PREFLIGHT.md +4 -0
- package/README.md +53 -4
- package/dist/aci.generated.js +3 -3
- package/dist/agent-amount.generated.d.ts +7 -0
- package/dist/agent-amount.generated.js +3 -0
- package/dist/amadeus-checkout.generated.d.ts +6 -1
- package/dist/amadeus-checkout.generated.js +26 -2
- package/dist/capabilities.generated.d.ts +2 -0
- package/dist/capabilities.generated.js +3 -0
- package/dist/card-fields.generated.js +2574 -186
- package/dist/cdp.js +103 -29
- package/dist/client.d.ts +130 -9
- package/dist/client.js +304 -115
- package/dist/creditguard.generated.js +4 -2
- package/dist/cse-body.js +11 -0
- package/dist/ebanx.d.ts +1 -1
- package/dist/ebanx.js +1 -1
- package/dist/eximbay.d.ts +46 -0
- package/dist/eximbay.js +69 -0
- package/dist/hosted-entry.js +2 -1
- package/dist/hosted-form.d.ts +5 -0
- package/dist/hosted-form.js +5 -0
- package/dist/lifecycle.d.ts +9 -4
- package/dist/lifecycle.js +16 -4
- package/dist/paygent.generated.d.ts +60 -0
- package/dist/paygent.generated.js +425 -0
- package/dist/payrexx.d.ts +91 -0
- package/dist/payrexx.generated.d.ts +91 -0
- package/dist/payrexx.generated.js +536 -0
- package/dist/payrexx.js +141 -0
- package/dist/paytrail.d.ts +58 -0
- package/dist/paytrail.js +98 -0
- package/dist/pre-claim.d.ts +27 -0
- package/dist/pre-claim.js +175 -20
- package/dist/prepared-processor.d.ts +7 -2
- package/dist/prepared-processor.js +16 -2
- package/dist/primer.generated.js +2709 -321
- package/dist/registry.d.ts +4 -3
- package/dist/registry.js +12 -4
- package/dist/sbps.d.ts +57 -0
- package/dist/sbps.generated.d.ts +96 -0
- package/dist/sbps.generated.js +427 -0
- package/dist/sbps.js +90 -0
- package/dist/stripe-checkout.generated.js +744 -27
- package/dist/toast-seal.generated.d.ts +37 -0
- package/dist/toast-seal.generated.js +625 -0
- package/dist/toast.generated.d.ts +41 -0
- package/dist/toast.generated.js +113 -0
- package/dist/transbank.d.ts +33 -0
- package/dist/transbank.js +62 -0
- package/dist/url-mask-parts.d.ts +24 -0
- package/dist/url-mask-parts.js +22 -0
- package/dist/url-masks.generated.d.ts +3 -0
- package/dist/url-masks.generated.js +2 -0
- package/package.json +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// Generated from @agent-cards/payment-core. Do not edit.
|
|
3
|
-
// artifact-sha256:
|
|
3
|
+
// artifact-sha256: d1aac0b870ff4b5f9d63a43d1c2bb0eef03841846206282b5aeca4f540f0e73d
|
|
4
4
|
// src/card-number-key.js
|
|
5
5
|
var CARD_NUMBER_KEY = /^(number|card_number|cardnumber|cardNum|card_num|pan)$/i;
|
|
6
6
|
// src/json-path.js
|
|
@@ -101,12 +101,12 @@ function parseConvergeBody(body) {
|
|
|
101
101
|
return parsed;
|
|
102
102
|
}
|
|
103
103
|
function convergeAmountCents(value) {
|
|
104
|
-
const
|
|
105
|
-
const m = typeof
|
|
104
|
+
const text8 = typeof value === "number" && Number.isFinite(value) ? String(value) : value;
|
|
105
|
+
const m = typeof text8 === "string" ? AMOUNT.exec(text8) : null;
|
|
106
106
|
if (!m)
|
|
107
107
|
return null;
|
|
108
|
-
const
|
|
109
|
-
return Number.isSafeInteger(
|
|
108
|
+
const cents2 = Number(m[1]) * 100 + Number(((m[2] ?? "") + "00").slice(0, 2));
|
|
109
|
+
return Number.isSafeInteger(cents2) && cents2 > 0 ? cents2 : null;
|
|
110
110
|
}
|
|
111
111
|
function convergeBodyVerdict(body) {
|
|
112
112
|
const parsed = parseConvergeBody(body);
|
|
@@ -357,8 +357,8 @@ var CONTROL = /[\u0000-\u001f\u007f]/;
|
|
|
357
357
|
var cardLikeName = (name) => (name.match(/[0-9]/g) ?? []).length >= 12;
|
|
358
358
|
var record3 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
359
359
|
var sameKeys = (value, keys) => {
|
|
360
|
-
const
|
|
361
|
-
return
|
|
360
|
+
const own12 = Object.keys(value);
|
|
361
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
362
362
|
};
|
|
363
363
|
var refuse4 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
364
364
|
var CARD4 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -582,9 +582,9 @@ var K = /* @__PURE__ */ new Uint32Array([
|
|
|
582
582
|
3329325298
|
|
583
583
|
]);
|
|
584
584
|
var rotr = (x, n) => x >>> n | x << 32 - n;
|
|
585
|
-
function utf8(
|
|
585
|
+
function utf8(text8) {
|
|
586
586
|
const out = [];
|
|
587
|
-
for (const char of
|
|
587
|
+
for (const char of text8) {
|
|
588
588
|
let cp = char.codePointAt(0);
|
|
589
589
|
if (cp >= 55296 && cp <= 57343)
|
|
590
590
|
cp = 65533;
|
|
@@ -663,13 +663,13 @@ var TYPED_ARRAY = Object.getPrototypeOf(Uint8Array.prototype);
|
|
|
663
663
|
var typedArrayName = Object.getOwnPropertyDescriptor(TYPED_ARRAY, Symbol.toStringTag).get;
|
|
664
664
|
function parseRsaPublicKey(key) {
|
|
665
665
|
const spki = key && typeof key === "object" ? key.spki : void 0;
|
|
666
|
-
const
|
|
666
|
+
const pin11 = key && typeof key === "object" ? key.sha256 : void 0;
|
|
667
667
|
const named = key && typeof key === "object" && Object.prototype.hasOwnProperty.call(key, "exponent") ? key.exponent : void 0;
|
|
668
668
|
if (named !== void 0 && named !== 17)
|
|
669
669
|
throw refuse6("key");
|
|
670
670
|
if (typeof spki !== "string" || spki.length > 1024 || spki.length % 4 !== 0 || !BASE64.test(spki))
|
|
671
671
|
throw refuse6("key");
|
|
672
|
-
if (typeof
|
|
672
|
+
if (typeof pin11 !== "string" || !SHA256_HEX.test(pin11))
|
|
673
673
|
throw refuse6("key");
|
|
674
674
|
let binary;
|
|
675
675
|
try {
|
|
@@ -681,7 +681,7 @@ function parseRsaPublicKey(key) {
|
|
|
681
681
|
if (btoa(binary) !== spki)
|
|
682
682
|
throw refuse6("key");
|
|
683
683
|
const der = Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
684
|
-
if (sha256Hex(der) !==
|
|
684
|
+
if (sha256Hex(der) !== pin11)
|
|
685
685
|
throw refuse6("key");
|
|
686
686
|
const outer = readElement(der, 0, 48);
|
|
687
687
|
if (outer.end !== der.length || outer.start + RSA_ALGORITHM.length > der.length)
|
|
@@ -771,8 +771,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
|
|
|
771
771
|
var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
|
|
772
772
|
var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
773
773
|
var sameKeys2 = (value, keys) => {
|
|
774
|
-
const
|
|
775
|
-
return
|
|
774
|
+
const own12 = Object.keys(value);
|
|
775
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
776
776
|
};
|
|
777
777
|
var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
778
778
|
var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1261,8 +1261,8 @@ var TEXT_LIMIT = 256;
|
|
|
1261
1261
|
var CONTROL4 = /[\u0000-\u001f\u007f]/;
|
|
1262
1262
|
var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1263
1263
|
var sameKeys3 = (value, keys) => {
|
|
1264
|
-
const
|
|
1265
|
-
return
|
|
1264
|
+
const own12 = Object.keys(value);
|
|
1265
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
1266
1266
|
};
|
|
1267
1267
|
var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
1268
1268
|
var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -1292,13 +1292,13 @@ function billingFields(value) {
|
|
|
1292
1292
|
if (names.length > MAX_FIELDS)
|
|
1293
1293
|
return false;
|
|
1294
1294
|
return names.every((name) => {
|
|
1295
|
-
const
|
|
1295
|
+
const field2 = value[name];
|
|
1296
1296
|
if (!FIELD_NAME.test(name))
|
|
1297
1297
|
return false;
|
|
1298
|
-
if (!record6(
|
|
1299
|
-
return billingText(
|
|
1300
|
-
const nested = Object.keys(
|
|
1301
|
-
return nested.length <= MAX_NESTED_FIELDS && nested.every((key) => FIELD_NAME.test(key) && billingText(
|
|
1298
|
+
if (!record6(field2))
|
|
1299
|
+
return billingText(field2);
|
|
1300
|
+
const nested = Object.keys(field2);
|
|
1301
|
+
return nested.length <= MAX_NESTED_FIELDS && nested.every((key) => FIELD_NAME.test(key) && billingText(field2[key]));
|
|
1302
1302
|
});
|
|
1303
1303
|
}
|
|
1304
1304
|
function wixPaymentsBodyVerdict(body) {
|
|
@@ -1372,14 +1372,14 @@ function readJson2(body) {
|
|
|
1372
1372
|
catch {
|
|
1373
1373
|
return { parsed: null, exact: false };
|
|
1374
1374
|
}
|
|
1375
|
-
let
|
|
1375
|
+
let exact4 = false;
|
|
1376
1376
|
try {
|
|
1377
|
-
|
|
1377
|
+
exact4 = body.length <= BODY_LIMIT6 && JSON.stringify(parsed) === body;
|
|
1378
1378
|
}
|
|
1379
1379
|
catch {
|
|
1380
|
-
|
|
1380
|
+
exact4 = false;
|
|
1381
1381
|
}
|
|
1382
|
-
return { parsed, exact:
|
|
1382
|
+
return { parsed, exact: exact4 };
|
|
1383
1383
|
}
|
|
1384
1384
|
function billingValue(value) {
|
|
1385
1385
|
if (value === UNDEFINED)
|
|
@@ -1434,14 +1434,14 @@ function attachType(parsed) {
|
|
|
1434
1434
|
return typeof type === "string" ? type : null;
|
|
1435
1435
|
}
|
|
1436
1436
|
function paymongoBodyVerdict(body, session) {
|
|
1437
|
-
const { parsed, exact:
|
|
1437
|
+
const { parsed, exact: exact4 } = readJson2(body);
|
|
1438
1438
|
const type = parsed === null ? null : attachType(parsed);
|
|
1439
1439
|
if (type !== "card") {
|
|
1440
1440
|
if (parsed === null)
|
|
1441
1441
|
return body === void 0 || body === null || body === "" ? CONTINUE4 : refuse10("paymongo_body_unsupported");
|
|
1442
1442
|
return namesCardValue(parsed) ? refuse10("paymongo_body_unsupported") : CONTINUE4;
|
|
1443
1443
|
}
|
|
1444
|
-
if (!
|
|
1444
|
+
if (!exact4)
|
|
1445
1445
|
return refuse10("paymongo_body_unsupported");
|
|
1446
1446
|
const code = judgeCardAttach(parsed, session);
|
|
1447
1447
|
return code === null ? CARD9 : refuse10(code);
|
|
@@ -1464,15 +1464,15 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
|
|
|
1464
1464
|
var CARD_PAYMENT = "PAYMENT_CARD";
|
|
1465
1465
|
var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1466
1466
|
var sameKeys4 = (value, keys) => {
|
|
1467
|
-
const
|
|
1468
|
-
return
|
|
1467
|
+
const own12 = Object.keys(value);
|
|
1468
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
1469
1469
|
};
|
|
1470
1470
|
var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1471
1471
|
var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
1472
|
-
function luhn(
|
|
1472
|
+
function luhn(digits3) {
|
|
1473
1473
|
let sum = 0;
|
|
1474
|
-
for (let at = 0; at <
|
|
1475
|
-
let digit = Number(
|
|
1474
|
+
for (let at = 0; at < digits3.length; at += 1) {
|
|
1475
|
+
let digit = Number(digits3[digits3.length - 1 - at]);
|
|
1476
1476
|
if (at % 2 === 1) {
|
|
1477
1477
|
digit *= 2;
|
|
1478
1478
|
if (digit > 9)
|
|
@@ -1619,10 +1619,10 @@ function readForm2(body) {
|
|
|
1619
1619
|
return null;
|
|
1620
1620
|
}
|
|
1621
1621
|
}
|
|
1622
|
-
function cardNetwork2(
|
|
1623
|
-
if (VISA2.test(
|
|
1622
|
+
function cardNetwork2(digits3) {
|
|
1623
|
+
if (VISA2.test(digits3))
|
|
1624
1624
|
return "visa";
|
|
1625
|
-
return MASTERCARD2.test(
|
|
1625
|
+
return MASTERCARD2.test(digits3) ? "mastercard" : null;
|
|
1626
1626
|
}
|
|
1627
1627
|
function judgeBody2(body) {
|
|
1628
1628
|
const pairs = readForm2(body);
|
|
@@ -1646,7 +1646,7 @@ function judgeBody2(body) {
|
|
|
1646
1646
|
}
|
|
1647
1647
|
const number = value["card[number]"];
|
|
1648
1648
|
const network = GROUPED.test(number) ? cardNetwork2(number.replace(/ /g, "")) : null;
|
|
1649
|
-
if (network === null || value["card[brand]"] !== network || !SECURITY_CODE7.test(value["card[cvc]"]) || !MONTH3.test(value["card[exp_month]"]) || !YEAR3.test(value["card[exp_year]"]) || !HOLDER2.test(value["card[cardholder]"]) || !INSTANCE.test(value.instance) || !AMOUNT2.test(value.amount) || !CURRENCY.test(value.currency) || !(value.email === "" || value.email.length <= 254 && EMAIL.test(value.email)) || !FLAGS.every((
|
|
1649
|
+
if (network === null || value["card[brand]"] !== network || !SECURITY_CODE7.test(value["card[cvc]"]) || !MONTH3.test(value["card[exp_month]"]) || !YEAR3.test(value["card[exp_year]"]) || !HOLDER2.test(value["card[cardholder]"]) || !INSTANCE.test(value.instance) || !AMOUNT2.test(value.amount) || !CURRENCY.test(value.currency) || !(value.email === "" || value.email.length <= 254 && EMAIL.test(value.email)) || !FLAGS.every((flag3) => value[flag3] === "true" || value[flag3] === "false")) {
|
|
1650
1650
|
return { verdict: refuse12("payrexx_body_unsupported"), pairs: null };
|
|
1651
1651
|
}
|
|
1652
1652
|
if (value.isTokenization === "true" || value.isSubscription === "true")
|
|
@@ -1695,8 +1695,8 @@ var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
|
|
|
1695
1695
|
var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
|
|
1696
1696
|
var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1697
1697
|
var sameKeys5 = (value, keys) => {
|
|
1698
|
-
const
|
|
1699
|
-
return
|
|
1698
|
+
const own12 = Object.keys(value);
|
|
1699
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
1700
1700
|
};
|
|
1701
1701
|
var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1702
1702
|
var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1862,6 +1862,17 @@ function paygentRequestVerdict(url, body) {
|
|
|
1862
1862
|
const key = pairs[1][1];
|
|
1863
1863
|
return (environment2 === "production" ? LIVE_KEY : SANDBOX_KEY).test(key) ? CARD13 : refuse14("paygent_key_environment");
|
|
1864
1864
|
}
|
|
1865
|
+
var pin4 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]) });
|
|
1866
|
+
var PAYGENT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
1867
|
+
pin4({
|
|
1868
|
+
id: "fundex_tcs_eng",
|
|
1869
|
+
merchant: "Tokyo Chinese School",
|
|
1870
|
+
merchantId: "60362",
|
|
1871
|
+
keySha256: "6073dee112b1e4089025d1c1f3c4cfad818c314a81943ffa55b839cb2df51018",
|
|
1872
|
+
origins: ["https://fundexapp.jp"],
|
|
1873
|
+
currency: "jpy"
|
|
1874
|
+
})
|
|
1875
|
+
]);
|
|
1865
1876
|
// src/multipart-form.js
|
|
1866
1877
|
var BODY_LIMIT11 = 65536;
|
|
1867
1878
|
var CRLF = "\r\n";
|
|
@@ -1969,9 +1980,9 @@ var PAY_NL_CARD_PARTS = /* @__PURE__ */ Object.freeze([
|
|
|
1969
1980
|
"payment[card][expire_month]",
|
|
1970
1981
|
"payment[card][expire_year]"
|
|
1971
1982
|
]);
|
|
1972
|
-
var
|
|
1983
|
+
var pin5 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), serviceIds: Object.freeze([...fields.serviceIds]) });
|
|
1973
1984
|
var PAY_NL_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
1974
|
-
|
|
1985
|
+
pin5({ id: "weeztix", merchant: "Weeztix", origins: ["https://shop.weeztix.com"], serviceIds: ["SL-6399-2740"] })
|
|
1975
1986
|
]);
|
|
1976
1987
|
var RULE = /* @__PURE__ */ Object.freeze({ parts: PAY_NL_PARTS, card: PAY_NL_CARD_PARTS });
|
|
1977
1988
|
var SERVICE_ID = /^SL-\d{4}-\d{4}$/;
|
|
@@ -2087,10 +2098,10 @@ var wellFormed = (value) => {
|
|
|
2087
2098
|
var plainText2 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT2 && !CONTROL5.test(value) && (value.match(/[0-9]/g) ?? []).length < 12 && wellFormed(value);
|
|
2088
2099
|
var between = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
2089
2100
|
var NETWORK = /^(?:4[0-9]{15}|4[0-9]{12}|5[1-5][0-9]{14}|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[01][0-9]|20))[0-9]{12}|3[47][0-9]{13})$/;
|
|
2090
|
-
var luhn2 = (
|
|
2101
|
+
var luhn2 = (digits3) => {
|
|
2091
2102
|
let sum = 0;
|
|
2092
|
-
for (let at = 0; at <
|
|
2093
|
-
let d =
|
|
2103
|
+
for (let at = 0; at < digits3.length; at += 1) {
|
|
2104
|
+
let d = digits3.charCodeAt(digits3.length - 1 - at) - 48;
|
|
2094
2105
|
if (at % 2 === 1) {
|
|
2095
2106
|
d *= 2;
|
|
2096
2107
|
if (d > 9)
|
|
@@ -2101,7 +2112,7 @@ var luhn2 = (digits2) => {
|
|
|
2101
2112
|
return sum % 10 === 0;
|
|
2102
2113
|
};
|
|
2103
2114
|
var ANY_NETWORK = /^[2-6][0-9]{12,18}$/;
|
|
2104
|
-
var holdsCardShape = (
|
|
2115
|
+
var holdsCardShape = (text8, shape = NETWORK) => (text8.match(/[0-9]{13,}/g) ?? []).some((run) => run.length > 19 || shape.test(run) && luhn2(run));
|
|
2105
2116
|
var phone = (value) => typeof value === "string" && PHONE.test(value) && (value.match(/[0-9]/g) ?? []).length >= 6 && (value.match(/[0-9]/g) ?? []).length <= 15;
|
|
2106
2117
|
var refuse16 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
2107
2118
|
var CARD15 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -2312,10 +2323,10 @@ function orderedSubset(value, keys) {
|
|
|
2312
2323
|
}
|
|
2313
2324
|
return true;
|
|
2314
2325
|
}
|
|
2315
|
-
function luhn3(
|
|
2326
|
+
function luhn3(digits3) {
|
|
2316
2327
|
let sum = 0;
|
|
2317
|
-
for (let at = 0; at <
|
|
2318
|
-
let digit = Number(
|
|
2328
|
+
for (let at = 0; at < digits3.length; at += 1) {
|
|
2329
|
+
let digit = Number(digits3[digits3.length - 1 - at]);
|
|
2319
2330
|
if (at % 2 === 1) {
|
|
2320
2331
|
digit *= 2;
|
|
2321
2332
|
if (digit > 9)
|
|
@@ -2329,13 +2340,13 @@ var printable = (value) => [...value].every((ch) => ch.charCodeAt(0) >= 32 && ch
|
|
|
2329
2340
|
function typed(value, limit = 256) {
|
|
2330
2341
|
return typeof value === "string" && value.length >= 1 && value.length <= limit && !PAN_LIKE4.test(value) && printable(value);
|
|
2331
2342
|
}
|
|
2332
|
-
function decodeBase64(
|
|
2333
|
-
if (typeof
|
|
2343
|
+
function decodeBase64(text8) {
|
|
2344
|
+
if (typeof text8 !== "string" || !BASE643.test(text8) || text8.length % 4 !== 0)
|
|
2334
2345
|
return null;
|
|
2335
2346
|
let bits = 0;
|
|
2336
2347
|
let value = 0;
|
|
2337
2348
|
let out = "";
|
|
2338
|
-
for (const ch of
|
|
2349
|
+
for (const ch of text8.replace(/=+$/, "")) {
|
|
2339
2350
|
value = (value << 6 | BASE64_ALPHABET.indexOf(ch)) & 16777215;
|
|
2340
2351
|
bits += 6;
|
|
2341
2352
|
if (bits >= 8) {
|
|
@@ -2345,8 +2356,8 @@ function decodeBase64(text6) {
|
|
|
2345
2356
|
}
|
|
2346
2357
|
return out;
|
|
2347
2358
|
}
|
|
2348
|
-
function soundDevice(
|
|
2349
|
-
const json = decodeBase64(
|
|
2359
|
+
function soundDevice(text8) {
|
|
2360
|
+
const json = decodeBase64(text8);
|
|
2350
2361
|
if (json === null)
|
|
2351
2362
|
return false;
|
|
2352
2363
|
let value;
|
|
@@ -2464,17 +2475,17 @@ function sumupBodyVerdict(body, url) {
|
|
|
2464
2475
|
var SALTED = /* @__PURE__ */ Object.freeze([83, 97, 108, 116, 101, 100, 95, 95]);
|
|
2465
2476
|
var B64 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
2466
2477
|
var FIELD_LIMIT = 1024;
|
|
2467
|
-
function decodeCanonical(
|
|
2468
|
-
if (typeof
|
|
2478
|
+
function decodeCanonical(text8) {
|
|
2479
|
+
if (typeof text8 !== "string" || text8.length === 0 || text8.length % 4 !== 0 || !B64.test(text8))
|
|
2469
2480
|
return null;
|
|
2470
2481
|
let binary;
|
|
2471
2482
|
try {
|
|
2472
|
-
binary = atob(
|
|
2483
|
+
binary = atob(text8);
|
|
2473
2484
|
}
|
|
2474
2485
|
catch {
|
|
2475
2486
|
return null;
|
|
2476
2487
|
}
|
|
2477
|
-
if (btoa(binary) !==
|
|
2488
|
+
if (btoa(binary) !== text8)
|
|
2478
2489
|
return null;
|
|
2479
2490
|
return Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
2480
2491
|
}
|
|
@@ -2716,8 +2727,8 @@ var TEXT_LIMIT3 = 256;
|
|
|
2716
2727
|
var CONTROL7 = /[\u0000-\u001f\u007f]/;
|
|
2717
2728
|
var record13 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2718
2729
|
var sameKeys7 = (value, keys) => {
|
|
2719
|
-
const
|
|
2720
|
-
return
|
|
2730
|
+
const own12 = Object.keys(value);
|
|
2731
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
2721
2732
|
};
|
|
2722
2733
|
var plainText3 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT3 && !CONTROL7.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
2723
2734
|
var refuse19 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -2761,10 +2772,19 @@ function hipayBodyVerdict(body) {
|
|
|
2761
2772
|
return refuse19("hipay_keeps_card");
|
|
2762
2773
|
return value.multi_use === 0 ? CARD18 : refuse19("hipay_body_unsupported");
|
|
2763
2774
|
}
|
|
2764
|
-
var
|
|
2775
|
+
var pin6 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), usernames: Object.freeze([...fields.usernames]) });
|
|
2765
2776
|
var HIPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
2766
|
-
|
|
2777
|
+
pin6({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
|
|
2767
2778
|
]);
|
|
2779
|
+
// src/deep-freeze.js
|
|
2780
|
+
function deepFreeze(value) {
|
|
2781
|
+
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
2782
|
+
for (const child of Object.values(value))
|
|
2783
|
+
deepFreeze(child);
|
|
2784
|
+
Object.freeze(value);
|
|
2785
|
+
}
|
|
2786
|
+
return value;
|
|
2787
|
+
}
|
|
2768
2788
|
// src/amazon-payment-services.js
|
|
2769
2789
|
var APS_PSP = "amazon_payment_services";
|
|
2770
2790
|
var APS_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.payfort.com": "production", "sbcheckout.payfort.com": "sandbox" });
|
|
@@ -3049,14 +3069,14 @@ function cloverTokenUrl(url) {
|
|
|
3049
3069
|
return null;
|
|
3050
3070
|
return Object.freeze({ host: parsed.hostname, environment: CLOVER_TOKEN_HOSTS[parsed.hostname] });
|
|
3051
3071
|
}
|
|
3052
|
-
function cloverBrand(
|
|
3053
|
-
if (typeof
|
|
3072
|
+
function cloverBrand(digits3) {
|
|
3073
|
+
if (typeof digits3 !== "string" || !/^[0-9]{6,19}$/.test(digits3))
|
|
3054
3074
|
return null;
|
|
3055
|
-
const two = Number(
|
|
3056
|
-
const three = Number(
|
|
3057
|
-
const four = Number(
|
|
3058
|
-
const six = Number(
|
|
3059
|
-
if (
|
|
3075
|
+
const two = Number(digits3.slice(0, 2));
|
|
3076
|
+
const three = Number(digits3.slice(0, 3));
|
|
3077
|
+
const four = Number(digits3.slice(0, 4));
|
|
3078
|
+
const six = Number(digits3.slice(0, 6));
|
|
3079
|
+
if (digits3.startsWith("4"))
|
|
3060
3080
|
return "VISA";
|
|
3061
3081
|
if (two === 34 || two === 37)
|
|
3062
3082
|
return "AMEX";
|
|
@@ -3158,14 +3178,14 @@ var record16 = (value) => value !== null && typeof value === "object" && !Array.
|
|
|
3158
3178
|
function isTapPaymentsTokenUrl(url) {
|
|
3159
3179
|
return url === TAP_PAYMENTS_TOKEN_URL;
|
|
3160
3180
|
}
|
|
3161
|
-
var
|
|
3181
|
+
var pin7 = (fields) => Object.freeze({
|
|
3162
3182
|
...fields,
|
|
3163
3183
|
origins: Object.freeze([...fields.origins]),
|
|
3164
3184
|
sessions: Object.freeze({ ...fields.sessions }),
|
|
3165
3185
|
key: Object.freeze({ ...fields.key })
|
|
3166
3186
|
});
|
|
3167
3187
|
var TAP_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3168
|
-
|
|
3188
|
+
pin7({
|
|
3169
3189
|
id: "casefilegame",
|
|
3170
3190
|
merchant: "Casefilegame",
|
|
3171
3191
|
tapMerchantId: "67977048",
|
|
@@ -3429,7 +3449,7 @@ var YEAR11 = /^[0-9]{2}$/;
|
|
|
3429
3449
|
var CODE4 = /^[0-9]{3}$/;
|
|
3430
3450
|
var NAME_LIMIT3 = 100;
|
|
3431
3451
|
var NAME_WORD = /[a-z]+/gi;
|
|
3432
|
-
var printable2 = (
|
|
3452
|
+
var printable2 = (text8) => [...text8].every((character) => {
|
|
3433
3453
|
const point = character.codePointAt(0);
|
|
3434
3454
|
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
3435
3455
|
});
|
|
@@ -3438,15 +3458,15 @@ var HOSTNAME = /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](
|
|
|
3438
3458
|
var PUBLISHABLE_KEY = /^[A-Za-z0-9]{16,64}$/;
|
|
3439
3459
|
var record18 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3440
3460
|
var sameKeys8 = (value, keys) => {
|
|
3441
|
-
const
|
|
3442
|
-
return
|
|
3461
|
+
const own12 = Object.keys(value);
|
|
3462
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
3443
3463
|
};
|
|
3444
3464
|
var refuse24 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3445
3465
|
var CARD23 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3446
|
-
function luhn4(
|
|
3466
|
+
function luhn4(digits3) {
|
|
3447
3467
|
let sum = 0;
|
|
3448
|
-
for (let at = 0; at <
|
|
3449
|
-
let digit = Number(
|
|
3468
|
+
for (let at = 0; at < digits3.length; at += 1) {
|
|
3469
|
+
let digit = Number(digits3[digits3.length - 1 - at]);
|
|
3450
3470
|
if (at % 2 === 1) {
|
|
3451
3471
|
digit *= 2;
|
|
3452
3472
|
if (digit > 9)
|
|
@@ -3705,12 +3725,93 @@ var SUCCESS_RULES = {
|
|
|
3705
3725
|
cvvIncluded: (value) => typeof value === "boolean"
|
|
3706
3726
|
};
|
|
3707
3727
|
var SUCCESS_KEYS = Object.keys(SUCCESS_RULES);
|
|
3728
|
+
// src/openpay.js
|
|
3729
|
+
var OPENPAY_PSP = "openpay_bbva";
|
|
3730
|
+
var OPENPAY_API_HOSTS = /* @__PURE__ */ Object.freeze({
|
|
3731
|
+
"api.openpay.mx": "production",
|
|
3732
|
+
"api.openpay.co": "production",
|
|
3733
|
+
"api.openpay.pe": "production",
|
|
3734
|
+
"sandbox-api.openpay.mx": "sandbox",
|
|
3735
|
+
"sandbox-api.openpay.co": "sandbox",
|
|
3736
|
+
"sandbox-api.openpay.pe": "sandbox"
|
|
3737
|
+
});
|
|
3738
|
+
var OPENPAY_CARD_KEYS = /* @__PURE__ */ Object.freeze(["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year", "address"]);
|
|
3739
|
+
var OPENPAY_ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["line1", "line2", "line3", "state", "city", "postal_code", "country_code"]);
|
|
3740
|
+
var BODY_LIMIT23 = 4096;
|
|
3741
|
+
var URL_LIMIT10 = 96;
|
|
3742
|
+
var TOKEN_URL = /^https:\/\/((?:sandbox-)?api\.openpay\.(?:mx|co|pe))\/v1\/([a-z0-9]{10,40})\/tokens$/;
|
|
3743
|
+
var NUMBER6 = /^[0-9]{12,19}$/;
|
|
3744
|
+
var SECURITY_CODE14 = /^[0-9]{3,4}$/;
|
|
3745
|
+
var MONTH_TEXT = /^(?:0?[1-9]|1[0-2])$/;
|
|
3746
|
+
var YEAR12 = /^[0-9]{2}$/;
|
|
3747
|
+
var COUNTRY3 = /^[A-Z]{2}$/;
|
|
3748
|
+
var LETTERS2 = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
|
|
3749
|
+
var PAGE_NAME3 = new RegExp(`^[${LETTERS2} .'-]{1,64}$`);
|
|
3750
|
+
var HAS_LETTER2 = new RegExp(`[${LETTERS2}]`);
|
|
3751
|
+
var ADDRESS_VALUE2 = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
|
|
3752
|
+
var PAN_LIKE6 = new RegExp(`(?:[0-9][^0-9${LETTERS2}]*){12,}`);
|
|
3753
|
+
var record20 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3754
|
+
var hasOwn = (object, key) => Object.prototype.hasOwnProperty.call(object, key);
|
|
3755
|
+
var refuse25 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3756
|
+
var CARD24 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3757
|
+
function openpayTokenTarget(url) {
|
|
3758
|
+
if (typeof url !== "string" || url.length > URL_LIMIT10)
|
|
3759
|
+
return null;
|
|
3760
|
+
const match = TOKEN_URL.exec(url);
|
|
3761
|
+
if (!match)
|
|
3762
|
+
return null;
|
|
3763
|
+
return Object.freeze({ environment: OPENPAY_API_HOSTS[match[1]], host: match[1], merchantId: match[2] });
|
|
3764
|
+
}
|
|
3765
|
+
function readJson6(body) {
|
|
3766
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT23)
|
|
3767
|
+
return null;
|
|
3768
|
+
try {
|
|
3769
|
+
const value = JSON.parse(body);
|
|
3770
|
+
return record20(value) && JSON.stringify(value) === body ? value : null;
|
|
3771
|
+
}
|
|
3772
|
+
catch {
|
|
3773
|
+
return null;
|
|
3774
|
+
}
|
|
3775
|
+
}
|
|
3776
|
+
var soundMonth = (value) => Number.isInteger(value) && value >= 1 && value <= 12 || typeof value === "string" && MONTH_TEXT.test(value);
|
|
3777
|
+
function soundAddress2(address2) {
|
|
3778
|
+
if (!record20(address2))
|
|
3779
|
+
return false;
|
|
3780
|
+
const keys = Object.keys(address2);
|
|
3781
|
+
return keys.length > 0 && keys.every((key) => OPENPAY_ADDRESS_KEYS.includes(key) && typeof address2[key] === "string" && ADDRESS_VALUE2.test(address2[key]) && !PAN_LIKE6.test(address2[key])) && keys.some((key) => address2[key] !== "") && (!hasOwn(address2, "country_code") || COUNTRY3.test(address2.country_code));
|
|
3782
|
+
}
|
|
3783
|
+
function openpayBodyVerdict(body, url) {
|
|
3784
|
+
if (url !== void 0 && openpayTokenTarget(url) === null)
|
|
3785
|
+
return refuse25("openpay_url_refused");
|
|
3786
|
+
const value = readJson6(body);
|
|
3787
|
+
if (value === null)
|
|
3788
|
+
return refuse25("openpay_body_unsupported");
|
|
3789
|
+
const keys = Object.keys(value);
|
|
3790
|
+
if (!keys.every((key) => OPENPAY_CARD_KEYS.includes(key)) || !["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year"].every((key) => keys.includes(key))) {
|
|
3791
|
+
return refuse25("openpay_body_unsupported");
|
|
3792
|
+
}
|
|
3793
|
+
if (typeof value.card_number !== "string" || !NUMBER6.test(value.card_number) || typeof value.cvv2 !== "string" || !SECURITY_CODE14.test(value.cvv2) || !soundMonth(value.expiration_month) || typeof value.expiration_year !== "string" || !YEAR12.test(value.expiration_year) || typeof value.holder_name !== "string" || !PAGE_NAME3.test(value.holder_name) || !HAS_LETTER2.test(value.holder_name) || keys.includes("address") && !soundAddress2(value.address)) {
|
|
3794
|
+
return refuse25("openpay_body_unsupported");
|
|
3795
|
+
}
|
|
3796
|
+
return CARD24;
|
|
3797
|
+
}
|
|
3798
|
+
var pin8 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), publicKeys: Object.freeze([...fields.publicKeys]) });
|
|
3799
|
+
var OPENPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3800
|
+
pin8({
|
|
3801
|
+
id: "diario_de_yucatan",
|
|
3802
|
+
merchant: "Diario de Yucatán",
|
|
3803
|
+
origins: ["https://www.yucatan.com.mx"],
|
|
3804
|
+
host: "api.openpay.mx",
|
|
3805
|
+
merchantId: "mqyloyrm8tsvtsgcrj0d",
|
|
3806
|
+
publicKeys: ["pk_260aa43616a445bb98472e6ca51da968"]
|
|
3807
|
+
})
|
|
3808
|
+
]);
|
|
3708
3809
|
// src/poynt.js
|
|
3709
3810
|
var POYNT_PSP = "poynt";
|
|
3710
3811
|
var UUID4 = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
3711
3812
|
var NONCE_URL = new RegExp(`^https://services\\.poynt\\.net/v1/commerce/stores/(${UUID4})/payment-tokens/generate-nonce$`);
|
|
3712
3813
|
var STORE_ID = new RegExp(`^${UUID4}$`);
|
|
3713
|
-
var
|
|
3814
|
+
var BODY_LIMIT24 = 8192;
|
|
3714
3815
|
var ROOT_KEYS8 = /* @__PURE__ */ Object.freeze(["applicationId", "channelId", "card", "verificationData"]);
|
|
3715
3816
|
var CARD_KEYS10 = /* @__PURE__ */ Object.freeze(["number", "expirationMonth", "expirationYear", "type", "cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"]);
|
|
3716
3817
|
var ADDRESS_KEYS4 = /* @__PURE__ */ Object.freeze(["postalCode", "line1", "line2", "city", "territory", "countryCode", "postalCodeExtension"]);
|
|
@@ -3720,17 +3821,17 @@ var CARD_ON_FILE_KEYS = /* @__PURE__ */ Object.freeze(["saveFinancialInstrumentO
|
|
|
3720
3821
|
var CARD_TYPES = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMERICAN_EXPRESS", "DINERS_CLUB", "DISCOVER", "JCB", "UNIONPAY", "MAESTRO", "ELO", "HIPERCARD", "TROY", ""]);
|
|
3721
3822
|
var CARD_NUMBER12 = /^[0-9]{12,19}$/;
|
|
3722
3823
|
var MONTH12 = /^(?:0[1-9]|1[0-2])$/;
|
|
3723
|
-
var
|
|
3724
|
-
var
|
|
3824
|
+
var YEAR13 = /^20[0-9]{2}$/;
|
|
3825
|
+
var SECURITY_CODE15 = /^[0-9]{3,4}$/;
|
|
3725
3826
|
var IDENTIFIER = /^[A-Za-z0-9:._-]{1,128}$/;
|
|
3726
3827
|
var APPLICATION_ID = new RegExp(`^urn:aid:${UUID4}$`);
|
|
3727
3828
|
var POSTAL_CODE3 = /^[A-Za-z0-9_]{0,16}$/;
|
|
3728
|
-
var
|
|
3829
|
+
var COUNTRY4 = /^[A-Z]{2}$/;
|
|
3729
3830
|
var TEXT_LIMIT7 = 256;
|
|
3730
3831
|
var CONTROL10 = /[\u0000-\u001f\u007f]/;
|
|
3731
|
-
var cardLike2 = (
|
|
3832
|
+
var cardLike2 = (text8) => (text8.match(/[0-9]/g) ?? []).length >= 12;
|
|
3732
3833
|
var text5 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT7 && !CONTROL10.test(value) && !cardLike2(value);
|
|
3733
|
-
var
|
|
3834
|
+
var record21 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3734
3835
|
var own5 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
3735
3836
|
var inOrder4 = (value, order, required) => {
|
|
3736
3837
|
const keys = Object.keys(value);
|
|
@@ -3743,8 +3844,8 @@ var inOrder4 = (value, order, required) => {
|
|
|
3743
3844
|
}
|
|
3744
3845
|
return required.every((key) => keys.includes(key));
|
|
3745
3846
|
};
|
|
3746
|
-
var
|
|
3747
|
-
var
|
|
3847
|
+
var refuse26 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3848
|
+
var CARD25 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3748
3849
|
function poyntStoreId(url) {
|
|
3749
3850
|
const match = typeof url === "string" ? NONCE_URL.exec(url) : null;
|
|
3750
3851
|
return match ? match[1] : null;
|
|
@@ -3753,12 +3854,12 @@ function isPoyntNonceUrl(url) {
|
|
|
3753
3854
|
return poyntStoreId(url) !== null;
|
|
3754
3855
|
}
|
|
3755
3856
|
function readBody14(body) {
|
|
3756
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
3857
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT24)
|
|
3757
3858
|
return null;
|
|
3758
3859
|
let value;
|
|
3759
3860
|
try {
|
|
3760
3861
|
value = JSON.parse(body);
|
|
3761
|
-
if (!
|
|
3862
|
+
if (!record21(value) || JSON.stringify(value) !== body)
|
|
3762
3863
|
return null;
|
|
3763
3864
|
}
|
|
3764
3865
|
catch {
|
|
@@ -3769,32 +3870,32 @@ function readBody14(body) {
|
|
|
3769
3870
|
function poyntBodyVerdict(body) {
|
|
3770
3871
|
const value = readBody14(body);
|
|
3771
3872
|
if (value === null)
|
|
3772
|
-
return
|
|
3873
|
+
return refuse26("poynt_body_unsupported");
|
|
3773
3874
|
if (CARD_ON_FILE_KEYS.some((key) => own5(value, key)))
|
|
3774
|
-
return
|
|
3875
|
+
return refuse26("poynt_card_on_file");
|
|
3775
3876
|
if (!inOrder4(value, ROOT_KEYS8, REQUIRED_ROOT) || typeof value.applicationId !== "string" || !APPLICATION_ID.test(value.applicationId) || own5(value, "channelId") && (typeof value.channelId !== "string" || !IDENTIFIER.test(value.channelId))) {
|
|
3776
|
-
return
|
|
3877
|
+
return refuse26("poynt_body_unsupported");
|
|
3777
3878
|
}
|
|
3778
3879
|
const { card, verificationData: verification } = value;
|
|
3779
|
-
if (!
|
|
3780
|
-
return
|
|
3880
|
+
if (!record21(card) || !inOrder4(card, CARD_KEYS10, REQUIRED_CARD) || typeof card.number !== "string" || !CARD_NUMBER12.test(card.number) || typeof card.expirationMonth !== "string" || !MONTH12.test(card.expirationMonth) || typeof card.expirationYear !== "string" || !YEAR13.test(card.expirationYear) || !CARD_TYPES.includes(card.type) || !["cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"].every((key) => !own5(card, key) || text5(card[key]))) {
|
|
3881
|
+
return refuse26("poynt_body_unsupported");
|
|
3781
3882
|
}
|
|
3782
|
-
if (!
|
|
3783
|
-
return
|
|
3883
|
+
if (!record21(verification) || Object.keys(verification).join() !== "cardHolderBillingAddress,cvData" || typeof verification.cvData !== "string" || !SECURITY_CODE15.test(verification.cvData))
|
|
3884
|
+
return refuse26("poynt_body_unsupported");
|
|
3784
3885
|
const address2 = verification.cardHolderBillingAddress;
|
|
3785
|
-
if (!
|
|
3786
|
-
return
|
|
3787
|
-
return
|
|
3886
|
+
if (!record21(address2) || !inOrder4(address2, ADDRESS_KEYS4, []) || !Object.values(address2).every(text5) || own5(address2, "postalCode") && !POSTAL_CODE3.test(address2.postalCode) || own5(address2, "postalCodeExtension") && !POSTAL_CODE3.test(address2.postalCodeExtension) || own5(address2, "countryCode") && !COUNTRY4.test(address2.countryCode))
|
|
3887
|
+
return refuse26("poynt_body_unsupported");
|
|
3888
|
+
return CARD25;
|
|
3788
3889
|
}
|
|
3789
|
-
var
|
|
3890
|
+
var pin9 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), storeIds: Object.freeze([...fields.storeIds]) });
|
|
3790
3891
|
var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3791
|
-
|
|
3892
|
+
pin9({
|
|
3792
3893
|
id: "yearning_for_learning",
|
|
3793
3894
|
merchant: "Yearning for Learning Publishing & Coaching",
|
|
3794
3895
|
origins: ["https://ff305485-ba6c-423a-87b0-cebe3f83ffe9.mysimplestore.com"],
|
|
3795
3896
|
storeIds: ["71ac12ed-e61f-4318-95db-db0e7c649d6f"]
|
|
3796
3897
|
}),
|
|
3797
|
-
|
|
3898
|
+
pin9({
|
|
3798
3899
|
id: "timber_ridge_bookkeeping",
|
|
3799
3900
|
merchant: "Timber Ridge Bookkeeping",
|
|
3800
3901
|
origins: ["https://d7d64ac3-0352-4e53-af9a-f6d8e7b5fb71.mysimplestore.com"],
|
|
@@ -3802,107 +3903,2394 @@ var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
|
3802
3903
|
})
|
|
3803
3904
|
]);
|
|
3804
3905
|
var MAX_ANSWER_CHARS = 16 * 1024;
|
|
3805
|
-
// src/
|
|
3806
|
-
|
|
3807
|
-
|
|
3808
|
-
|
|
3809
|
-
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3906
|
+
// src/cardcom.js
|
|
3907
|
+
var CARDCOM_PSP = "cardcom";
|
|
3908
|
+
var CARDCOM_HOST = "secure.cardcom.solutions";
|
|
3909
|
+
var CARDCOM_ORIGIN = "https://secure.cardcom.solutions";
|
|
3910
|
+
var CARDCOM_SUBMIT_PATH = "/api/EA5/SubmitPayment";
|
|
3911
|
+
var CARDCOM_CURRENCIES = /* @__PURE__ */ Object.freeze({ 1: "ils", 826: "gbp", 840: "usd", 978: "eur" });
|
|
3912
|
+
var BODY_LIMIT25 = 65536;
|
|
3913
|
+
var TOP_KEYS2 = /* @__PURE__ */ Object.freeze(["GoogleToken", "UserAgent", "NumberOfTries", "GooglePayToken", "Store", "_3DSecureReq", "HooxReference"]);
|
|
3914
|
+
var STORE_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3915
|
+
"CommonStore",
|
|
3916
|
+
"CompanyInfoStore",
|
|
3917
|
+
"ProductsStore",
|
|
3918
|
+
"DeliveryStore",
|
|
3919
|
+
"DocumentStore",
|
|
3920
|
+
"DetailsStore",
|
|
3921
|
+
"PaymentStore"
|
|
3922
|
+
]);
|
|
3923
|
+
var THREE_DS_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3924
|
+
"TerminalNum",
|
|
3925
|
+
"CoinId",
|
|
3926
|
+
"CardNumber",
|
|
3927
|
+
"CardholderFullName",
|
|
3928
|
+
"CardholderPhone",
|
|
3929
|
+
"CardHolderEmail",
|
|
3930
|
+
"CVV",
|
|
3931
|
+
"CardExpireMonth",
|
|
3932
|
+
"CardExpireYear",
|
|
3933
|
+
"RequestedBillingAmount",
|
|
3934
|
+
"UserAgentHeader",
|
|
3935
|
+
"browserLanguage",
|
|
3936
|
+
"_3ds_browserjavaenabled",
|
|
3937
|
+
"_3ds_browserscreenheight",
|
|
3938
|
+
"_3ds_browserscreenwidth",
|
|
3939
|
+
"_3ds_browsercolordepth",
|
|
3940
|
+
"_3ds_challengewindowsize",
|
|
3941
|
+
"_3ds_channel",
|
|
3942
|
+
"_3ds_category",
|
|
3943
|
+
"_3ds_transtype",
|
|
3944
|
+
"ExternalAisurit4DealPageUID",
|
|
3945
|
+
"DealToSaveJSON",
|
|
3946
|
+
"GooglePayToken",
|
|
3947
|
+
"DirectDebitSplitPaymentsSum",
|
|
3948
|
+
"SapakMutav"
|
|
3949
|
+
]);
|
|
3950
|
+
var COMMON_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3951
|
+
"Uid",
|
|
3952
|
+
"OldUid",
|
|
3953
|
+
"TerminalNumber",
|
|
3954
|
+
"TerminalType",
|
|
3955
|
+
"StoreInitialized",
|
|
3956
|
+
"SuccessRedirectUrl",
|
|
3957
|
+
"ErrorRedirectUrl",
|
|
3958
|
+
"BackgroundImageUrl",
|
|
3959
|
+
"AdditionalDataJson",
|
|
3960
|
+
"Language",
|
|
3961
|
+
"UniqTempDealID",
|
|
3962
|
+
"IsError",
|
|
3963
|
+
"ErrorCode",
|
|
3964
|
+
"ErrorMessage",
|
|
3965
|
+
"OpeningText",
|
|
3966
|
+
"IsEA5SinglePage",
|
|
3967
|
+
"CurrentCardcomBitIntervalId",
|
|
3968
|
+
"SapakMutav",
|
|
3969
|
+
"ShowCookiesBanner",
|
|
3970
|
+
"HideFooter",
|
|
3971
|
+
"LPVersion"
|
|
3972
|
+
]);
|
|
3973
|
+
var COMPANY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3974
|
+
"CompanyNumber",
|
|
3975
|
+
"Name",
|
|
3976
|
+
"Address1",
|
|
3977
|
+
"Address2",
|
|
3978
|
+
"Address3",
|
|
3979
|
+
"Tel",
|
|
3980
|
+
"Email",
|
|
3981
|
+
"LogoURL",
|
|
3982
|
+
"LogoAlt",
|
|
3983
|
+
"YoutubeLink",
|
|
3984
|
+
"InstagramLink",
|
|
3985
|
+
"FacebookLink",
|
|
3986
|
+
"WhatsappLink",
|
|
3987
|
+
"Comments",
|
|
3988
|
+
"ShowGPayLogo",
|
|
3989
|
+
"ShowMasterCardLogo",
|
|
3990
|
+
"ShowVisaLogo",
|
|
3991
|
+
"ShowAmexLogo",
|
|
3992
|
+
"ShowDinersLogo",
|
|
3993
|
+
"ShowIsracardLogo",
|
|
3994
|
+
"MetaTitle",
|
|
3995
|
+
"MetaDescription",
|
|
3996
|
+
"MetaImage"
|
|
3997
|
+
]);
|
|
3998
|
+
var DELIVERY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3999
|
+
"ShowDeliveryForm",
|
|
4000
|
+
"DeliveryMethodField",
|
|
4001
|
+
"CityField",
|
|
4002
|
+
"StreetField",
|
|
4003
|
+
"BuildingNumberField",
|
|
4004
|
+
"ApartmentNumberField",
|
|
4005
|
+
"FloorField",
|
|
4006
|
+
"EntranceField",
|
|
4007
|
+
"DeliveryNotesField",
|
|
4008
|
+
"Cities",
|
|
4009
|
+
"Streets"
|
|
4010
|
+
]);
|
|
4011
|
+
var DOCUMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4012
|
+
"ShowInvoiceForm",
|
|
4013
|
+
"Comments",
|
|
4014
|
+
"Title",
|
|
4015
|
+
"NameField",
|
|
4016
|
+
"IdField",
|
|
4017
|
+
"MobileField",
|
|
4018
|
+
"AdditionalPhoneField",
|
|
4019
|
+
"EmailField",
|
|
4020
|
+
"EmailConfirmField",
|
|
4021
|
+
"CityField",
|
|
4022
|
+
"StreetField",
|
|
4023
|
+
"ZipcodeField",
|
|
4024
|
+
"SendPreBuyDataToServer",
|
|
4025
|
+
"DocTypeToCreate"
|
|
4026
|
+
]);
|
|
4027
|
+
var DETAILS_KEYS = /* @__PURE__ */ Object.freeze(["ShowDetailsForm", "ShowCancelBtn", "CancelUrl", "Comments", "FormFields"]);
|
|
4028
|
+
var PAYMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4029
|
+
"Comments",
|
|
4030
|
+
"ButtonText",
|
|
4031
|
+
"ButtonTextZeroSum",
|
|
4032
|
+
"HideCreditCardFieldsOnZeroSum",
|
|
4033
|
+
"EmailField",
|
|
4034
|
+
"MobileField",
|
|
4035
|
+
"CardNumberField",
|
|
4036
|
+
"YearsField",
|
|
4037
|
+
"MonthsField",
|
|
4038
|
+
"CvvField",
|
|
4039
|
+
"CardOwnerNameField",
|
|
4040
|
+
"CardTZField",
|
|
4041
|
+
"PaymentsField",
|
|
4042
|
+
"OpenSumField",
|
|
4043
|
+
"CardOwnerCityField",
|
|
4044
|
+
"CardOwnerAddressField",
|
|
4045
|
+
"CardOwnerZipcodeField",
|
|
4046
|
+
"ApprovedTermsAndConditions",
|
|
4047
|
+
"ShowTermsAndConditions",
|
|
4048
|
+
"TermsAndConditionsUrl",
|
|
4049
|
+
"AllowMerchantMessages",
|
|
4050
|
+
"MustAllowMerchantMessages",
|
|
4051
|
+
"ShowMerchantMessages",
|
|
4052
|
+
"ShowPayPal",
|
|
4053
|
+
"ShowUpayBitButton",
|
|
4054
|
+
"ShowPayMeBitButton",
|
|
4055
|
+
"ShowCardcomBitButton",
|
|
4056
|
+
"ShowApplePay",
|
|
4057
|
+
"MerchantApplePayLogoUrl",
|
|
4058
|
+
"ShowGooglePay",
|
|
4059
|
+
"ShowRecaptcha",
|
|
4060
|
+
"RecaptchaVersion",
|
|
4061
|
+
"IsCredit",
|
|
4062
|
+
"NumOfRetriesAllowed",
|
|
4063
|
+
"Commissions",
|
|
4064
|
+
"Is3DSecureEnabled",
|
|
4065
|
+
"Was3DSActiveOnPageLoad",
|
|
4066
|
+
"ThreeDSecureTransactionId",
|
|
4067
|
+
"ShowSuccessPopup",
|
|
4068
|
+
"ShowErrorPopup",
|
|
4069
|
+
"DonationType",
|
|
4070
|
+
"ThreeDSecureCavv",
|
|
4071
|
+
"GoogleCardNumber",
|
|
4072
|
+
"GoogleExpirationYear",
|
|
4073
|
+
"GoogleExpirationMonth",
|
|
4074
|
+
"CanSkipAuthentication",
|
|
4075
|
+
"CartTitle",
|
|
4076
|
+
"IsDirectDebit",
|
|
4077
|
+
"EnableHooxOffers",
|
|
4078
|
+
"HooxID",
|
|
4079
|
+
"SupportedCardBrands",
|
|
4080
|
+
"IsDirectDebitSplitPayments",
|
|
4081
|
+
"ApplePayApplicationData",
|
|
4082
|
+
"ShowPaymentButton",
|
|
4083
|
+
"OrderSummeryTitle",
|
|
4084
|
+
"AllowBitEmptyCardOwnerName",
|
|
4085
|
+
"IsCreateToken",
|
|
4086
|
+
"TurnstileSiteKey",
|
|
4087
|
+
"PrivacyPolicyUrl",
|
|
4088
|
+
"DualCardsBINs",
|
|
4089
|
+
"IsHideCart",
|
|
4090
|
+
"IsJ5"
|
|
4091
|
+
]);
|
|
4092
|
+
var FIELD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4093
|
+
"Ref",
|
|
4094
|
+
"Id",
|
|
4095
|
+
"Order",
|
|
4096
|
+
"InputType",
|
|
4097
|
+
"Required",
|
|
4098
|
+
"PreventPaste",
|
|
4099
|
+
"Show",
|
|
4100
|
+
"Data",
|
|
4101
|
+
"Value",
|
|
4102
|
+
"Direction",
|
|
4103
|
+
"Disabled"
|
|
4104
|
+
]);
|
|
4105
|
+
var PRODUCT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4106
|
+
"MinQuantity",
|
|
4107
|
+
"MaxQuantity",
|
|
4108
|
+
"JumpsInQuantity",
|
|
4109
|
+
"SelectedBuyQuantity",
|
|
4110
|
+
"QuantityOptions",
|
|
4111
|
+
"Comments",
|
|
4112
|
+
"IsManualSum",
|
|
4113
|
+
"PaymentsOptions",
|
|
4114
|
+
"IsCouponActive",
|
|
4115
|
+
"ManualPrice",
|
|
4116
|
+
"ManualPriceTxt",
|
|
4117
|
+
"IsVatFree",
|
|
4118
|
+
"SpecialPrices",
|
|
4119
|
+
"PreConfiguredPrice",
|
|
4120
|
+
"IsPreSelected",
|
|
4121
|
+
"CurrentInventory",
|
|
4122
|
+
"CheckInventory",
|
|
4123
|
+
"uid",
|
|
4124
|
+
"imageUrl",
|
|
4125
|
+
"name",
|
|
4126
|
+
"description",
|
|
4127
|
+
"BasePrice",
|
|
4128
|
+
"PriceBeforeDiscount",
|
|
4129
|
+
"BaseISOCurrency",
|
|
4130
|
+
"PriceToShow",
|
|
4131
|
+
"PriceBeforeDiscountToShow",
|
|
4132
|
+
"IsCurrent"
|
|
4133
|
+
]);
|
|
4134
|
+
var CURRENCY_KEYS = /* @__PURE__ */ Object.freeze(["Code", "AlphabeticCode", "ValueToNis", "NameHeb", "NameEn", "CoinSing"]);
|
|
4135
|
+
var NO_COUPON = '{"IsActivatedByUser":false,"IsActive":false,"CouponCode":"","IsValid":false,"DiscountType":0,"DiscountValue":0,"CouponType":1}';
|
|
4136
|
+
var FRESH_MANUAL_SUM = '{"Ref":"","Id":0,"Order":0,"InputType":0,"Required":false,"PreventPaste":false,"Show":true,"Data":{"Label":"","validators":[],"SelectList":[]},"Value":"","Direction":0,"Disabled":false}';
|
|
4137
|
+
var DONATION = /* @__PURE__ */ Object.freeze({ none: 0, monthly: 1, multiple: 2, single: 3 });
|
|
4138
|
+
var PAGE_ID = /^[A-Za-z0-9_-]{16,32}$/;
|
|
4139
|
+
var DEAL_ID = /^[0-9a-z]{6,40}$/;
|
|
4140
|
+
var PRODUCT_ID = /^[A-Za-z0-9_-]{8,64}$/;
|
|
4141
|
+
var TOKEN3 = /^[A-Za-z0-9_.:+/=-]{1,8192}$/;
|
|
4142
|
+
var SCREEN = /^[0-9]{1,5}$/;
|
|
4143
|
+
var LANGUAGE2 = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8}){0,3}$/;
|
|
4144
|
+
var CARD_NUMBER13 = /^[0-9]{12,19}$/;
|
|
4145
|
+
var MONTH13 = /^(?:[1-9]|1[0-2])$/;
|
|
4146
|
+
var YEAR14 = /^20[0-9]{2}$/;
|
|
4147
|
+
var CODE5 = /^[0-9]{3,4}$/;
|
|
4148
|
+
var TEXT_LIMIT8 = 256;
|
|
4149
|
+
var LONG_TEXT_LIMIT = BODY_LIMIT25;
|
|
4150
|
+
var record22 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4151
|
+
var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4152
|
+
var sameKeys9 = (value, keys) => {
|
|
4153
|
+
const own12 = Object.keys(value);
|
|
4154
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
4155
|
+
};
|
|
4156
|
+
var exact3 = (pattern, value) => typeof value === "string" && pattern.test(value);
|
|
4157
|
+
var printable3 = (text8) => [...text8].every((character) => {
|
|
4158
|
+
const point = character.codePointAt(0);
|
|
4159
|
+
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
4160
|
+
});
|
|
4161
|
+
var text6 = (value, limit = TEXT_LIMIT8) => typeof value === "string" && value.length <= limit && printable3(value);
|
|
4162
|
+
var pageText = (value, limit = LONG_TEXT_LIMIT) => value === null || typeof value === "string" && value.length <= limit;
|
|
4163
|
+
var whole = (value, min = 0, max = Number.MAX_SAFE_INTEGER) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
4164
|
+
var flag = (value) => typeof value === "boolean";
|
|
4165
|
+
var optionalFlag = (value) => value === null || flag(value);
|
|
4166
|
+
var refuse27 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4167
|
+
var CARD26 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4168
|
+
function luhn5(digits3) {
|
|
4169
|
+
let sum = 0;
|
|
4170
|
+
for (let at = 0; at < digits3.length; at += 1) {
|
|
4171
|
+
let digit = Number(digits3[digits3.length - 1 - at]);
|
|
4172
|
+
if (at % 2 === 1) {
|
|
4173
|
+
digit *= 2;
|
|
4174
|
+
if (digit > 9)
|
|
4175
|
+
digit -= 9;
|
|
4176
|
+
}
|
|
4177
|
+
sum += digit;
|
|
3813
4178
|
}
|
|
3814
|
-
|
|
3815
|
-
|
|
3816
|
-
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
4179
|
+
return sum % 10 === 0;
|
|
4180
|
+
}
|
|
4181
|
+
function cents(value) {
|
|
4182
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0 || value > 1e7)
|
|
4183
|
+
return null;
|
|
4184
|
+
const minor = Math.round(value * 100);
|
|
4185
|
+
return Math.abs(minor - value * 100) < 1e-6 ? minor : null;
|
|
4186
|
+
}
|
|
4187
|
+
function isCardcomSubmitUrl(url) {
|
|
4188
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
4189
|
+
return false;
|
|
4190
|
+
let parsed;
|
|
4191
|
+
try {
|
|
4192
|
+
parsed = new URL(url);
|
|
3820
4193
|
}
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
return { verdict: "refuse", code: "paypal_url_refused" };
|
|
3824
|
-
return paypalBodyVerdict(body);
|
|
4194
|
+
catch {
|
|
4195
|
+
return false;
|
|
3825
4196
|
}
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
4197
|
+
return parsed.href === url && parsed.protocol === "https:" && !parsed.port && !parsed.username && !parsed.password && !parsed.search && !parsed.hash && parsed.hostname === CARDCOM_HOST && parsed.pathname === CARDCOM_SUBMIT_PATH;
|
|
4198
|
+
}
|
|
4199
|
+
function readBody15(body) {
|
|
4200
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT25)
|
|
4201
|
+
return null;
|
|
4202
|
+
let value;
|
|
4203
|
+
try {
|
|
4204
|
+
value = JSON.parse(body);
|
|
4205
|
+
if (!record22(value) || JSON.stringify(value) !== body)
|
|
4206
|
+
return null;
|
|
3832
4207
|
}
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
return { verdict: "refuse", code: "paddle_vgs_url_refused" };
|
|
3836
|
-
return paddleVgsBodyVerdict(body);
|
|
4208
|
+
catch {
|
|
4209
|
+
return null;
|
|
3837
4210
|
}
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
4211
|
+
return value;
|
|
4212
|
+
}
|
|
4213
|
+
function field(value) {
|
|
4214
|
+
return record22(value) && sameKeys9(value, FIELD_KEYS) && text6(value.Ref, 64) && whole(value.Id) && whole(value.Order) && whole(value.InputType) && flag(value.Required) && flag(value.PreventPaste) && flag(value.Show) && record22(value.Data) && typeof value.Value === "string" && value.Value.length <= 4096 && whole(value.Direction) && flag(value.Disabled);
|
|
4215
|
+
}
|
|
4216
|
+
var optionalField = (value) => value === null || field(value);
|
|
4217
|
+
function selectValues(value) {
|
|
4218
|
+
const list = field(value) ? value.Data.SelectList : null;
|
|
4219
|
+
if (!Array.isArray(list) || list.length === 0)
|
|
4220
|
+
return null;
|
|
4221
|
+
return list.map((option) => record22(option) && typeof option.value === "string" ? option.value : null);
|
|
4222
|
+
}
|
|
4223
|
+
function commonStore(value) {
|
|
4224
|
+
return record22(value) && sameKeys9(value, COMMON_KEYS) && exact3(PAGE_ID, value.Uid) && (value.OldUid === null || value.OldUid === "" || value.OldUid === value.Uid) && whole(value.TerminalNumber, 1, 99999999) && whole(value.TerminalType) && value.StoreInitialized === true && pageText(value.SuccessRedirectUrl) && pageText(value.ErrorRedirectUrl) && pageText(value.BackgroundImageUrl) && pageText(value.AdditionalDataJson) && exact3(LANGUAGE2, value.Language) && exact3(DEAL_ID, value.UniqTempDealID) && value.IsError === false && value.ErrorCode === 0 && value.ErrorMessage === "" && value.OpeningText === "" && flag(value.IsEA5SinglePage) && whole(value.CurrentCardcomBitIntervalId) && value.SapakMutav === "" && flag(value.ShowCookiesBanner) && flag(value.HideFooter) && value.LPVersion === 0;
|
|
4225
|
+
}
|
|
4226
|
+
function companyStore(value) {
|
|
4227
|
+
return record22(value) && sameKeys9(value, COMPANY_KEYS) && whole(value.CompanyNumber, 1) && COMPANY_KEYS.slice(1).every((key) => key.startsWith("Show") ? flag(value[key]) : pageText(value[key]));
|
|
4228
|
+
}
|
|
4229
|
+
var SUM_TEXT = /^(?:0*[1-9][0-9]*(?:\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$/;
|
|
4230
|
+
var sumText = (text8, sum) => text8 === null || typeof text8 === "string" && SUM_TEXT.test(text8) && Number.parseFloat(text8) === sum;
|
|
4231
|
+
function chosenProduct(value) {
|
|
4232
|
+
return record22(value) && sameKeys9(value, PRODUCT_KEYS) && whole(value.MinQuantity) && whole(value.MaxQuantity) && whole(value.JumpsInQuantity) && value.SelectedBuyQuantity === 1 && Array.isArray(value.QuantityOptions) && value.QuantityOptions.length === 0 && pageText(value.Comments) && flag(value.IsManualSum) && Array.isArray(value.PaymentsOptions) && flag(value.IsCouponActive) && typeof value.ManualPrice === "number" && sumText(value.ManualPriceTxt, value.ManualPrice) && flag(value.IsVatFree) && Array.isArray(value.SpecialPrices) && (value.PreConfiguredPrice === null || typeof value.PreConfiguredPrice === "number") && flag(value.IsPreSelected) && typeof value.CurrentInventory === "number" && flag(value.CheckInventory) && exact3(PRODUCT_ID, value.uid) && pageText(value.imageUrl) && typeof value.name === "string" && pageText(value.name) && pageText(value.description) && typeof value.BasePrice === "number" && typeof value.PriceBeforeDiscount === "number" && whole(value.BaseISOCurrency) && typeof value.PriceToShow === "number" && typeof value.PriceBeforeDiscountToShow === "number" && flag(value.IsCurrent);
|
|
4233
|
+
}
|
|
4234
|
+
var DAY_RATES = /* @__PURE__ */ Object.freeze({ 1: 1, 826: 4.1194, 840: 3.089, 978: 3.4769 });
|
|
4235
|
+
var dayRate = (code, rate) => typeof rate === "number" && Number.isFinite(rate) && (code === 1 ? rate === 1 : rate >= DAY_RATES[code] * 0.75 && rate <= DAY_RATES[code] * 1.25);
|
|
4236
|
+
function chargedCurrency(value) {
|
|
4237
|
+
return record22(value) && sameKeys9(value, CURRENCY_KEYS) && whole(value.Code) && owns6(CARDCOM_CURRENCIES, value.Code) && value.AlphabeticCode === CARDCOM_CURRENCIES[value.Code].toUpperCase() && dayRate(value.Code, value.ValueToNis) && pageText(value.NameHeb) && pageText(value.NameEn) && pageText(value.CoinSing);
|
|
4238
|
+
}
|
|
4239
|
+
function freshProductsStore(products) {
|
|
4240
|
+
return {
|
|
4241
|
+
Title: "",
|
|
4242
|
+
isDonation: false,
|
|
4243
|
+
showCurrencyConvert: false,
|
|
4244
|
+
currencies: [],
|
|
4245
|
+
selectedCurrency: products.selectedCurrency,
|
|
4246
|
+
coupon: products.coupon,
|
|
4247
|
+
couponCalculatedDiscount: 0,
|
|
4248
|
+
CurrentCouponCode: "",
|
|
4249
|
+
products: products.products,
|
|
4250
|
+
deliveryMethods: products.deliveryMethods,
|
|
4251
|
+
haveImages: false,
|
|
4252
|
+
isCouponActive: false,
|
|
4253
|
+
ShowProductPrice: false,
|
|
4254
|
+
ShowTotalPrice: false,
|
|
4255
|
+
ItemsDisplayType: 0,
|
|
4256
|
+
ManualSumField: JSON.parse(FRESH_MANUAL_SUM),
|
|
4257
|
+
ShowVatInfo: false,
|
|
4258
|
+
Vat: 0,
|
|
4259
|
+
TotalPriceNotRequireVat: 0,
|
|
4260
|
+
TotalPriceRequireVat: 0,
|
|
4261
|
+
TotalVat: 0,
|
|
4262
|
+
DiscountSum: 0,
|
|
4263
|
+
ShowDonationAmountsButtons: false,
|
|
4264
|
+
DonationDescription: ""
|
|
4265
|
+
};
|
|
4266
|
+
}
|
|
4267
|
+
function productsStore(value) {
|
|
4268
|
+
if (!record22(value) || !Array.isArray(value.products) || value.products.length !== 1 || !chosenProduct(value.products[0]) || !chargedCurrency(value.selectedCurrency) || !Array.isArray(value.deliveryMethods) || !value.deliveryMethods.every((method) => record22(method) && method.IsCurrent === false && typeof method.PriceToShow === "number") || JSON.stringify(value.coupon) !== NO_COUPON)
|
|
4269
|
+
return false;
|
|
4270
|
+
return JSON.stringify(freshProductsStore(value)) === JSON.stringify(value);
|
|
4271
|
+
}
|
|
4272
|
+
function deliveryStore(value) {
|
|
4273
|
+
return record22(value) && sameKeys9(value, DELIVERY_KEYS) && flag(value.ShowDeliveryForm) && DELIVERY_KEYS.slice(1, 9).every((key) => optionalField(value[key])) && Array.isArray(value.Cities) && value.Cities.length === 0 && Array.isArray(value.Streets) && value.Streets.length === 0;
|
|
4274
|
+
}
|
|
4275
|
+
function documentStore(value) {
|
|
4276
|
+
return record22(value) && sameKeys9(value, DOCUMENT_KEYS) && flag(value.ShowInvoiceForm) && pageText(value.Comments) && pageText(value.Title) && DOCUMENT_KEYS.slice(3, 12).every((key) => optionalField(value[key])) && flag(value.SendPreBuyDataToServer) && whole(value.DocTypeToCreate);
|
|
4277
|
+
}
|
|
4278
|
+
function detailsStore(value) {
|
|
4279
|
+
return record22(value) && sameKeys9(value, DETAILS_KEYS) && flag(value.ShowDetailsForm) && value.ShowCancelBtn === false && value.CancelUrl === "" && pageText(value.Comments) && Array.isArray(value.FormFields) && value.FormFields.every(field);
|
|
4280
|
+
}
|
|
4281
|
+
function pageCard(payment) {
|
|
4282
|
+
const number = payment.CardNumberField.Value;
|
|
4283
|
+
const years = selectValues(payment.YearsField);
|
|
4284
|
+
return CARD_NUMBER13.test(number) && luhn5(number) && MONTH13.test(payment.MonthsField.Value) && YEAR14.test(payment.YearsField.Value) && (years === null || years.includes(payment.YearsField.Value)) && CODE5.test(payment.CvvField.Value) && payment.CardOwnerNameField.Value.length >= 2 && text6(payment.CardOwnerNameField.Value, 100);
|
|
4285
|
+
}
|
|
4286
|
+
function paymentStore(value) {
|
|
4287
|
+
if (!record22(value) || !sameKeys9(value, PAYMENT_KEYS))
|
|
4288
|
+
return false;
|
|
4289
|
+
const fields = [
|
|
4290
|
+
"EmailField",
|
|
4291
|
+
"MobileField",
|
|
4292
|
+
"CardNumberField",
|
|
4293
|
+
"YearsField",
|
|
4294
|
+
"MonthsField",
|
|
4295
|
+
"CvvField",
|
|
4296
|
+
"CardOwnerNameField",
|
|
4297
|
+
"CardTZField",
|
|
4298
|
+
"PaymentsField",
|
|
4299
|
+
"OpenSumField"
|
|
4300
|
+
];
|
|
4301
|
+
const untouched = ["CardOwnerCityField", "CardOwnerAddressField", "CardOwnerZipcodeField"];
|
|
4302
|
+
const flags = [
|
|
4303
|
+
"HideCreditCardFieldsOnZeroSum",
|
|
4304
|
+
"ApprovedTermsAndConditions",
|
|
4305
|
+
"ShowTermsAndConditions",
|
|
4306
|
+
"AllowMerchantMessages",
|
|
4307
|
+
"MustAllowMerchantMessages",
|
|
4308
|
+
"ShowMerchantMessages",
|
|
4309
|
+
"ShowPayPal",
|
|
4310
|
+
"ShowUpayBitButton",
|
|
4311
|
+
"ShowPayMeBitButton",
|
|
4312
|
+
"ShowCardcomBitButton",
|
|
4313
|
+
"ShowApplePay",
|
|
4314
|
+
"ShowGooglePay",
|
|
4315
|
+
"ShowRecaptcha",
|
|
4316
|
+
"IsCredit",
|
|
4317
|
+
"Is3DSecureEnabled",
|
|
4318
|
+
"ShowSuccessPopup",
|
|
4319
|
+
"ShowErrorPopup",
|
|
4320
|
+
"CanSkipAuthentication",
|
|
4321
|
+
"IsDirectDebit",
|
|
4322
|
+
"EnableHooxOffers",
|
|
4323
|
+
"IsDirectDebitSplitPayments",
|
|
4324
|
+
"ShowPaymentButton",
|
|
4325
|
+
"AllowBitEmptyCardOwnerName",
|
|
4326
|
+
"IsCreateToken",
|
|
4327
|
+
"IsHideCart",
|
|
4328
|
+
"IsJ5"
|
|
4329
|
+
];
|
|
4330
|
+
const texts = [
|
|
4331
|
+
"Comments",
|
|
4332
|
+
"ButtonText",
|
|
4333
|
+
"ButtonTextZeroSum",
|
|
4334
|
+
"TermsAndConditionsUrl",
|
|
4335
|
+
"MerchantApplePayLogoUrl",
|
|
4336
|
+
"RecaptchaVersion",
|
|
4337
|
+
"CartTitle",
|
|
4338
|
+
"HooxID",
|
|
4339
|
+
"ApplePayApplicationData",
|
|
4340
|
+
"OrderSummeryTitle",
|
|
4341
|
+
"TurnstileSiteKey",
|
|
4342
|
+
"PrivacyPolicyUrl"
|
|
4343
|
+
];
|
|
4344
|
+
return fields.every((key) => field(value[key])) && untouched.every((key) => JSON.stringify(value[key]) === "{}") && flags.every((key) => flag(value[key])) && texts.every((key) => pageText(value[key])) && whole(value.NumOfRetriesAllowed, 0, 99) && Array.isArray(value.Commissions) && value.Commissions.every(record22) && optionalFlag(value.Was3DSActiveOnPageLoad) && pageText(value.ThreeDSecureTransactionId) && pageText(value.ThreeDSecureCavv) && Object.values(DONATION).includes(value.DonationType) && value.GoogleCardNumber === "" && value.GoogleExpirationYear === "0" && value.GoogleExpirationMonth === "0" && Array.isArray(value.SupportedCardBrands) && value.SupportedCardBrands.every((brand) => text6(brand, 32)) && Array.isArray(value.DualCardsBINs) && value.DualCardsBINs.every(record22) && pageCard(value);
|
|
4345
|
+
}
|
|
4346
|
+
function threeDsBlock(value, block) {
|
|
4347
|
+
const { CommonStore: common, ProductsStore: products, PaymentStore: payment } = value.Store;
|
|
4348
|
+
if (!record22(block) || !sameKeys9(block, THREE_DS_KEYS) || typeof block.RequestedBillingAmount !== "number" || !exact3(LANGUAGE2, block.browserLanguage) || !exact3(SCREEN, block._3ds_browserscreenheight) || !exact3(SCREEN, block._3ds_browserscreenwidth) || !exact3(SCREEN, block._3ds_browsercolordepth))
|
|
4349
|
+
return false;
|
|
4350
|
+
const rebuilt = {
|
|
4351
|
+
TerminalNum: common.TerminalNumber,
|
|
4352
|
+
CoinId: products.selectedCurrency.Code,
|
|
4353
|
+
CardNumber: payment.CardNumberField.Value,
|
|
4354
|
+
CardholderFullName: payment.CardOwnerNameField.Value,
|
|
4355
|
+
CardholderPhone: payment.MobileField.Value,
|
|
4356
|
+
CardHolderEmail: payment.EmailField.Value,
|
|
4357
|
+
CVV: payment.CvvField.Value,
|
|
4358
|
+
CardExpireMonth: payment.MonthsField.Value,
|
|
4359
|
+
CardExpireYear: payment.YearsField.Value.substr(2, 2),
|
|
4360
|
+
RequestedBillingAmount: block.RequestedBillingAmount,
|
|
4361
|
+
UserAgentHeader: value.UserAgent,
|
|
4362
|
+
browserLanguage: block.browserLanguage,
|
|
4363
|
+
_3ds_browserjavaenabled: "true",
|
|
4364
|
+
_3ds_browserscreenheight: block._3ds_browserscreenheight,
|
|
4365
|
+
_3ds_browserscreenwidth: block._3ds_browserscreenwidth,
|
|
4366
|
+
_3ds_browsercolordepth: block._3ds_browsercolordepth,
|
|
4367
|
+
_3ds_challengewindowsize: "05",
|
|
4368
|
+
_3ds_channel: "02",
|
|
4369
|
+
_3ds_category: "01",
|
|
4370
|
+
_3ds_transtype: "01",
|
|
4371
|
+
ExternalAisurit4DealPageUID: common.Uid,
|
|
4372
|
+
DealToSaveJSON: "",
|
|
4373
|
+
GooglePayToken: "",
|
|
4374
|
+
DirectDebitSplitPaymentsSum: 0,
|
|
4375
|
+
SapakMutav: ""
|
|
4376
|
+
};
|
|
4377
|
+
return JSON.stringify(rebuilt) === JSON.stringify(block);
|
|
4378
|
+
}
|
|
4379
|
+
var hooxReference = (value) => value === null || value === "" || whole(value) || typeof value === "string" && /^[\x21-\x7e]{1,256}$/.test(value);
|
|
4380
|
+
function pageBody(body) {
|
|
4381
|
+
const value = readBody15(body);
|
|
4382
|
+
if (value === null || !sameKeys9(value, TOP_KEYS2) || typeof value.GoogleToken !== "string" || value.GoogleToken !== "" && !TOKEN3.test(value.GoogleToken) || value.UserAgent === "" || !text6(value.UserAgent, 1024) || !whole(value.NumberOfTries, 1, 10) || value.GooglePayToken !== "" || !hooxReference(value.HooxReference) || !record22(value.Store) || !sameKeys9(value.Store, STORE_KEYS))
|
|
4383
|
+
return null;
|
|
4384
|
+
const store = value.Store;
|
|
4385
|
+
if (!commonStore(store.CommonStore) || !companyStore(store.CompanyInfoStore) || !productsStore(store.ProductsStore) || !deliveryStore(store.DeliveryStore) || !documentStore(store.DocumentStore) || !detailsStore(store.DetailsStore) || !paymentStore(store.PaymentStore) || !threeDsBlock(value, value._3DSecureReq))
|
|
4386
|
+
return null;
|
|
4387
|
+
const product = store.ProductsStore.products[0];
|
|
4388
|
+
const price = cents(product.PriceToShow);
|
|
4389
|
+
if (price === null || cents(value._3DSecureReq.RequestedBillingAmount) !== price || product.BaseISOCurrency !== store.ProductsStore.selectedCurrency.Code || product.IsManualSum && product.ManualPrice !== product.PriceToShow)
|
|
4390
|
+
return null;
|
|
4391
|
+
if (store.PaymentStore.ShowRecaptcha !== (value.GoogleToken !== ""))
|
|
4392
|
+
return null;
|
|
4393
|
+
return value;
|
|
4394
|
+
}
|
|
4395
|
+
function cardcomBodyVerdict(body, url) {
|
|
4396
|
+
if (url !== void 0 && !isCardcomSubmitUrl(url))
|
|
4397
|
+
return refuse27("cardcom_url_refused");
|
|
4398
|
+
const value = pageBody(body);
|
|
4399
|
+
if (value === null)
|
|
4400
|
+
return refuse27("cardcom_body_unsupported");
|
|
4401
|
+
const payment = value.Store.PaymentStore;
|
|
4402
|
+
const receiptId = value.Store.DocumentStore.IdField;
|
|
4403
|
+
if (payment.Is3DSecureEnabled || payment.Was3DSActiveOnPageLoad === true || payment.ThreeDSecureTransactionId || payment.ThreeDSecureCavv) {
|
|
4404
|
+
return refuse27("cardcom_three_d_secure_refused");
|
|
4405
|
+
}
|
|
4406
|
+
if (payment.IsCreateToken || payment.IsJ5)
|
|
4407
|
+
return refuse27("cardcom_card_saving_refused");
|
|
4408
|
+
if (payment.IsDirectDebitSplitPayments || payment.PaymentsField.Value !== "1" || payment.DonationType === DONATION.monthly || payment.DonationType === DONATION.multiple || payment.IsDirectDebit && payment.DonationType !== DONATION.single) {
|
|
4409
|
+
return refuse27("cardcom_recurring_refused");
|
|
4410
|
+
}
|
|
4411
|
+
if (payment.CardTZField.Value !== "" || payment.CardTZField.Show && payment.CardTZField.Required || receiptId !== null && (receiptId.Value !== "" || receiptId.Show && receiptId.Required))
|
|
4412
|
+
return refuse27("cardcom_id_required");
|
|
4413
|
+
if (payment.ShowRecaptcha && payment.RecaptchaVersion !== "v3")
|
|
4414
|
+
return refuse27("cardcom_captcha_unsupported");
|
|
4415
|
+
return CARD26;
|
|
4416
|
+
}
|
|
4417
|
+
var CARDCOM_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
4418
|
+
Object.freeze({
|
|
4419
|
+
id: "machon_alte_usd",
|
|
4420
|
+
merchant: "Machon Alte",
|
|
4421
|
+
origins: Object.freeze([CARDCOM_ORIGIN]),
|
|
4422
|
+
page: "kzR5pTyr0kC3oqjpGbCMiQ",
|
|
4423
|
+
terminal: 162226,
|
|
4424
|
+
products: Object.freeze([Object.freeze({ uid: "JoQrlcuGCUWYM4I66eX7pw", currency: "usd", price: null })]),
|
|
4425
|
+
settings: "e38d7c7abce83a3a994a707e345595cf6ec2a15d77794a8eea70c0d5ce4773ab"
|
|
4426
|
+
})
|
|
4427
|
+
]);
|
|
4428
|
+
// src/nexi-checkout.js
|
|
4429
|
+
var NEXI_CHECKOUT_PSP = "nexi_checkout";
|
|
4430
|
+
var NEXI_CHECKOUT_PAY_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.dibspayment.eu": "production", "test.checkout.dibspayment.eu": "test" });
|
|
4431
|
+
var NEXI_CHECKOUT_PAY_PATH = "/api/v1/pay";
|
|
4432
|
+
var BODY_LIMIT26 = 4096;
|
|
4433
|
+
var BODY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4434
|
+
"type",
|
|
4435
|
+
"paymentType",
|
|
4436
|
+
"acceptedTermsAndConditions",
|
|
4437
|
+
"amountConfirmedByConsumer",
|
|
4438
|
+
"surchargeAmount",
|
|
4439
|
+
"consumerCheckedSaveNewPaymentMethod",
|
|
4440
|
+
"consumerHasConsentedToRememberingNewDevice",
|
|
4441
|
+
"consumerWantsToBeAnonymous",
|
|
4442
|
+
"language"
|
|
4443
|
+
]);
|
|
4444
|
+
var CARD_KEYS11 = /* @__PURE__ */ Object.freeze(["cardNumber", "cardVerificationCode", "cardholderName", "expiryMonth", "expiryYear"]);
|
|
4445
|
+
var CARD_NUMBER14 = /^[0-9]{13,19}$/;
|
|
4446
|
+
var MONTH14 = /^(?:0[1-9]|1[0-2])$/;
|
|
4447
|
+
var YEAR15 = /^[0-9]{2}$/;
|
|
4448
|
+
var CODE6 = /^[0-9]{3,4}$/;
|
|
4449
|
+
var TEXT_LIMIT9 = 128;
|
|
4450
|
+
var EMAIL_LIMIT2 = 254;
|
|
4451
|
+
var LANGUAGE3 = /^[a-z]{2}-[a-z]{2}$/i;
|
|
4452
|
+
var AMOUNT_LIMIT2 = 2147483647;
|
|
4453
|
+
var record23 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4454
|
+
var own6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4455
|
+
var sameKeys10 = (value, keys) => {
|
|
4456
|
+
const found = Object.keys(value);
|
|
4457
|
+
return found.length === keys.length && found.every((key, at) => key === keys[at]);
|
|
4458
|
+
};
|
|
4459
|
+
var refuse28 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4460
|
+
var CARD27 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4461
|
+
var printable4 = (text8) => [...text8].every((character) => {
|
|
4462
|
+
const point = character.codePointAt(0);
|
|
4463
|
+
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
4464
|
+
});
|
|
4465
|
+
var text7 = (value, limit) => typeof value === "string" && value.length <= limit && printable4(value);
|
|
4466
|
+
function luhn6(digits3) {
|
|
4467
|
+
let sum = 0;
|
|
4468
|
+
for (let at = 0; at < digits3.length; at += 1) {
|
|
4469
|
+
let digit = Number(digits3[digits3.length - 1 - at]);
|
|
4470
|
+
if (at % 2 === 1) {
|
|
4471
|
+
digit *= 2;
|
|
4472
|
+
if (digit > 9)
|
|
4473
|
+
digit -= 9;
|
|
4474
|
+
}
|
|
4475
|
+
sum += digit;
|
|
3842
4476
|
}
|
|
3843
|
-
|
|
3844
|
-
|
|
4477
|
+
return sum % 10 === 0;
|
|
4478
|
+
}
|
|
4479
|
+
function nexiCheckoutPayUrl(url) {
|
|
4480
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
4481
|
+
return null;
|
|
4482
|
+
let parsed;
|
|
4483
|
+
try {
|
|
4484
|
+
parsed = new URL(url);
|
|
3845
4485
|
}
|
|
3846
|
-
|
|
3847
|
-
return
|
|
4486
|
+
catch {
|
|
4487
|
+
return null;
|
|
3848
4488
|
}
|
|
3849
|
-
if (
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
return
|
|
4489
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.search || parsed.hash || parsed.pathname !== NEXI_CHECKOUT_PAY_PATH)
|
|
4490
|
+
return null;
|
|
4491
|
+
if (!own6(NEXI_CHECKOUT_PAY_HOSTS, parsed.hostname))
|
|
4492
|
+
return null;
|
|
4493
|
+
return Object.freeze({ host: parsed.hostname, environment: NEXI_CHECKOUT_PAY_HOSTS[parsed.hostname] });
|
|
4494
|
+
}
|
|
4495
|
+
function isNexiCheckoutPayUrl(url) {
|
|
4496
|
+
return nexiCheckoutPayUrl(url) !== null;
|
|
4497
|
+
}
|
|
4498
|
+
function readBody16(body) {
|
|
4499
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT26)
|
|
4500
|
+
return null;
|
|
4501
|
+
let value;
|
|
4502
|
+
try {
|
|
4503
|
+
value = JSON.parse(body);
|
|
4504
|
+
if (!record23(value) || JSON.stringify(value) !== body)
|
|
4505
|
+
return null;
|
|
3853
4506
|
}
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
return twoC2pBodyVerdict(body);
|
|
3857
|
-
const target = twoC2pPaymentTarget(url);
|
|
3858
|
-
if (target === null)
|
|
3859
|
-
return { verdict: "refuse", code: "twoc2p_url_refused" };
|
|
3860
|
-
if (!target.reviewed)
|
|
3861
|
-
return twoC2pPaymentCarriesCard(body) ? { verdict: "refuse", code: "twoc2p_build_unreviewed" } : { verdict: "continue" };
|
|
3862
|
-
const keyBytes = twoC2pKeyBytes(target.environment);
|
|
3863
|
-
return keyBytes === null ? { verdict: "refuse", code: "twoc2p_field_unreviewed" } : twoC2pBodyVerdict(body, keyBytes, target.environment);
|
|
4507
|
+
catch {
|
|
4508
|
+
return null;
|
|
3864
4509
|
}
|
|
3865
|
-
|
|
3866
|
-
|
|
3867
|
-
|
|
3868
|
-
|
|
3869
|
-
|
|
3870
|
-
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
return
|
|
4510
|
+
return value;
|
|
4511
|
+
}
|
|
4512
|
+
function cardFormValues(card) {
|
|
4513
|
+
if (!record23(card))
|
|
4514
|
+
return false;
|
|
4515
|
+
const keys = Object.keys(card);
|
|
4516
|
+
const expected = own6(card, "email") ? CARD_KEYS11.length + 1 : CARD_KEYS11.length;
|
|
4517
|
+
if (keys.length !== expected || !CARD_KEYS11.every((key) => own6(card, key)))
|
|
4518
|
+
return false;
|
|
4519
|
+
if (own6(card, "email") && !text7(card.email, EMAIL_LIMIT2))
|
|
4520
|
+
return false;
|
|
4521
|
+
return typeof card.cardNumber === "string" && CARD_NUMBER14.test(card.cardNumber) && luhn6(card.cardNumber) && typeof card.cardVerificationCode === "string" && CODE6.test(card.cardVerificationCode) && text7(card.cardholderName, TEXT_LIMIT9) && card.cardholderName.trim() !== "" && typeof card.expiryMonth === "string" && MONTH14.test(card.expiryMonth) && typeof card.expiryYear === "string" && YEAR15.test(card.expiryYear);
|
|
4522
|
+
}
|
|
4523
|
+
var amount = (value, least) => Number.isSafeInteger(value) && value >= least && value <= AMOUNT_LIMIT2;
|
|
4524
|
+
var flag2 = (value) => typeof value === "boolean";
|
|
4525
|
+
function nexiCheckoutBodyVerdict(body, url) {
|
|
4526
|
+
if (url !== void 0 && !isNexiCheckoutPayUrl(url))
|
|
4527
|
+
return refuse28("nexi_checkout_url_refused");
|
|
4528
|
+
const value = readBody16(body);
|
|
4529
|
+
if (value === null || !sameKeys10(value, BODY_KEYS))
|
|
4530
|
+
return refuse28("nexi_checkout_body_unsupported");
|
|
4531
|
+
if (value.type !== "card" || !record23(value.paymentType) || !sameKeys10(value.paymentType, ["card"]) || !cardFormValues(value.paymentType.card) || !flag2(value.acceptedTermsAndConditions) || !amount(value.amountConfirmedByConsumer, 1) || !amount(value.surchargeAmount, 0) || !flag2(value.consumerCheckedSaveNewPaymentMethod) || !flag2(value.consumerHasConsentedToRememberingNewDevice) || !flag2(value.consumerWantsToBeAnonymous) || typeof value.language !== "string" || value.language !== "" && !LANGUAGE3.test(value.language))
|
|
4532
|
+
return refuse28("nexi_checkout_body_unsupported");
|
|
4533
|
+
if (value.consumerCheckedSaveNewPaymentMethod || value.consumerHasConsentedToRememberingNewDevice)
|
|
4534
|
+
return refuse28("nexi_checkout_card_saving_refused");
|
|
4535
|
+
if (value.surchargeAmount !== 0)
|
|
4536
|
+
return refuse28("nexi_checkout_surcharge_refused");
|
|
4537
|
+
return CARD27;
|
|
4538
|
+
}
|
|
4539
|
+
// src/toast.js
|
|
4540
|
+
var TOAST_PSP = "toast";
|
|
4541
|
+
var TOAST_PAYMENT_METHODS_URL = "https://payments.toasttab.com/v1/payment-methods";
|
|
4542
|
+
var TOAST_KEY_ID = "RSA-OAEP-SHA1::bacb4887-8314-4c23-98fc-d5ef7bc99e94_oo-legacy-browsers";
|
|
4543
|
+
var TOAST_SUBSTITUTION = /* @__PURE__ */ Object.freeze({ at: "card", fields: Object.freeze(["cardData"]) });
|
|
4544
|
+
var BODY_LIMIT27 = 8192;
|
|
4545
|
+
var ROOT_KEYS9 = /* @__PURE__ */ Object.freeze(["type", "card", "sessionSecret", "usage", "setupFutureUsage", "billingDetails"]);
|
|
4546
|
+
var CARD_KEYS12 = /* @__PURE__ */ Object.freeze(["keyId", "cardData"]);
|
|
4547
|
+
var WALLETS = /* @__PURE__ */ Object.freeze(["APPLE_PAY", "GOOGLE_PAY"]);
|
|
4548
|
+
var SESSION_SECRET = /^[\x21-\x7e]{1,1024}$/;
|
|
4549
|
+
var POSTAL_CODE4 = /^[A-Za-z0-9 -]{0,16}$/;
|
|
4550
|
+
var CIPHERTEXT_B64 = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
|
|
4551
|
+
var record24 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4552
|
+
var sameKeys11 = (value, keys) => {
|
|
4553
|
+
const own12 = Object.keys(value);
|
|
4554
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
4555
|
+
};
|
|
4556
|
+
var refuse29 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4557
|
+
var failed = (code) => (
|
|
4558
|
+
/** @type {ToastBodyReadJs} */
|
|
4559
|
+
Object.freeze({ ok: false, code }));
|
|
4560
|
+
var CARD28 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4561
|
+
var CONTINUE10 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
4562
|
+
function isWalletBody(parsed) {
|
|
4563
|
+
const card = parsed.card;
|
|
4564
|
+
const rootOk = sameKeys11(parsed, ["type", "card", "sessionSecret"]) || sameKeys11(parsed, ["type", "card", "sessionSecret", "billingDetails"]) && record24(parsed.billingDetails);
|
|
4565
|
+
return rootOk && WALLETS.includes(parsed.type) && record24(card) && sameKeys11(card, ["keyId", "cardData", "wallet"]) && card.keyId === null && typeof card.cardData === "string" && record24(card.wallet) && sameKeys11(card.wallet, ["type"]) && card.wallet.type === parsed.type && typeof parsed.sessionSecret === "string";
|
|
4566
|
+
}
|
|
4567
|
+
function isToastPaymentMethodsUrl(url) {
|
|
4568
|
+
return url === TOAST_PAYMENT_METHODS_URL;
|
|
4569
|
+
}
|
|
4570
|
+
function isToastCiphertext(value) {
|
|
4571
|
+
return typeof value === "string" && CIPHERTEXT_B64.test(value);
|
|
4572
|
+
}
|
|
4573
|
+
function readToastBody(body) {
|
|
4574
|
+
const malformed = failed("toast_body_malformed");
|
|
4575
|
+
if (typeof body !== "string" || body.length > BODY_LIMIT27)
|
|
4576
|
+
return malformed;
|
|
4577
|
+
let parsed;
|
|
4578
|
+
try {
|
|
4579
|
+
parsed = JSON.parse(body);
|
|
3874
4580
|
}
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
return
|
|
4581
|
+
catch {
|
|
4582
|
+
return malformed;
|
|
4583
|
+
}
|
|
4584
|
+
if (!record24(parsed) || JSON.stringify(parsed) !== body)
|
|
4585
|
+
return malformed;
|
|
4586
|
+
if (isWalletBody(parsed))
|
|
4587
|
+
return (
|
|
4588
|
+
/** @type {ToastBodyReadJs} */
|
|
4589
|
+
Object.freeze({ ok: false, wallet: true }));
|
|
4590
|
+
const card = parsed.card;
|
|
4591
|
+
if (!sameKeys11(parsed, ROOT_KEYS9) || parsed.type !== "CARD" || !record24(card) || !sameKeys11(card, CARD_KEYS12))
|
|
4592
|
+
return malformed;
|
|
4593
|
+
if (typeof card.keyId !== "string")
|
|
4594
|
+
return malformed;
|
|
4595
|
+
if (card.keyId !== TOAST_KEY_ID)
|
|
4596
|
+
return failed("toast_foreign_key");
|
|
4597
|
+
if (!isToastCiphertext(card.cardData))
|
|
4598
|
+
return malformed;
|
|
4599
|
+
if (typeof parsed.sessionSecret !== "string" || !SESSION_SECRET.test(parsed.sessionSecret))
|
|
4600
|
+
return malformed;
|
|
4601
|
+
if (parsed.usage !== null || parsed.setupFutureUsage !== null)
|
|
4602
|
+
return failed("toast_keeps_card");
|
|
4603
|
+
const billing = parsed.billingDetails;
|
|
4604
|
+
if (!record24(billing) || !sameKeys11(billing, ["postalCode"]) || typeof billing.postalCode !== "string" || !POSTAL_CODE4.test(billing.postalCode))
|
|
4605
|
+
return malformed;
|
|
4606
|
+
const read = { ok: true, sessionSecret: parsed.sessionSecret, postalCode: billing.postalCode, cardData: card.cardData };
|
|
4607
|
+
return Object.freeze(read);
|
|
4608
|
+
}
|
|
4609
|
+
function toastBodyVerdict(body) {
|
|
4610
|
+
const read = readToastBody(body);
|
|
4611
|
+
if (read.ok)
|
|
4612
|
+
return CARD28;
|
|
4613
|
+
return read.wallet ? CONTINUE10 : refuse29(read.code);
|
|
4614
|
+
}
|
|
4615
|
+
// src/fastspring.js
|
|
4616
|
+
var FASTSPRING_PSP = "fastspring";
|
|
4617
|
+
var FASTSPRING_STORE_PINS = /* @__PURE__ */ Object.freeze([
|
|
4618
|
+
Object.freeze({ environment: "production", store: "daisydisk", storefront: "", merchant: "DaisyDisk" })
|
|
4619
|
+
]);
|
|
4620
|
+
var URL_LIMIT11 = 256;
|
|
4621
|
+
var BODY_LIMIT28 = 32768;
|
|
4622
|
+
var STORE = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
|
|
4623
|
+
var CARD_URL = new RegExp(`^https://(${STORE})(\\.test)?\\.onfastspring\\.com((?:/(?:popup|embedded)-[A-Za-z0-9_-]{1,64})?)/session/([A-Za-z0-9_-]{16,64})/payment$`);
|
|
4624
|
+
var DIGITS = /^[0-9]{12,19}$/;
|
|
4625
|
+
var MONTH15 = /^(?:0?[1-9]|1[0-2])$/;
|
|
4626
|
+
var YEAR16 = /^(?:[0-9]{2}|[0-9]{4})$/;
|
|
4627
|
+
var SECURITY_CODE16 = /^[0-9]{3,4}$/;
|
|
4628
|
+
var CARD_KEYS13 = /* @__PURE__ */ Object.freeze(["year", "month", "number", "security"]);
|
|
4629
|
+
var SAVED_CARD_KEYS = /* @__PURE__ */ Object.freeze(["savedCardId", "savedCardEnding", "savedCardBin", "variantType"]);
|
|
4630
|
+
var BODY_KEYS2 = /* @__PURE__ */ new Set([
|
|
4631
|
+
"contact",
|
|
4632
|
+
"card",
|
|
4633
|
+
"sepa",
|
|
4634
|
+
"ach",
|
|
4635
|
+
"pad",
|
|
4636
|
+
"bacs",
|
|
4637
|
+
"upi",
|
|
4638
|
+
"mercadopago",
|
|
4639
|
+
"cpfNumber",
|
|
4640
|
+
"dniNumber",
|
|
4641
|
+
"googlepay",
|
|
4642
|
+
"applepay",
|
|
4643
|
+
"paymentKlarna",
|
|
4644
|
+
"paymentType",
|
|
4645
|
+
"subscribe",
|
|
4646
|
+
"captcha",
|
|
4647
|
+
"recipientSelected",
|
|
4648
|
+
"recipient",
|
|
4649
|
+
"customerReference",
|
|
4650
|
+
"autoRenew",
|
|
4651
|
+
"fingerprint",
|
|
4652
|
+
"savedPaypalId",
|
|
4653
|
+
"savedVenmoId",
|
|
4654
|
+
"cashapp"
|
|
4655
|
+
]);
|
|
4656
|
+
var METHOD_KEYS = /* @__PURE__ */ Object.freeze(["sepa", "ach", "pad", "bacs", "upi", "mercadopago", "googlepay", "applepay", "paymentKlarna"]);
|
|
4657
|
+
var SAVED_METHOD_KEYS = /* @__PURE__ */ Object.freeze(["savedPaypalId", "savedVenmoId", "cashapp"]);
|
|
4658
|
+
var TEXT2 = /^[^\x00-\x1f\x7f]{0,256}$/;
|
|
4659
|
+
var IP_ADDRESS = /^[0-9A-Fa-f.:]{2,45}$/;
|
|
4660
|
+
var FINGERPRINT_KEYS = /* @__PURE__ */ Object.freeze(["uniqueId", "fingerprintHash"]);
|
|
4661
|
+
var CARD_MEMBER3 = /^(?:card_?number|cc_?number|pan|cvc2?|cvv2?|security_?code)$/i;
|
|
4662
|
+
var record25 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4663
|
+
var own7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4664
|
+
var nothing = (value) => value === void 0 || value === null || value === "" || value === false;
|
|
4665
|
+
var refuse30 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4666
|
+
var CARD29 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4667
|
+
var CONTINUE11 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
4668
|
+
function fastspringCardUrl(url) {
|
|
4669
|
+
if (typeof url !== "string" || url.length > URL_LIMIT11 || url.includes("?") || url.includes("#"))
|
|
4670
|
+
return null;
|
|
4671
|
+
let parsed;
|
|
4672
|
+
try {
|
|
4673
|
+
parsed = new URL(url);
|
|
3880
4674
|
}
|
|
3881
|
-
|
|
3882
|
-
return
|
|
3883
|
-
if (recognizer && recognizer.psp === REVOLUT_PSP) {
|
|
3884
|
-
if (url !== void 0 && !isRevolutPaymentsUrl(url))
|
|
3885
|
-
return { verdict: "refuse", code: "revolut_url_refused" };
|
|
3886
|
-
return revolutBodyVerdict(body);
|
|
4675
|
+
catch {
|
|
4676
|
+
return null;
|
|
3887
4677
|
}
|
|
3888
|
-
if (
|
|
3889
|
-
return
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
4678
|
+
if (parsed.href !== url || parsed.port || parsed.username || parsed.password)
|
|
4679
|
+
return null;
|
|
4680
|
+
const match = CARD_URL.exec(url);
|
|
4681
|
+
if (!match)
|
|
4682
|
+
return null;
|
|
4683
|
+
return Object.freeze({
|
|
4684
|
+
environment: match[2] ? "sandbox" : "production",
|
|
4685
|
+
store: match[1],
|
|
4686
|
+
storefront: match[3],
|
|
4687
|
+
session: match[4],
|
|
4688
|
+
sessionUrl: url.slice(0, -"/payment".length)
|
|
4689
|
+
});
|
|
4690
|
+
}
|
|
4691
|
+
function isFastspringCardUrl(url) {
|
|
4692
|
+
return fastspringCardUrl(url) !== null;
|
|
4693
|
+
}
|
|
4694
|
+
function readJson7(body) {
|
|
4695
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT28)
|
|
4696
|
+
return { parsed: null, exact: false };
|
|
4697
|
+
let parsed;
|
|
4698
|
+
try {
|
|
4699
|
+
parsed = JSON.parse(body);
|
|
3896
4700
|
}
|
|
3897
|
-
|
|
3898
|
-
return
|
|
3899
|
-
|
|
3900
|
-
|
|
4701
|
+
catch {
|
|
4702
|
+
return { parsed: null, exact: false };
|
|
4703
|
+
}
|
|
4704
|
+
let exact4 = false;
|
|
4705
|
+
try {
|
|
4706
|
+
exact4 = JSON.stringify(parsed) === body;
|
|
4707
|
+
}
|
|
4708
|
+
catch {
|
|
4709
|
+
exact4 = false;
|
|
4710
|
+
}
|
|
4711
|
+
return { parsed, exact: exact4 };
|
|
4712
|
+
}
|
|
4713
|
+
function numberDigits(number) {
|
|
4714
|
+
if (typeof number !== "string")
|
|
4715
|
+
return null;
|
|
4716
|
+
const digits3 = number.replace(/ /g, "");
|
|
4717
|
+
if (!DIGITS.test(digits3))
|
|
4718
|
+
return null;
|
|
4719
|
+
return number === digits3 || number === digits3.replace(/(.{4})/g, "$1 ").trim() ? digits3 : null;
|
|
4720
|
+
}
|
|
4721
|
+
function emptyDetails(key, value) {
|
|
4722
|
+
if (nothing(value))
|
|
4723
|
+
return true;
|
|
4724
|
+
if (!record25(value))
|
|
4725
|
+
return false;
|
|
4726
|
+
return Object.entries(value).every(([name, leaf]) => nothing(leaf) || key === "sepa" && name === "ipAddress" && typeof leaf === "string" && IP_ADDRESS.test(leaf));
|
|
4727
|
+
}
|
|
4728
|
+
function namesCardOutside(parsed) {
|
|
4729
|
+
const pending = Object.entries(parsed).filter(([key]) => key !== "card").map(([, value]) => value).filter((value) => value !== null && typeof value === "object");
|
|
4730
|
+
if (Object.keys(parsed).some((key) => key !== "card" && CARD_MEMBER3.test(key)))
|
|
4731
|
+
return true;
|
|
4732
|
+
while (pending.length > 0) {
|
|
4733
|
+
const node = pending.pop();
|
|
4734
|
+
for (const key of Object.keys(node)) {
|
|
4735
|
+
if (!Array.isArray(node) && CARD_MEMBER3.test(key))
|
|
4736
|
+
return true;
|
|
4737
|
+
const value = node[key];
|
|
4738
|
+
if (value !== null && typeof value === "object")
|
|
4739
|
+
pending.push(value);
|
|
4740
|
+
}
|
|
4741
|
+
}
|
|
4742
|
+
return false;
|
|
4743
|
+
}
|
|
4744
|
+
var cardValues = (card) => record25(card) && (!nothing(card.number) || !nothing(card.security));
|
|
4745
|
+
function judgeCard2(parsed) {
|
|
4746
|
+
const card = parsed.card;
|
|
4747
|
+
if (record25(card) && SAVED_CARD_KEYS.some((key) => own7(card, key)))
|
|
4748
|
+
return "fastspring_saved_card";
|
|
4749
|
+
if (SAVED_METHOD_KEYS.some((key) => own7(parsed, key)))
|
|
4750
|
+
return "fastspring_saved_card";
|
|
4751
|
+
if (!Object.keys(parsed).every((key) => BODY_KEYS2.has(key)) || namesCardOutside(parsed))
|
|
4752
|
+
return "fastspring_body_unsupported";
|
|
4753
|
+
if (!record25(card) || Object.keys(card).length !== CARD_KEYS13.length || !CARD_KEYS13.every((key) => own7(card, key)) || numberDigits(card.number) === null || typeof card.month !== "string" || !MONTH15.test(card.month) || typeof card.year !== "string" || !YEAR16.test(card.year) || typeof card.security !== "string" || !SECURITY_CODE16.test(card.security))
|
|
4754
|
+
return "fastspring_body_unsupported";
|
|
4755
|
+
if (parsed.recipientSelected === true || own7(parsed, "recipient"))
|
|
4756
|
+
return "fastspring_gift";
|
|
4757
|
+
if (typeof parsed.recipientSelected !== "boolean")
|
|
4758
|
+
return "fastspring_body_unsupported";
|
|
4759
|
+
if (parsed.autoRenew === true)
|
|
4760
|
+
return "fastspring_keep_on_file";
|
|
4761
|
+
if (!nothing(parsed.autoRenew))
|
|
4762
|
+
return "fastspring_body_unsupported";
|
|
4763
|
+
for (const key of ["cpfNumber", "dniNumber"]) {
|
|
4764
|
+
if (nothing(parsed[key]))
|
|
4765
|
+
continue;
|
|
4766
|
+
return typeof parsed[key] === "string" ? "fastspring_local_route" : "fastspring_body_unsupported";
|
|
4767
|
+
}
|
|
4768
|
+
const captcha = parsed.captcha;
|
|
4769
|
+
if (!record25(captcha) || Object.keys(captcha).length !== 2 || typeof captcha.token !== "string" || typeof captcha.captchaType !== "string")
|
|
4770
|
+
return "fastspring_body_unsupported";
|
|
4771
|
+
if (captcha.token !== "" || captcha.captchaType !== "")
|
|
4772
|
+
return "fastspring_captcha_unsupported";
|
|
4773
|
+
if (own7(parsed, "customerReference"))
|
|
4774
|
+
return "fastspring_body_unsupported";
|
|
4775
|
+
if (!METHOD_KEYS.every((key) => emptyDetails(key, parsed[key])))
|
|
4776
|
+
return "fastspring_body_unsupported";
|
|
4777
|
+
const contact = parsed.contact;
|
|
4778
|
+
if (!record25(contact) || !Object.values(contact).every((value) => value === null || typeof value === "boolean" || typeof value === "string" && TEXT2.test(value)))
|
|
4779
|
+
return "fastspring_body_unsupported";
|
|
4780
|
+
if (!(parsed.subscribe === void 0 || parsed.subscribe === null || typeof parsed.subscribe === "boolean"))
|
|
4781
|
+
return "fastspring_body_unsupported";
|
|
4782
|
+
const fingerprint = parsed.fingerprint;
|
|
4783
|
+
if (fingerprint !== void 0 && !(record25(fingerprint) && Object.keys(fingerprint).every((key) => FINGERPRINT_KEYS.includes(key)) && Object.values(fingerprint).every((value) => value === null || typeof value === "number" && Number.isFinite(value) || typeof value === "string" && TEXT2.test(value))))
|
|
4784
|
+
return "fastspring_body_unsupported";
|
|
4785
|
+
return null;
|
|
4786
|
+
}
|
|
4787
|
+
function fastspringBodyVerdict(body) {
|
|
4788
|
+
const { parsed, exact: exact4 } = readJson7(body);
|
|
4789
|
+
if (!record25(parsed))
|
|
4790
|
+
return body === void 0 || body === null || body === "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
|
|
4791
|
+
if (parsed.paymentType !== "card") {
|
|
4792
|
+
if (cardValues(parsed.card) || namesCardOutside(parsed))
|
|
4793
|
+
return refuse30("fastspring_body_unsupported");
|
|
4794
|
+
return typeof parsed.paymentType === "string" && parsed.paymentType !== "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
|
|
4795
|
+
}
|
|
4796
|
+
if (!exact4)
|
|
4797
|
+
return refuse30("fastspring_body_unsupported");
|
|
4798
|
+
const code = judgeCard2(parsed);
|
|
4799
|
+
return code === null ? CARD29 : refuse30(code);
|
|
4800
|
+
}
|
|
4801
|
+
// src/omise.js
|
|
4802
|
+
var OMISE_PSP = "omise";
|
|
4803
|
+
var OMISE_TOKEN_URL = "https://vault.omise.co/tokens";
|
|
4804
|
+
var OMISE_CARD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4805
|
+
"number",
|
|
4806
|
+
"name",
|
|
4807
|
+
"expiration_month",
|
|
4808
|
+
"expiration_year",
|
|
4809
|
+
"security_code",
|
|
4810
|
+
"email",
|
|
4811
|
+
"phone_number",
|
|
4812
|
+
"country",
|
|
4813
|
+
"state",
|
|
4814
|
+
"city",
|
|
4815
|
+
"postal_code",
|
|
4816
|
+
"street1",
|
|
4817
|
+
"street2"
|
|
4818
|
+
]);
|
|
4819
|
+
var BODY_LIMIT29 = 4096;
|
|
4820
|
+
var SECURITY_CODE17 = /^[0-9]{3,4}$/;
|
|
4821
|
+
var MONTH_TEXT2 = /^(?:0?[1-9]|1[0-2])$/;
|
|
4822
|
+
var YEAR_TEXT = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
4823
|
+
var COUNTRY5 = /^[A-Za-z]{2}$/;
|
|
4824
|
+
var PHONE3 = /^\+?[0-9 ()-]{6,24}$/;
|
|
4825
|
+
var POSTAL_NUMBER_LIMIT = 99999999999;
|
|
4826
|
+
var TEXT_LIMIT10 = 256;
|
|
4827
|
+
var CONTROL11 = /[\u0000-\u001f\u007f]/;
|
|
4828
|
+
var NUMBER_FIELD = /^[0-9]+(?: [0-9]+){0,6}$/;
|
|
4829
|
+
var record26 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4830
|
+
var own8 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4831
|
+
var wellFormed2 = (value) => {
|
|
4832
|
+
try {
|
|
4833
|
+
encodeURIComponent(value);
|
|
4834
|
+
return true;
|
|
4835
|
+
}
|
|
4836
|
+
catch {
|
|
4837
|
+
return false;
|
|
4838
|
+
}
|
|
4839
|
+
};
|
|
4840
|
+
var digits2 = (value) => (value.match(/\p{Nd}/gu) ?? []).length;
|
|
4841
|
+
var plainText5 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT10 && !CONTROL11.test(value) && digits2(value) < 12 && wellFormed2(value);
|
|
4842
|
+
var optionalText2 = (value) => value === "" || plainText5(value);
|
|
4843
|
+
function luhnValid(run) {
|
|
4844
|
+
let sum = 0;
|
|
4845
|
+
for (let i = 0; i < run.length; i += 1) {
|
|
4846
|
+
let digit = run.charCodeAt(run.length - 1 - i) - 48;
|
|
4847
|
+
if (i % 2 === 1)
|
|
4848
|
+
digit = digit * 2 > 9 ? digit * 2 - 9 : digit * 2;
|
|
4849
|
+
sum += digit;
|
|
4850
|
+
}
|
|
4851
|
+
return sum % 10 === 0;
|
|
4852
|
+
}
|
|
4853
|
+
function cardShaped(value) {
|
|
4854
|
+
const groups = value.match(/[0-9]+/g) ?? [];
|
|
4855
|
+
for (let first = 0; first < groups.length; first += 1) {
|
|
4856
|
+
let run = "";
|
|
4857
|
+
for (let last = first; last < groups.length && run.length < 19; last += 1) {
|
|
4858
|
+
run += groups[last];
|
|
4859
|
+
if (run.length >= 13 && run.length <= 19 && run[0] >= "2" && run[0] <= "6" && luhnValid(run))
|
|
4860
|
+
return true;
|
|
4861
|
+
}
|
|
4862
|
+
}
|
|
4863
|
+
return false;
|
|
4864
|
+
}
|
|
4865
|
+
var phoneNumber = (value) => typeof value === "string" && PHONE3.test(value) && digits2(value) >= 6 && digits2(value) <= 15 && !cardShaped(value);
|
|
4866
|
+
var numberField = (value) => typeof value === "string" && NUMBER_FIELD.test(value) && digits2(value) >= 12 && digits2(value) <= 19;
|
|
4867
|
+
var refuse31 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4868
|
+
var CARD30 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4869
|
+
function isOmiseTokenUrl(url) {
|
|
4870
|
+
return url === OMISE_TOKEN_URL;
|
|
4871
|
+
}
|
|
4872
|
+
function readBody17(body) {
|
|
4873
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT29)
|
|
4874
|
+
return null;
|
|
4875
|
+
let value;
|
|
4876
|
+
try {
|
|
4877
|
+
value = JSON.parse(body);
|
|
4878
|
+
if (!record26(value) || JSON.stringify(value) !== body)
|
|
4879
|
+
return null;
|
|
4880
|
+
}
|
|
4881
|
+
catch {
|
|
4882
|
+
return null;
|
|
4883
|
+
}
|
|
4884
|
+
return value;
|
|
4885
|
+
}
|
|
4886
|
+
function monthValue(value) {
|
|
4887
|
+
if (typeof value === "number")
|
|
4888
|
+
return Number.isSafeInteger(value) && value >= 1 && value <= 12;
|
|
4889
|
+
return typeof value === "string" && MONTH_TEXT2.test(value);
|
|
4890
|
+
}
|
|
4891
|
+
function yearValue(value) {
|
|
4892
|
+
if (typeof value === "number")
|
|
4893
|
+
return Number.isSafeInteger(value) && (value >= 0 && value <= 99 || value >= 2e3 && value <= 2099);
|
|
4894
|
+
return typeof value === "string" && YEAR_TEXT.test(value);
|
|
4895
|
+
}
|
|
4896
|
+
function cardMembers(card) {
|
|
4897
|
+
if (!record26(card) || !Object.keys(card).every((key) => OMISE_CARD_KEYS.includes(key)))
|
|
4898
|
+
return false;
|
|
4899
|
+
if (!numberField(card.number) || !plainText5(card.name) || !monthValue(card.expiration_month) || !yearValue(card.expiration_year) || typeof card.security_code !== "string" || !SECURITY_CODE17.test(card.security_code))
|
|
4900
|
+
return false;
|
|
4901
|
+
for (const key of ["email", "state", "city", "street1", "street2"]) {
|
|
4902
|
+
if (own8(card, key) && !optionalText2(card[key]))
|
|
4903
|
+
return false;
|
|
4904
|
+
}
|
|
4905
|
+
if (own8(card, "country") && (typeof card.country !== "string" || !COUNTRY5.test(card.country)))
|
|
4906
|
+
return false;
|
|
4907
|
+
if (own8(card, "phone_number") && !(card.phone_number === "" || phoneNumber(card.phone_number)))
|
|
4908
|
+
return false;
|
|
4909
|
+
if (own8(card, "postal_code")) {
|
|
4910
|
+
const code = card.postal_code;
|
|
4911
|
+
const sound = typeof code === "number" ? Number.isSafeInteger(code) && code >= 0 && code <= POSTAL_NUMBER_LIMIT : optionalText2(code);
|
|
4912
|
+
if (!sound)
|
|
4913
|
+
return false;
|
|
4914
|
+
}
|
|
4915
|
+
return true;
|
|
4916
|
+
}
|
|
4917
|
+
function omiseBodyVerdict(body) {
|
|
4918
|
+
const value = readBody17(body);
|
|
4919
|
+
if (value === null)
|
|
4920
|
+
return refuse31("omise_body_unsupported");
|
|
4921
|
+
const keys = Object.keys(value);
|
|
4922
|
+
if (keys.length !== 1 || keys[0] !== "card" || !cardMembers(value.card))
|
|
4923
|
+
return refuse31("omise_body_unsupported");
|
|
4924
|
+
return CARD30;
|
|
4925
|
+
}
|
|
4926
|
+
var pin10 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), keys: Object.freeze([...fields.keys]) });
|
|
4927
|
+
var OMISE_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
4928
|
+
pin10({ id: "taejai", merchant: "Taejai", origins: ["https://taejai.com"], keys: ["pkey_53q6mm66esjr563ob0h"] }),
|
|
4929
|
+
pin10({ id: "socialgiver", merchant: "Socialgiver", origins: ["https://www.socialgiver.com"], keys: ["pkey_5d5o2iahksmyrkybemg"] }),
|
|
4930
|
+
pin10({ id: "thireq_pecko_links", merchant: "Thireq Pecko", origins: ["https://linksplus.omise.co"], keys: ["pkey_65w70xniwsinf0gm680"] })
|
|
4931
|
+
]);
|
|
4932
|
+
// src/xendit.js
|
|
4933
|
+
var XENDIT_PSP = "xendit";
|
|
4934
|
+
var XENDIT_TOKEN_URL = "https://api.xendit.co/v2/credit_card_tokens";
|
|
4935
|
+
var XENDIT_TOKEN_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4936
|
+
"is_single_use",
|
|
4937
|
+
"card_data",
|
|
4938
|
+
"should_authenticate",
|
|
4939
|
+
"billing_details",
|
|
4940
|
+
"fp_session_id",
|
|
4941
|
+
"metadata",
|
|
4942
|
+
"amount",
|
|
4943
|
+
"card_cvn",
|
|
4944
|
+
"currency",
|
|
4945
|
+
"mid_label",
|
|
4946
|
+
"external_id"
|
|
4947
|
+
]);
|
|
4948
|
+
var XENDIT_CARD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4949
|
+
"account_number",
|
|
4950
|
+
"exp_month",
|
|
4951
|
+
"exp_year",
|
|
4952
|
+
"cvn",
|
|
4953
|
+
"card_holder_name",
|
|
4954
|
+
"card_holder_email",
|
|
4955
|
+
"card_holder_first_name",
|
|
4956
|
+
"card_holder_last_name",
|
|
4957
|
+
"card_holder_phone_number"
|
|
4958
|
+
]);
|
|
4959
|
+
var BODY_LIMIT30 = 8192;
|
|
4960
|
+
var CARD_NUMBER15 = /^[0-9]{12,19}$/;
|
|
4961
|
+
var SECURITY_CODE18 = /^[0-9]{3,4}$/;
|
|
4962
|
+
var MONTH16 = /^(?:0[1-9]|1[0-2])$/;
|
|
4963
|
+
var YEAR17 = /^20[0-9]{2}$/;
|
|
4964
|
+
var CURRENCY4 = /^[A-Z]{3}$/;
|
|
4965
|
+
var AMOUNT_LIMIT3 = 1e12;
|
|
4966
|
+
var FP_SESSION = /^[A-Za-z0-9._:-]{0,256}$/;
|
|
4967
|
+
var FORTER_TOKEN = /^[A-Za-z0-9._~:+/=-]{1,1024}$/;
|
|
4968
|
+
var MID_LABEL = /^[A-Za-z0-9_.-]{1,64}$/;
|
|
4969
|
+
var EXTERNAL_ID = /^[\x21-\x7e]{1,255}$/;
|
|
4970
|
+
var PHONE4 = /^\+?[0-9]{6,15}$/;
|
|
4971
|
+
var TEXT_LIMIT11 = 256;
|
|
4972
|
+
var CONTROL12 = /[\u0000-\u001f\u007f]/;
|
|
4973
|
+
var BILLING_KEYS = /* @__PURE__ */ Object.freeze(["given_names", "surname", "email", "mobile_number", "phone_number", "address"]);
|
|
4974
|
+
var ADDRESS_KEYS5 = /* @__PURE__ */ Object.freeze(["country", "street_line1", "street_line2", "city", "province_state", "postal_code", "category"]);
|
|
4975
|
+
var AMOUNT_TEXT = /^[0-9]{1,13}(?:\.[0-9]{1,2})?$/;
|
|
4976
|
+
var record27 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4977
|
+
var own9 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4978
|
+
var inOrder5 = (value, keys) => {
|
|
4979
|
+
let at = 0;
|
|
4980
|
+
for (const name of Object.keys(value)) {
|
|
4981
|
+
while (at < keys.length && keys[at] !== name)
|
|
4982
|
+
at += 1;
|
|
4983
|
+
if (at === keys.length)
|
|
4984
|
+
return false;
|
|
4985
|
+
at += 1;
|
|
4986
|
+
}
|
|
4987
|
+
return true;
|
|
4988
|
+
};
|
|
4989
|
+
var wellFormed3 = (value) => {
|
|
4990
|
+
try {
|
|
4991
|
+
encodeURIComponent(value);
|
|
4992
|
+
return true;
|
|
4993
|
+
}
|
|
4994
|
+
catch {
|
|
4995
|
+
return false;
|
|
4996
|
+
}
|
|
4997
|
+
};
|
|
4998
|
+
var plainText6 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT11 && !CONTROL12.test(value) && (value.match(/[0-9]/g) ?? []).length < 12 && wellFormed3(value);
|
|
4999
|
+
var reference = (value) => typeof value === "string" && EXTERNAL_ID.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
5000
|
+
var refuse32 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5001
|
+
var CARD31 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5002
|
+
function isXenditTokenUrl(url) {
|
|
5003
|
+
return url === XENDIT_TOKEN_URL;
|
|
5004
|
+
}
|
|
5005
|
+
function readBody18(body) {
|
|
5006
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT30)
|
|
5007
|
+
return null;
|
|
5008
|
+
let value;
|
|
5009
|
+
try {
|
|
5010
|
+
value = JSON.parse(body);
|
|
5011
|
+
if (!record27(value) || JSON.stringify(value) !== body)
|
|
5012
|
+
return null;
|
|
5013
|
+
}
|
|
5014
|
+
catch {
|
|
5015
|
+
return null;
|
|
5016
|
+
}
|
|
5017
|
+
return value;
|
|
5018
|
+
}
|
|
5019
|
+
function amountValue(value) {
|
|
5020
|
+
if (typeof value === "number" && !Number.isFinite(value))
|
|
5021
|
+
return false;
|
|
5022
|
+
const text8 = typeof value === "number" ? String(value) : value;
|
|
5023
|
+
if (typeof text8 !== "string" || !AMOUNT_TEXT.test(text8))
|
|
5024
|
+
return false;
|
|
5025
|
+
const amount2 = Number(text8);
|
|
5026
|
+
return amount2 > 0 && amount2 <= AMOUNT_LIMIT3;
|
|
5027
|
+
}
|
|
5028
|
+
function billingDetails(value) {
|
|
5029
|
+
if (!record27(value) || !inOrder5(value, BILLING_KEYS))
|
|
5030
|
+
return false;
|
|
5031
|
+
return Object.keys(value).every((key) => {
|
|
5032
|
+
const field2 = value[key];
|
|
5033
|
+
if (key !== "address")
|
|
5034
|
+
return key === "mobile_number" || key === "phone_number" ? typeof field2 === "string" && PHONE4.test(field2) : plainText6(field2);
|
|
5035
|
+
return record27(field2) && inOrder5(field2, ADDRESS_KEYS5) && Object.keys(field2).every((name) => plainText6(field2[name]));
|
|
5036
|
+
});
|
|
5037
|
+
}
|
|
5038
|
+
function cardData(value) {
|
|
5039
|
+
if (!record27(value) || !inOrder5(value, XENDIT_CARD_KEYS))
|
|
5040
|
+
return false;
|
|
5041
|
+
if (typeof value.account_number !== "string" || !CARD_NUMBER15.test(value.account_number) || typeof value.exp_month !== "string" || !MONTH16.test(value.exp_month) || typeof value.exp_year !== "string" || !YEAR17.test(value.exp_year) || typeof value.cvn !== "string" || !SECURITY_CODE18.test(value.cvn))
|
|
5042
|
+
return false;
|
|
5043
|
+
for (const key of ["card_holder_name", "card_holder_email", "card_holder_first_name", "card_holder_last_name"]) {
|
|
5044
|
+
if (own9(value, key) && !plainText6(value[key]))
|
|
5045
|
+
return false;
|
|
5046
|
+
}
|
|
5047
|
+
return !own9(value, "card_holder_phone_number") || typeof value.card_holder_phone_number === "string" && PHONE4.test(value.card_holder_phone_number);
|
|
5048
|
+
}
|
|
5049
|
+
function xenditBodyVerdict(body) {
|
|
5050
|
+
const value = readBody18(body);
|
|
5051
|
+
if (value === null || !inOrder5(value, XENDIT_TOKEN_KEYS) || !own9(value, "is_single_use") || !own9(value, "card_data")) {
|
|
5052
|
+
return refuse32("xendit_body_unsupported");
|
|
5053
|
+
}
|
|
5054
|
+
if (value.is_single_use !== true)
|
|
5055
|
+
return value.is_single_use === false ? refuse32("xendit_multiple_use") : refuse32("xendit_body_unsupported");
|
|
5056
|
+
if (!cardData(value.card_data) || value.should_authenticate !== true || !amountValue(value.amount) || typeof value.currency !== "string" || !CURRENCY4.test(value.currency))
|
|
5057
|
+
return refuse32("xendit_body_unsupported");
|
|
5058
|
+
if (own9(value, "card_cvn") && value.card_cvn !== value.card_data.cvn)
|
|
5059
|
+
return refuse32("xendit_body_unsupported");
|
|
5060
|
+
if (own9(value, "billing_details") && !billingDetails(value.billing_details))
|
|
5061
|
+
return refuse32("xendit_body_unsupported");
|
|
5062
|
+
if (own9(value, "fp_session_id") && (typeof value.fp_session_id !== "string" || !FP_SESSION.test(value.fp_session_id)))
|
|
5063
|
+
return refuse32("xendit_body_unsupported");
|
|
5064
|
+
if (own9(value, "metadata")) {
|
|
5065
|
+
const metadata = value.metadata;
|
|
5066
|
+
if (!record27(metadata) || Object.keys(metadata).length !== 1 || !record27(metadata._forter) || Object.keys(metadata._forter).length !== 1 || typeof metadata._forter.token !== "string" || !FORTER_TOKEN.test(metadata._forter.token))
|
|
5067
|
+
return refuse32("xendit_body_unsupported");
|
|
5068
|
+
}
|
|
5069
|
+
if (own9(value, "mid_label") && (typeof value.mid_label !== "string" || !MID_LABEL.test(value.mid_label)))
|
|
5070
|
+
return refuse32("xendit_body_unsupported");
|
|
5071
|
+
if (own9(value, "external_id") && !reference(value.external_id))
|
|
5072
|
+
return refuse32("xendit_body_unsupported");
|
|
5073
|
+
return CARD31;
|
|
5074
|
+
}
|
|
5075
|
+
// src/tappay.js
|
|
5076
|
+
var TAPPAY_PSP = "tappay";
|
|
5077
|
+
var TAPPAY_GETPRIME_URL = "https://js.tappaysdk.com/payment/tpdirect/production/getprime";
|
|
5078
|
+
var BODY_LIMIT31 = 8192;
|
|
5079
|
+
var REQUIRED_KEYS3 = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "protocol", "tappay_sdk_version", "cardholder_info"]);
|
|
5080
|
+
var KEY_ORDER = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "port", "protocol", "tappay_sdk_version", "cardholder_info", "cardccv", "device_id"]);
|
|
5081
|
+
var OPTIONAL_KEYS2 = /* @__PURE__ */ Object.freeze(["port", "cardccv", "device_id"]);
|
|
5082
|
+
var CARDHOLDER_KEYS = /* @__PURE__ */ Object.freeze(["name_en", "email", "phone_number_country_code", "phone_number"]);
|
|
5083
|
+
var CARD_NUMBER16 = /^[0-9]{12,19}$/;
|
|
5084
|
+
var CARD_DUE_DATE = /^20[0-9]{2}(?:0[1-9]|1[0-2])$/;
|
|
5085
|
+
var SECURITY_CODE19 = /^[0-9]{3,4}$/;
|
|
5086
|
+
var APP_KEY = /^[A-Za-z0-9_-]{16,512}$/;
|
|
5087
|
+
var SDK_VERSION = /^v[0-9]+(?:\.[0-9]+){1,3}$/;
|
|
5088
|
+
var HOSTNAME2 = /^[A-Za-z0-9.:-]{1,255}$/;
|
|
5089
|
+
var ORIGIN_URL = /^https?:\/\/[A-Za-z0-9.:_/-]{1,255}$/;
|
|
5090
|
+
var PROTOCOL = /^https?:$/;
|
|
5091
|
+
var PORT = /^[0-9]{0,5}$/;
|
|
5092
|
+
var CONTROL13 = /[\u0000-\u001f\u007f]/;
|
|
5093
|
+
var TEXT_LIMIT12 = 256;
|
|
5094
|
+
var DEVICE_ID = /^[A-Za-z0-9_-]{1,128}$/;
|
|
5095
|
+
var record28 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5096
|
+
var plainText7 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT12 && !CONTROL13.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
5097
|
+
var holderField = (value) => value === null || plainText7(value);
|
|
5098
|
+
var refuse33 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5099
|
+
var CARD32 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5100
|
+
function isTappayGetPrimeUrl(url) {
|
|
5101
|
+
return url === TAPPAY_GETPRIME_URL;
|
|
5102
|
+
}
|
|
5103
|
+
function readBody19(body) {
|
|
5104
|
+
if (typeof body !== "string" || body.length > BODY_LIMIT31)
|
|
5105
|
+
return null;
|
|
5106
|
+
const eq = body.indexOf("=");
|
|
5107
|
+
if (eq !== "jsonString".length || body.slice(0, eq) !== "jsonString")
|
|
5108
|
+
return null;
|
|
5109
|
+
const json = body.slice(eq + 1);
|
|
5110
|
+
let value;
|
|
5111
|
+
try {
|
|
5112
|
+
value = JSON.parse(json);
|
|
5113
|
+
if (!record28(value) || JSON.stringify(value) !== json)
|
|
5114
|
+
return null;
|
|
5115
|
+
}
|
|
5116
|
+
catch {
|
|
5117
|
+
return null;
|
|
5118
|
+
}
|
|
5119
|
+
return value;
|
|
5120
|
+
}
|
|
5121
|
+
function keysInOrder(value) {
|
|
5122
|
+
const keys = Object.keys(value);
|
|
5123
|
+
for (const key of REQUIRED_KEYS3) {
|
|
5124
|
+
if (!keys.includes(key))
|
|
5125
|
+
return false;
|
|
5126
|
+
}
|
|
5127
|
+
for (const key of keys) {
|
|
5128
|
+
if (!KEY_ORDER.includes(key) || !REQUIRED_KEYS3.includes(key) && !OPTIONAL_KEYS2.includes(key))
|
|
5129
|
+
return false;
|
|
5130
|
+
}
|
|
5131
|
+
const rank = (key) => KEY_ORDER.indexOf(key);
|
|
5132
|
+
for (let at = 1; at < keys.length; at += 1) {
|
|
5133
|
+
if (rank(keys[at]) <= rank(keys[at - 1]))
|
|
5134
|
+
return false;
|
|
5135
|
+
}
|
|
5136
|
+
return true;
|
|
5137
|
+
}
|
|
5138
|
+
function cardholderInfo(value) {
|
|
5139
|
+
if (!record28(value))
|
|
5140
|
+
return false;
|
|
5141
|
+
const keys = Object.keys(value);
|
|
5142
|
+
return keys.length <= CARDHOLDER_KEYS.length && keys.every((key) => CARDHOLDER_KEYS.includes(key) && holderField(value[key]));
|
|
5143
|
+
}
|
|
5144
|
+
function tappayBodyVerdict(body) {
|
|
5145
|
+
const value = readBody19(body);
|
|
5146
|
+
if (value === null || !keysInOrder(value))
|
|
5147
|
+
return refuse33("tappay_body_unsupported");
|
|
5148
|
+
if (typeof value.cardnumber !== "string" || !CARD_NUMBER16.test(value.cardnumber) || typeof value.cardduedate !== "string" || !CARD_DUE_DATE.test(value.cardduedate) || !Number.isInteger(value.appid) || value.appid < 0 || typeof value.appkey !== "string" || !APP_KEY.test(value.appkey) || typeof value.appname !== "string" || !HOSTNAME2.test(value.appname) || typeof value.url !== "string" || !ORIGIN_URL.test(value.url) || typeof value.protocol !== "string" || !PROTOCOL.test(value.protocol) || typeof value.tappay_sdk_version !== "string" || !SDK_VERSION.test(value.tappay_sdk_version) || !cardholderInfo(value.cardholder_info)) {
|
|
5149
|
+
return refuse33("tappay_body_unsupported");
|
|
5150
|
+
}
|
|
5151
|
+
if (Object.prototype.hasOwnProperty.call(value, "port") && (typeof value.port !== "string" || !PORT.test(value.port)))
|
|
5152
|
+
return refuse33("tappay_body_unsupported");
|
|
5153
|
+
if (Object.prototype.hasOwnProperty.call(value, "cardccv") && (typeof value.cardccv !== "string" || !SECURITY_CODE19.test(value.cardccv)))
|
|
5154
|
+
return refuse33("tappay_body_unsupported");
|
|
5155
|
+
if (Object.prototype.hasOwnProperty.call(value, "device_id") && (typeof value.device_id !== "string" || !DEVICE_ID.test(value.device_id)))
|
|
5156
|
+
return refuse33("tappay_body_unsupported");
|
|
5157
|
+
return CARD32;
|
|
5158
|
+
}
|
|
5159
|
+
// src/paymob.js
|
|
5160
|
+
var PAYMOB_PSP = "paymob";
|
|
5161
|
+
var PAYMOB_HOSTS = /* @__PURE__ */ Object.freeze(["accept.paymob.com", "uae.paymob.com", "ksa.paymob.com", "oman.paymob.com", "accept.paymobsolutions.com"]);
|
|
5162
|
+
var PAYMOB_PAY_PATH = "/api/acceptance/payments/pay";
|
|
5163
|
+
var URL_LIMIT12 = 128;
|
|
5164
|
+
var BODY_LIMIT32 = 16384;
|
|
5165
|
+
var KEY_LIMIT = 8192;
|
|
5166
|
+
var NUMBER7 = /^[0-9]{12,19}$/;
|
|
5167
|
+
var MONTH17 = /^(?:0[1-9]|1[0-2])$/;
|
|
5168
|
+
var YEAR18 = /^[0-9]{2}$/;
|
|
5169
|
+
var SECURITY_CODE20 = /^[0-9]{3,4}$/;
|
|
5170
|
+
var TEXT3 = /^[^\x00-\x1f\x7f]{0,256}$/;
|
|
5171
|
+
var HOLDER_TEXT = /^[^\x00-\x1f\x7f]{0,128}$/;
|
|
5172
|
+
var FIELD = /^[a-z][a-z0-9_]{0,39}$/;
|
|
5173
|
+
var FINGERPRINT3 = /^[\x21-\x7e]{1,256}$/;
|
|
5174
|
+
var ORIGIN2 = /^https?:\/\/[A-Za-z0-9.-]{1,253}(?::[0-9]{1,5})?$/;
|
|
5175
|
+
var SWITCH = /* @__PURE__ */ new Set(["True", "False"]);
|
|
5176
|
+
var SOURCE_FOR = /* @__PURE__ */ Object.freeze({ IFRAME: "True", PIXEL: "False" });
|
|
5177
|
+
var CARD_MEMBER4 = /^(?:card_?number|pan|cvv|cvc|cvn|card_pin|card_expiry|expiry_month|expiry_year|security_code)$/i;
|
|
5178
|
+
var SAVED_CARD = "TOKEN";
|
|
5179
|
+
var OTHER_CARD_SUBTYPES = /* @__PURE__ */ new Set(["OMANNET", "PREMIUM", "PREMIUM6_ONLINE", "SYMPL"]);
|
|
5180
|
+
var CARD_SOURCE_KEYS = /* @__PURE__ */ new Set(["identifier", "sourceholder_name", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"]);
|
|
5181
|
+
var TOP_KEYS3 = /* @__PURE__ */ new Set([
|
|
5182
|
+
"source",
|
|
5183
|
+
"billing",
|
|
5184
|
+
"shipping_data",
|
|
5185
|
+
"payment_token",
|
|
5186
|
+
"api_source",
|
|
5187
|
+
"unified_checkout",
|
|
5188
|
+
"save_card",
|
|
5189
|
+
"fingerprint",
|
|
5190
|
+
"merchant-domain",
|
|
5191
|
+
"customer",
|
|
5192
|
+
"converted_currency",
|
|
5193
|
+
"no_of_cards_selected",
|
|
5194
|
+
"split_payment_amount"
|
|
5195
|
+
]);
|
|
5196
|
+
var REQUIRED_TOP_KEYS = ["source", "payment_token", "api_source", "unified_checkout", "save_card"];
|
|
5197
|
+
var REQUIRED_SOURCE_KEYS = ["identifier", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"];
|
|
5198
|
+
var record29 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5199
|
+
var own10 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
5200
|
+
var refuse34 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5201
|
+
var CARD33 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5202
|
+
var CONTINUE12 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
5203
|
+
function paymobPayHost(url) {
|
|
5204
|
+
if (typeof url !== "string" || url.length > URL_LIMIT12 || url.includes("?") || url.includes("#"))
|
|
5205
|
+
return null;
|
|
5206
|
+
let parsed;
|
|
5207
|
+
try {
|
|
5208
|
+
parsed = new URL(url);
|
|
5209
|
+
}
|
|
5210
|
+
catch {
|
|
5211
|
+
return null;
|
|
5212
|
+
}
|
|
5213
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !PAYMOB_HOSTS.includes(parsed.hostname) || parsed.pathname !== PAYMOB_PAY_PATH)
|
|
5214
|
+
return null;
|
|
5215
|
+
return parsed.hostname;
|
|
5216
|
+
}
|
|
5217
|
+
function isPaymobPayUrl(url) {
|
|
5218
|
+
return paymobPayHost(url) !== null;
|
|
5219
|
+
}
|
|
5220
|
+
var BASE645 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
5221
|
+
var BASE64URL = /^[A-Za-z0-9_-]+$/;
|
|
5222
|
+
var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
5223
|
+
function decodeBase642(text8, url) {
|
|
5224
|
+
if (typeof text8 !== "string" || text8 === "")
|
|
5225
|
+
return null;
|
|
5226
|
+
let body = text8;
|
|
5227
|
+
if (url) {
|
|
5228
|
+
if (!BASE64URL.test(body) || body.length % 4 === 1)
|
|
5229
|
+
return null;
|
|
5230
|
+
}
|
|
5231
|
+
else {
|
|
5232
|
+
if (!BASE645.test(body) || body.length % 4 !== 0)
|
|
5233
|
+
return null;
|
|
5234
|
+
body = body.replace(/=+$/, "");
|
|
5235
|
+
}
|
|
5236
|
+
const extra = url ? "-_" : "+/";
|
|
5237
|
+
const bytes = new Uint8Array(Math.floor(body.length * 3 / 4));
|
|
5238
|
+
let buffer = 0;
|
|
5239
|
+
let bits = 0;
|
|
5240
|
+
let at = 0;
|
|
5241
|
+
for (const char of body) {
|
|
5242
|
+
const value = (ALPHABET + extra).indexOf(char);
|
|
5243
|
+
if (value < 0)
|
|
5244
|
+
return null;
|
|
5245
|
+
buffer = buffer << 6 | value;
|
|
5246
|
+
bits += 6;
|
|
5247
|
+
if (bits >= 8) {
|
|
5248
|
+
bits -= 8;
|
|
5249
|
+
bytes[at++] = buffer >> bits & 255;
|
|
5250
|
+
}
|
|
5251
|
+
}
|
|
5252
|
+
if (buffer & (1 << bits) - 1)
|
|
5253
|
+
return null;
|
|
5254
|
+
return bytes.subarray(0, at);
|
|
5255
|
+
}
|
|
5256
|
+
function jsonOf(bytes) {
|
|
5257
|
+
if (!bytes)
|
|
5258
|
+
return null;
|
|
5259
|
+
let text8;
|
|
5260
|
+
try {
|
|
5261
|
+
text8 = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
5262
|
+
}
|
|
5263
|
+
catch {
|
|
5264
|
+
return null;
|
|
5265
|
+
}
|
|
5266
|
+
try {
|
|
5267
|
+
const value = JSON.parse(text8);
|
|
5268
|
+
return record29(value) ? value : null;
|
|
5269
|
+
}
|
|
5270
|
+
catch {
|
|
5271
|
+
return null;
|
|
5272
|
+
}
|
|
5273
|
+
}
|
|
5274
|
+
var positive = (value) => Number.isSafeInteger(value) && value > 0;
|
|
5275
|
+
var CURRENCY5 = /^[A-Z]{3}$/;
|
|
5276
|
+
var KEY_CLAIMS = /* @__PURE__ */ new Set([
|
|
5277
|
+
"user_id",
|
|
5278
|
+
"integration_id",
|
|
5279
|
+
"order_id",
|
|
5280
|
+
"amount_cents",
|
|
5281
|
+
"currency",
|
|
5282
|
+
"exp",
|
|
5283
|
+
"billing_data",
|
|
5284
|
+
"extra",
|
|
5285
|
+
"notification_url",
|
|
5286
|
+
"redirection_url",
|
|
5287
|
+
"redirect_url",
|
|
5288
|
+
"lock_order_when_paid",
|
|
5289
|
+
"single_payment_attempt",
|
|
5290
|
+
"next_payment_intention",
|
|
5291
|
+
"created_by",
|
|
5292
|
+
"is_partner",
|
|
5293
|
+
"split_payment_methods"
|
|
5294
|
+
]);
|
|
5295
|
+
var SUBSCRIPTION_CLAIMS = /* @__PURE__ */ new Set(["subscription_plan_id", "subscription_start_date"]);
|
|
5296
|
+
var UNREADABLE_KEY = /* @__PURE__ */ Object.freeze({ facts: null, code: "paymob_payment_key_unreadable" });
|
|
5297
|
+
function readPaymentKey(key) {
|
|
5298
|
+
if (typeof key !== "string" || key.length > KEY_LIMIT)
|
|
5299
|
+
return UNREADABLE_KEY;
|
|
5300
|
+
const outer = decodeBase642(key, false);
|
|
5301
|
+
if (!outer)
|
|
5302
|
+
return UNREADABLE_KEY;
|
|
5303
|
+
let jwt;
|
|
5304
|
+
try {
|
|
5305
|
+
jwt = new TextDecoder("utf-8", { fatal: true }).decode(outer);
|
|
5306
|
+
}
|
|
5307
|
+
catch {
|
|
5308
|
+
return UNREADABLE_KEY;
|
|
5309
|
+
}
|
|
5310
|
+
const parts = jwt.split(".");
|
|
5311
|
+
if (parts.length !== 3 || parts.some((part) => part === "" || !BASE64URL.test(part)))
|
|
5312
|
+
return UNREADABLE_KEY;
|
|
5313
|
+
const header = jsonOf(decodeBase642(parts[0], true));
|
|
5314
|
+
if (!header || Object.keys(header).length !== 2 || header.alg !== "HS512" || header.typ !== "JWT")
|
|
5315
|
+
return UNREADABLE_KEY;
|
|
5316
|
+
const signature = decodeBase642(parts[2], true);
|
|
5317
|
+
if (!signature || signature.length !== 64)
|
|
5318
|
+
return UNREADABLE_KEY;
|
|
5319
|
+
const payload = jsonOf(decodeBase642(parts[1], true));
|
|
5320
|
+
if (!payload)
|
|
5321
|
+
return UNREADABLE_KEY;
|
|
5322
|
+
const claims = Object.keys(payload);
|
|
5323
|
+
if (claims.some((claim) => SUBSCRIPTION_CLAIMS.has(claim) && payload[claim] !== null))
|
|
5324
|
+
return Object.freeze({ facts: null, code: "paymob_subscription" });
|
|
5325
|
+
if (claims.some((claim) => !KEY_CLAIMS.has(claim) && !SUBSCRIPTION_CLAIMS.has(claim)))
|
|
5326
|
+
return UNREADABLE_KEY;
|
|
5327
|
+
const { user_id: merchantId, integration_id: integrationId, order_id: orderId, amount_cents: amountCents, currency, exp } = payload;
|
|
5328
|
+
if (!positive(merchantId) || !positive(integrationId) || !positive(orderId) || !Number.isSafeInteger(amountCents) || amountCents < 0 || typeof currency !== "string" || !CURRENCY5.test(currency) || own10(payload, "exp") && !positive(exp))
|
|
5329
|
+
return UNREADABLE_KEY;
|
|
5330
|
+
if (amountCents === 0)
|
|
5331
|
+
return Object.freeze({ facts: null, code: "paymob_no_amount" });
|
|
5332
|
+
return Object.freeze({ facts: Object.freeze({ merchantId, integrationId, orderId, amountCents, currency, expiresAt: own10(payload, "exp") ? exp : null }), code: null });
|
|
5333
|
+
}
|
|
5334
|
+
function readJson8(body) {
|
|
5335
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT32)
|
|
5336
|
+
return { parsed: null, exact: false };
|
|
5337
|
+
let parsed;
|
|
5338
|
+
try {
|
|
5339
|
+
parsed = JSON.parse(body);
|
|
5340
|
+
}
|
|
5341
|
+
catch {
|
|
5342
|
+
return { parsed: null, exact: false };
|
|
5343
|
+
}
|
|
5344
|
+
let exact4 = false;
|
|
5345
|
+
try {
|
|
5346
|
+
exact4 = body.length <= BODY_LIMIT32 && JSON.stringify(parsed) === body;
|
|
5347
|
+
}
|
|
5348
|
+
catch {
|
|
5349
|
+
exact4 = false;
|
|
5350
|
+
}
|
|
5351
|
+
return { parsed, exact: exact4 };
|
|
5352
|
+
}
|
|
5353
|
+
function namesCardValue3(parsed) {
|
|
5354
|
+
const pending = parsed !== null && typeof parsed === "object" ? [parsed] : [];
|
|
5355
|
+
while (pending.length > 0) {
|
|
5356
|
+
const node = pending.pop();
|
|
5357
|
+
for (const key of Object.keys(node)) {
|
|
5358
|
+
if (!Array.isArray(node) && CARD_MEMBER4.test(key))
|
|
5359
|
+
return true;
|
|
5360
|
+
const value = node[key];
|
|
5361
|
+
if (value !== null && typeof value === "object")
|
|
5362
|
+
pending.push(value);
|
|
5363
|
+
}
|
|
5364
|
+
}
|
|
5365
|
+
return false;
|
|
5366
|
+
}
|
|
5367
|
+
function addressBlock(value) {
|
|
5368
|
+
return record29(value) && Object.keys(value).length <= 32 && Object.entries(value).every(([key, text8]) => FIELD.test(key) && !CARD_MEMBER4.test(key) && (text8 === null || typeof text8 === "string" && TEXT3.test(text8)));
|
|
5369
|
+
}
|
|
5370
|
+
function judgeCardPayment(parsed) {
|
|
5371
|
+
const source = parsed.source;
|
|
5372
|
+
for (const key of Object.keys(parsed))
|
|
5373
|
+
if (!TOP_KEYS3.has(key))
|
|
5374
|
+
return "paymob_body_unsupported";
|
|
5375
|
+
for (const key of Object.keys(source)) {
|
|
5376
|
+
if (key === "is_card_to_installment" || key === "tenure")
|
|
5377
|
+
return "paymob_installments";
|
|
5378
|
+
if (!CARD_SOURCE_KEYS.has(key))
|
|
5379
|
+
return "paymob_body_unsupported";
|
|
5380
|
+
}
|
|
5381
|
+
if (own10(parsed, "customer"))
|
|
5382
|
+
return "paymob_account";
|
|
5383
|
+
if (own10(parsed, "no_of_cards_selected") || own10(parsed, "split_payment_amount"))
|
|
5384
|
+
return "paymob_split_payment";
|
|
5385
|
+
if (own10(parsed, "converted_currency"))
|
|
5386
|
+
return "paymob_currency_conversion";
|
|
5387
|
+
if (!REQUIRED_TOP_KEYS.every((key) => own10(parsed, key)) || !REQUIRED_SOURCE_KEYS.every((key) => own10(source, key)))
|
|
5388
|
+
return "paymob_body_unsupported";
|
|
5389
|
+
if (source.save_card === true || parsed.save_card === true)
|
|
5390
|
+
return "paymob_keep_on_file";
|
|
5391
|
+
if (source.save_card !== false || parsed.save_card !== false)
|
|
5392
|
+
return "paymob_body_unsupported";
|
|
5393
|
+
if (typeof source.identifier !== "string" || !NUMBER7.test(source.identifier) || typeof source.expiry_month !== "string" || !MONTH17.test(source.expiry_month) || typeof source.expiry_year !== "string" || !YEAR18.test(source.expiry_year) || typeof source.cvn !== "string" || !SECURITY_CODE20.test(source.cvn) || own10(source, "sourceholder_name") && !(typeof source.sourceholder_name === "string" && HOLDER_TEXT.test(source.sourceholder_name))) {
|
|
5394
|
+
return "paymob_body_unsupported";
|
|
5395
|
+
}
|
|
5396
|
+
if (!own10(SOURCE_FOR, parsed.api_source) || !SWITCH.has(parsed.unified_checkout) || parsed.unified_checkout !== SOURCE_FOR[parsed.api_source] || source.unified_checkout !== parsed.unified_checkout)
|
|
5397
|
+
return "paymob_body_unsupported";
|
|
5398
|
+
if (own10(parsed, "billing") && !addressBlock(parsed.billing) || own10(parsed, "shipping_data") && !addressBlock(parsed.shipping_data)) {
|
|
5399
|
+
return "paymob_body_unsupported";
|
|
5400
|
+
}
|
|
5401
|
+
if (own10(parsed, "fingerprint") && parsed.fingerprint !== null && !(typeof parsed.fingerprint === "string" && FINGERPRINT3.test(parsed.fingerprint))) {
|
|
5402
|
+
return "paymob_body_unsupported";
|
|
5403
|
+
}
|
|
5404
|
+
if (own10(parsed, "merchant-domain") && !(typeof parsed["merchant-domain"] === "string" && ORIGIN2.test(parsed["merchant-domain"]))) {
|
|
5405
|
+
return "paymob_body_unsupported";
|
|
5406
|
+
}
|
|
5407
|
+
return readPaymentKey(parsed.payment_token).code;
|
|
5408
|
+
}
|
|
5409
|
+
function paymobBodyVerdict(body) {
|
|
5410
|
+
if (body === void 0 || body === null || body === "")
|
|
5411
|
+
return CONTINUE12;
|
|
5412
|
+
const { parsed, exact: exact4 } = readJson8(body);
|
|
5413
|
+
if (!exact4 || !record29(parsed) || !record29(parsed.source) || typeof parsed.source.subtype !== "string")
|
|
5414
|
+
return refuse34("paymob_body_unsupported");
|
|
5415
|
+
const subtype = parsed.source.subtype;
|
|
5416
|
+
if (subtype === "CARD") {
|
|
5417
|
+
const code = judgeCardPayment(parsed);
|
|
5418
|
+
return code === null ? CARD33 : refuse34(code);
|
|
5419
|
+
}
|
|
5420
|
+
if (subtype === SAVED_CARD)
|
|
5421
|
+
return refuse34("paymob_saved_card");
|
|
5422
|
+
if (OTHER_CARD_SUBTYPES.has(subtype) || namesCardValue3(parsed))
|
|
5423
|
+
return refuse34("paymob_body_unsupported");
|
|
5424
|
+
return CONTINUE12;
|
|
5425
|
+
}
|
|
5426
|
+
// src/payu-latam.js
|
|
5427
|
+
var PAYU_LATAM_PSP = "payu_latam";
|
|
5428
|
+
var PAYU_LATAM_HOSTS = /* @__PURE__ */ Object.freeze({
|
|
5429
|
+
production: Object.freeze(["checkout.payulatam.com"]),
|
|
5430
|
+
sandbox: Object.freeze(["sandbox.checkout.payulatam.com"])
|
|
5431
|
+
});
|
|
5432
|
+
var PAYU_LATAM_COUNTRIES = /* @__PURE__ */ Object.freeze(["cl", "co", "mx", "pa", "pe"]);
|
|
5433
|
+
var UNREVIEWED_COUNTRIES = /* @__PURE__ */ Object.freeze(["ar", "br"]);
|
|
5434
|
+
var PAYU_LATAM_CARD_BRANDS = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMEX", "DINERS"]);
|
|
5435
|
+
var BODY_LIMIT33 = 65536;
|
|
5436
|
+
var URL_LIMIT13 = 256;
|
|
5437
|
+
var SUBMIT_PATH = /^\/ppp-web-gateway-payu\/checkout\/submit\/([a-z]{2})\/credit_card\/([0-9a-f]{32})$/;
|
|
5438
|
+
var KEY = /^[0-9a-f]{32}$/;
|
|
5439
|
+
var CARD_KEYS14 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear", "cardType"]);
|
|
5440
|
+
var CARD_REQUIRED2 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear"]);
|
|
5441
|
+
var CARD_TYPES2 = /* @__PURE__ */ Object.freeze(["CREDIT", "DEBIT", "PREPAID"]);
|
|
5442
|
+
var NOT_THE_CARD_FORM = /* @__PURE__ */ Object.freeze([
|
|
5443
|
+
"checkoutPaymentMethod",
|
|
5444
|
+
"response",
|
|
5445
|
+
"checkoutPse",
|
|
5446
|
+
"checkoutKhipu",
|
|
5447
|
+
"smsCode",
|
|
5448
|
+
"checkoutDebitCard"
|
|
5449
|
+
]);
|
|
5450
|
+
var TRANSACTION_MEMBERS = /* @__PURE__ */ Object.freeze([
|
|
5451
|
+
"id",
|
|
5452
|
+
"key",
|
|
5453
|
+
"isPaymentAttempt",
|
|
5454
|
+
"payer",
|
|
5455
|
+
"state",
|
|
5456
|
+
"merchantId",
|
|
5457
|
+
"orderId",
|
|
5458
|
+
"order",
|
|
5459
|
+
"checkoutPaymentMethod",
|
|
5460
|
+
"paymentNetwork",
|
|
5461
|
+
"paymentMethodType",
|
|
5462
|
+
"paymentMethodMain",
|
|
5463
|
+
"bank",
|
|
5464
|
+
"paymentAgreementId",
|
|
5465
|
+
"paymentCountry",
|
|
5466
|
+
"paymentExchangeRate",
|
|
5467
|
+
"response",
|
|
5468
|
+
"expirationDate",
|
|
5469
|
+
"lastUpdatedDate",
|
|
5470
|
+
"creationDate",
|
|
5471
|
+
"termsAndConditionId",
|
|
5472
|
+
"installments",
|
|
5473
|
+
"installmentValue",
|
|
5474
|
+
"internationalCard",
|
|
5475
|
+
"checkoutVersion",
|
|
5476
|
+
"payerCommissionValue",
|
|
5477
|
+
"payerInterestValue",
|
|
5478
|
+
"payerPricingValue",
|
|
5479
|
+
"promotionId",
|
|
5480
|
+
"shippingValue",
|
|
5481
|
+
"shipmentMerchantValue",
|
|
5482
|
+
"additionalValue",
|
|
5483
|
+
"administrativeFee",
|
|
5484
|
+
"payerTotalAmount",
|
|
5485
|
+
"source",
|
|
5486
|
+
"integrationMethod",
|
|
5487
|
+
"cardType",
|
|
5488
|
+
"creditCardCountry",
|
|
5489
|
+
"shippingInfo",
|
|
5490
|
+
"questionnaire",
|
|
5491
|
+
"merchantSoftDescriptor",
|
|
5492
|
+
"pmNetworkValue",
|
|
5493
|
+
"tea",
|
|
5494
|
+
"cft",
|
|
5495
|
+
"hasPaymentByPoints",
|
|
5496
|
+
"loyaltyProgramRedeemedAmount",
|
|
5497
|
+
"loyaltyProgramRedeemedPoints",
|
|
5498
|
+
"lendingEligible",
|
|
5499
|
+
"registerLendingDevice",
|
|
5500
|
+
"lendingDeviceToken",
|
|
5501
|
+
"abandonedLendingTransaction",
|
|
5502
|
+
"masterpassObfuscateCreditCardNumber",
|
|
5503
|
+
"isMasterpass",
|
|
5504
|
+
"brandName",
|
|
5505
|
+
"transactionType",
|
|
5506
|
+
"nossoNumero",
|
|
5507
|
+
"paymentTaxesDetails",
|
|
5508
|
+
"shopifyGid",
|
|
5509
|
+
"shopifyVersion",
|
|
5510
|
+
"shopifyShopDomain",
|
|
5511
|
+
"shopifyRedirectTime",
|
|
5512
|
+
"paymentCancelUrl",
|
|
5513
|
+
"checkoutCreditCard",
|
|
5514
|
+
"isRegisterPayer",
|
|
5515
|
+
"creditCardTokenId",
|
|
5516
|
+
"checkoutPse",
|
|
5517
|
+
"checkoutKhipu",
|
|
5518
|
+
"smsCode",
|
|
5519
|
+
"checkoutDebitCard"
|
|
5520
|
+
]);
|
|
5521
|
+
var ADDRESS = ["street1", "street2", "street3", "city", "state", "country", "postalCode", "phone"];
|
|
5522
|
+
var PERSON = [
|
|
5523
|
+
"fullName",
|
|
5524
|
+
"emailAddress",
|
|
5525
|
+
"contactPhone",
|
|
5526
|
+
"phoneCountryCode",
|
|
5527
|
+
"dniNumber",
|
|
5528
|
+
"isDniNumberEncrypt",
|
|
5529
|
+
"dniType",
|
|
5530
|
+
"personType",
|
|
5531
|
+
"businessName",
|
|
5532
|
+
"cnpj",
|
|
5533
|
+
"gender"
|
|
5534
|
+
];
|
|
5535
|
+
var MONEY = ["value", "symbol", "currency"];
|
|
5536
|
+
var RECORD_MEMBERS = /* @__PURE__ */ Object.freeze({
|
|
5537
|
+
payer: [...PERSON, "merchantBuyerId", "billingAddress", "birthDate", "identificationNumber", "identificationType"],
|
|
5538
|
+
"payer.billingAddress": ADDRESS,
|
|
5539
|
+
order: [
|
|
5540
|
+
"id",
|
|
5541
|
+
"referenceCode",
|
|
5542
|
+
"airlineCode",
|
|
5543
|
+
"description",
|
|
5544
|
+
"isTest",
|
|
5545
|
+
"signature",
|
|
5546
|
+
"language",
|
|
5547
|
+
"buyer",
|
|
5548
|
+
"shipment",
|
|
5549
|
+
"state",
|
|
5550
|
+
"status",
|
|
5551
|
+
"paymentApprovalDate",
|
|
5552
|
+
"creationDate",
|
|
5553
|
+
"accountId",
|
|
5554
|
+
"amount",
|
|
5555
|
+
"tax",
|
|
5556
|
+
"totalPurchase",
|
|
5557
|
+
"currency",
|
|
5558
|
+
"amountConvertedValue",
|
|
5559
|
+
"taxConvertedValue",
|
|
5560
|
+
"taxReturnBase",
|
|
5561
|
+
"taxReturnBaseConvertedValue",
|
|
5562
|
+
"additionalValue",
|
|
5563
|
+
"administrativeFee",
|
|
5564
|
+
"taxAdministrativeFee",
|
|
5565
|
+
"taxAdministrativeFeeReturnBase",
|
|
5566
|
+
"enabledPaymentMethods",
|
|
5567
|
+
"enabledInstallments",
|
|
5568
|
+
"enabledPaymentMethodTypes",
|
|
5569
|
+
"enabledIin",
|
|
5570
|
+
"enabledPseBanks",
|
|
5571
|
+
"enabledKhipuBanks",
|
|
5572
|
+
"paymentMethodsDescription",
|
|
5573
|
+
"urlEncodedId",
|
|
5574
|
+
"shippingValue",
|
|
5575
|
+
"paymentRequestLinkId",
|
|
5576
|
+
"airlineDescription",
|
|
5577
|
+
"displayShipping",
|
|
5578
|
+
"displayBuyerComments",
|
|
5579
|
+
"buyerCommentsLabel",
|
|
5580
|
+
"extraParameters",
|
|
5581
|
+
"dispersion"
|
|
5582
|
+
],
|
|
5583
|
+
"order.buyer": [...PERSON, "merchantBuyerId", "buyerAddress", "comments"],
|
|
5584
|
+
"order.buyer.buyerAddress": ADDRESS,
|
|
5585
|
+
"order.shipment": [...PERSON, "merchantShipmentId", "shippingAddress", "comments"],
|
|
5586
|
+
"order.shipment.shippingAddress": ADDRESS,
|
|
5587
|
+
"order.amount": MONEY,
|
|
5588
|
+
"order.tax": MONEY,
|
|
5589
|
+
"order.totalPurchase": MONEY,
|
|
5590
|
+
"order.amountConvertedValue": MONEY,
|
|
5591
|
+
"order.taxConvertedValue": MONEY,
|
|
5592
|
+
"order.taxReturnBase": MONEY,
|
|
5593
|
+
"order.taxReturnBaseConvertedValue": MONEY,
|
|
5594
|
+
shippingInfo: [
|
|
5595
|
+
"userLogin",
|
|
5596
|
+
"id",
|
|
5597
|
+
"reference",
|
|
5598
|
+
"description",
|
|
5599
|
+
"currency",
|
|
5600
|
+
"deliveryCity",
|
|
5601
|
+
"deliveryCityName",
|
|
5602
|
+
"deliveryAddress1",
|
|
5603
|
+
"deliveryAddress2",
|
|
5604
|
+
"deliveryAddress3",
|
|
5605
|
+
"postalCode",
|
|
5606
|
+
"fullName",
|
|
5607
|
+
"documentType",
|
|
5608
|
+
"document",
|
|
5609
|
+
"phoneNumber",
|
|
5610
|
+
"observationsReceivingShipment",
|
|
5611
|
+
"destinationState",
|
|
5612
|
+
"destinationStateName",
|
|
5613
|
+
"destinationCountry",
|
|
5614
|
+
"destinationEmail",
|
|
5615
|
+
"originFullName",
|
|
5616
|
+
"originIdentificationType",
|
|
5617
|
+
"originIdentification",
|
|
5618
|
+
"originCity",
|
|
5619
|
+
"originState",
|
|
5620
|
+
"originCountry",
|
|
5621
|
+
"originAddress",
|
|
5622
|
+
"originZipCode",
|
|
5623
|
+
"originPhone",
|
|
5624
|
+
"originEmail",
|
|
5625
|
+
"kilogramWeight",
|
|
5626
|
+
"volumetricWeight",
|
|
5627
|
+
"totalValue",
|
|
5628
|
+
"declaredValue",
|
|
5629
|
+
"shippingValue",
|
|
5630
|
+
"guideNumber",
|
|
5631
|
+
"enlistmentApplies",
|
|
5632
|
+
"deliveryDate",
|
|
5633
|
+
"deliveryDays",
|
|
5634
|
+
"minDeliveryDays",
|
|
5635
|
+
"packageHeight",
|
|
5636
|
+
"packageWidth",
|
|
5637
|
+
"packageLength",
|
|
5638
|
+
"shippingProvider",
|
|
5639
|
+
"shippingState",
|
|
5640
|
+
"creationDate",
|
|
5641
|
+
"lastUpdateDate",
|
|
5642
|
+
"expirationDate",
|
|
5643
|
+
"signature",
|
|
5644
|
+
"strCreationDate",
|
|
5645
|
+
"comment",
|
|
5646
|
+
"warehouseId",
|
|
5647
|
+
"additionalDeliveryDays",
|
|
5648
|
+
"shippingMerchantValue"
|
|
5649
|
+
],
|
|
5650
|
+
// PayU's own ten, as transaction/create names them, and the merchant's extra1 to extra4 (the payment form's
|
|
5651
|
+
// optional fields), each text or nothing.
|
|
5652
|
+
"order.extraParameters": [
|
|
5653
|
+
"CURRENCY",
|
|
5654
|
+
"LANGUAGE",
|
|
5655
|
+
"ACCOUNT_ID",
|
|
5656
|
+
"ALGORITHM_SIGNATURE",
|
|
5657
|
+
"CHECKOUT_VERSION",
|
|
5658
|
+
"RESPONSE_URL",
|
|
5659
|
+
"IS_TEST",
|
|
5660
|
+
"SIGNATURE",
|
|
5661
|
+
"NOTIFY_URL",
|
|
5662
|
+
"IP_COUNTRY",
|
|
5663
|
+
"EXTRA1",
|
|
5664
|
+
"EXTRA2",
|
|
5665
|
+
"EXTRA3",
|
|
5666
|
+
"EXTRA4"
|
|
5667
|
+
]
|
|
5668
|
+
});
|
|
5669
|
+
var TEXT_RECORDS = /* @__PURE__ */ Object.freeze(["order.extraParameters"]);
|
|
5670
|
+
var CARD_WORDS = /* @__PURE__ */ Object.freeze([
|
|
5671
|
+
"card",
|
|
5672
|
+
"cards",
|
|
5673
|
+
"pan",
|
|
5674
|
+
"cvv",
|
|
5675
|
+
"cvv2",
|
|
5676
|
+
"cvc",
|
|
5677
|
+
"cvd",
|
|
5678
|
+
"csc",
|
|
5679
|
+
"ccv",
|
|
5680
|
+
"cc",
|
|
5681
|
+
"token",
|
|
5682
|
+
"masterpass",
|
|
5683
|
+
"wallet",
|
|
5684
|
+
"register",
|
|
5685
|
+
"recurring",
|
|
5686
|
+
"recurrent",
|
|
5687
|
+
"recurrence",
|
|
5688
|
+
"keep",
|
|
5689
|
+
"store",
|
|
5690
|
+
"save",
|
|
5691
|
+
"saved",
|
|
5692
|
+
"vault",
|
|
5693
|
+
"exp",
|
|
5694
|
+
"expiry",
|
|
5695
|
+
"expiration",
|
|
5696
|
+
"expiracion",
|
|
5697
|
+
"tarjeta",
|
|
5698
|
+
"tarjetas",
|
|
5699
|
+
"vencimiento"
|
|
5700
|
+
]);
|
|
5701
|
+
var OWN_CARD_MEMBERS = /* @__PURE__ */ Object.freeze([
|
|
5702
|
+
"checkoutCreditCard",
|
|
5703
|
+
"cardType",
|
|
5704
|
+
"internationalCard",
|
|
5705
|
+
"creditCardCountry",
|
|
5706
|
+
"isMasterpass",
|
|
5707
|
+
"masterpassObfuscateCreditCardNumber",
|
|
5708
|
+
"isRegisterPayer",
|
|
5709
|
+
"registerLendingDevice",
|
|
5710
|
+
"lendingDeviceToken",
|
|
5711
|
+
"creditCardTokenId",
|
|
5712
|
+
"checkoutDebitCard",
|
|
5713
|
+
"expirationDate",
|
|
5714
|
+
"shippingInfo.expirationDate"
|
|
5715
|
+
]);
|
|
5716
|
+
var SIGNATURE2 = /^[0-9a-f]{32,128}$/i;
|
|
5717
|
+
var OPAQUE_MEMBERS = /* @__PURE__ */ Object.freeze({
|
|
5718
|
+
key: /^[0-9a-f]{32}$/,
|
|
5719
|
+
"order.signature": SIGNATURE2,
|
|
5720
|
+
"order.extraParameters.SIGNATURE": SIGNATURE2,
|
|
5721
|
+
"shippingInfo.signature": SIGNATURE2,
|
|
5722
|
+
"order.urlEncodedId": /^[A-Za-z0-9+/=_-]{1,256}$/,
|
|
5723
|
+
shopifyGid: /^gid:\/\/shopify\/[A-Za-z]+\/[0-9]{1,20}$/
|
|
5724
|
+
});
|
|
5725
|
+
var IS_TEST_TEXT = /* @__PURE__ */ Object.freeze({ true: ["true", "1"], false: ["false", "0"] });
|
|
5726
|
+
var MASKS = /* @__PURE__ */ Object.freeze({ VISA: [4, 4, 4, 4], MASTERCARD: [4, 4, 4, 4], AMEX: [4, 6, 5], DINERS: [4, 6, 4] });
|
|
5727
|
+
var NETWORK2 = /* @__PURE__ */ Object.freeze({
|
|
5728
|
+
VISA: /^4(?:[0-9]{12}|[0-9]{15})$/,
|
|
5729
|
+
MASTERCARD: /^(?:5[1-5][0-9]{14}|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[01][0-9]|20))[0-9]{12})$/,
|
|
5730
|
+
AMEX: /^3[47][0-9]{13}$/,
|
|
5731
|
+
DINERS: /^(?:3(?:0[0-5]|[68][0-9])[0-9]{11}|3095[0-9]{10}|3[89][0-9]{12})$/
|
|
5732
|
+
});
|
|
5733
|
+
var SECURITY_CODE21 = /^[0-9]{3,4}$/;
|
|
5734
|
+
var COUNTRY6 = /^[A-Z]{2}$/;
|
|
5735
|
+
var record30 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5736
|
+
var owns7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
5737
|
+
var refuse35 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5738
|
+
var CARD34 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5739
|
+
var absent = (value, key) => !owns7(value, key) || value[key] === null;
|
|
5740
|
+
function payuLatamSubmitTarget(url) {
|
|
5741
|
+
if (typeof url !== "string" || url.length > URL_LIMIT13 || url.includes("?") || url.includes("#"))
|
|
5742
|
+
return null;
|
|
5743
|
+
let parsed;
|
|
5744
|
+
try {
|
|
5745
|
+
parsed = new URL(url);
|
|
5746
|
+
}
|
|
5747
|
+
catch {
|
|
5748
|
+
return null;
|
|
5749
|
+
}
|
|
5750
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
5751
|
+
return null;
|
|
5752
|
+
const environment2 = PAYU_LATAM_HOSTS.production.includes(parsed.hostname) ? "production" : PAYU_LATAM_HOSTS.sandbox.includes(parsed.hostname) ? "sandbox" : null;
|
|
5753
|
+
const match = environment2 === null ? null : SUBMIT_PATH.exec(parsed.pathname);
|
|
5754
|
+
if (match === null || !(PAYU_LATAM_COUNTRIES.includes(match[1]) || UNREVIEWED_COUNTRIES.includes(match[1])))
|
|
5755
|
+
return null;
|
|
5756
|
+
return Object.freeze({ host: parsed.hostname, environment: environment2, country: match[1], key: match[2] });
|
|
5757
|
+
}
|
|
5758
|
+
function readJson9(body) {
|
|
5759
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT33)
|
|
5760
|
+
return null;
|
|
5761
|
+
let at = 0;
|
|
5762
|
+
let nodes = 0;
|
|
5763
|
+
const fail = () => {
|
|
5764
|
+
throw new Error("invalid_payu_latam_json");
|
|
5765
|
+
};
|
|
5766
|
+
const space = () => {
|
|
5767
|
+
while (" \r\n".includes(body[at] ?? "\0"))
|
|
5768
|
+
at += 1;
|
|
5769
|
+
};
|
|
5770
|
+
const string = () => {
|
|
5771
|
+
space();
|
|
5772
|
+
const start = at;
|
|
5773
|
+
if (body[at++] !== '"')
|
|
5774
|
+
fail();
|
|
5775
|
+
while (at < body.length) {
|
|
5776
|
+
const character = body[at++];
|
|
5777
|
+
if (character === "\\") {
|
|
5778
|
+
at += 1;
|
|
5779
|
+
continue;
|
|
5780
|
+
}
|
|
5781
|
+
if (character === '"')
|
|
5782
|
+
return JSON.parse(body.slice(start, at));
|
|
5783
|
+
}
|
|
5784
|
+
return fail();
|
|
5785
|
+
};
|
|
5786
|
+
const value = (depth) => {
|
|
5787
|
+
if (depth > 8 || ++nodes > 4096)
|
|
5788
|
+
fail();
|
|
5789
|
+
space();
|
|
5790
|
+
const character = body[at];
|
|
5791
|
+
if (character === '"')
|
|
5792
|
+
return string();
|
|
5793
|
+
if (character === "{") {
|
|
5794
|
+
at += 1;
|
|
5795
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
5796
|
+
const seen = /* @__PURE__ */ new Set();
|
|
5797
|
+
space();
|
|
5798
|
+
if (body[at] === "}") {
|
|
5799
|
+
at += 1;
|
|
5800
|
+
return result;
|
|
5801
|
+
}
|
|
5802
|
+
for (;;) {
|
|
5803
|
+
const key = string();
|
|
5804
|
+
if (seen.has(key) || ["__proto__", "prototype", "constructor"].includes(key))
|
|
5805
|
+
fail();
|
|
5806
|
+
seen.add(key);
|
|
5807
|
+
space();
|
|
5808
|
+
if (body[at++] !== ":")
|
|
5809
|
+
fail();
|
|
5810
|
+
result[key] = value(depth + 1);
|
|
5811
|
+
space();
|
|
5812
|
+
const next = body[at++];
|
|
5813
|
+
if (next === "}")
|
|
5814
|
+
return result;
|
|
5815
|
+
if (next !== ",")
|
|
5816
|
+
fail();
|
|
5817
|
+
}
|
|
5818
|
+
}
|
|
5819
|
+
if (character === "[") {
|
|
5820
|
+
at += 1;
|
|
5821
|
+
const result = [];
|
|
5822
|
+
space();
|
|
5823
|
+
if (body[at] === "]") {
|
|
5824
|
+
at += 1;
|
|
5825
|
+
return result;
|
|
5826
|
+
}
|
|
5827
|
+
for (;;) {
|
|
5828
|
+
result.push(value(depth + 1));
|
|
5829
|
+
space();
|
|
5830
|
+
const next = body[at++];
|
|
5831
|
+
if (next === "]")
|
|
5832
|
+
return result;
|
|
5833
|
+
if (next !== ",")
|
|
5834
|
+
fail();
|
|
5835
|
+
}
|
|
5836
|
+
}
|
|
5837
|
+
for (const literal of ["true", "false", "null"]) {
|
|
5838
|
+
if (body.startsWith(literal, at)) {
|
|
5839
|
+
at += literal.length;
|
|
5840
|
+
return JSON.parse(literal);
|
|
5841
|
+
}
|
|
5842
|
+
}
|
|
5843
|
+
const number = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/.exec(body.slice(at, at + 32));
|
|
5844
|
+
if (!number || /^-?[0-9]{16,}$/.test(number[0]))
|
|
5845
|
+
fail();
|
|
5846
|
+
at += number[0].length;
|
|
5847
|
+
const parsed = Number(number[0]);
|
|
5848
|
+
if (!Number.isFinite(parsed))
|
|
5849
|
+
fail();
|
|
5850
|
+
return parsed;
|
|
5851
|
+
};
|
|
5852
|
+
try {
|
|
5853
|
+
const parsed = value(0);
|
|
5854
|
+
space();
|
|
5855
|
+
return at === body.length && record30(parsed) ? parsed : null;
|
|
5856
|
+
}
|
|
5857
|
+
catch {
|
|
5858
|
+
return null;
|
|
5859
|
+
}
|
|
5860
|
+
}
|
|
5861
|
+
function cardNamed2(key) {
|
|
5862
|
+
const words = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^A-Za-z0-9]+/).filter(Boolean).map((word) => word.toLowerCase());
|
|
5863
|
+
const phrase = words.join(" ");
|
|
5864
|
+
return words.some((word) => CARD_WORDS.includes(word)) || ["security code", "codigo seguridad", "codigo verificacion"].some((said) => phrase.includes(said));
|
|
5865
|
+
}
|
|
5866
|
+
function carriesCardNumber(text8) {
|
|
5867
|
+
for (const [run] of text8.matchAll(/[0-9]+(?:[ ._/,-][0-9]+)*/g)) {
|
|
5868
|
+
const groups = run.split(/[ ._/,-]/);
|
|
5869
|
+
for (let first = 0; first < groups.length; first += 1) {
|
|
5870
|
+
let digits3 = "";
|
|
5871
|
+
for (let last = first; last < groups.length && digits3.length + groups[last].length <= 19; last += 1) {
|
|
5872
|
+
digits3 += groups[last];
|
|
5873
|
+
if (digits3.length >= 13 && digits3[0] >= "2" && digits3[0] <= "6" && luhn7(digits3))
|
|
5874
|
+
return true;
|
|
5875
|
+
}
|
|
5876
|
+
}
|
|
5877
|
+
}
|
|
5878
|
+
return false;
|
|
5879
|
+
}
|
|
5880
|
+
var wholeCardNumber = (text8) => /^[2-6][0-9]{12,18}$/.test(text8) && luhn7(text8);
|
|
5881
|
+
function membersRefusal(root) {
|
|
5882
|
+
const pending = [[root, ""]];
|
|
5883
|
+
while (pending.length > 0) {
|
|
5884
|
+
const [node, path] = pending.pop();
|
|
5885
|
+
const own12 = path === "" ? TRANSACTION_MEMBERS : owns7(RECORD_MEMBERS, path) ? RECORD_MEMBERS[path] : null;
|
|
5886
|
+
for (const [key, child] of Object.entries(node)) {
|
|
5887
|
+
const at = Array.isArray(node) ? path : path === "" ? key : `${path}.${key}`;
|
|
5888
|
+
if (at === "checkoutCreditCard")
|
|
5889
|
+
continue;
|
|
5890
|
+
if (own12 !== null && !own12.includes(key))
|
|
5891
|
+
return true;
|
|
5892
|
+
if (TEXT_RECORDS.includes(path) && child !== null && typeof child !== "string")
|
|
5893
|
+
return true;
|
|
5894
|
+
if (!Array.isArray(node) && owns7(OPAQUE_MEMBERS, at)) {
|
|
5895
|
+
if (child !== null && (typeof child !== "string" || !OPAQUE_MEMBERS[at].test(child) || wholeCardNumber(child)))
|
|
5896
|
+
return true;
|
|
5897
|
+
continue;
|
|
5898
|
+
}
|
|
5899
|
+
if (!Array.isArray(node) && !OWN_CARD_MEMBERS.includes(at) && cardNamed2(key) && child !== null && child !== false)
|
|
5900
|
+
return true;
|
|
5901
|
+
if (typeof child === "string" && carriesCardNumber(child))
|
|
5902
|
+
return true;
|
|
5903
|
+
if (typeof child === "number" && (!/Date$/.test(key) || String(child).length > 13) && carriesCardNumber(String(child)))
|
|
5904
|
+
return true;
|
|
5905
|
+
if (child !== null && typeof child === "object")
|
|
5906
|
+
pending.push([child, at]);
|
|
5907
|
+
}
|
|
5908
|
+
}
|
|
5909
|
+
return false;
|
|
5910
|
+
}
|
|
5911
|
+
function cardDigits(number, brand) {
|
|
5912
|
+
if (typeof number !== "string")
|
|
5913
|
+
return null;
|
|
5914
|
+
if (/^[0-9]{12,19}$/.test(number))
|
|
5915
|
+
return number;
|
|
5916
|
+
const groups = number.split(" ");
|
|
5917
|
+
const mask = MASKS[brand];
|
|
5918
|
+
if (!mask || groups.length !== mask.length || !groups.every((group, at) => group.length === mask[at] && /^[0-9]+$/.test(group)))
|
|
5919
|
+
return null;
|
|
5920
|
+
return groups.join("");
|
|
5921
|
+
}
|
|
5922
|
+
function luhn7(digits3) {
|
|
5923
|
+
let sum = 0;
|
|
5924
|
+
for (let at = digits3.length - 1, double = false; at >= 0; at -= 1, double = !double) {
|
|
5925
|
+
let digit = digits3.charCodeAt(at) - 48;
|
|
5926
|
+
if (double) {
|
|
5927
|
+
digit *= 2;
|
|
5928
|
+
if (digit > 9)
|
|
5929
|
+
digit -= 9;
|
|
5930
|
+
}
|
|
5931
|
+
sum += digit;
|
|
5932
|
+
}
|
|
5933
|
+
return sum % 10 === 0;
|
|
5934
|
+
}
|
|
5935
|
+
function cardRefusal(card, brand) {
|
|
5936
|
+
if (!record30(card) || !Object.keys(card).every((key) => CARD_KEYS14.includes(key)) || !CARD_REQUIRED2.every((key) => owns7(card, key))) {
|
|
5937
|
+
return "payu_latam_body_unsupported";
|
|
5938
|
+
}
|
|
5939
|
+
const digits3 = cardDigits(card.number, brand);
|
|
5940
|
+
if (digits3 === null || !NETWORK2[brand].test(digits3) || !luhn7(digits3))
|
|
5941
|
+
return "payu_latam_body_unsupported";
|
|
5942
|
+
const code = card.securityCode;
|
|
5943
|
+
if (typeof code !== "string" || !SECURITY_CODE21.test(code) || code.length !== (brand === "AMEX" ? 4 : 3))
|
|
5944
|
+
return "payu_latam_body_unsupported";
|
|
5945
|
+
const { expirationDateMonth: month, expirationDateYear: year } = card;
|
|
5946
|
+
if (!Number.isSafeInteger(month) || month < 1 || month > 12 || !Number.isSafeInteger(year) || year < 0 || year > 99)
|
|
5947
|
+
return "payu_latam_body_unsupported";
|
|
5948
|
+
if (!absent(card, "cardType") && !CARD_TYPES2.includes(card.cardType))
|
|
5949
|
+
return "payu_latam_body_unsupported";
|
|
5950
|
+
return null;
|
|
5951
|
+
}
|
|
5952
|
+
function judgeBody5(body, target) {
|
|
5953
|
+
const value = readJson9(body);
|
|
5954
|
+
if (value === null || value.paymentMethodType !== "CREDIT_CARD" || typeof value.key !== "string" || !KEY.test(value.key) || !record30(value.order) || !record30(value.payer))
|
|
5955
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5956
|
+
if (target !== void 0 && value.key !== target.key)
|
|
5957
|
+
return { code: "payu_latam_session_mismatch", value: null };
|
|
5958
|
+
if (!absent(value, "creditCardTokenId") || value.isMasterpass === true || !absent(value, "masterpassObfuscateCreditCardNumber")) {
|
|
5959
|
+
return { code: "payu_latam_saved_card", value: null };
|
|
5960
|
+
}
|
|
5961
|
+
if (NOT_THE_CARD_FORM.some((key) => !absent(value, key)) || membersRefusal(value) || !absent(value, "lendingDeviceToken") || !absent(value, "questionnaire") || !(absent(value, "registerLendingDevice") || value.registerLendingDevice === false))
|
|
5962
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5963
|
+
const brand = value.paymentMethodMain;
|
|
5964
|
+
if (typeof brand !== "string" || !PAYU_LATAM_CARD_BRANDS.includes(brand))
|
|
5965
|
+
return { code: "payu_latam_card_unsupported", value: null };
|
|
5966
|
+
const card = cardRefusal(value.checkoutCreditCard, brand);
|
|
5967
|
+
if (card !== null)
|
|
5968
|
+
return { code: card, value: null };
|
|
5969
|
+
if (value.installments !== 1 && value.installments !== "1")
|
|
5970
|
+
return { code: "payu_latam_installments_unsupported", value: null };
|
|
5971
|
+
if (!absent(value, "cardType") && !CARD_TYPES2.includes(value.cardType) || !absent(value, "internationalCard") && typeof value.internationalCard !== "boolean" || !absent(value, "creditCardCountry") && (typeof value.creditCardCountry !== "string" || !COUNTRY6.test(value.creditCardCountry)) || !absent(value, "transactionType") && value.transactionType !== "AUTHORIZATION_AND_CAPTURE" || !absent(value, "isMasterpass") && typeof value.isMasterpass !== "boolean" || typeof value.order.isTest !== "boolean")
|
|
5972
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5973
|
+
const extra = value.order.extraParameters;
|
|
5974
|
+
if (!record30(extra) || !IS_TEST_TEXT[value.order.isTest].includes(extra.IS_TEST)) {
|
|
5975
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5976
|
+
}
|
|
5977
|
+
if (value.isRegisterPayer === true)
|
|
5978
|
+
return { code: "payu_latam_keep_on_file", value: null };
|
|
5979
|
+
if (!absent(value, "isRegisterPayer") && value.isRegisterPayer !== false)
|
|
5980
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5981
|
+
if (target !== void 0 && target.environment === "production" && value.order.isTest)
|
|
5982
|
+
return { code: "payu_latam_environment_mismatch", value: null };
|
|
5983
|
+
return { code: null, value };
|
|
5984
|
+
}
|
|
5985
|
+
function payuLatamBodyVerdict(body, url) {
|
|
5986
|
+
let target;
|
|
5987
|
+
if (url !== void 0) {
|
|
5988
|
+
target = payuLatamSubmitTarget(url);
|
|
5989
|
+
if (target === null)
|
|
5990
|
+
return refuse35("payu_latam_url_refused");
|
|
5991
|
+
if (!PAYU_LATAM_COUNTRIES.includes(target.country))
|
|
5992
|
+
return refuse35("payu_latam_country_unreviewed");
|
|
5993
|
+
}
|
|
5994
|
+
const { code } = judgeBody5(body, target);
|
|
5995
|
+
return code === null ? CARD34 : refuse35(code);
|
|
5996
|
+
}
|
|
5997
|
+
// src/registration.js
|
|
5998
|
+
var PARTS = { psp: "id", definitions: "list", refusedOperations: "list", settlementReadback: "any", exactUrl: "rule", bodyGate: "rule", amount: "rule" };
|
|
5999
|
+
var PSP_ID = /^[a-z][a-z0-9_]*$/;
|
|
6000
|
+
var registrationProblems = (spec) => problemsOf(spec, PARTS);
|
|
6001
|
+
function problemsOf(spec, parts) {
|
|
6002
|
+
if (!spec || typeof spec !== "object")
|
|
6003
|
+
return ["a registration is an object"];
|
|
6004
|
+
const psp = spec.psp;
|
|
6005
|
+
if (typeof psp !== "string" || !PSP_ID.test(psp))
|
|
6006
|
+
return [`${JSON.stringify(psp)} is not a processor id`];
|
|
6007
|
+
const problems2 = Object.keys(spec).filter((key) => !(key in parts)).map((key) => `${psp}: ${key} is no registration part`);
|
|
6008
|
+
for (const [key, kind] of Object.entries(parts)) {
|
|
6009
|
+
const value = spec[key];
|
|
6010
|
+
if (value === void 0)
|
|
6011
|
+
continue;
|
|
6012
|
+
if (kind === "rule" && typeof value !== "function")
|
|
6013
|
+
problems2.push(`${psp}: ${key} is not a function`);
|
|
6014
|
+
if (kind === "numbers" && !((Array.isArray(value) || value instanceof Set) && [...value].every((n) => typeof n === "string" && /^\d{12,19}$/.test(n)))) {
|
|
6015
|
+
problems2.push(`${psp}: ${key} is not a list of card numbers`);
|
|
6016
|
+
}
|
|
6017
|
+
}
|
|
6018
|
+
if ("definitions" in parts) {
|
|
6019
|
+
if (!Array.isArray(spec.definitions) || spec.definitions.length === 0)
|
|
6020
|
+
problems2.push(`${psp}: names no definition`);
|
|
6021
|
+
else if (spec.definitions.some((definition) => definition?.psp !== psp))
|
|
6022
|
+
problems2.push(`${psp}: a definition names another processor`);
|
|
6023
|
+
for (const id of spec.refusedOperations ?? []) {
|
|
6024
|
+
if (typeof id !== "string" || !id.startsWith(`${psp}.`))
|
|
6025
|
+
problems2.push(`${psp}: ${JSON.stringify(id)} is not one of its operations`);
|
|
6026
|
+
}
|
|
6027
|
+
}
|
|
6028
|
+
return problems2;
|
|
6029
|
+
}
|
|
6030
|
+
function registered(spec, parts) {
|
|
6031
|
+
const problems2 = problemsOf(spec, parts);
|
|
6032
|
+
if (problems2.length)
|
|
6033
|
+
throw new Error(`payment-core registration refused: ${problems2.join("; ")}`);
|
|
6034
|
+
return deepFreeze({ ...spec });
|
|
6035
|
+
}
|
|
6036
|
+
function registerProcessor(spec) {
|
|
6037
|
+
return registered(spec, PARTS);
|
|
6038
|
+
}
|
|
6039
|
+
// src/processors/midtrans.js
|
|
6040
|
+
var MIDTRANS_PSP = "midtrans";
|
|
6041
|
+
var MIDTRANS_OPERATION = "midtrans.card_request";
|
|
6042
|
+
var MIDTRANS_TOKEN_URL = "https://api.midtrans.com/v2/token";
|
|
6043
|
+
var MIDTRANS_SANDBOX_TOKEN_URL = "https://api.sandbox.midtrans.com/v2/token";
|
|
6044
|
+
var MIDTRANS_TOKEN_KEYS = /* @__PURE__ */ Object.freeze(["card_cvv", "card_number", "card_exp_month", "card_exp_year", "installment_term"]);
|
|
6045
|
+
var BODY_LIMIT34 = 4096;
|
|
6046
|
+
var CARD_NUMBER17 = /^[0-9]{12,19}$/;
|
|
6047
|
+
var SECURITY_CODE22 = /^[0-9]{3,4}$/;
|
|
6048
|
+
var MONTH18 = /^(?:0[1-9]|1[0-2])$/;
|
|
6049
|
+
var YEAR19 = /^20[0-9]{2}$/;
|
|
6050
|
+
var TERM = /^[0-9]{1,3}$/;
|
|
6051
|
+
var record31 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
6052
|
+
var own11 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
6053
|
+
var inOrder6 = (value, keys) => {
|
|
6054
|
+
let at = 0;
|
|
6055
|
+
for (const name of Object.keys(value)) {
|
|
6056
|
+
while (at < keys.length && keys[at] !== name)
|
|
6057
|
+
at += 1;
|
|
6058
|
+
if (at === keys.length)
|
|
6059
|
+
return false;
|
|
6060
|
+
at += 1;
|
|
6061
|
+
}
|
|
6062
|
+
return true;
|
|
6063
|
+
};
|
|
6064
|
+
var refuse36 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
6065
|
+
var CARD35 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
6066
|
+
function isMidtransTokenUrl(url) {
|
|
6067
|
+
return url === MIDTRANS_TOKEN_URL || url === MIDTRANS_SANDBOX_TOKEN_URL;
|
|
6068
|
+
}
|
|
6069
|
+
function readBody20(body) {
|
|
6070
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT34)
|
|
6071
|
+
return null;
|
|
6072
|
+
let value;
|
|
6073
|
+
try {
|
|
6074
|
+
value = JSON.parse(body);
|
|
6075
|
+
if (!record31(value) || JSON.stringify(value) !== body)
|
|
6076
|
+
return null;
|
|
6077
|
+
}
|
|
6078
|
+
catch {
|
|
6079
|
+
return null;
|
|
6080
|
+
}
|
|
6081
|
+
return value;
|
|
6082
|
+
}
|
|
6083
|
+
function midtransBodyVerdict(body) {
|
|
6084
|
+
const value = readBody20(body);
|
|
6085
|
+
if (value === null || !inOrder6(value, MIDTRANS_TOKEN_KEYS)) {
|
|
6086
|
+
if (record31(value) && (own11(value, "token_id") || own11(value, "two_click")) && !own11(value, "card_number"))
|
|
6087
|
+
return refuse36("midtrans_saved_card");
|
|
6088
|
+
return refuse36("midtrans_body_unsupported");
|
|
6089
|
+
}
|
|
6090
|
+
if (!own11(value, "card_cvv") || !own11(value, "card_number") || !own11(value, "card_exp_month") || !own11(value, "card_exp_year")) {
|
|
6091
|
+
return refuse36("midtrans_body_unsupported");
|
|
6092
|
+
}
|
|
6093
|
+
if (typeof value.card_cvv !== "string" || !SECURITY_CODE22.test(value.card_cvv) || typeof value.card_number !== "string" || !CARD_NUMBER17.test(value.card_number) || typeof value.card_exp_month !== "string" || !MONTH18.test(value.card_exp_month) || typeof value.card_exp_year !== "string" || !YEAR19.test(value.card_exp_year))
|
|
6094
|
+
return refuse36("midtrans_body_unsupported");
|
|
6095
|
+
if (own11(value, "installment_term") && (typeof value.installment_term !== "string" || !TERM.test(value.installment_term)))
|
|
6096
|
+
return refuse36("midtrans_body_unsupported");
|
|
6097
|
+
return CARD35;
|
|
6098
|
+
}
|
|
6099
|
+
var midtrans_default = /* @__PURE__ */ registerProcessor({
|
|
6100
|
+
psp: MIDTRANS_PSP,
|
|
6101
|
+
definitions: [
|
|
6102
|
+
{
|
|
6103
|
+
psp: "midtrans",
|
|
6104
|
+
// Snap's token request, as the header above reads it. Sandbox has its own host, so the device sends a
|
|
6105
|
+
// test-mode request only Midtrans' documented test cards (hostEnvironmentPinned, device-replay.js S7).
|
|
6106
|
+
// Ships dark: served only to a client that declares `midtrans_card_token`, gated off for every org until an
|
|
6107
|
+
// operator lists one (`midtrans:<org>`), and the backend's gate serves only Agentcard's own company until the
|
|
6108
|
+
// token's publishable key is bound to the merchant (backend config.ts MIDTRANS_KEY_BOUND_TO_MERCHANT).
|
|
6109
|
+
capability: "midtrans_card_token",
|
|
6110
|
+
match: "api\\.(?:sandbox\\.)?midtrans\\.com/v2/token",
|
|
6111
|
+
hosts: ["^api\\.midtrans\\.com$", "^api\\.sandbox\\.midtrans\\.com$"],
|
|
6112
|
+
sandboxHosts: ["^api\\.sandbox\\.midtrans\\.com$"],
|
|
6113
|
+
hostEnvironmentPinned: true,
|
|
6114
|
+
encoding: "json",
|
|
6115
|
+
// Snap's own headers: the publishable client key (Authorization Basic) and X-Service. Origin, Referer and
|
|
6116
|
+
// cookies never ride.
|
|
6117
|
+
passthroughHeaders: ["^authorization$", "^x-service$"],
|
|
6118
|
+
jsonCardFields: [["card_number"]]
|
|
6119
|
+
}
|
|
6120
|
+
],
|
|
6121
|
+
// Only the cardholder's device sends a token, after a person approves; no reviewed list names midtrans.
|
|
6122
|
+
refusedOperations: [MIDTRANS_OPERATION],
|
|
6123
|
+
// Not surveyed: the token moves no money, and the merchant's own charge names its status by the order id alone.
|
|
6124
|
+
settlementReadback: "not_surveyed",
|
|
6125
|
+
exactUrl: isMidtransTokenUrl,
|
|
6126
|
+
bodyGate: (url, body) => url !== void 0 && !isMidtransTokenUrl(url) ? { verdict: "refuse", code: "midtrans_url_refused" } : midtransBodyVerdict(body)
|
|
6127
|
+
});
|
|
6128
|
+
// src/processors/index.generated.js
|
|
6129
|
+
var REGISTERED_MODULES = Object.freeze({
|
|
6130
|
+
midtrans: midtrans_default
|
|
6131
|
+
});
|
|
6132
|
+
// src/registry.js
|
|
6133
|
+
var REGISTERED_PROCESSORS = Object.values(REGISTERED_MODULES);
|
|
6134
|
+
var ids = REGISTERED_PROCESSORS.map((processor) => processor.psp);
|
|
6135
|
+
var problems = REGISTERED_PROCESSORS.flatMap(registrationProblems);
|
|
6136
|
+
for (const [name, processor] of Object.entries(REGISTERED_MODULES)) {
|
|
6137
|
+
if (processor.psp !== name)
|
|
6138
|
+
problems.push(`processors/${name}.js registers ${JSON.stringify(processor.psp)}`);
|
|
6139
|
+
}
|
|
6140
|
+
if (ids.some((id, i) => i > 0 && ids[i - 1] >= id))
|
|
6141
|
+
problems.push(`registered processors out of id order: ${ids.join(", ")}`);
|
|
6142
|
+
if (problems.length)
|
|
6143
|
+
throw new Error(`payment-core registry refused: ${problems.join("; ")}`);
|
|
6144
|
+
var BY_PSP = new Map(REGISTERED_PROCESSORS.map((processor) => [processor.psp, processor]));
|
|
6145
|
+
var REGISTERED_IDS = Object.freeze(ids);
|
|
6146
|
+
var REGISTERED_DEFINITIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.definitions));
|
|
6147
|
+
var REGISTERED_REFUSED_OPERATIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.refusedOperations ?? []));
|
|
6148
|
+
var REGISTERED_SETTLEMENT_READBACK = Object.freeze(REGISTERED_PROCESSORS.filter((processor) => processor.settlementReadback !== void 0).map((processor) => [processor.psp, processor.settlementReadback]));
|
|
6149
|
+
function registeredRule(psp, name) {
|
|
6150
|
+
return typeof psp === "string" ? BY_PSP.get(psp)?.[name] : void 0;
|
|
6151
|
+
}
|
|
6152
|
+
// src/card-fields.js
|
|
6153
|
+
function processorGate(recognizer, url, body) {
|
|
6154
|
+
if (recognizer && recognizer.psp === LYRA_PSP)
|
|
6155
|
+
return lyraBodyVerdict(body, url);
|
|
6156
|
+
if (recognizer && recognizer.psp === WIX_PAYMENTS_PSP) {
|
|
6157
|
+
if (url !== void 0 && !isWixPaymentsTokenizeUrl(url))
|
|
6158
|
+
return { verdict: "refuse", code: "wix_payments_url_refused" };
|
|
6159
|
+
return wixPaymentsBodyVerdict(body);
|
|
6160
|
+
}
|
|
6161
|
+
if (recognizer && recognizer.psp === KOMOJU_PSP)
|
|
6162
|
+
return komojuBodyVerdict(body, url);
|
|
6163
|
+
if (recognizer && recognizer.psp === HIPAY_PSP) {
|
|
6164
|
+
if (url !== void 0 && !isHipayTokenUrl(url))
|
|
6165
|
+
return { verdict: "refuse", code: "hipay_url_refused" };
|
|
6166
|
+
return hipayBodyVerdict(body);
|
|
6167
|
+
}
|
|
6168
|
+
if (recognizer && recognizer.psp === PAYPAL_PSP) {
|
|
6169
|
+
if (url !== void 0 && !isPaypalConfirmUrl(url))
|
|
6170
|
+
return { verdict: "refuse", code: "paypal_url_refused" };
|
|
6171
|
+
return paypalBodyVerdict(body);
|
|
6172
|
+
}
|
|
6173
|
+
if (recognizer && recognizer.psp === MAKECOMMERCE_PSP)
|
|
6174
|
+
return makecommerceBodyVerdict(body, url);
|
|
6175
|
+
if (recognizer && recognizer.psp === OPENPAY_PSP)
|
|
6176
|
+
return openpayBodyVerdict(body, url);
|
|
6177
|
+
if (recognizer && recognizer.psp === POYNT_PSP) {
|
|
6178
|
+
if (url !== void 0 && !isPoyntNonceUrl(url))
|
|
6179
|
+
return { verdict: "refuse", code: "poynt_url_refused" };
|
|
6180
|
+
return poyntBodyVerdict(body);
|
|
6181
|
+
}
|
|
6182
|
+
if (recognizer && recognizer.psp === CARDCOM_PSP)
|
|
6183
|
+
return cardcomBodyVerdict(body, url);
|
|
6184
|
+
if (recognizer && recognizer.psp === TOAST_PSP) {
|
|
6185
|
+
if (url !== void 0 && !isToastPaymentMethodsUrl(url))
|
|
6186
|
+
return { verdict: "refuse", code: "toast_url_refused" };
|
|
6187
|
+
return toastBodyVerdict(body);
|
|
6188
|
+
}
|
|
6189
|
+
if (recognizer && recognizer.psp === PAYU_LATAM_PSP)
|
|
6190
|
+
return payuLatamBodyVerdict(body, url);
|
|
6191
|
+
if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
|
|
6192
|
+
if (url !== void 0 && !isPaddleVgsCardsUrl(url))
|
|
6193
|
+
return { verdict: "refuse", code: "paddle_vgs_url_refused" };
|
|
6194
|
+
return paddleVgsBodyVerdict(body);
|
|
6195
|
+
}
|
|
6196
|
+
if (recognizer && recognizer.psp === PAYFAST_PSP) {
|
|
6197
|
+
if (url !== void 0 && !isPayfastPayUrl(url))
|
|
6198
|
+
return { verdict: "refuse", code: "payfast_url_refused" };
|
|
6199
|
+
return payfastBodyVerdict(body);
|
|
6200
|
+
}
|
|
6201
|
+
if (recognizer && recognizer.psp === PAYREXX_PSP) {
|
|
6202
|
+
return url !== void 0 ? payrexxGateVerdict(url, body) : payrexxBodyVerdict(body);
|
|
6203
|
+
}
|
|
6204
|
+
if (recognizer && recognizer.psp === PAYGENT_PSP) {
|
|
6205
|
+
return url !== void 0 ? paygentRequestVerdict(url, body) : paygentBodyVerdict(body);
|
|
6206
|
+
}
|
|
6207
|
+
if (recognizer && recognizer.psp === PAY_NL_PSP) {
|
|
6208
|
+
if (url !== void 0 && !isPayNlTokenUrl(url))
|
|
6209
|
+
return { verdict: "refuse", code: "pay_nl_url_refused" };
|
|
6210
|
+
return payNlBodyVerdict(body);
|
|
6211
|
+
}
|
|
6212
|
+
if (recognizer && recognizer.psp === TWOC2P_PSP) {
|
|
6213
|
+
if (url === void 0)
|
|
6214
|
+
return twoC2pBodyVerdict(body);
|
|
6215
|
+
const target = twoC2pPaymentTarget(url);
|
|
6216
|
+
if (target === null)
|
|
6217
|
+
return { verdict: "refuse", code: "twoc2p_url_refused" };
|
|
6218
|
+
if (!target.reviewed)
|
|
6219
|
+
return twoC2pPaymentCarriesCard(body) ? { verdict: "refuse", code: "twoc2p_build_unreviewed" } : { verdict: "continue" };
|
|
6220
|
+
const keyBytes = twoC2pKeyBytes(target.environment);
|
|
6221
|
+
return keyBytes === null ? { verdict: "refuse", code: "twoc2p_field_unreviewed" } : twoC2pBodyVerdict(body, keyBytes, target.environment);
|
|
6222
|
+
}
|
|
6223
|
+
if (recognizer && recognizer.psp === APS_PSP)
|
|
6224
|
+
return apsBodyVerdict(body, url);
|
|
6225
|
+
if (recognizer && recognizer.psp === CONEKTA_PSP)
|
|
6226
|
+
return conektaBodyVerdict(body, url);
|
|
6227
|
+
if (recognizer && recognizer.psp === PADDLE_TOKENEX_PSP) {
|
|
6228
|
+
const target = url !== void 0 ? paddleTokenexPayTarget(url) : null;
|
|
6229
|
+
if (url !== void 0 && target === null)
|
|
6230
|
+
return { verdict: "refuse", code: "paddle_tokenex_pay_unsupported" };
|
|
6231
|
+
return paddleTokenexBodyVerdict(body, target ? target.line : void 0);
|
|
6232
|
+
}
|
|
6233
|
+
if (recognizer && recognizer.psp === PAYMONGO_PSP) {
|
|
6234
|
+
const session = url !== void 0 ? paymongoCheckoutSession(url) : void 0;
|
|
6235
|
+
if (url !== void 0 && session === null)
|
|
6236
|
+
return { verdict: "refuse", code: "paymongo_url_refused" };
|
|
6237
|
+
return paymongoBodyVerdict(body, session);
|
|
6238
|
+
}
|
|
6239
|
+
if (recognizer && recognizer.psp === GOPAY_PSP)
|
|
6240
|
+
return gopayBodyVerdict(body, url);
|
|
6241
|
+
if (recognizer && recognizer.psp === REVOLUT_PSP) {
|
|
6242
|
+
if (url !== void 0 && !isRevolutPaymentsUrl(url))
|
|
6243
|
+
return { verdict: "refuse", code: "revolut_url_refused" };
|
|
6244
|
+
return revolutBodyVerdict(body);
|
|
6245
|
+
}
|
|
6246
|
+
if (recognizer && recognizer.psp === SUMUP_PSP)
|
|
6247
|
+
return sumupBodyVerdict(body, url);
|
|
6248
|
+
if (recognizer && recognizer.psp === CLOVER_PSP)
|
|
6249
|
+
return cloverBodyVerdict(body, url);
|
|
6250
|
+
if (recognizer && recognizer.psp === TAP_PAYMENTS_PSP) {
|
|
6251
|
+
if (url !== void 0 && !isTapPaymentsTokenUrl(url))
|
|
6252
|
+
return { verdict: "refuse", code: "tap_payments_url_refused" };
|
|
6253
|
+
return tapPaymentsBodyVerdict(body);
|
|
6254
|
+
}
|
|
6255
|
+
if (recognizer && recognizer.psp === TOKENEX_IFRAME_PSP)
|
|
6256
|
+
return tokenexIframeBodyVerdict(body, url);
|
|
6257
|
+
if (recognizer && recognizer.psp === NEXI_CHECKOUT_PSP)
|
|
6258
|
+
return nexiCheckoutBodyVerdict(body, url);
|
|
6259
|
+
if (recognizer && recognizer.psp === FASTSPRING_PSP) {
|
|
6260
|
+
if (url !== void 0 && !isFastspringCardUrl(url))
|
|
6261
|
+
return { verdict: "refuse", code: "fastspring_url_refused" };
|
|
6262
|
+
return fastspringBodyVerdict(body);
|
|
6263
|
+
}
|
|
6264
|
+
if (recognizer && recognizer.psp === OMISE_PSP) {
|
|
6265
|
+
if (url !== void 0 && !isOmiseTokenUrl(url))
|
|
6266
|
+
return { verdict: "refuse", code: "omise_url_refused" };
|
|
6267
|
+
return omiseBodyVerdict(body);
|
|
6268
|
+
}
|
|
6269
|
+
if (recognizer && recognizer.psp === XENDIT_PSP) {
|
|
6270
|
+
if (url !== void 0 && !isXenditTokenUrl(url))
|
|
6271
|
+
return { verdict: "refuse", code: "xendit_url_refused" };
|
|
6272
|
+
return xenditBodyVerdict(body);
|
|
6273
|
+
}
|
|
6274
|
+
if (recognizer && recognizer.psp === PAYMOB_PSP) {
|
|
6275
|
+
if (url !== void 0 && !isPaymobPayUrl(url))
|
|
6276
|
+
return { verdict: "refuse", code: "paymob_url_refused" };
|
|
6277
|
+
return paymobBodyVerdict(body);
|
|
6278
|
+
}
|
|
6279
|
+
if (recognizer && recognizer.psp === GRAVY_PSP)
|
|
6280
|
+
return gravyBodyVerdict(body);
|
|
3901
6281
|
if (recognizer && recognizer.psp === MONERIS_PSP) {
|
|
3902
6282
|
if (url !== void 0 && !isMonerisTokenizeUrl(url))
|
|
3903
6283
|
return { verdict: "refuse", code: "moneris_url_refused" };
|
|
3904
6284
|
return monerisBodyVerdict(body);
|
|
3905
6285
|
}
|
|
6286
|
+
if (recognizer && recognizer.psp === TAPPAY_PSP) {
|
|
6287
|
+
if (url !== void 0 && !isTappayGetPrimeUrl(url))
|
|
6288
|
+
return { verdict: "refuse", code: "tappay_url_refused" };
|
|
6289
|
+
return tappayBodyVerdict(body);
|
|
6290
|
+
}
|
|
6291
|
+
const ownGate = registeredRule(recognizer?.psp, "bodyGate");
|
|
6292
|
+
if (ownGate)
|
|
6293
|
+
return ownGate(url, body);
|
|
3906
6294
|
if (!recognizer || recognizer.psp !== "elavon_converge")
|
|
3907
6295
|
return null;
|
|
3908
6296
|
if (url !== void 0 && !isConvergeProcessUrl(url))
|
|
@@ -3925,7 +6313,7 @@ function carriesCardFields(recognizer, body) {
|
|
|
3925
6313
|
if (typeof body !== "string" || body === "")
|
|
3926
6314
|
return false;
|
|
3927
6315
|
const anyCase = recognizer.caseInsensitiveFormKeys === true;
|
|
3928
|
-
const wanted = anyCase ? fields.map((
|
|
6316
|
+
const wanted = anyCase ? fields.map((field2) => String(field2).toLowerCase()) : fields;
|
|
3929
6317
|
for (const chunk of body.split("&")) {
|
|
3930
6318
|
const eq = chunk.indexOf("=");
|
|
3931
6319
|
if (eq <= 0 || eq === chunk.length - 1)
|
|
@@ -4013,7 +6401,7 @@ function splitCardLeg(recognizer, body) {
|
|
|
4013
6401
|
const absorb = list(split.absorb);
|
|
4014
6402
|
const pass = list(split.pass);
|
|
4015
6403
|
const sibling = list(split.siblingKeys);
|
|
4016
|
-
const
|
|
6404
|
+
const own12 = [];
|
|
4017
6405
|
const seen = /* @__PURE__ */ new Set();
|
|
4018
6406
|
for (const chunk of body.split("&")) {
|
|
4019
6407
|
const eq = chunk.indexOf("=");
|
|
@@ -4030,13 +6418,13 @@ function splitCardLeg(recognizer, body) {
|
|
|
4030
6418
|
return null;
|
|
4031
6419
|
seen.add(key);
|
|
4032
6420
|
if (!sibling.includes(key))
|
|
4033
|
-
|
|
6421
|
+
own12.push(key);
|
|
4034
6422
|
}
|
|
4035
|
-
if (
|
|
6423
|
+
if (own12.length === 0)
|
|
4036
6424
|
return null;
|
|
4037
|
-
if (
|
|
6425
|
+
if (own12.every((key) => absorb.includes(key)))
|
|
4038
6426
|
return "absorb";
|
|
4039
|
-
if (
|
|
6427
|
+
if (own12.every((key) => pass.includes(key)))
|
|
4040
6428
|
return "pass";
|
|
4041
6429
|
return null;
|
|
4042
6430
|
}
|