@agent-cards/sdk 0.23.22 → 0.23.24
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 +34 -0
- package/PREFLIGHT.md +2 -0
- package/README.md +34 -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.d.ts +5 -2
- package/dist/amadeus.js +18 -3
- package/dist/amazon-payment-services.d.ts +25 -0
- package/dist/amazon-payment-services.generated.d.ts +76 -0
- package/dist/amazon-payment-services.generated.js +883 -0
- package/dist/amazon-payment-services.js +53 -0
- package/dist/capabilities.generated.d.ts +2 -0
- package/dist/capabilities.generated.js +3 -0
- package/dist/card-fields.generated.js +1127 -25
- package/dist/cdp.js +116 -15
- package/dist/client.d.ts +107 -8
- package/dist/client.js +277 -128
- package/dist/hosted-entry.js +2 -1
- package/dist/hosted-form.d.ts +5 -0
- package/dist/hosted-form.js +5 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/openpay.generated.d.ts +67 -0
- package/dist/openpay.generated.js +446 -0
- package/dist/paddle-checkout-watch.d.ts +70 -0
- package/dist/paddle-checkout-watch.js +239 -0
- package/dist/paddle-tokenex.generated.d.ts +29 -1
- package/dist/paddle-tokenex.generated.js +175 -26
- package/dist/paytrail.d.ts +58 -0
- package/dist/paytrail.js +98 -0
- package/dist/pre-claim.d.ts +4 -0
- package/dist/pre-claim.js +46 -2
- package/dist/prepared-processor.d.ts +12 -4
- package/dist/prepared-processor.js +31 -5
- package/dist/primer.generated.js +1155 -53
- 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 +458 -8
- package/dist/tap-payments.d.ts +43 -0
- package/dist/tap-payments.generated.d.ts +59 -0
- package/dist/tap-payments.generated.js +990 -0
- package/dist/tap-payments.js +72 -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: 30277fd34048f75e9f6b6252d783092c471aca03a64462bb4f458f9417b8cc82
|
|
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
|
|
@@ -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" });
|
|
@@ -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 });
|
|
@@ -1464,8 +1464,8 @@ 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" });
|
|
@@ -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" });
|
|
@@ -2727,8 +2727,8 @@ var TEXT_LIMIT3 = 256;
|
|
|
2727
2727
|
var CONTROL7 = /[\u0000-\u001f\u007f]/;
|
|
2728
2728
|
var record13 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2729
2729
|
var sameKeys7 = (value, keys) => {
|
|
2730
|
-
const
|
|
2731
|
-
return
|
|
2730
|
+
const own12 = Object.keys(value);
|
|
2731
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
2732
2732
|
};
|
|
2733
2733
|
var plainText3 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT3 && !CONTROL7.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
2734
2734
|
var refuse19 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -2776,6 +2776,15 @@ var pin6 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fie
|
|
|
2776
2776
|
var HIPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
2777
2777
|
pin6({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
|
|
2778
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
|
+
}
|
|
2779
2788
|
// src/amazon-payment-services.js
|
|
2780
2789
|
var APS_PSP = "amazon_payment_services";
|
|
2781
2790
|
var APS_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.payfort.com": "production", "sbcheckout.payfort.com": "sandbox" });
|
|
@@ -3449,8 +3458,8 @@ var HOSTNAME = /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](
|
|
|
3449
3458
|
var PUBLISHABLE_KEY = /^[A-Za-z0-9]{16,64}$/;
|
|
3450
3459
|
var record18 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3451
3460
|
var sameKeys8 = (value, keys) => {
|
|
3452
|
-
const
|
|
3453
|
-
return
|
|
3461
|
+
const own12 = Object.keys(value);
|
|
3462
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
3454
3463
|
};
|
|
3455
3464
|
var refuse24 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3456
3465
|
var CARD23 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -4141,8 +4150,8 @@ var LONG_TEXT_LIMIT = BODY_LIMIT25;
|
|
|
4141
4150
|
var record22 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4142
4151
|
var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4143
4152
|
var sameKeys9 = (value, keys) => {
|
|
4144
|
-
const
|
|
4145
|
-
return
|
|
4153
|
+
const own12 = Object.keys(value);
|
|
4154
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
4146
4155
|
};
|
|
4147
4156
|
var exact3 = (pattern, value) => typeof value === "string" && pattern.test(value);
|
|
4148
4157
|
var printable3 = (text8) => [...text8].every((character) => {
|
|
@@ -4541,8 +4550,8 @@ var POSTAL_CODE4 = /^[A-Za-z0-9 -]{0,16}$/;
|
|
|
4541
4550
|
var CIPHERTEXT_B64 = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
|
|
4542
4551
|
var record24 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4543
4552
|
var sameKeys11 = (value, keys) => {
|
|
4544
|
-
const
|
|
4545
|
-
return
|
|
4553
|
+
const own12 = Object.keys(value);
|
|
4554
|
+
return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
|
|
4546
4555
|
};
|
|
4547
4556
|
var refuse29 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4548
4557
|
var failed = (code) => (
|
|
@@ -4606,7 +4615,8 @@ function toastBodyVerdict(body) {
|
|
|
4606
4615
|
// src/fastspring.js
|
|
4607
4616
|
var FASTSPRING_PSP = "fastspring";
|
|
4608
4617
|
var FASTSPRING_STORE_PINS = /* @__PURE__ */ Object.freeze([
|
|
4609
|
-
Object.freeze({ environment: "production", store: "daisydisk", storefront: "", merchant: "DaisyDisk" })
|
|
4618
|
+
Object.freeze({ environment: "production", store: "daisydisk", storefront: "", merchant: "DaisyDisk" }),
|
|
4619
|
+
Object.freeze({ environment: "production", store: "stardock", storefront: "/popup-store", merchant: "Stardock" })
|
|
4610
4620
|
]);
|
|
4611
4621
|
var URL_LIMIT11 = 256;
|
|
4612
4622
|
var BODY_LIMIT28 = 32768;
|
|
@@ -5063,6 +5073,1083 @@ function xenditBodyVerdict(body) {
|
|
|
5063
5073
|
return refuse32("xendit_body_unsupported");
|
|
5064
5074
|
return CARD31;
|
|
5065
5075
|
}
|
|
5076
|
+
// src/tappay.js
|
|
5077
|
+
var TAPPAY_PSP = "tappay";
|
|
5078
|
+
var TAPPAY_GETPRIME_URL = "https://js.tappaysdk.com/payment/tpdirect/production/getprime";
|
|
5079
|
+
var BODY_LIMIT31 = 8192;
|
|
5080
|
+
var REQUIRED_KEYS3 = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "protocol", "tappay_sdk_version", "cardholder_info"]);
|
|
5081
|
+
var KEY_ORDER = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "port", "protocol", "tappay_sdk_version", "cardholder_info", "cardccv", "device_id"]);
|
|
5082
|
+
var OPTIONAL_KEYS2 = /* @__PURE__ */ Object.freeze(["port", "cardccv", "device_id"]);
|
|
5083
|
+
var CARDHOLDER_KEYS = /* @__PURE__ */ Object.freeze(["name_en", "email", "phone_number_country_code", "phone_number"]);
|
|
5084
|
+
var CARD_NUMBER16 = /^[0-9]{12,19}$/;
|
|
5085
|
+
var CARD_DUE_DATE = /^20[0-9]{2}(?:0[1-9]|1[0-2])$/;
|
|
5086
|
+
var SECURITY_CODE19 = /^[0-9]{3,4}$/;
|
|
5087
|
+
var APP_KEY = /^[A-Za-z0-9_-]{16,512}$/;
|
|
5088
|
+
var SDK_VERSION = /^v[0-9]+(?:\.[0-9]+){1,3}$/;
|
|
5089
|
+
var HOSTNAME2 = /^[A-Za-z0-9.:-]{1,255}$/;
|
|
5090
|
+
var ORIGIN_URL = /^https?:\/\/[A-Za-z0-9.:_/-]{1,255}$/;
|
|
5091
|
+
var PROTOCOL = /^https?:$/;
|
|
5092
|
+
var PORT = /^[0-9]{0,5}$/;
|
|
5093
|
+
var CONTROL13 = /[\u0000-\u001f\u007f]/;
|
|
5094
|
+
var TEXT_LIMIT12 = 256;
|
|
5095
|
+
var DEVICE_ID = /^[A-Za-z0-9_-]{1,128}$/;
|
|
5096
|
+
var record28 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5097
|
+
var plainText7 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT12 && !CONTROL13.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
5098
|
+
var holderField = (value) => value === null || plainText7(value);
|
|
5099
|
+
var refuse33 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5100
|
+
var CARD32 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5101
|
+
function isTappayGetPrimeUrl(url) {
|
|
5102
|
+
return url === TAPPAY_GETPRIME_URL;
|
|
5103
|
+
}
|
|
5104
|
+
function readBody19(body) {
|
|
5105
|
+
if (typeof body !== "string" || body.length > BODY_LIMIT31)
|
|
5106
|
+
return null;
|
|
5107
|
+
const eq = body.indexOf("=");
|
|
5108
|
+
if (eq !== "jsonString".length || body.slice(0, eq) !== "jsonString")
|
|
5109
|
+
return null;
|
|
5110
|
+
const json = body.slice(eq + 1);
|
|
5111
|
+
let value;
|
|
5112
|
+
try {
|
|
5113
|
+
value = JSON.parse(json);
|
|
5114
|
+
if (!record28(value) || JSON.stringify(value) !== json)
|
|
5115
|
+
return null;
|
|
5116
|
+
}
|
|
5117
|
+
catch {
|
|
5118
|
+
return null;
|
|
5119
|
+
}
|
|
5120
|
+
return value;
|
|
5121
|
+
}
|
|
5122
|
+
function keysInOrder(value) {
|
|
5123
|
+
const keys = Object.keys(value);
|
|
5124
|
+
for (const key of REQUIRED_KEYS3) {
|
|
5125
|
+
if (!keys.includes(key))
|
|
5126
|
+
return false;
|
|
5127
|
+
}
|
|
5128
|
+
for (const key of keys) {
|
|
5129
|
+
if (!KEY_ORDER.includes(key) || !REQUIRED_KEYS3.includes(key) && !OPTIONAL_KEYS2.includes(key))
|
|
5130
|
+
return false;
|
|
5131
|
+
}
|
|
5132
|
+
const rank = (key) => KEY_ORDER.indexOf(key);
|
|
5133
|
+
for (let at = 1; at < keys.length; at += 1) {
|
|
5134
|
+
if (rank(keys[at]) <= rank(keys[at - 1]))
|
|
5135
|
+
return false;
|
|
5136
|
+
}
|
|
5137
|
+
return true;
|
|
5138
|
+
}
|
|
5139
|
+
function cardholderInfo(value) {
|
|
5140
|
+
if (!record28(value))
|
|
5141
|
+
return false;
|
|
5142
|
+
const keys = Object.keys(value);
|
|
5143
|
+
return keys.length <= CARDHOLDER_KEYS.length && keys.every((key) => CARDHOLDER_KEYS.includes(key) && holderField(value[key]));
|
|
5144
|
+
}
|
|
5145
|
+
function tappayBodyVerdict(body) {
|
|
5146
|
+
const value = readBody19(body);
|
|
5147
|
+
if (value === null || !keysInOrder(value))
|
|
5148
|
+
return refuse33("tappay_body_unsupported");
|
|
5149
|
+
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)) {
|
|
5150
|
+
return refuse33("tappay_body_unsupported");
|
|
5151
|
+
}
|
|
5152
|
+
if (Object.prototype.hasOwnProperty.call(value, "port") && (typeof value.port !== "string" || !PORT.test(value.port)))
|
|
5153
|
+
return refuse33("tappay_body_unsupported");
|
|
5154
|
+
if (Object.prototype.hasOwnProperty.call(value, "cardccv") && (typeof value.cardccv !== "string" || !SECURITY_CODE19.test(value.cardccv)))
|
|
5155
|
+
return refuse33("tappay_body_unsupported");
|
|
5156
|
+
if (Object.prototype.hasOwnProperty.call(value, "device_id") && (typeof value.device_id !== "string" || !DEVICE_ID.test(value.device_id)))
|
|
5157
|
+
return refuse33("tappay_body_unsupported");
|
|
5158
|
+
return CARD32;
|
|
5159
|
+
}
|
|
5160
|
+
// src/paymob.js
|
|
5161
|
+
var PAYMOB_PSP = "paymob";
|
|
5162
|
+
var PAYMOB_HOSTS = /* @__PURE__ */ Object.freeze(["accept.paymob.com", "uae.paymob.com", "ksa.paymob.com", "oman.paymob.com", "accept.paymobsolutions.com"]);
|
|
5163
|
+
var PAYMOB_PAY_PATH = "/api/acceptance/payments/pay";
|
|
5164
|
+
var URL_LIMIT12 = 128;
|
|
5165
|
+
var BODY_LIMIT32 = 16384;
|
|
5166
|
+
var KEY_LIMIT = 8192;
|
|
5167
|
+
var NUMBER7 = /^[0-9]{12,19}$/;
|
|
5168
|
+
var MONTH17 = /^(?:0[1-9]|1[0-2])$/;
|
|
5169
|
+
var YEAR18 = /^[0-9]{2}$/;
|
|
5170
|
+
var SECURITY_CODE20 = /^[0-9]{3,4}$/;
|
|
5171
|
+
var TEXT3 = /^[^\x00-\x1f\x7f]{0,256}$/;
|
|
5172
|
+
var HOLDER_TEXT = /^[^\x00-\x1f\x7f]{0,128}$/;
|
|
5173
|
+
var FIELD = /^[a-z][a-z0-9_]{0,39}$/;
|
|
5174
|
+
var FINGERPRINT3 = /^[\x21-\x7e]{1,256}$/;
|
|
5175
|
+
var ORIGIN2 = /^https?:\/\/[A-Za-z0-9.-]{1,253}(?::[0-9]{1,5})?$/;
|
|
5176
|
+
var SWITCH = /* @__PURE__ */ new Set(["True", "False"]);
|
|
5177
|
+
var SOURCE_FOR = /* @__PURE__ */ Object.freeze({ IFRAME: "True", PIXEL: "False" });
|
|
5178
|
+
var CARD_MEMBER4 = /^(?:card_?number|pan|cvv|cvc|cvn|card_pin|card_expiry|expiry_month|expiry_year|security_code)$/i;
|
|
5179
|
+
var SAVED_CARD = "TOKEN";
|
|
5180
|
+
var OTHER_CARD_SUBTYPES = /* @__PURE__ */ new Set(["OMANNET", "PREMIUM", "PREMIUM6_ONLINE", "SYMPL"]);
|
|
5181
|
+
var CARD_SOURCE_KEYS = /* @__PURE__ */ new Set(["identifier", "sourceholder_name", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"]);
|
|
5182
|
+
var TOP_KEYS3 = /* @__PURE__ */ new Set([
|
|
5183
|
+
"source",
|
|
5184
|
+
"billing",
|
|
5185
|
+
"shipping_data",
|
|
5186
|
+
"payment_token",
|
|
5187
|
+
"api_source",
|
|
5188
|
+
"unified_checkout",
|
|
5189
|
+
"save_card",
|
|
5190
|
+
"fingerprint",
|
|
5191
|
+
"merchant-domain",
|
|
5192
|
+
"customer",
|
|
5193
|
+
"converted_currency",
|
|
5194
|
+
"no_of_cards_selected",
|
|
5195
|
+
"split_payment_amount"
|
|
5196
|
+
]);
|
|
5197
|
+
var REQUIRED_TOP_KEYS = ["source", "payment_token", "api_source", "unified_checkout", "save_card"];
|
|
5198
|
+
var REQUIRED_SOURCE_KEYS = ["identifier", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"];
|
|
5199
|
+
var record29 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5200
|
+
var own10 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
5201
|
+
var refuse34 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5202
|
+
var CARD33 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5203
|
+
var CONTINUE12 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
5204
|
+
function paymobPayHost(url) {
|
|
5205
|
+
if (typeof url !== "string" || url.length > URL_LIMIT12 || url.includes("?") || url.includes("#"))
|
|
5206
|
+
return null;
|
|
5207
|
+
let parsed;
|
|
5208
|
+
try {
|
|
5209
|
+
parsed = new URL(url);
|
|
5210
|
+
}
|
|
5211
|
+
catch {
|
|
5212
|
+
return null;
|
|
5213
|
+
}
|
|
5214
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !PAYMOB_HOSTS.includes(parsed.hostname) || parsed.pathname !== PAYMOB_PAY_PATH)
|
|
5215
|
+
return null;
|
|
5216
|
+
return parsed.hostname;
|
|
5217
|
+
}
|
|
5218
|
+
function isPaymobPayUrl(url) {
|
|
5219
|
+
return paymobPayHost(url) !== null;
|
|
5220
|
+
}
|
|
5221
|
+
var BASE645 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
5222
|
+
var BASE64URL = /^[A-Za-z0-9_-]+$/;
|
|
5223
|
+
var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
5224
|
+
function decodeBase642(text8, url) {
|
|
5225
|
+
if (typeof text8 !== "string" || text8 === "")
|
|
5226
|
+
return null;
|
|
5227
|
+
let body = text8;
|
|
5228
|
+
if (url) {
|
|
5229
|
+
if (!BASE64URL.test(body) || body.length % 4 === 1)
|
|
5230
|
+
return null;
|
|
5231
|
+
}
|
|
5232
|
+
else {
|
|
5233
|
+
if (!BASE645.test(body) || body.length % 4 !== 0)
|
|
5234
|
+
return null;
|
|
5235
|
+
body = body.replace(/=+$/, "");
|
|
5236
|
+
}
|
|
5237
|
+
const extra = url ? "-_" : "+/";
|
|
5238
|
+
const bytes = new Uint8Array(Math.floor(body.length * 3 / 4));
|
|
5239
|
+
let buffer = 0;
|
|
5240
|
+
let bits = 0;
|
|
5241
|
+
let at = 0;
|
|
5242
|
+
for (const char of body) {
|
|
5243
|
+
const value = (ALPHABET + extra).indexOf(char);
|
|
5244
|
+
if (value < 0)
|
|
5245
|
+
return null;
|
|
5246
|
+
buffer = buffer << 6 | value;
|
|
5247
|
+
bits += 6;
|
|
5248
|
+
if (bits >= 8) {
|
|
5249
|
+
bits -= 8;
|
|
5250
|
+
bytes[at++] = buffer >> bits & 255;
|
|
5251
|
+
}
|
|
5252
|
+
}
|
|
5253
|
+
if (buffer & (1 << bits) - 1)
|
|
5254
|
+
return null;
|
|
5255
|
+
return bytes.subarray(0, at);
|
|
5256
|
+
}
|
|
5257
|
+
function jsonOf(bytes) {
|
|
5258
|
+
if (!bytes)
|
|
5259
|
+
return null;
|
|
5260
|
+
let text8;
|
|
5261
|
+
try {
|
|
5262
|
+
text8 = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
5263
|
+
}
|
|
5264
|
+
catch {
|
|
5265
|
+
return null;
|
|
5266
|
+
}
|
|
5267
|
+
try {
|
|
5268
|
+
const value = JSON.parse(text8);
|
|
5269
|
+
return record29(value) ? value : null;
|
|
5270
|
+
}
|
|
5271
|
+
catch {
|
|
5272
|
+
return null;
|
|
5273
|
+
}
|
|
5274
|
+
}
|
|
5275
|
+
var positive = (value) => Number.isSafeInteger(value) && value > 0;
|
|
5276
|
+
var CURRENCY5 = /^[A-Z]{3}$/;
|
|
5277
|
+
var KEY_CLAIMS = /* @__PURE__ */ new Set([
|
|
5278
|
+
"user_id",
|
|
5279
|
+
"integration_id",
|
|
5280
|
+
"order_id",
|
|
5281
|
+
"amount_cents",
|
|
5282
|
+
"currency",
|
|
5283
|
+
"exp",
|
|
5284
|
+
"billing_data",
|
|
5285
|
+
"extra",
|
|
5286
|
+
"notification_url",
|
|
5287
|
+
"redirection_url",
|
|
5288
|
+
"redirect_url",
|
|
5289
|
+
"lock_order_when_paid",
|
|
5290
|
+
"single_payment_attempt",
|
|
5291
|
+
"next_payment_intention",
|
|
5292
|
+
"created_by",
|
|
5293
|
+
"is_partner",
|
|
5294
|
+
"split_payment_methods"
|
|
5295
|
+
]);
|
|
5296
|
+
var SUBSCRIPTION_CLAIMS = /* @__PURE__ */ new Set(["subscription_plan_id", "subscription_start_date"]);
|
|
5297
|
+
var UNREADABLE_KEY = /* @__PURE__ */ Object.freeze({ facts: null, code: "paymob_payment_key_unreadable" });
|
|
5298
|
+
function readPaymentKey(key) {
|
|
5299
|
+
if (typeof key !== "string" || key.length > KEY_LIMIT)
|
|
5300
|
+
return UNREADABLE_KEY;
|
|
5301
|
+
const outer = decodeBase642(key, false);
|
|
5302
|
+
if (!outer)
|
|
5303
|
+
return UNREADABLE_KEY;
|
|
5304
|
+
let jwt;
|
|
5305
|
+
try {
|
|
5306
|
+
jwt = new TextDecoder("utf-8", { fatal: true }).decode(outer);
|
|
5307
|
+
}
|
|
5308
|
+
catch {
|
|
5309
|
+
return UNREADABLE_KEY;
|
|
5310
|
+
}
|
|
5311
|
+
const parts = jwt.split(".");
|
|
5312
|
+
if (parts.length !== 3 || parts.some((part) => part === "" || !BASE64URL.test(part)))
|
|
5313
|
+
return UNREADABLE_KEY;
|
|
5314
|
+
const header = jsonOf(decodeBase642(parts[0], true));
|
|
5315
|
+
if (!header || Object.keys(header).length !== 2 || header.alg !== "HS512" || header.typ !== "JWT")
|
|
5316
|
+
return UNREADABLE_KEY;
|
|
5317
|
+
const signature = decodeBase642(parts[2], true);
|
|
5318
|
+
if (!signature || signature.length !== 64)
|
|
5319
|
+
return UNREADABLE_KEY;
|
|
5320
|
+
const payload = jsonOf(decodeBase642(parts[1], true));
|
|
5321
|
+
if (!payload)
|
|
5322
|
+
return UNREADABLE_KEY;
|
|
5323
|
+
const claims = Object.keys(payload);
|
|
5324
|
+
if (claims.some((claim) => SUBSCRIPTION_CLAIMS.has(claim) && payload[claim] !== null))
|
|
5325
|
+
return Object.freeze({ facts: null, code: "paymob_subscription" });
|
|
5326
|
+
if (claims.some((claim) => !KEY_CLAIMS.has(claim) && !SUBSCRIPTION_CLAIMS.has(claim)))
|
|
5327
|
+
return UNREADABLE_KEY;
|
|
5328
|
+
const { user_id: merchantId, integration_id: integrationId, order_id: orderId, amount_cents: amountCents, currency, exp } = payload;
|
|
5329
|
+
if (!positive(merchantId) || !positive(integrationId) || !positive(orderId) || !Number.isSafeInteger(amountCents) || amountCents < 0 || typeof currency !== "string" || !CURRENCY5.test(currency) || own10(payload, "exp") && !positive(exp))
|
|
5330
|
+
return UNREADABLE_KEY;
|
|
5331
|
+
if (amountCents === 0)
|
|
5332
|
+
return Object.freeze({ facts: null, code: "paymob_no_amount" });
|
|
5333
|
+
return Object.freeze({ facts: Object.freeze({ merchantId, integrationId, orderId, amountCents, currency, expiresAt: own10(payload, "exp") ? exp : null }), code: null });
|
|
5334
|
+
}
|
|
5335
|
+
function readJson8(body) {
|
|
5336
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT32)
|
|
5337
|
+
return { parsed: null, exact: false };
|
|
5338
|
+
let parsed;
|
|
5339
|
+
try {
|
|
5340
|
+
parsed = JSON.parse(body);
|
|
5341
|
+
}
|
|
5342
|
+
catch {
|
|
5343
|
+
return { parsed: null, exact: false };
|
|
5344
|
+
}
|
|
5345
|
+
let exact4 = false;
|
|
5346
|
+
try {
|
|
5347
|
+
exact4 = body.length <= BODY_LIMIT32 && JSON.stringify(parsed) === body;
|
|
5348
|
+
}
|
|
5349
|
+
catch {
|
|
5350
|
+
exact4 = false;
|
|
5351
|
+
}
|
|
5352
|
+
return { parsed, exact: exact4 };
|
|
5353
|
+
}
|
|
5354
|
+
function namesCardValue3(parsed) {
|
|
5355
|
+
const pending = parsed !== null && typeof parsed === "object" ? [parsed] : [];
|
|
5356
|
+
while (pending.length > 0) {
|
|
5357
|
+
const node = pending.pop();
|
|
5358
|
+
for (const key of Object.keys(node)) {
|
|
5359
|
+
if (!Array.isArray(node) && CARD_MEMBER4.test(key))
|
|
5360
|
+
return true;
|
|
5361
|
+
const value = node[key];
|
|
5362
|
+
if (value !== null && typeof value === "object")
|
|
5363
|
+
pending.push(value);
|
|
5364
|
+
}
|
|
5365
|
+
}
|
|
5366
|
+
return false;
|
|
5367
|
+
}
|
|
5368
|
+
function addressBlock(value) {
|
|
5369
|
+
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)));
|
|
5370
|
+
}
|
|
5371
|
+
function judgeCardPayment(parsed) {
|
|
5372
|
+
const source = parsed.source;
|
|
5373
|
+
for (const key of Object.keys(parsed))
|
|
5374
|
+
if (!TOP_KEYS3.has(key))
|
|
5375
|
+
return "paymob_body_unsupported";
|
|
5376
|
+
for (const key of Object.keys(source)) {
|
|
5377
|
+
if (key === "is_card_to_installment" || key === "tenure")
|
|
5378
|
+
return "paymob_installments";
|
|
5379
|
+
if (!CARD_SOURCE_KEYS.has(key))
|
|
5380
|
+
return "paymob_body_unsupported";
|
|
5381
|
+
}
|
|
5382
|
+
if (own10(parsed, "customer"))
|
|
5383
|
+
return "paymob_account";
|
|
5384
|
+
if (own10(parsed, "no_of_cards_selected") || own10(parsed, "split_payment_amount"))
|
|
5385
|
+
return "paymob_split_payment";
|
|
5386
|
+
if (own10(parsed, "converted_currency"))
|
|
5387
|
+
return "paymob_currency_conversion";
|
|
5388
|
+
if (!REQUIRED_TOP_KEYS.every((key) => own10(parsed, key)) || !REQUIRED_SOURCE_KEYS.every((key) => own10(source, key)))
|
|
5389
|
+
return "paymob_body_unsupported";
|
|
5390
|
+
if (source.save_card === true || parsed.save_card === true)
|
|
5391
|
+
return "paymob_keep_on_file";
|
|
5392
|
+
if (source.save_card !== false || parsed.save_card !== false)
|
|
5393
|
+
return "paymob_body_unsupported";
|
|
5394
|
+
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))) {
|
|
5395
|
+
return "paymob_body_unsupported";
|
|
5396
|
+
}
|
|
5397
|
+
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)
|
|
5398
|
+
return "paymob_body_unsupported";
|
|
5399
|
+
if (own10(parsed, "billing") && !addressBlock(parsed.billing) || own10(parsed, "shipping_data") && !addressBlock(parsed.shipping_data)) {
|
|
5400
|
+
return "paymob_body_unsupported";
|
|
5401
|
+
}
|
|
5402
|
+
if (own10(parsed, "fingerprint") && parsed.fingerprint !== null && !(typeof parsed.fingerprint === "string" && FINGERPRINT3.test(parsed.fingerprint))) {
|
|
5403
|
+
return "paymob_body_unsupported";
|
|
5404
|
+
}
|
|
5405
|
+
if (own10(parsed, "merchant-domain") && !(typeof parsed["merchant-domain"] === "string" && ORIGIN2.test(parsed["merchant-domain"]))) {
|
|
5406
|
+
return "paymob_body_unsupported";
|
|
5407
|
+
}
|
|
5408
|
+
return readPaymentKey(parsed.payment_token).code;
|
|
5409
|
+
}
|
|
5410
|
+
function paymobBodyVerdict(body) {
|
|
5411
|
+
if (body === void 0 || body === null || body === "")
|
|
5412
|
+
return CONTINUE12;
|
|
5413
|
+
const { parsed, exact: exact4 } = readJson8(body);
|
|
5414
|
+
if (!exact4 || !record29(parsed) || !record29(parsed.source) || typeof parsed.source.subtype !== "string")
|
|
5415
|
+
return refuse34("paymob_body_unsupported");
|
|
5416
|
+
const subtype = parsed.source.subtype;
|
|
5417
|
+
if (subtype === "CARD") {
|
|
5418
|
+
const code = judgeCardPayment(parsed);
|
|
5419
|
+
return code === null ? CARD33 : refuse34(code);
|
|
5420
|
+
}
|
|
5421
|
+
if (subtype === SAVED_CARD)
|
|
5422
|
+
return refuse34("paymob_saved_card");
|
|
5423
|
+
if (OTHER_CARD_SUBTYPES.has(subtype) || namesCardValue3(parsed))
|
|
5424
|
+
return refuse34("paymob_body_unsupported");
|
|
5425
|
+
return CONTINUE12;
|
|
5426
|
+
}
|
|
5427
|
+
// src/payu-latam.js
|
|
5428
|
+
var PAYU_LATAM_PSP = "payu_latam";
|
|
5429
|
+
var PAYU_LATAM_HOSTS = /* @__PURE__ */ Object.freeze({
|
|
5430
|
+
production: Object.freeze(["checkout.payulatam.com"]),
|
|
5431
|
+
sandbox: Object.freeze(["sandbox.checkout.payulatam.com"])
|
|
5432
|
+
});
|
|
5433
|
+
var PAYU_LATAM_COUNTRIES = /* @__PURE__ */ Object.freeze(["cl", "co", "mx", "pa", "pe"]);
|
|
5434
|
+
var UNREVIEWED_COUNTRIES = /* @__PURE__ */ Object.freeze(["ar", "br"]);
|
|
5435
|
+
var PAYU_LATAM_CARD_BRANDS = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMEX", "DINERS"]);
|
|
5436
|
+
var BODY_LIMIT33 = 65536;
|
|
5437
|
+
var URL_LIMIT13 = 256;
|
|
5438
|
+
var SUBMIT_PATH = /^\/ppp-web-gateway-payu\/checkout\/submit\/([a-z]{2})\/credit_card\/([0-9a-f]{32})$/;
|
|
5439
|
+
var KEY = /^[0-9a-f]{32}$/;
|
|
5440
|
+
var CARD_KEYS14 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear", "cardType"]);
|
|
5441
|
+
var CARD_REQUIRED2 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear"]);
|
|
5442
|
+
var CARD_TYPES2 = /* @__PURE__ */ Object.freeze(["CREDIT", "DEBIT", "PREPAID"]);
|
|
5443
|
+
var NOT_THE_CARD_FORM = /* @__PURE__ */ Object.freeze([
|
|
5444
|
+
"checkoutPaymentMethod",
|
|
5445
|
+
"response",
|
|
5446
|
+
"checkoutPse",
|
|
5447
|
+
"checkoutKhipu",
|
|
5448
|
+
"smsCode",
|
|
5449
|
+
"checkoutDebitCard"
|
|
5450
|
+
]);
|
|
5451
|
+
var TRANSACTION_MEMBERS = /* @__PURE__ */ Object.freeze([
|
|
5452
|
+
"id",
|
|
5453
|
+
"key",
|
|
5454
|
+
"isPaymentAttempt",
|
|
5455
|
+
"payer",
|
|
5456
|
+
"state",
|
|
5457
|
+
"merchantId",
|
|
5458
|
+
"orderId",
|
|
5459
|
+
"order",
|
|
5460
|
+
"checkoutPaymentMethod",
|
|
5461
|
+
"paymentNetwork",
|
|
5462
|
+
"paymentMethodType",
|
|
5463
|
+
"paymentMethodMain",
|
|
5464
|
+
"bank",
|
|
5465
|
+
"paymentAgreementId",
|
|
5466
|
+
"paymentCountry",
|
|
5467
|
+
"paymentExchangeRate",
|
|
5468
|
+
"response",
|
|
5469
|
+
"expirationDate",
|
|
5470
|
+
"lastUpdatedDate",
|
|
5471
|
+
"creationDate",
|
|
5472
|
+
"termsAndConditionId",
|
|
5473
|
+
"installments",
|
|
5474
|
+
"installmentValue",
|
|
5475
|
+
"internationalCard",
|
|
5476
|
+
"checkoutVersion",
|
|
5477
|
+
"payerCommissionValue",
|
|
5478
|
+
"payerInterestValue",
|
|
5479
|
+
"payerPricingValue",
|
|
5480
|
+
"promotionId",
|
|
5481
|
+
"shippingValue",
|
|
5482
|
+
"shipmentMerchantValue",
|
|
5483
|
+
"additionalValue",
|
|
5484
|
+
"administrativeFee",
|
|
5485
|
+
"payerTotalAmount",
|
|
5486
|
+
"source",
|
|
5487
|
+
"integrationMethod",
|
|
5488
|
+
"cardType",
|
|
5489
|
+
"creditCardCountry",
|
|
5490
|
+
"shippingInfo",
|
|
5491
|
+
"questionnaire",
|
|
5492
|
+
"merchantSoftDescriptor",
|
|
5493
|
+
"pmNetworkValue",
|
|
5494
|
+
"tea",
|
|
5495
|
+
"cft",
|
|
5496
|
+
"hasPaymentByPoints",
|
|
5497
|
+
"loyaltyProgramRedeemedAmount",
|
|
5498
|
+
"loyaltyProgramRedeemedPoints",
|
|
5499
|
+
"lendingEligible",
|
|
5500
|
+
"registerLendingDevice",
|
|
5501
|
+
"lendingDeviceToken",
|
|
5502
|
+
"abandonedLendingTransaction",
|
|
5503
|
+
"masterpassObfuscateCreditCardNumber",
|
|
5504
|
+
"isMasterpass",
|
|
5505
|
+
"brandName",
|
|
5506
|
+
"transactionType",
|
|
5507
|
+
"nossoNumero",
|
|
5508
|
+
"paymentTaxesDetails",
|
|
5509
|
+
"shopifyGid",
|
|
5510
|
+
"shopifyVersion",
|
|
5511
|
+
"shopifyShopDomain",
|
|
5512
|
+
"shopifyRedirectTime",
|
|
5513
|
+
"paymentCancelUrl",
|
|
5514
|
+
"checkoutCreditCard",
|
|
5515
|
+
"isRegisterPayer",
|
|
5516
|
+
"creditCardTokenId",
|
|
5517
|
+
"checkoutPse",
|
|
5518
|
+
"checkoutKhipu",
|
|
5519
|
+
"smsCode",
|
|
5520
|
+
"checkoutDebitCard"
|
|
5521
|
+
]);
|
|
5522
|
+
var ADDRESS = ["street1", "street2", "street3", "city", "state", "country", "postalCode", "phone"];
|
|
5523
|
+
var PERSON = [
|
|
5524
|
+
"fullName",
|
|
5525
|
+
"emailAddress",
|
|
5526
|
+
"contactPhone",
|
|
5527
|
+
"phoneCountryCode",
|
|
5528
|
+
"dniNumber",
|
|
5529
|
+
"isDniNumberEncrypt",
|
|
5530
|
+
"dniType",
|
|
5531
|
+
"personType",
|
|
5532
|
+
"businessName",
|
|
5533
|
+
"cnpj",
|
|
5534
|
+
"gender"
|
|
5535
|
+
];
|
|
5536
|
+
var MONEY = ["value", "symbol", "currency"];
|
|
5537
|
+
var RECORD_MEMBERS = /* @__PURE__ */ Object.freeze({
|
|
5538
|
+
payer: [...PERSON, "merchantBuyerId", "billingAddress", "birthDate", "identificationNumber", "identificationType"],
|
|
5539
|
+
"payer.billingAddress": ADDRESS,
|
|
5540
|
+
order: [
|
|
5541
|
+
"id",
|
|
5542
|
+
"referenceCode",
|
|
5543
|
+
"airlineCode",
|
|
5544
|
+
"description",
|
|
5545
|
+
"isTest",
|
|
5546
|
+
"signature",
|
|
5547
|
+
"language",
|
|
5548
|
+
"buyer",
|
|
5549
|
+
"shipment",
|
|
5550
|
+
"state",
|
|
5551
|
+
"status",
|
|
5552
|
+
"paymentApprovalDate",
|
|
5553
|
+
"creationDate",
|
|
5554
|
+
"accountId",
|
|
5555
|
+
"amount",
|
|
5556
|
+
"tax",
|
|
5557
|
+
"totalPurchase",
|
|
5558
|
+
"currency",
|
|
5559
|
+
"amountConvertedValue",
|
|
5560
|
+
"taxConvertedValue",
|
|
5561
|
+
"taxReturnBase",
|
|
5562
|
+
"taxReturnBaseConvertedValue",
|
|
5563
|
+
"additionalValue",
|
|
5564
|
+
"administrativeFee",
|
|
5565
|
+
"taxAdministrativeFee",
|
|
5566
|
+
"taxAdministrativeFeeReturnBase",
|
|
5567
|
+
"enabledPaymentMethods",
|
|
5568
|
+
"enabledInstallments",
|
|
5569
|
+
"enabledPaymentMethodTypes",
|
|
5570
|
+
"enabledIin",
|
|
5571
|
+
"enabledPseBanks",
|
|
5572
|
+
"enabledKhipuBanks",
|
|
5573
|
+
"paymentMethodsDescription",
|
|
5574
|
+
"urlEncodedId",
|
|
5575
|
+
"shippingValue",
|
|
5576
|
+
"paymentRequestLinkId",
|
|
5577
|
+
"airlineDescription",
|
|
5578
|
+
"displayShipping",
|
|
5579
|
+
"displayBuyerComments",
|
|
5580
|
+
"buyerCommentsLabel",
|
|
5581
|
+
"extraParameters",
|
|
5582
|
+
"dispersion"
|
|
5583
|
+
],
|
|
5584
|
+
"order.buyer": [...PERSON, "merchantBuyerId", "buyerAddress", "comments"],
|
|
5585
|
+
"order.buyer.buyerAddress": ADDRESS,
|
|
5586
|
+
"order.shipment": [...PERSON, "merchantShipmentId", "shippingAddress", "comments"],
|
|
5587
|
+
"order.shipment.shippingAddress": ADDRESS,
|
|
5588
|
+
"order.amount": MONEY,
|
|
5589
|
+
"order.tax": MONEY,
|
|
5590
|
+
"order.totalPurchase": MONEY,
|
|
5591
|
+
"order.amountConvertedValue": MONEY,
|
|
5592
|
+
"order.taxConvertedValue": MONEY,
|
|
5593
|
+
"order.taxReturnBase": MONEY,
|
|
5594
|
+
"order.taxReturnBaseConvertedValue": MONEY,
|
|
5595
|
+
shippingInfo: [
|
|
5596
|
+
"userLogin",
|
|
5597
|
+
"id",
|
|
5598
|
+
"reference",
|
|
5599
|
+
"description",
|
|
5600
|
+
"currency",
|
|
5601
|
+
"deliveryCity",
|
|
5602
|
+
"deliveryCityName",
|
|
5603
|
+
"deliveryAddress1",
|
|
5604
|
+
"deliveryAddress2",
|
|
5605
|
+
"deliveryAddress3",
|
|
5606
|
+
"postalCode",
|
|
5607
|
+
"fullName",
|
|
5608
|
+
"documentType",
|
|
5609
|
+
"document",
|
|
5610
|
+
"phoneNumber",
|
|
5611
|
+
"observationsReceivingShipment",
|
|
5612
|
+
"destinationState",
|
|
5613
|
+
"destinationStateName",
|
|
5614
|
+
"destinationCountry",
|
|
5615
|
+
"destinationEmail",
|
|
5616
|
+
"originFullName",
|
|
5617
|
+
"originIdentificationType",
|
|
5618
|
+
"originIdentification",
|
|
5619
|
+
"originCity",
|
|
5620
|
+
"originState",
|
|
5621
|
+
"originCountry",
|
|
5622
|
+
"originAddress",
|
|
5623
|
+
"originZipCode",
|
|
5624
|
+
"originPhone",
|
|
5625
|
+
"originEmail",
|
|
5626
|
+
"kilogramWeight",
|
|
5627
|
+
"volumetricWeight",
|
|
5628
|
+
"totalValue",
|
|
5629
|
+
"declaredValue",
|
|
5630
|
+
"shippingValue",
|
|
5631
|
+
"guideNumber",
|
|
5632
|
+
"enlistmentApplies",
|
|
5633
|
+
"deliveryDate",
|
|
5634
|
+
"deliveryDays",
|
|
5635
|
+
"minDeliveryDays",
|
|
5636
|
+
"packageHeight",
|
|
5637
|
+
"packageWidth",
|
|
5638
|
+
"packageLength",
|
|
5639
|
+
"shippingProvider",
|
|
5640
|
+
"shippingState",
|
|
5641
|
+
"creationDate",
|
|
5642
|
+
"lastUpdateDate",
|
|
5643
|
+
"expirationDate",
|
|
5644
|
+
"signature",
|
|
5645
|
+
"strCreationDate",
|
|
5646
|
+
"comment",
|
|
5647
|
+
"warehouseId",
|
|
5648
|
+
"additionalDeliveryDays",
|
|
5649
|
+
"shippingMerchantValue"
|
|
5650
|
+
],
|
|
5651
|
+
// PayU's own ten, as transaction/create names them, and the merchant's extra1 to extra4 (the payment form's
|
|
5652
|
+
// optional fields), each text or nothing.
|
|
5653
|
+
"order.extraParameters": [
|
|
5654
|
+
"CURRENCY",
|
|
5655
|
+
"LANGUAGE",
|
|
5656
|
+
"ACCOUNT_ID",
|
|
5657
|
+
"ALGORITHM_SIGNATURE",
|
|
5658
|
+
"CHECKOUT_VERSION",
|
|
5659
|
+
"RESPONSE_URL",
|
|
5660
|
+
"IS_TEST",
|
|
5661
|
+
"SIGNATURE",
|
|
5662
|
+
"NOTIFY_URL",
|
|
5663
|
+
"IP_COUNTRY",
|
|
5664
|
+
"EXTRA1",
|
|
5665
|
+
"EXTRA2",
|
|
5666
|
+
"EXTRA3",
|
|
5667
|
+
"EXTRA4"
|
|
5668
|
+
]
|
|
5669
|
+
});
|
|
5670
|
+
var TEXT_RECORDS = /* @__PURE__ */ Object.freeze(["order.extraParameters"]);
|
|
5671
|
+
var CARD_WORDS = /* @__PURE__ */ Object.freeze([
|
|
5672
|
+
"card",
|
|
5673
|
+
"cards",
|
|
5674
|
+
"pan",
|
|
5675
|
+
"cvv",
|
|
5676
|
+
"cvv2",
|
|
5677
|
+
"cvc",
|
|
5678
|
+
"cvd",
|
|
5679
|
+
"csc",
|
|
5680
|
+
"ccv",
|
|
5681
|
+
"cc",
|
|
5682
|
+
"token",
|
|
5683
|
+
"masterpass",
|
|
5684
|
+
"wallet",
|
|
5685
|
+
"register",
|
|
5686
|
+
"recurring",
|
|
5687
|
+
"recurrent",
|
|
5688
|
+
"recurrence",
|
|
5689
|
+
"keep",
|
|
5690
|
+
"store",
|
|
5691
|
+
"save",
|
|
5692
|
+
"saved",
|
|
5693
|
+
"vault",
|
|
5694
|
+
"exp",
|
|
5695
|
+
"expiry",
|
|
5696
|
+
"expiration",
|
|
5697
|
+
"expiracion",
|
|
5698
|
+
"tarjeta",
|
|
5699
|
+
"tarjetas",
|
|
5700
|
+
"vencimiento"
|
|
5701
|
+
]);
|
|
5702
|
+
var OWN_CARD_MEMBERS = /* @__PURE__ */ Object.freeze([
|
|
5703
|
+
"checkoutCreditCard",
|
|
5704
|
+
"cardType",
|
|
5705
|
+
"internationalCard",
|
|
5706
|
+
"creditCardCountry",
|
|
5707
|
+
"isMasterpass",
|
|
5708
|
+
"masterpassObfuscateCreditCardNumber",
|
|
5709
|
+
"isRegisterPayer",
|
|
5710
|
+
"registerLendingDevice",
|
|
5711
|
+
"lendingDeviceToken",
|
|
5712
|
+
"creditCardTokenId",
|
|
5713
|
+
"checkoutDebitCard",
|
|
5714
|
+
"expirationDate",
|
|
5715
|
+
"shippingInfo.expirationDate"
|
|
5716
|
+
]);
|
|
5717
|
+
var SIGNATURE2 = /^[0-9a-f]{32,128}$/i;
|
|
5718
|
+
var OPAQUE_MEMBERS = /* @__PURE__ */ Object.freeze({
|
|
5719
|
+
key: /^[0-9a-f]{32}$/,
|
|
5720
|
+
"order.signature": SIGNATURE2,
|
|
5721
|
+
"order.extraParameters.SIGNATURE": SIGNATURE2,
|
|
5722
|
+
"shippingInfo.signature": SIGNATURE2,
|
|
5723
|
+
"order.urlEncodedId": /^[A-Za-z0-9+/=_-]{1,256}$/,
|
|
5724
|
+
shopifyGid: /^gid:\/\/shopify\/[A-Za-z]+\/[0-9]{1,20}$/
|
|
5725
|
+
});
|
|
5726
|
+
var IS_TEST_TEXT = /* @__PURE__ */ Object.freeze({ true: ["true", "1"], false: ["false", "0"] });
|
|
5727
|
+
var MASKS = /* @__PURE__ */ Object.freeze({ VISA: [4, 4, 4, 4], MASTERCARD: [4, 4, 4, 4], AMEX: [4, 6, 5], DINERS: [4, 6, 4] });
|
|
5728
|
+
var NETWORK2 = /* @__PURE__ */ Object.freeze({
|
|
5729
|
+
VISA: /^4(?:[0-9]{12}|[0-9]{15})$/,
|
|
5730
|
+
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})$/,
|
|
5731
|
+
AMEX: /^3[47][0-9]{13}$/,
|
|
5732
|
+
DINERS: /^(?:3(?:0[0-5]|[68][0-9])[0-9]{11}|3095[0-9]{10}|3[89][0-9]{12})$/
|
|
5733
|
+
});
|
|
5734
|
+
var SECURITY_CODE21 = /^[0-9]{3,4}$/;
|
|
5735
|
+
var COUNTRY6 = /^[A-Z]{2}$/;
|
|
5736
|
+
var record30 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5737
|
+
var owns7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
5738
|
+
var refuse35 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5739
|
+
var CARD34 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5740
|
+
var absent = (value, key) => !owns7(value, key) || value[key] === null;
|
|
5741
|
+
function payuLatamSubmitTarget(url) {
|
|
5742
|
+
if (typeof url !== "string" || url.length > URL_LIMIT13 || url.includes("?") || url.includes("#"))
|
|
5743
|
+
return null;
|
|
5744
|
+
let parsed;
|
|
5745
|
+
try {
|
|
5746
|
+
parsed = new URL(url);
|
|
5747
|
+
}
|
|
5748
|
+
catch {
|
|
5749
|
+
return null;
|
|
5750
|
+
}
|
|
5751
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
5752
|
+
return null;
|
|
5753
|
+
const environment2 = PAYU_LATAM_HOSTS.production.includes(parsed.hostname) ? "production" : PAYU_LATAM_HOSTS.sandbox.includes(parsed.hostname) ? "sandbox" : null;
|
|
5754
|
+
const match = environment2 === null ? null : SUBMIT_PATH.exec(parsed.pathname);
|
|
5755
|
+
if (match === null || !(PAYU_LATAM_COUNTRIES.includes(match[1]) || UNREVIEWED_COUNTRIES.includes(match[1])))
|
|
5756
|
+
return null;
|
|
5757
|
+
return Object.freeze({ host: parsed.hostname, environment: environment2, country: match[1], key: match[2] });
|
|
5758
|
+
}
|
|
5759
|
+
function readJson9(body) {
|
|
5760
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT33)
|
|
5761
|
+
return null;
|
|
5762
|
+
let at = 0;
|
|
5763
|
+
let nodes = 0;
|
|
5764
|
+
const fail = () => {
|
|
5765
|
+
throw new Error("invalid_payu_latam_json");
|
|
5766
|
+
};
|
|
5767
|
+
const space = () => {
|
|
5768
|
+
while (" \r\n".includes(body[at] ?? "\0"))
|
|
5769
|
+
at += 1;
|
|
5770
|
+
};
|
|
5771
|
+
const string = () => {
|
|
5772
|
+
space();
|
|
5773
|
+
const start = at;
|
|
5774
|
+
if (body[at++] !== '"')
|
|
5775
|
+
fail();
|
|
5776
|
+
while (at < body.length) {
|
|
5777
|
+
const character = body[at++];
|
|
5778
|
+
if (character === "\\") {
|
|
5779
|
+
at += 1;
|
|
5780
|
+
continue;
|
|
5781
|
+
}
|
|
5782
|
+
if (character === '"')
|
|
5783
|
+
return JSON.parse(body.slice(start, at));
|
|
5784
|
+
}
|
|
5785
|
+
return fail();
|
|
5786
|
+
};
|
|
5787
|
+
const value = (depth) => {
|
|
5788
|
+
if (depth > 8 || ++nodes > 4096)
|
|
5789
|
+
fail();
|
|
5790
|
+
space();
|
|
5791
|
+
const character = body[at];
|
|
5792
|
+
if (character === '"')
|
|
5793
|
+
return string();
|
|
5794
|
+
if (character === "{") {
|
|
5795
|
+
at += 1;
|
|
5796
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
5797
|
+
const seen = /* @__PURE__ */ new Set();
|
|
5798
|
+
space();
|
|
5799
|
+
if (body[at] === "}") {
|
|
5800
|
+
at += 1;
|
|
5801
|
+
return result;
|
|
5802
|
+
}
|
|
5803
|
+
for (;;) {
|
|
5804
|
+
const key = string();
|
|
5805
|
+
if (seen.has(key) || ["__proto__", "prototype", "constructor"].includes(key))
|
|
5806
|
+
fail();
|
|
5807
|
+
seen.add(key);
|
|
5808
|
+
space();
|
|
5809
|
+
if (body[at++] !== ":")
|
|
5810
|
+
fail();
|
|
5811
|
+
result[key] = value(depth + 1);
|
|
5812
|
+
space();
|
|
5813
|
+
const next = body[at++];
|
|
5814
|
+
if (next === "}")
|
|
5815
|
+
return result;
|
|
5816
|
+
if (next !== ",")
|
|
5817
|
+
fail();
|
|
5818
|
+
}
|
|
5819
|
+
}
|
|
5820
|
+
if (character === "[") {
|
|
5821
|
+
at += 1;
|
|
5822
|
+
const result = [];
|
|
5823
|
+
space();
|
|
5824
|
+
if (body[at] === "]") {
|
|
5825
|
+
at += 1;
|
|
5826
|
+
return result;
|
|
5827
|
+
}
|
|
5828
|
+
for (;;) {
|
|
5829
|
+
result.push(value(depth + 1));
|
|
5830
|
+
space();
|
|
5831
|
+
const next = body[at++];
|
|
5832
|
+
if (next === "]")
|
|
5833
|
+
return result;
|
|
5834
|
+
if (next !== ",")
|
|
5835
|
+
fail();
|
|
5836
|
+
}
|
|
5837
|
+
}
|
|
5838
|
+
for (const literal of ["true", "false", "null"]) {
|
|
5839
|
+
if (body.startsWith(literal, at)) {
|
|
5840
|
+
at += literal.length;
|
|
5841
|
+
return JSON.parse(literal);
|
|
5842
|
+
}
|
|
5843
|
+
}
|
|
5844
|
+
const number = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/.exec(body.slice(at, at + 32));
|
|
5845
|
+
if (!number || /^-?[0-9]{16,}$/.test(number[0]))
|
|
5846
|
+
fail();
|
|
5847
|
+
at += number[0].length;
|
|
5848
|
+
const parsed = Number(number[0]);
|
|
5849
|
+
if (!Number.isFinite(parsed))
|
|
5850
|
+
fail();
|
|
5851
|
+
return parsed;
|
|
5852
|
+
};
|
|
5853
|
+
try {
|
|
5854
|
+
const parsed = value(0);
|
|
5855
|
+
space();
|
|
5856
|
+
return at === body.length && record30(parsed) ? parsed : null;
|
|
5857
|
+
}
|
|
5858
|
+
catch {
|
|
5859
|
+
return null;
|
|
5860
|
+
}
|
|
5861
|
+
}
|
|
5862
|
+
function cardNamed2(key) {
|
|
5863
|
+
const words = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^A-Za-z0-9]+/).filter(Boolean).map((word) => word.toLowerCase());
|
|
5864
|
+
const phrase = words.join(" ");
|
|
5865
|
+
return words.some((word) => CARD_WORDS.includes(word)) || ["security code", "codigo seguridad", "codigo verificacion"].some((said) => phrase.includes(said));
|
|
5866
|
+
}
|
|
5867
|
+
function carriesCardNumber(text8) {
|
|
5868
|
+
for (const [run] of text8.matchAll(/[0-9]+(?:[ ._/,-][0-9]+)*/g)) {
|
|
5869
|
+
const groups = run.split(/[ ._/,-]/);
|
|
5870
|
+
for (let first = 0; first < groups.length; first += 1) {
|
|
5871
|
+
let digits3 = "";
|
|
5872
|
+
for (let last = first; last < groups.length && digits3.length + groups[last].length <= 19; last += 1) {
|
|
5873
|
+
digits3 += groups[last];
|
|
5874
|
+
if (digits3.length >= 13 && digits3[0] >= "2" && digits3[0] <= "6" && luhn7(digits3))
|
|
5875
|
+
return true;
|
|
5876
|
+
}
|
|
5877
|
+
}
|
|
5878
|
+
}
|
|
5879
|
+
return false;
|
|
5880
|
+
}
|
|
5881
|
+
var wholeCardNumber = (text8) => /^[2-6][0-9]{12,18}$/.test(text8) && luhn7(text8);
|
|
5882
|
+
function membersRefusal(root) {
|
|
5883
|
+
const pending = [[root, ""]];
|
|
5884
|
+
while (pending.length > 0) {
|
|
5885
|
+
const [node, path] = pending.pop();
|
|
5886
|
+
const own12 = path === "" ? TRANSACTION_MEMBERS : owns7(RECORD_MEMBERS, path) ? RECORD_MEMBERS[path] : null;
|
|
5887
|
+
for (const [key, child] of Object.entries(node)) {
|
|
5888
|
+
const at = Array.isArray(node) ? path : path === "" ? key : `${path}.${key}`;
|
|
5889
|
+
if (at === "checkoutCreditCard")
|
|
5890
|
+
continue;
|
|
5891
|
+
if (own12 !== null && !own12.includes(key))
|
|
5892
|
+
return true;
|
|
5893
|
+
if (TEXT_RECORDS.includes(path) && child !== null && typeof child !== "string")
|
|
5894
|
+
return true;
|
|
5895
|
+
if (!Array.isArray(node) && owns7(OPAQUE_MEMBERS, at)) {
|
|
5896
|
+
if (child !== null && (typeof child !== "string" || !OPAQUE_MEMBERS[at].test(child) || wholeCardNumber(child)))
|
|
5897
|
+
return true;
|
|
5898
|
+
continue;
|
|
5899
|
+
}
|
|
5900
|
+
if (!Array.isArray(node) && !OWN_CARD_MEMBERS.includes(at) && cardNamed2(key) && child !== null && child !== false)
|
|
5901
|
+
return true;
|
|
5902
|
+
if (typeof child === "string" && carriesCardNumber(child))
|
|
5903
|
+
return true;
|
|
5904
|
+
if (typeof child === "number" && (!/Date$/.test(key) || String(child).length > 13) && carriesCardNumber(String(child)))
|
|
5905
|
+
return true;
|
|
5906
|
+
if (child !== null && typeof child === "object")
|
|
5907
|
+
pending.push([child, at]);
|
|
5908
|
+
}
|
|
5909
|
+
}
|
|
5910
|
+
return false;
|
|
5911
|
+
}
|
|
5912
|
+
function cardDigits(number, brand) {
|
|
5913
|
+
if (typeof number !== "string")
|
|
5914
|
+
return null;
|
|
5915
|
+
if (/^[0-9]{12,19}$/.test(number))
|
|
5916
|
+
return number;
|
|
5917
|
+
const groups = number.split(" ");
|
|
5918
|
+
const mask = MASKS[brand];
|
|
5919
|
+
if (!mask || groups.length !== mask.length || !groups.every((group, at) => group.length === mask[at] && /^[0-9]+$/.test(group)))
|
|
5920
|
+
return null;
|
|
5921
|
+
return groups.join("");
|
|
5922
|
+
}
|
|
5923
|
+
function luhn7(digits3) {
|
|
5924
|
+
let sum = 0;
|
|
5925
|
+
for (let at = digits3.length - 1, double = false; at >= 0; at -= 1, double = !double) {
|
|
5926
|
+
let digit = digits3.charCodeAt(at) - 48;
|
|
5927
|
+
if (double) {
|
|
5928
|
+
digit *= 2;
|
|
5929
|
+
if (digit > 9)
|
|
5930
|
+
digit -= 9;
|
|
5931
|
+
}
|
|
5932
|
+
sum += digit;
|
|
5933
|
+
}
|
|
5934
|
+
return sum % 10 === 0;
|
|
5935
|
+
}
|
|
5936
|
+
function cardRefusal(card, brand) {
|
|
5937
|
+
if (!record30(card) || !Object.keys(card).every((key) => CARD_KEYS14.includes(key)) || !CARD_REQUIRED2.every((key) => owns7(card, key))) {
|
|
5938
|
+
return "payu_latam_body_unsupported";
|
|
5939
|
+
}
|
|
5940
|
+
const digits3 = cardDigits(card.number, brand);
|
|
5941
|
+
if (digits3 === null || !NETWORK2[brand].test(digits3) || !luhn7(digits3))
|
|
5942
|
+
return "payu_latam_body_unsupported";
|
|
5943
|
+
const code = card.securityCode;
|
|
5944
|
+
if (typeof code !== "string" || !SECURITY_CODE21.test(code) || code.length !== (brand === "AMEX" ? 4 : 3))
|
|
5945
|
+
return "payu_latam_body_unsupported";
|
|
5946
|
+
const { expirationDateMonth: month, expirationDateYear: year } = card;
|
|
5947
|
+
if (!Number.isSafeInteger(month) || month < 1 || month > 12 || !Number.isSafeInteger(year) || year < 0 || year > 99)
|
|
5948
|
+
return "payu_latam_body_unsupported";
|
|
5949
|
+
if (!absent(card, "cardType") && !CARD_TYPES2.includes(card.cardType))
|
|
5950
|
+
return "payu_latam_body_unsupported";
|
|
5951
|
+
return null;
|
|
5952
|
+
}
|
|
5953
|
+
function judgeBody5(body, target) {
|
|
5954
|
+
const value = readJson9(body);
|
|
5955
|
+
if (value === null || value.paymentMethodType !== "CREDIT_CARD" || typeof value.key !== "string" || !KEY.test(value.key) || !record30(value.order) || !record30(value.payer))
|
|
5956
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5957
|
+
if (target !== void 0 && value.key !== target.key)
|
|
5958
|
+
return { code: "payu_latam_session_mismatch", value: null };
|
|
5959
|
+
if (!absent(value, "creditCardTokenId") || value.isMasterpass === true || !absent(value, "masterpassObfuscateCreditCardNumber")) {
|
|
5960
|
+
return { code: "payu_latam_saved_card", value: null };
|
|
5961
|
+
}
|
|
5962
|
+
if (NOT_THE_CARD_FORM.some((key) => !absent(value, key)) || membersRefusal(value) || !absent(value, "lendingDeviceToken") || !absent(value, "questionnaire") || !(absent(value, "registerLendingDevice") || value.registerLendingDevice === false))
|
|
5963
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5964
|
+
const brand = value.paymentMethodMain;
|
|
5965
|
+
if (typeof brand !== "string" || !PAYU_LATAM_CARD_BRANDS.includes(brand))
|
|
5966
|
+
return { code: "payu_latam_card_unsupported", value: null };
|
|
5967
|
+
const card = cardRefusal(value.checkoutCreditCard, brand);
|
|
5968
|
+
if (card !== null)
|
|
5969
|
+
return { code: card, value: null };
|
|
5970
|
+
if (value.installments !== 1 && value.installments !== "1")
|
|
5971
|
+
return { code: "payu_latam_installments_unsupported", value: null };
|
|
5972
|
+
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")
|
|
5973
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5974
|
+
const extra = value.order.extraParameters;
|
|
5975
|
+
if (!record30(extra) || !IS_TEST_TEXT[value.order.isTest].includes(extra.IS_TEST)) {
|
|
5976
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5977
|
+
}
|
|
5978
|
+
if (value.isRegisterPayer === true)
|
|
5979
|
+
return { code: "payu_latam_keep_on_file", value: null };
|
|
5980
|
+
if (!absent(value, "isRegisterPayer") && value.isRegisterPayer !== false)
|
|
5981
|
+
return { code: "payu_latam_body_unsupported", value: null };
|
|
5982
|
+
if (target !== void 0 && target.environment === "production" && value.order.isTest)
|
|
5983
|
+
return { code: "payu_latam_environment_mismatch", value: null };
|
|
5984
|
+
return { code: null, value };
|
|
5985
|
+
}
|
|
5986
|
+
function payuLatamBodyVerdict(body, url) {
|
|
5987
|
+
let target;
|
|
5988
|
+
if (url !== void 0) {
|
|
5989
|
+
target = payuLatamSubmitTarget(url);
|
|
5990
|
+
if (target === null)
|
|
5991
|
+
return refuse35("payu_latam_url_refused");
|
|
5992
|
+
if (!PAYU_LATAM_COUNTRIES.includes(target.country))
|
|
5993
|
+
return refuse35("payu_latam_country_unreviewed");
|
|
5994
|
+
}
|
|
5995
|
+
const { code } = judgeBody5(body, target);
|
|
5996
|
+
return code === null ? CARD34 : refuse35(code);
|
|
5997
|
+
}
|
|
5998
|
+
// src/registration.js
|
|
5999
|
+
var PARTS = { psp: "id", definitions: "list", refusedOperations: "list", settlementReadback: "any", exactUrl: "rule", bodyGate: "rule", amount: "rule" };
|
|
6000
|
+
var PSP_ID = /^[a-z][a-z0-9_]*$/;
|
|
6001
|
+
var registrationProblems = (spec) => problemsOf(spec, PARTS);
|
|
6002
|
+
function problemsOf(spec, parts) {
|
|
6003
|
+
if (!spec || typeof spec !== "object")
|
|
6004
|
+
return ["a registration is an object"];
|
|
6005
|
+
const psp = spec.psp;
|
|
6006
|
+
if (typeof psp !== "string" || !PSP_ID.test(psp))
|
|
6007
|
+
return [`${JSON.stringify(psp)} is not a processor id`];
|
|
6008
|
+
const problems2 = Object.keys(spec).filter((key) => !(key in parts)).map((key) => `${psp}: ${key} is no registration part`);
|
|
6009
|
+
for (const [key, kind] of Object.entries(parts)) {
|
|
6010
|
+
const value = spec[key];
|
|
6011
|
+
if (value === void 0)
|
|
6012
|
+
continue;
|
|
6013
|
+
if (kind === "rule" && typeof value !== "function")
|
|
6014
|
+
problems2.push(`${psp}: ${key} is not a function`);
|
|
6015
|
+
if (kind === "numbers" && !((Array.isArray(value) || value instanceof Set) && [...value].every((n) => typeof n === "string" && /^\d{12,19}$/.test(n)))) {
|
|
6016
|
+
problems2.push(`${psp}: ${key} is not a list of card numbers`);
|
|
6017
|
+
}
|
|
6018
|
+
}
|
|
6019
|
+
if ("definitions" in parts) {
|
|
6020
|
+
if (!Array.isArray(spec.definitions) || spec.definitions.length === 0)
|
|
6021
|
+
problems2.push(`${psp}: names no definition`);
|
|
6022
|
+
else if (spec.definitions.some((definition) => definition?.psp !== psp))
|
|
6023
|
+
problems2.push(`${psp}: a definition names another processor`);
|
|
6024
|
+
for (const id of spec.refusedOperations ?? []) {
|
|
6025
|
+
if (typeof id !== "string" || !id.startsWith(`${psp}.`))
|
|
6026
|
+
problems2.push(`${psp}: ${JSON.stringify(id)} is not one of its operations`);
|
|
6027
|
+
}
|
|
6028
|
+
}
|
|
6029
|
+
return problems2;
|
|
6030
|
+
}
|
|
6031
|
+
function registered(spec, parts) {
|
|
6032
|
+
const problems2 = problemsOf(spec, parts);
|
|
6033
|
+
if (problems2.length)
|
|
6034
|
+
throw new Error(`payment-core registration refused: ${problems2.join("; ")}`);
|
|
6035
|
+
return deepFreeze({ ...spec });
|
|
6036
|
+
}
|
|
6037
|
+
function registerProcessor(spec) {
|
|
6038
|
+
return registered(spec, PARTS);
|
|
6039
|
+
}
|
|
6040
|
+
// src/processors/midtrans.js
|
|
6041
|
+
var MIDTRANS_PSP = "midtrans";
|
|
6042
|
+
var MIDTRANS_OPERATION = "midtrans.card_request";
|
|
6043
|
+
var MIDTRANS_TOKEN_URL = "https://api.midtrans.com/v2/token";
|
|
6044
|
+
var MIDTRANS_SANDBOX_TOKEN_URL = "https://api.sandbox.midtrans.com/v2/token";
|
|
6045
|
+
var MIDTRANS_TOKEN_KEYS = /* @__PURE__ */ Object.freeze(["card_cvv", "card_number", "card_exp_month", "card_exp_year", "installment_term"]);
|
|
6046
|
+
var BODY_LIMIT34 = 4096;
|
|
6047
|
+
var CARD_NUMBER17 = /^[0-9]{12,19}$/;
|
|
6048
|
+
var SECURITY_CODE22 = /^[0-9]{3,4}$/;
|
|
6049
|
+
var MONTH18 = /^(?:0[1-9]|1[0-2])$/;
|
|
6050
|
+
var YEAR19 = /^20[0-9]{2}$/;
|
|
6051
|
+
var TERM = /^[0-9]{1,3}$/;
|
|
6052
|
+
var record31 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
6053
|
+
var own11 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
6054
|
+
var inOrder6 = (value, keys) => {
|
|
6055
|
+
let at = 0;
|
|
6056
|
+
for (const name of Object.keys(value)) {
|
|
6057
|
+
while (at < keys.length && keys[at] !== name)
|
|
6058
|
+
at += 1;
|
|
6059
|
+
if (at === keys.length)
|
|
6060
|
+
return false;
|
|
6061
|
+
at += 1;
|
|
6062
|
+
}
|
|
6063
|
+
return true;
|
|
6064
|
+
};
|
|
6065
|
+
var refuse36 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
6066
|
+
var CARD35 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
6067
|
+
function isMidtransTokenUrl(url) {
|
|
6068
|
+
return url === MIDTRANS_TOKEN_URL || url === MIDTRANS_SANDBOX_TOKEN_URL;
|
|
6069
|
+
}
|
|
6070
|
+
function readBody20(body) {
|
|
6071
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT34)
|
|
6072
|
+
return null;
|
|
6073
|
+
let value;
|
|
6074
|
+
try {
|
|
6075
|
+
value = JSON.parse(body);
|
|
6076
|
+
if (!record31(value) || JSON.stringify(value) !== body)
|
|
6077
|
+
return null;
|
|
6078
|
+
}
|
|
6079
|
+
catch {
|
|
6080
|
+
return null;
|
|
6081
|
+
}
|
|
6082
|
+
return value;
|
|
6083
|
+
}
|
|
6084
|
+
function midtransBodyVerdict(body) {
|
|
6085
|
+
const value = readBody20(body);
|
|
6086
|
+
if (value === null || !inOrder6(value, MIDTRANS_TOKEN_KEYS)) {
|
|
6087
|
+
if (record31(value) && (own11(value, "token_id") || own11(value, "two_click")) && !own11(value, "card_number"))
|
|
6088
|
+
return refuse36("midtrans_saved_card");
|
|
6089
|
+
return refuse36("midtrans_body_unsupported");
|
|
6090
|
+
}
|
|
6091
|
+
if (!own11(value, "card_cvv") || !own11(value, "card_number") || !own11(value, "card_exp_month") || !own11(value, "card_exp_year")) {
|
|
6092
|
+
return refuse36("midtrans_body_unsupported");
|
|
6093
|
+
}
|
|
6094
|
+
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))
|
|
6095
|
+
return refuse36("midtrans_body_unsupported");
|
|
6096
|
+
if (own11(value, "installment_term") && (typeof value.installment_term !== "string" || !TERM.test(value.installment_term)))
|
|
6097
|
+
return refuse36("midtrans_body_unsupported");
|
|
6098
|
+
return CARD35;
|
|
6099
|
+
}
|
|
6100
|
+
var midtrans_default = /* @__PURE__ */ registerProcessor({
|
|
6101
|
+
psp: MIDTRANS_PSP,
|
|
6102
|
+
definitions: [
|
|
6103
|
+
{
|
|
6104
|
+
psp: "midtrans",
|
|
6105
|
+
// Snap's token request, as the header above reads it. Sandbox has its own host, so the device sends a
|
|
6106
|
+
// test-mode request only Midtrans' documented test cards (hostEnvironmentPinned, device-replay.js S7).
|
|
6107
|
+
// Ships dark: served only to a client that declares `midtrans_card_token`, gated off for every org until an
|
|
6108
|
+
// operator lists one (`midtrans:<org>`), and the backend's gate serves only Agentcard's own company until the
|
|
6109
|
+
// token's publishable key is bound to the merchant (backend config.ts MIDTRANS_KEY_BOUND_TO_MERCHANT).
|
|
6110
|
+
capability: "midtrans_card_token",
|
|
6111
|
+
match: "api\\.(?:sandbox\\.)?midtrans\\.com/v2/token",
|
|
6112
|
+
hosts: ["^api\\.midtrans\\.com$", "^api\\.sandbox\\.midtrans\\.com$"],
|
|
6113
|
+
sandboxHosts: ["^api\\.sandbox\\.midtrans\\.com$"],
|
|
6114
|
+
hostEnvironmentPinned: true,
|
|
6115
|
+
encoding: "json",
|
|
6116
|
+
// Snap's own headers: the publishable client key (Authorization Basic) and X-Service. Origin, Referer and
|
|
6117
|
+
// cookies never ride.
|
|
6118
|
+
passthroughHeaders: ["^authorization$", "^x-service$"],
|
|
6119
|
+
jsonCardFields: [["card_number"]]
|
|
6120
|
+
}
|
|
6121
|
+
],
|
|
6122
|
+
// Only the cardholder's device sends a token, after a person approves; no reviewed list names midtrans.
|
|
6123
|
+
refusedOperations: [MIDTRANS_OPERATION],
|
|
6124
|
+
// Not surveyed: the token moves no money, and the merchant's own charge names its status by the order id alone.
|
|
6125
|
+
settlementReadback: "not_surveyed",
|
|
6126
|
+
exactUrl: isMidtransTokenUrl,
|
|
6127
|
+
bodyGate: (url, body) => url !== void 0 && !isMidtransTokenUrl(url) ? { verdict: "refuse", code: "midtrans_url_refused" } : midtransBodyVerdict(body)
|
|
6128
|
+
});
|
|
6129
|
+
// src/processors/index.generated.js
|
|
6130
|
+
var REGISTERED_MODULES = Object.freeze({
|
|
6131
|
+
midtrans: midtrans_default
|
|
6132
|
+
});
|
|
6133
|
+
// src/registry.js
|
|
6134
|
+
var REGISTERED_PROCESSORS = Object.values(REGISTERED_MODULES);
|
|
6135
|
+
var ids = REGISTERED_PROCESSORS.map((processor) => processor.psp);
|
|
6136
|
+
var problems = REGISTERED_PROCESSORS.flatMap(registrationProblems);
|
|
6137
|
+
for (const [name, processor] of Object.entries(REGISTERED_MODULES)) {
|
|
6138
|
+
if (processor.psp !== name)
|
|
6139
|
+
problems.push(`processors/${name}.js registers ${JSON.stringify(processor.psp)}`);
|
|
6140
|
+
}
|
|
6141
|
+
if (ids.some((id, i) => i > 0 && ids[i - 1] >= id))
|
|
6142
|
+
problems.push(`registered processors out of id order: ${ids.join(", ")}`);
|
|
6143
|
+
if (problems.length)
|
|
6144
|
+
throw new Error(`payment-core registry refused: ${problems.join("; ")}`);
|
|
6145
|
+
var BY_PSP = new Map(REGISTERED_PROCESSORS.map((processor) => [processor.psp, processor]));
|
|
6146
|
+
var REGISTERED_IDS = Object.freeze(ids);
|
|
6147
|
+
var REGISTERED_DEFINITIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.definitions));
|
|
6148
|
+
var REGISTERED_REFUSED_OPERATIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.refusedOperations ?? []));
|
|
6149
|
+
var REGISTERED_SETTLEMENT_READBACK = Object.freeze(REGISTERED_PROCESSORS.filter((processor) => processor.settlementReadback !== void 0).map((processor) => [processor.psp, processor.settlementReadback]));
|
|
6150
|
+
function registeredRule(psp, name) {
|
|
6151
|
+
return typeof psp === "string" ? BY_PSP.get(psp)?.[name] : void 0;
|
|
6152
|
+
}
|
|
5066
6153
|
// src/card-fields.js
|
|
5067
6154
|
function processorGate(recognizer, url, body) {
|
|
5068
6155
|
if (recognizer && recognizer.psp === LYRA_PSP)
|
|
@@ -5100,6 +6187,8 @@ function processorGate(recognizer, url, body) {
|
|
|
5100
6187
|
return { verdict: "refuse", code: "toast_url_refused" };
|
|
5101
6188
|
return toastBodyVerdict(body);
|
|
5102
6189
|
}
|
|
6190
|
+
if (recognizer && recognizer.psp === PAYU_LATAM_PSP)
|
|
6191
|
+
return payuLatamBodyVerdict(body, url);
|
|
5103
6192
|
if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
|
|
5104
6193
|
if (url !== void 0 && !isPaddleVgsCardsUrl(url))
|
|
5105
6194
|
return { verdict: "refuse", code: "paddle_vgs_url_refused" };
|
|
@@ -5183,6 +6272,11 @@ function processorGate(recognizer, url, body) {
|
|
|
5183
6272
|
return { verdict: "refuse", code: "xendit_url_refused" };
|
|
5184
6273
|
return xenditBodyVerdict(body);
|
|
5185
6274
|
}
|
|
6275
|
+
if (recognizer && recognizer.psp === PAYMOB_PSP) {
|
|
6276
|
+
if (url !== void 0 && !isPaymobPayUrl(url))
|
|
6277
|
+
return { verdict: "refuse", code: "paymob_url_refused" };
|
|
6278
|
+
return paymobBodyVerdict(body);
|
|
6279
|
+
}
|
|
5186
6280
|
if (recognizer && recognizer.psp === GRAVY_PSP)
|
|
5187
6281
|
return gravyBodyVerdict(body);
|
|
5188
6282
|
if (recognizer && recognizer.psp === MONERIS_PSP) {
|
|
@@ -5190,6 +6284,14 @@ function processorGate(recognizer, url, body) {
|
|
|
5190
6284
|
return { verdict: "refuse", code: "moneris_url_refused" };
|
|
5191
6285
|
return monerisBodyVerdict(body);
|
|
5192
6286
|
}
|
|
6287
|
+
if (recognizer && recognizer.psp === TAPPAY_PSP) {
|
|
6288
|
+
if (url !== void 0 && !isTappayGetPrimeUrl(url))
|
|
6289
|
+
return { verdict: "refuse", code: "tappay_url_refused" };
|
|
6290
|
+
return tappayBodyVerdict(body);
|
|
6291
|
+
}
|
|
6292
|
+
const ownGate = registeredRule(recognizer?.psp, "bodyGate");
|
|
6293
|
+
if (ownGate)
|
|
6294
|
+
return ownGate(url, body);
|
|
5193
6295
|
if (!recognizer || recognizer.psp !== "elavon_converge")
|
|
5194
6296
|
return null;
|
|
5195
6297
|
if (url !== void 0 && !isConvergeProcessUrl(url))
|
|
@@ -5300,7 +6402,7 @@ function splitCardLeg(recognizer, body) {
|
|
|
5300
6402
|
const absorb = list(split.absorb);
|
|
5301
6403
|
const pass = list(split.pass);
|
|
5302
6404
|
const sibling = list(split.siblingKeys);
|
|
5303
|
-
const
|
|
6405
|
+
const own12 = [];
|
|
5304
6406
|
const seen = /* @__PURE__ */ new Set();
|
|
5305
6407
|
for (const chunk of body.split("&")) {
|
|
5306
6408
|
const eq = chunk.indexOf("=");
|
|
@@ -5317,13 +6419,13 @@ function splitCardLeg(recognizer, body) {
|
|
|
5317
6419
|
return null;
|
|
5318
6420
|
seen.add(key);
|
|
5319
6421
|
if (!sibling.includes(key))
|
|
5320
|
-
|
|
6422
|
+
own12.push(key);
|
|
5321
6423
|
}
|
|
5322
|
-
if (
|
|
6424
|
+
if (own12.length === 0)
|
|
5323
6425
|
return null;
|
|
5324
|
-
if (
|
|
6426
|
+
if (own12.every((key) => absorb.includes(key)))
|
|
5325
6427
|
return "absorb";
|
|
5326
|
-
if (
|
|
6428
|
+
if (own12.every((key) => pass.includes(key)))
|
|
5327
6429
|
return "pass";
|
|
5328
6430
|
return null;
|
|
5329
6431
|
}
|