@agent-cards/sdk 0.23.3 → 0.23.4
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 +2 -0
- package/README.md +3 -3
- package/dist/adyen-merchant-hosted.generated.js +134 -127
- package/dist/merchant-hosted.js +2 -1
- package/dist/merchant-total.js +4 -1
- package/dist/substitutions.generated.js +134 -127
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
- Recognize Target Optical's card request as its checkout sends it today: a JSON `PUT` to `/wcs/resources/store/12001/cart/@self/addPayment` with the page's `nocache` query, the total in `piAmount` with five decimals (`"49.42000"`). The profile described the form post Target Optical's older checkout sent, which no request matches now, so the adapters let the dummy card reach Target Optical. The profile stays in observe: both adapters now pause that request and refuse it as `unsupported_checkout` before any authorization, let the saved-card body to the same URL through untouched, and abort the card save a signed-in shopper's page sends to `/wcs/resources/store/12001/mypayments` in every status. They also abort, in every status, a post to `/AjaxOrderChangeServicePIAddTO`, the form endpoint the older checkout used, which they refused before and which the storefront still declares in a script it serves, so moving the profile to the `PUT` leaves no path where the dummy card reaches Target Optical. `attachToPlaywright` routes a reviewed card endpoint's request by every method the profiles name; it asked only for `POST`, so a `PUT` card request or resend never reached its gates. A card endpoint create names the profile's own method in `request.method`; an API that reads every card endpoint request as a `POST` refuses a `PUT` create with `invalid_request`, so nothing is charged. TypeScript: `CardEndpointProfile.method` can be `PUT`.
|
|
12
12
|
|
|
13
|
+
- Pay Cinemark and Dick's Sporting Goods' own storefront, two reviewed Adyen merchants that take the card on their own server. Both profiles, `cinemark_initiate` and `dsg_paygate_v2`, ship `enabled`, and the API serves them `enabled` only to a client of a company Agentcard turned them on for. For every other client the adapters keep pausing and aborting their card requests as `merchant_profile_observed`, as before. A payment there needs a preparation for the profile and the cardholder's approval in the Vault, and Autopilot never pays one. The create carries the merchant's own checkout total as your agent's browser read it, and the API refuses a payment whose amount is not that total. Dick's paygate at Golf Galaxy, Public Lands and Going Going Gone moves to its own profile, `dsg_other_stores_paygate_v2`, which ships in `observe`, so the adapters abort those card requests as before. Matching API and Vault releases are required.
|
|
14
|
+
|
|
13
15
|
- Stop the card fields adyen-web 5 encrypts at a reviewed Adyen merchant profile. adyen-web 5 seals each field as an RSA-OAEP / A256CBC-HS512 JWE, where adyen-web 6 writes RSA-OAEP-256 / A256GCM, and the SDK read only adyen-web 6's form. So the card requests of Cathay Pacific's payment page and Dunelm's legacy checkout, and Cathay's charge request after its signing step, reached the merchant with the agent's dummy card. The adapters now read both forms as a card. Both profiles ship in `observe`, so the adapters abort each of these requests before it leaves the browser and report it as `merchant_profile_observed`. The Vault writes only adyen-web 6's form, so the API refuses a create for a card request in adyen-web 5's form with `cse_template_unsupported`, and nothing is charged.
|
|
14
16
|
|
|
15
17
|
- Abort the requests in which IHG's pay page sends the typed card outside its reviewed card request, in every status, as `card_endpoint_refused` with reason `card_resend`. The page posts the same booking to IHG's enrollment service while its pre-ticked "Enroll for free" box stays ticked, posts it on other paths for more than one room, a travel agent or Business Rewards, and at a hotel that asks for 3-D Secure first posts the number to two 3-D Secure calls. The SDK let each of these reach IHG with the agent's dummy card. A booking with the box unticked reaches IHG's reviewed card request, which the adapters refuse as before while IHG is in `observe`.
|
package/README.md
CHANGED
|
@@ -255,7 +255,7 @@ Coverage is specific to the processor request format, merchant setup, browser tr
|
|
|
255
255
|
| Mercado Pago | Card tokenization and prepared checkout are implemented. Guest Checkout Pro in Mexico also corrects the issuer for one native card association when the selected card has the same brand and type. One live MXN 40 Lotería Chida purchase with published SDK 0.10.0 completed automatically through Pay; the merchant confirmed paid status and PDF fulfillment. The historical SDK result remains unknown because the private receipt adapter rejected a relative download URL; a separate read with the corrected adapter confirms that same paid receipt. Independent processor capture/settlement and other country or integration paths remain unverified. |
|
|
256
256
|
| VGS Collect (Very Good Security; Wolt) | not supported: VGS's proxy aliases only submissions from its own iframe, so a replay from the cardholder's device is refused by the merchant (verified on Wolt, 2026-09-03). Not recognized, so the agent's browser is not paused there |
|
|
257
257
|
| PayPal Hosted Fields (the legacy card fields of PayPal's JS SDK; Planet Golf UK) | not supported: no Agentcard payment takes over the card these fields send to `cors.api.paypal.com`. The SDK fails that request for every company, so PayPal's payment confirm never receives the dummy card, and the controller reads `unsupported` with reason `unsupported_paypal_hosted_fields` and holds the attachment until you attach again; a PayPal wallet payment continues untouched |
|
|
258
|
-
| Adyen | supported (mode `cse`): the vault encrypts the card for Adyen on the cardholder's device and your browser sends it. Sessions flow: the paused request is `/checkoutshopper/v1/sessions/{id}/payments` on Adyen's own hosts. A merchant that posts the encrypted fields to its own server pauses only when Agentcard reviewed it as a merchant profile
|
|
258
|
+
| Adyen | supported (mode `cse`): the vault encrypts the card for Adyen on the cardholder's device and your browser sends it. Sessions flow: the paused request is `/checkoutshopper/v1/sessions/{id}/payments` on Adyen's own hosts. A merchant that posts the encrypted fields to its own server pauses only when Agentcard reviewed it as a merchant profile. Cinemark and Dick's Sporting Goods' own storefront take payments for a company Agentcard turned them on for; every other reviewed merchant is in `observe`, so its card requests are reported and aborted and nothing pays there yet (see "Adyen merchants that take the card on their own server"). Without a preparation, approval starts at Pay and must land before Adyen Web's own request timeout (observed at 60 seconds on Adyen Web 6.41 and 6.44; not enforced by the SDK); `prepare({ psp: 'adyen' })` moves the approval before Pay |
|
|
259
259
|
| ACI Worldwide COPYandPAY (Halfords) | dark launch: served only after `syncRegistry()` and only for an org Agentcard enabled; prepared checkout only. The card-number request is replayed from the cardholder's device, the page's own CVC and expiry requests are answered locally, and `/payment` continues once. See [Pay an ACI COPYandPAY checkout](#pay-an-aci-copyandpay-checkout) |
|
|
260
260
|
| Tranzila | supported (mode `hosted_form`): the cardholder finishes on Tranzila's own page; the paused form navigation resolves to a synthetic page, and you poll the merchant's order state |
|
|
261
261
|
| Fiserv Commerce Hub | implemented (mode `cse`, prepared checkout only) and off until Agentcard turns it on for your company: the card frame's card capture on `connect.fiservapis.com` (or `connect-cert.fiservapis.com` in the sandbox), with the approved card encrypted on the cardholder's device under a key Agentcard reviewed for the merchant. A merchant whose frame posts to Fiserv's `payment-link` endpoint is not recognized. No live merchant purchase is verified yet |
|
|
@@ -1252,7 +1252,7 @@ Some Adyen merchants have adyen-web encrypt the card into four fields and post t
|
|
|
1252
1252
|
|
|
1253
1253
|
- A request that carries no encrypted card (a basket query, a preflight) continues as before.
|
|
1254
1254
|
- A body the browser did not hand over (a blob or a file, which neither adapter can read) is not proven card-free, so any request but a `GET`, `HEAD` or `OPTIONS` that carries one is treated as a card request the profile cannot finish. Playwright reports a missing body the same way, so an empty body is treated alike in both adapters.
|
|
1255
|
-
- A profile in `observe` never pays. Its card request is aborted before it reaches the merchant, and the adapters report `merchant_profile_observed` with the profile, the templated URL, the verdict and `keyPathSha256`, the SHA-256 of the body's sorted key paths (never a value; `null` for a body that was not read), then `unsupported_checkout`. The controller reads `unsupported` with reason `merchant_profile_observe`, and no authorization exists.
|
|
1255
|
+
- A profile in `observe` never pays. Its card request is aborted before it reaches the merchant, and the adapters report `merchant_profile_observed` with the profile, the templated URL, the verdict and `keyPathSha256`, the SHA-256 of the body's sorted key paths (never a value; `null` for a body that was not read), then `unsupported_checkout`. The controller reads `unsupported` with reason `merchant_profile_observe`, and no authorization exists. `cinemark_initiate` and `dsg_paygate_v2` (Dick's Sporting Goods' own storefront) ship `enabled`, and the API serves them `enabled` only to a client of a company Agentcard turned them on for. Every other reviewed profile ships in `observe`, `dunelm_was_graphql` and `dsg_other_stores_paygate_v2` (Dick's paygate at Golf Galaxy, Public Lands and Going Going Gone) among them.
|
|
1256
1256
|
- A card request the profile cannot finish (storing the card, a stored card, another operation, three fields instead of four, a sibling endpoint, an unreadable body) is aborted with `unsupported_checkout` and the reason, and reads `unsupported` with reason `merchant_request_unsupported`.
|
|
1257
1257
|
- The profile's own card request, once Agentcard enables the profile for your client and this build, pays only through a preparation for that profile. Without one it is aborted before any pause, prompt or authorization: the adapters report `blocked` with `preparation_required`, the controller reads `failed` with that reason, and `prepare()` is refused on that attachment, as after any first card request. Create a new attachment and prepare before Pay.
|
|
1258
1258
|
|
|
@@ -1266,7 +1266,7 @@ After hand-off, a `5xx` final answer (after any redirect), a network failure, or
|
|
|
1266
1266
|
|
|
1267
1267
|
#### Testing against your own Adyen TEST account
|
|
1268
1268
|
|
|
1269
|
-
A test-mode client can run the same checkout against its own server and its own Adyen TEST account,
|
|
1269
|
+
A test-mode client can run the same checkout against its own server and its own Adyen TEST account, whether or not Agentcard has enabled the reviewed profile. Declare your endpoint on the client, before any attach, as taking the card request of a profile this build reviewed:
|
|
1270
1270
|
|
|
1271
1271
|
```ts
|
|
1272
1272
|
const vault = new VaultClient({ clientId, clientSecret, sandboxMerchants: [
|
|
@@ -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: 4790fdfc656acbda50ddf8471507933ddd4938f4c5b351ec096a9549a7c8c257
|
|
4
4
|
// src/deep-freeze.js
|
|
5
5
|
function deepFreeze(value) {
|
|
6
6
|
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
@@ -1086,6 +1086,118 @@ function selectMerchantExchanges(profile, stageName, input) {
|
|
|
1086
1086
|
return { ok: true, responses: newestMerchantExchanges(kept) };
|
|
1087
1087
|
}
|
|
1088
1088
|
// src/merchant-profiles.js
|
|
1089
|
+
var DSG_PAYGATE_V2 = /* @__PURE__ */ deepFreeze({
|
|
1090
|
+
method: "POST",
|
|
1091
|
+
path: "/prod/api/paygate/v2/authorization",
|
|
1092
|
+
query: {},
|
|
1093
|
+
// The page sends true for every checkout its translator read, the only checkouts
|
|
1094
|
+
// the amount source below maps; a legacy checkout is not this card request.
|
|
1095
|
+
requires: [{ path: ["isModernOrder"], equals: true }],
|
|
1096
|
+
holder: ["tenders", "encryptedCardTenders", 0],
|
|
1097
|
+
fields: {
|
|
1098
|
+
encryptedCardNumber: "cardNumber",
|
|
1099
|
+
encryptedExpiryMonth: "expirationMonth",
|
|
1100
|
+
encryptedExpiryYear: "expirationYear",
|
|
1101
|
+
encryptedSecurityCode: "cvv"
|
|
1102
|
+
},
|
|
1103
|
+
// cardType and vinBalue describe the dummy the agent typed: the facts below
|
|
1104
|
+
// write the approved card's instead, so nothing is removed.
|
|
1105
|
+
remove: [],
|
|
1106
|
+
refuse: [
|
|
1107
|
+
{ path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
|
|
1108
|
+
// A saved card, or a second card tender the Vault never encrypted.
|
|
1109
|
+
{ path: ["tenders", "savedCardTender"], when: "present" },
|
|
1110
|
+
{ path: ["tenders", "encryptedCardTenders", 1], when: "present" },
|
|
1111
|
+
// A gift card pays part of the order, so the card pays less than the total.
|
|
1112
|
+
{ path: ["tenders", "giftCardTenders"], when: "present" }
|
|
1113
|
+
],
|
|
1114
|
+
amount: null,
|
|
1115
|
+
// Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
|
|
1116
|
+
// on the checkout page answers the whole checkout, camelCase on the wire: the page
|
|
1117
|
+
// load's PATCH (or the create), then every address, shipping, promotion, gift card,
|
|
1118
|
+
// tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
|
|
1119
|
+
// with exactly two decimals ("123.45"; the page itself drops the dot for minor
|
|
1120
|
+
// units). transactionReference is the checkout key, in the body and the URL. After
|
|
1121
|
+
// payment the order submit and the confirmation read return the placed checkout.
|
|
1122
|
+
amountSource: {
|
|
1123
|
+
id: "dsg_checkout_pricing",
|
|
1124
|
+
origin: "checkout",
|
|
1125
|
+
format: "json",
|
|
1126
|
+
responses: [
|
|
1127
|
+
{ method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
1128
|
+
{ method: "POST", path: "/api/v1/checkouts", query: {} },
|
|
1129
|
+
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
|
|
1130
|
+
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
|
|
1131
|
+
{ method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
1132
|
+
{ method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
1133
|
+
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
|
|
1134
|
+
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
|
|
1135
|
+
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
|
|
1136
|
+
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
1137
|
+
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
1138
|
+
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
|
|
1139
|
+
],
|
|
1140
|
+
total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
|
|
1141
|
+
unit: "major",
|
|
1142
|
+
currency: "USD",
|
|
1143
|
+
currencyPath: ["pricing", "currency"],
|
|
1144
|
+
bind: [
|
|
1145
|
+
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
1146
|
+
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
1147
|
+
],
|
|
1148
|
+
// The order total and the card's share are the same text. Anything that lowers the
|
|
1149
|
+
// share below the total (a gift card, ScoreCard rewards) or lands in only one of them
|
|
1150
|
+
// (a tip, a donation) is refused until a HAR shows which one the charge follows, so
|
|
1151
|
+
// the approved amount and the placed checkout's total read after payment agree.
|
|
1152
|
+
requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
|
|
1153
|
+
refuse: [
|
|
1154
|
+
// A placed checkout is not the one being paid.
|
|
1155
|
+
{ path: ["orderPlacedTime"], when: "true" },
|
|
1156
|
+
// Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
|
|
1157
|
+
{ path: ["payment", "giftCards"], when: "nonEmpty" },
|
|
1158
|
+
{ path: ["addresses"], when: "empty" }
|
|
1159
|
+
],
|
|
1160
|
+
maxAgeMs: 9e5,
|
|
1161
|
+
afterPayment: {
|
|
1162
|
+
origin: "checkout",
|
|
1163
|
+
format: "json",
|
|
1164
|
+
responses: [
|
|
1165
|
+
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
1166
|
+
{ method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
|
|
1167
|
+
],
|
|
1168
|
+
// The order total, which the requires rule above held equal to the card's share
|
|
1169
|
+
// before payment. totalRemaining is not read here: after placement it can drop to
|
|
1170
|
+
// what is still unpaid, which would hide a higher charge.
|
|
1171
|
+
total: { path: ["pricing", "total"], format: "decimal2" },
|
|
1172
|
+
unit: "major",
|
|
1173
|
+
currency: "USD",
|
|
1174
|
+
currencyPath: ["pricing", "currency"],
|
|
1175
|
+
bind: [
|
|
1176
|
+
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
1177
|
+
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
1178
|
+
],
|
|
1179
|
+
refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
|
|
1180
|
+
}
|
|
1181
|
+
},
|
|
1182
|
+
facts: [
|
|
1183
|
+
// adyen-web's brand codes, the ones the page's supported list names; Dick's own
|
|
1184
|
+
// private-label (plcc, comc) cards have no Agentcard brand and are refused.
|
|
1185
|
+
{
|
|
1186
|
+
path: ["tenders", "encryptedCardTenders", 0, "cardType"],
|
|
1187
|
+
fact: "brand",
|
|
1188
|
+
map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
|
|
1189
|
+
},
|
|
1190
|
+
{ path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
|
|
1191
|
+
],
|
|
1192
|
+
adyen: {
|
|
1193
|
+
environment: "live",
|
|
1194
|
+
clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
|
|
1195
|
+
publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
|
|
1196
|
+
}
|
|
1197
|
+
});
|
|
1198
|
+
function dsgPaygateProfile(own) {
|
|
1199
|
+
return { ...own, ...DSG_PAYGATE_V2 };
|
|
1200
|
+
}
|
|
1089
1201
|
var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
|
|
1090
1202
|
{
|
|
1091
1203
|
// Read Sep 23, 2026. assets.dunelm.com checkout-page bundle: submitPayment
|
|
@@ -1181,10 +1293,13 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
|
|
|
1181
1293
|
// client key from the three securedFields iframes on
|
|
1182
1294
|
// checkoutshopper-live-us.adyen.com (adyen-web 6.x). The request body itself
|
|
1183
1295
|
// was not captured: the guest email gate stopped the run before Pay. Public
|
|
1184
|
-
// key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC).
|
|
1296
|
+
// key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC). Enabled
|
|
1297
|
+
// Oct 7, 2026 under D1 (amountSource, above): live checks on Sep 30 and Oct 6
|
|
1298
|
+
// matched its key pin, its card request as the page's script builds it, and its
|
|
1299
|
+
// checkout total.
|
|
1185
1300
|
id: "cinemark_initiate",
|
|
1186
1301
|
merchant: "Cinemark",
|
|
1187
|
-
status: "
|
|
1302
|
+
status: "enabled",
|
|
1188
1303
|
origins: [{ checkout: "https://www.cinemark.com", endpoint: "https://www.cinemark.com" }],
|
|
1189
1304
|
method: "POST",
|
|
1190
1305
|
path: "/api/adyen/initiatePayment",
|
|
@@ -1257,137 +1372,29 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
|
|
|
1257
1372
|
publicKeySha256: "9dd5ef549c7454d60ca970ff76c8f4cac36d79f2961e59eca9116791e86cbcc5"
|
|
1258
1373
|
}
|
|
1259
1374
|
},
|
|
1260
|
-
{
|
|
1261
|
-
//
|
|
1262
|
-
//
|
|
1263
|
-
//
|
|
1264
|
-
// beside cardType (adyen-web's first detected brand), saveForLater (the save-card
|
|
1265
|
-
// box) and vinBalue (the six digits onBinValue reports). The page posts it with
|
|
1266
|
-
// transactionReference, customer.device and any giftCardTenders to
|
|
1267
|
-
// <payments host>/prod/api/paygate/v2/authorization, the host picked from the
|
|
1268
|
-
// page's own (Dick's, Golf Galaxy, Public Lands, Going Going Gone). The same slot
|
|
1269
|
-
// carries Afterpay, CashApp and Affirm tenders with literal strings where the JWEs
|
|
1270
|
-
// go, and a saved card goes to tenders.savedCardTender instead. The body names no
|
|
1271
|
-
// amount: the paygate charges the cart it holds for transactionReference.
|
|
1272
|
-
// mountCCForm names the client key and environment 'live'. Public key read from
|
|
1273
|
-
// checkoutshopper-live.adyen.com on 2026-09-25 (UTC).
|
|
1375
|
+
/* @__PURE__ */ dsgPaygateProfile({
|
|
1376
|
+
// Dick's own storefront, the one live checks read on Sep 30 and Oct 6, 2026: its key
|
|
1377
|
+
// pin, its card request as the page's code builds it, its card facts and its checkout
|
|
1378
|
+
// pricing matched DSG_PAYGATE_V2. Enabled Oct 7, 2026 under D1 (amountSource, above).
|
|
1274
1379
|
id: "dsg_paygate_v2",
|
|
1275
1380
|
merchant: "Dick's Sporting Goods",
|
|
1381
|
+
status: "enabled",
|
|
1382
|
+
origins: [
|
|
1383
|
+
{ checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" }
|
|
1384
|
+
]
|
|
1385
|
+
}),
|
|
1386
|
+
/* @__PURE__ */ dsgPaygateProfile({
|
|
1387
|
+
// The same paygate on the three other storefronts its page names. No live check has
|
|
1388
|
+
// read them, so their card requests stay paused and aborted in observe.
|
|
1389
|
+
id: "dsg_other_stores_paygate_v2",
|
|
1390
|
+
merchant: "Golf Galaxy, Public Lands and Going Going Gone",
|
|
1276
1391
|
status: "observe",
|
|
1277
1392
|
origins: [
|
|
1278
|
-
{ checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" },
|
|
1279
1393
|
{ checkout: "https://www.golfgalaxy.com", endpoint: "https://payments.golfgalaxy.com" },
|
|
1280
1394
|
{ checkout: "https://www.publiclands.com", endpoint: "https://payments.publiclands.com" },
|
|
1281
1395
|
{ checkout: "https://www.goinggoinggone.com", endpoint: "https://payments.goinggoinggone.com" }
|
|
1282
|
-
]
|
|
1283
|
-
|
|
1284
|
-
path: "/prod/api/paygate/v2/authorization",
|
|
1285
|
-
query: {},
|
|
1286
|
-
// The page sends true for every checkout its translator read, the only checkouts
|
|
1287
|
-
// the amount source below maps; a legacy checkout is not this card request.
|
|
1288
|
-
requires: [{ path: ["isModernOrder"], equals: true }],
|
|
1289
|
-
holder: ["tenders", "encryptedCardTenders", 0],
|
|
1290
|
-
fields: {
|
|
1291
|
-
encryptedCardNumber: "cardNumber",
|
|
1292
|
-
encryptedExpiryMonth: "expirationMonth",
|
|
1293
|
-
encryptedExpiryYear: "expirationYear",
|
|
1294
|
-
encryptedSecurityCode: "cvv"
|
|
1295
|
-
},
|
|
1296
|
-
// cardType and vinBalue describe the dummy the agent typed: the facts below
|
|
1297
|
-
// write the approved card's instead, so nothing is removed.
|
|
1298
|
-
remove: [],
|
|
1299
|
-
refuse: [
|
|
1300
|
-
{ path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
|
|
1301
|
-
// A saved card, or a second card tender the Vault never encrypted.
|
|
1302
|
-
{ path: ["tenders", "savedCardTender"], when: "present" },
|
|
1303
|
-
{ path: ["tenders", "encryptedCardTenders", 1], when: "present" },
|
|
1304
|
-
// A gift card pays part of the order, so the card pays less than the total.
|
|
1305
|
-
{ path: ["tenders", "giftCardTenders"], when: "present" }
|
|
1306
|
-
],
|
|
1307
|
-
amount: null,
|
|
1308
|
-
// Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
|
|
1309
|
-
// on the checkout page answers the whole checkout, camelCase on the wire: the page
|
|
1310
|
-
// load's PATCH (or the create), then every address, shipping, promotion, gift card,
|
|
1311
|
-
// tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
|
|
1312
|
-
// with exactly two decimals ("123.45"; the page itself drops the dot for minor
|
|
1313
|
-
// units). transactionReference is the checkout key, in the body and the URL. After
|
|
1314
|
-
// payment the order submit and the confirmation read return the placed checkout.
|
|
1315
|
-
amountSource: {
|
|
1316
|
-
id: "dsg_checkout_pricing",
|
|
1317
|
-
origin: "checkout",
|
|
1318
|
-
format: "json",
|
|
1319
|
-
responses: [
|
|
1320
|
-
{ method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
1321
|
-
{ method: "POST", path: "/api/v1/checkouts", query: {} },
|
|
1322
|
-
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
|
|
1323
|
-
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
|
|
1324
|
-
{ method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
1325
|
-
{ method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
1326
|
-
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
|
|
1327
|
-
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
|
|
1328
|
-
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
|
|
1329
|
-
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
1330
|
-
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
1331
|
-
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
|
|
1332
|
-
],
|
|
1333
|
-
total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
|
|
1334
|
-
unit: "major",
|
|
1335
|
-
currency: "USD",
|
|
1336
|
-
currencyPath: ["pricing", "currency"],
|
|
1337
|
-
bind: [
|
|
1338
|
-
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
1339
|
-
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
1340
|
-
],
|
|
1341
|
-
// The order total and the card's share are the same text. Anything that lowers the
|
|
1342
|
-
// share below the total (a gift card, ScoreCard rewards) or lands in only one of them
|
|
1343
|
-
// (a tip, a donation) is refused until a HAR shows which one the charge follows, so
|
|
1344
|
-
// the approved amount and the placed checkout's total read after payment agree.
|
|
1345
|
-
requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
|
|
1346
|
-
refuse: [
|
|
1347
|
-
// A placed checkout is not the one being paid.
|
|
1348
|
-
{ path: ["orderPlacedTime"], when: "true" },
|
|
1349
|
-
// Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
|
|
1350
|
-
{ path: ["payment", "giftCards"], when: "nonEmpty" },
|
|
1351
|
-
{ path: ["addresses"], when: "empty" }
|
|
1352
|
-
],
|
|
1353
|
-
maxAgeMs: 9e5,
|
|
1354
|
-
afterPayment: {
|
|
1355
|
-
origin: "checkout",
|
|
1356
|
-
format: "json",
|
|
1357
|
-
responses: [
|
|
1358
|
-
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
1359
|
-
{ method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
|
|
1360
|
-
],
|
|
1361
|
-
// The order total, which the requires rule above held equal to the card's share
|
|
1362
|
-
// before payment. totalRemaining is not read here: after placement it can drop to
|
|
1363
|
-
// what is still unpaid, which would hide a higher charge.
|
|
1364
|
-
total: { path: ["pricing", "total"], format: "decimal2" },
|
|
1365
|
-
unit: "major",
|
|
1366
|
-
currency: "USD",
|
|
1367
|
-
currencyPath: ["pricing", "currency"],
|
|
1368
|
-
bind: [
|
|
1369
|
-
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
1370
|
-
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
1371
|
-
],
|
|
1372
|
-
refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
|
|
1373
|
-
}
|
|
1374
|
-
},
|
|
1375
|
-
facts: [
|
|
1376
|
-
// adyen-web's brand codes, the ones the page's supported list names; Dick's own
|
|
1377
|
-
// private-label (plcc, comc) cards have no Agentcard brand and are refused.
|
|
1378
|
-
{
|
|
1379
|
-
path: ["tenders", "encryptedCardTenders", 0, "cardType"],
|
|
1380
|
-
fact: "brand",
|
|
1381
|
-
map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
|
|
1382
|
-
},
|
|
1383
|
-
{ path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
|
|
1384
|
-
],
|
|
1385
|
-
adyen: {
|
|
1386
|
-
environment: "live",
|
|
1387
|
-
clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
|
|
1388
|
-
publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
|
|
1389
|
-
}
|
|
1390
|
-
},
|
|
1396
|
+
]
|
|
1397
|
+
}),
|
|
1391
1398
|
{
|
|
1392
1399
|
// Read Sep 25, 2026, from public code only: the WooCommerce plugin super-payments 1.40.1 and
|
|
1393
1400
|
// cdn.superpayments.com/js/v2/payment.webcomponents.script.js as it stood on Sep 19.
|
package/dist/merchant-hosted.js
CHANGED
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
* the agent's dummy card never reaches the merchant and nothing is charged;
|
|
18
18
|
* 'enabled' lets a prepared checkout pay it. The API can hold a profile in
|
|
19
19
|
* 'observe' for a client but never enable it past this build: a profile is
|
|
20
|
-
* 'enabled' only when both say so.
|
|
20
|
+
* 'enabled' only when both say so. Cinemark and Dick's own storefront ship
|
|
21
|
+
* 'enabled'; every other profile ships in 'observe'.
|
|
21
22
|
*/
|
|
22
23
|
import { MERCHANT_PROFILE_RECOGNIZERS as SHARED_PROFILES, classifyDeclaredMerchantRequest as sharedClassifyDeclared, declaredTemplatedUrl as sharedDeclaredTemplatedUrl, declaredUrlGlobs as sharedDeclaredUrlGlobs, declaredUrlRelation as sharedDeclaredUrlRelation, declaredEndpointRefusal as sharedDeclaredEndpointRefusal, classifyMerchantRequest as sharedClassify, merchantBodyKeyPathSha256 as sharedKeyPathSha256, merchantProfileEnvironment as sharedEnvironment, merchantProfileRulesMatch as sharedRulesMatch, merchantProfileTemplatedUrl as sharedTemplatedUrl, merchantProfileUrlGlobs as sharedUrlGlobs, merchantProfileUrlRelation as sharedUrlRelation, sha256Hex as sharedSha256Hex, } from './adyen-merchant-hosted.generated.js';
|
|
23
24
|
import { SubstitutionError, substituteMerchantHosted as sharedSubstitute } from './substitutions.generated.js';
|
package/dist/merchant-total.js
CHANGED
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
*
|
|
13
13
|
* What this proves: the total is what the agent's browser session saw. It catches a
|
|
14
14
|
* mistyped amount and a cart that changed under the agent; it cannot tell a merchant's
|
|
15
|
-
* response from one the agent wrote
|
|
15
|
+
* response from one the agent wrote. So a profile priced this way stays in observe unless
|
|
16
|
+
* Agentcard accepted that risk for it by name (Cinemark and Dick's own storefront, Oct 7,
|
|
17
|
+
* 2026), and then it pays only for the company Agentcard enables it for, and only after the
|
|
18
|
+
* cardholder approves each payment.
|
|
16
19
|
*
|
|
17
20
|
* What the SDK owes payment-core (the header of merchant-amount.js): every exchange of
|
|
18
21
|
* the profile's shapes, projected, with the time it left; a wait for any such request
|
|
@@ -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: a1b7d280655947da8bb1d465d17c3436504ee350dd0be7f345d524eea0f2f374
|
|
4
4
|
// src/adyen-jwe.js
|
|
5
5
|
var ADYEN_JWE_HEADER = { alg: "RSA-OAEP-256", enc: "A256GCM", version: "1" };
|
|
6
6
|
var BASE64URL = /^[A-Za-z0-9_-]+$/;
|
|
@@ -277,6 +277,118 @@ function merchantBodyAmountPaths(profile) {
|
|
|
277
277
|
return isPlainObject(amount) ? [amount.value, amount.currency].filter(Array.isArray) : [];
|
|
278
278
|
}
|
|
279
279
|
// src/merchant-profiles.js
|
|
280
|
+
var DSG_PAYGATE_V2 = /* @__PURE__ */ deepFreeze({
|
|
281
|
+
method: "POST",
|
|
282
|
+
path: "/prod/api/paygate/v2/authorization",
|
|
283
|
+
query: {},
|
|
284
|
+
// The page sends true for every checkout its translator read, the only checkouts
|
|
285
|
+
// the amount source below maps; a legacy checkout is not this card request.
|
|
286
|
+
requires: [{ path: ["isModernOrder"], equals: true }],
|
|
287
|
+
holder: ["tenders", "encryptedCardTenders", 0],
|
|
288
|
+
fields: {
|
|
289
|
+
encryptedCardNumber: "cardNumber",
|
|
290
|
+
encryptedExpiryMonth: "expirationMonth",
|
|
291
|
+
encryptedExpiryYear: "expirationYear",
|
|
292
|
+
encryptedSecurityCode: "cvv"
|
|
293
|
+
},
|
|
294
|
+
// cardType and vinBalue describe the dummy the agent typed: the facts below
|
|
295
|
+
// write the approved card's instead, so nothing is removed.
|
|
296
|
+
remove: [],
|
|
297
|
+
refuse: [
|
|
298
|
+
{ path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
|
|
299
|
+
// A saved card, or a second card tender the Vault never encrypted.
|
|
300
|
+
{ path: ["tenders", "savedCardTender"], when: "present" },
|
|
301
|
+
{ path: ["tenders", "encryptedCardTenders", 1], when: "present" },
|
|
302
|
+
// A gift card pays part of the order, so the card pays less than the total.
|
|
303
|
+
{ path: ["tenders", "giftCardTenders"], when: "present" }
|
|
304
|
+
],
|
|
305
|
+
amount: null,
|
|
306
|
+
// Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
|
|
307
|
+
// on the checkout page answers the whole checkout, camelCase on the wire: the page
|
|
308
|
+
// load's PATCH (or the create), then every address, shipping, promotion, gift card,
|
|
309
|
+
// tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
|
|
310
|
+
// with exactly two decimals ("123.45"; the page itself drops the dot for minor
|
|
311
|
+
// units). transactionReference is the checkout key, in the body and the URL. After
|
|
312
|
+
// payment the order submit and the confirmation read return the placed checkout.
|
|
313
|
+
amountSource: {
|
|
314
|
+
id: "dsg_checkout_pricing",
|
|
315
|
+
origin: "checkout",
|
|
316
|
+
format: "json",
|
|
317
|
+
responses: [
|
|
318
|
+
{ method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
319
|
+
{ method: "POST", path: "/api/v1/checkouts", query: {} },
|
|
320
|
+
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
|
|
321
|
+
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
|
|
322
|
+
{ method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
323
|
+
{ method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
324
|
+
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
|
|
325
|
+
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
|
|
326
|
+
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
|
|
327
|
+
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
328
|
+
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
329
|
+
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
|
|
330
|
+
],
|
|
331
|
+
total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
|
|
332
|
+
unit: "major",
|
|
333
|
+
currency: "USD",
|
|
334
|
+
currencyPath: ["pricing", "currency"],
|
|
335
|
+
bind: [
|
|
336
|
+
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
337
|
+
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
338
|
+
],
|
|
339
|
+
// The order total and the card's share are the same text. Anything that lowers the
|
|
340
|
+
// share below the total (a gift card, ScoreCard rewards) or lands in only one of them
|
|
341
|
+
// (a tip, a donation) is refused until a HAR shows which one the charge follows, so
|
|
342
|
+
// the approved amount and the placed checkout's total read after payment agree.
|
|
343
|
+
requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
|
|
344
|
+
refuse: [
|
|
345
|
+
// A placed checkout is not the one being paid.
|
|
346
|
+
{ path: ["orderPlacedTime"], when: "true" },
|
|
347
|
+
// Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
|
|
348
|
+
{ path: ["payment", "giftCards"], when: "nonEmpty" },
|
|
349
|
+
{ path: ["addresses"], when: "empty" }
|
|
350
|
+
],
|
|
351
|
+
maxAgeMs: 9e5,
|
|
352
|
+
afterPayment: {
|
|
353
|
+
origin: "checkout",
|
|
354
|
+
format: "json",
|
|
355
|
+
responses: [
|
|
356
|
+
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
357
|
+
{ method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
|
|
358
|
+
],
|
|
359
|
+
// The order total, which the requires rule above held equal to the card's share
|
|
360
|
+
// before payment. totalRemaining is not read here: after placement it can drop to
|
|
361
|
+
// what is still unpaid, which would hide a higher charge.
|
|
362
|
+
total: { path: ["pricing", "total"], format: "decimal2" },
|
|
363
|
+
unit: "major",
|
|
364
|
+
currency: "USD",
|
|
365
|
+
currencyPath: ["pricing", "currency"],
|
|
366
|
+
bind: [
|
|
367
|
+
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
368
|
+
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
369
|
+
],
|
|
370
|
+
refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
facts: [
|
|
374
|
+
// adyen-web's brand codes, the ones the page's supported list names; Dick's own
|
|
375
|
+
// private-label (plcc, comc) cards have no Agentcard brand and are refused.
|
|
376
|
+
{
|
|
377
|
+
path: ["tenders", "encryptedCardTenders", 0, "cardType"],
|
|
378
|
+
fact: "brand",
|
|
379
|
+
map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
|
|
380
|
+
},
|
|
381
|
+
{ path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
|
|
382
|
+
],
|
|
383
|
+
adyen: {
|
|
384
|
+
environment: "live",
|
|
385
|
+
clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
|
|
386
|
+
publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
function dsgPaygateProfile(own) {
|
|
390
|
+
return { ...own, ...DSG_PAYGATE_V2 };
|
|
391
|
+
}
|
|
280
392
|
var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
|
|
281
393
|
{
|
|
282
394
|
// Read Sep 23, 2026. assets.dunelm.com checkout-page bundle: submitPayment
|
|
@@ -372,10 +484,13 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
|
|
|
372
484
|
// client key from the three securedFields iframes on
|
|
373
485
|
// checkoutshopper-live-us.adyen.com (adyen-web 6.x). The request body itself
|
|
374
486
|
// was not captured: the guest email gate stopped the run before Pay. Public
|
|
375
|
-
// key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC).
|
|
487
|
+
// key read from checkoutshopper-live-us.adyen.com on 2026-09-25 (UTC). Enabled
|
|
488
|
+
// Oct 7, 2026 under D1 (amountSource, above): live checks on Sep 30 and Oct 6
|
|
489
|
+
// matched its key pin, its card request as the page's script builds it, and its
|
|
490
|
+
// checkout total.
|
|
376
491
|
id: "cinemark_initiate",
|
|
377
492
|
merchant: "Cinemark",
|
|
378
|
-
status: "
|
|
493
|
+
status: "enabled",
|
|
379
494
|
origins: [{ checkout: "https://www.cinemark.com", endpoint: "https://www.cinemark.com" }],
|
|
380
495
|
method: "POST",
|
|
381
496
|
path: "/api/adyen/initiatePayment",
|
|
@@ -448,137 +563,29 @@ var MERCHANT_HOSTED_PROFILES = /* @__PURE__ */ deepFreeze([
|
|
|
448
563
|
publicKeySha256: "9dd5ef549c7454d60ca970ff76c8f4cac36d79f2961e59eca9116791e86cbcc5"
|
|
449
564
|
}
|
|
450
565
|
},
|
|
451
|
-
{
|
|
452
|
-
//
|
|
453
|
-
//
|
|
454
|
-
//
|
|
455
|
-
// beside cardType (adyen-web's first detected brand), saveForLater (the save-card
|
|
456
|
-
// box) and vinBalue (the six digits onBinValue reports). The page posts it with
|
|
457
|
-
// transactionReference, customer.device and any giftCardTenders to
|
|
458
|
-
// <payments host>/prod/api/paygate/v2/authorization, the host picked from the
|
|
459
|
-
// page's own (Dick's, Golf Galaxy, Public Lands, Going Going Gone). The same slot
|
|
460
|
-
// carries Afterpay, CashApp and Affirm tenders with literal strings where the JWEs
|
|
461
|
-
// go, and a saved card goes to tenders.savedCardTender instead. The body names no
|
|
462
|
-
// amount: the paygate charges the cart it holds for transactionReference.
|
|
463
|
-
// mountCCForm names the client key and environment 'live'. Public key read from
|
|
464
|
-
// checkoutshopper-live.adyen.com on 2026-09-25 (UTC).
|
|
566
|
+
/* @__PURE__ */ dsgPaygateProfile({
|
|
567
|
+
// Dick's own storefront, the one live checks read on Sep 30 and Oct 6, 2026: its key
|
|
568
|
+
// pin, its card request as the page's code builds it, its card facts and its checkout
|
|
569
|
+
// pricing matched DSG_PAYGATE_V2. Enabled Oct 7, 2026 under D1 (amountSource, above).
|
|
465
570
|
id: "dsg_paygate_v2",
|
|
466
571
|
merchant: "Dick's Sporting Goods",
|
|
572
|
+
status: "enabled",
|
|
573
|
+
origins: [
|
|
574
|
+
{ checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" }
|
|
575
|
+
]
|
|
576
|
+
}),
|
|
577
|
+
/* @__PURE__ */ dsgPaygateProfile({
|
|
578
|
+
// The same paygate on the three other storefronts its page names. No live check has
|
|
579
|
+
// read them, so their card requests stay paused and aborted in observe.
|
|
580
|
+
id: "dsg_other_stores_paygate_v2",
|
|
581
|
+
merchant: "Golf Galaxy, Public Lands and Going Going Gone",
|
|
467
582
|
status: "observe",
|
|
468
583
|
origins: [
|
|
469
|
-
{ checkout: "https://www.dickssportinggoods.com", endpoint: "https://payments.dickssportinggoods.com" },
|
|
470
584
|
{ checkout: "https://www.golfgalaxy.com", endpoint: "https://payments.golfgalaxy.com" },
|
|
471
585
|
{ checkout: "https://www.publiclands.com", endpoint: "https://payments.publiclands.com" },
|
|
472
586
|
{ checkout: "https://www.goinggoinggone.com", endpoint: "https://payments.goinggoinggone.com" }
|
|
473
|
-
]
|
|
474
|
-
|
|
475
|
-
path: "/prod/api/paygate/v2/authorization",
|
|
476
|
-
query: {},
|
|
477
|
-
// The page sends true for every checkout its translator read, the only checkouts
|
|
478
|
-
// the amount source below maps; a legacy checkout is not this card request.
|
|
479
|
-
requires: [{ path: ["isModernOrder"], equals: true }],
|
|
480
|
-
holder: ["tenders", "encryptedCardTenders", 0],
|
|
481
|
-
fields: {
|
|
482
|
-
encryptedCardNumber: "cardNumber",
|
|
483
|
-
encryptedExpiryMonth: "expirationMonth",
|
|
484
|
-
encryptedExpiryYear: "expirationYear",
|
|
485
|
-
encryptedSecurityCode: "cvv"
|
|
486
|
-
},
|
|
487
|
-
// cardType and vinBalue describe the dummy the agent typed: the facts below
|
|
488
|
-
// write the approved card's instead, so nothing is removed.
|
|
489
|
-
remove: [],
|
|
490
|
-
refuse: [
|
|
491
|
-
{ path: ["tenders", "encryptedCardTenders", 0, "saveForLater"], when: "true" },
|
|
492
|
-
// A saved card, or a second card tender the Vault never encrypted.
|
|
493
|
-
{ path: ["tenders", "savedCardTender"], when: "present" },
|
|
494
|
-
{ path: ["tenders", "encryptedCardTenders", 1], when: "present" },
|
|
495
|
-
// A gift card pays part of the order, so the card pays less than the total.
|
|
496
|
-
{ path: ["tenders", "giftCardTenders"], when: "present" }
|
|
497
|
-
],
|
|
498
|
-
amount: null,
|
|
499
|
-
// Read Sep 25, 2026 (research amount_source/dickssportinggoods). Every checkout call
|
|
500
|
-
// on the checkout page answers the whole checkout, camelCase on the wire: the page
|
|
501
|
-
// load's PATCH (or the create), then every address, shipping, promotion, gift card,
|
|
502
|
-
// tip and ScoreCard change. pricing.totalRemaining is what the card pays, a string
|
|
503
|
-
// with exactly two decimals ("123.45"; the page itself drops the dot for minor
|
|
504
|
-
// units). transactionReference is the checkout key, in the body and the URL. After
|
|
505
|
-
// payment the order submit and the confirmation read return the placed checkout.
|
|
506
|
-
amountSource: {
|
|
507
|
-
id: "dsg_checkout_pricing",
|
|
508
|
-
origin: "checkout",
|
|
509
|
-
format: "json",
|
|
510
|
-
responses: [
|
|
511
|
-
{ method: "PATCH", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
512
|
-
{ method: "POST", path: "/api/v1/checkouts", query: {} },
|
|
513
|
-
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/addresses", queries: [{}, { type: "billing" }, { type: "shipping" }] },
|
|
514
|
-
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/shipping/selected/groups/:groupNumber/mode", query: {} },
|
|
515
|
-
{ method: "PUT", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
516
|
-
{ method: "DELETE", path: "/api/v2/checkouts/:checkoutKey/promotion/cart", query: {} },
|
|
517
|
-
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey/gift-cards", query: {} },
|
|
518
|
-
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/gift-cards/:giftCardIndex", query: {} },
|
|
519
|
-
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/tip", query: {} },
|
|
520
|
-
{ method: "PUT", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
521
|
-
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/scorecard", query: {} },
|
|
522
|
-
{ method: "DELETE", path: "/api/v1/checkouts/:checkoutKey/v2/gifts", query: {} }
|
|
523
|
-
],
|
|
524
|
-
total: { path: ["pricing", "totalRemaining"], format: "decimal2" },
|
|
525
|
-
unit: "major",
|
|
526
|
-
currency: "USD",
|
|
527
|
-
currencyPath: ["pricing", "currency"],
|
|
528
|
-
bind: [
|
|
529
|
-
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
530
|
-
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
531
|
-
],
|
|
532
|
-
// The order total and the card's share are the same text. Anything that lowers the
|
|
533
|
-
// share below the total (a gift card, ScoreCard rewards) or lands in only one of them
|
|
534
|
-
// (a tip, a donation) is refused until a HAR shows which one the charge follows, so
|
|
535
|
-
// the approved amount and the placed checkout's total read after payment agree.
|
|
536
|
-
requires: [{ path: ["pricing", "total"], equalsPath: ["pricing", "totalRemaining"] }],
|
|
537
|
-
refuse: [
|
|
538
|
-
// A placed checkout is not the one being paid.
|
|
539
|
-
{ path: ["orderPlacedTime"], when: "true" },
|
|
540
|
-
// Gift cards and a checkout with no address yet (tax not estimated) wait for a HAR.
|
|
541
|
-
{ path: ["payment", "giftCards"], when: "nonEmpty" },
|
|
542
|
-
{ path: ["addresses"], when: "empty" }
|
|
543
|
-
],
|
|
544
|
-
maxAgeMs: 9e5,
|
|
545
|
-
afterPayment: {
|
|
546
|
-
origin: "checkout",
|
|
547
|
-
format: "json",
|
|
548
|
-
responses: [
|
|
549
|
-
{ method: "POST", path: "/api/v1/checkouts/:checkoutKey", query: {} },
|
|
550
|
-
{ method: "GET", path: "/api/v1/checkouts/submitted/:checkoutKey", query: {} }
|
|
551
|
-
],
|
|
552
|
-
// The order total, which the requires rule above held equal to the card's share
|
|
553
|
-
// before payment. totalRemaining is not read here: after placement it can drop to
|
|
554
|
-
// what is still unpaid, which would hide a higher charge.
|
|
555
|
-
total: { path: ["pricing", "total"], format: "decimal2" },
|
|
556
|
-
unit: "major",
|
|
557
|
-
currency: "USD",
|
|
558
|
-
currencyPath: ["pricing", "currency"],
|
|
559
|
-
bind: [
|
|
560
|
-
{ source: ["checkoutKey"], card: ["transactionReference"] },
|
|
561
|
-
{ placeholder: "checkoutKey", card: ["transactionReference"] }
|
|
562
|
-
],
|
|
563
|
-
refuse: [{ path: ["orderPlacedTime"], when: "unset" }]
|
|
564
|
-
}
|
|
565
|
-
},
|
|
566
|
-
facts: [
|
|
567
|
-
// adyen-web's brand codes, the ones the page's supported list names; Dick's own
|
|
568
|
-
// private-label (plcc, comc) cards have no Agentcard brand and are refused.
|
|
569
|
-
{
|
|
570
|
-
path: ["tenders", "encryptedCardTenders", 0, "cardType"],
|
|
571
|
-
fact: "brand",
|
|
572
|
-
map: { visa: "visa", mastercard: "mc", amex: "amex", discover: "discover", diners: "diners", jcb: "jcb" }
|
|
573
|
-
},
|
|
574
|
-
{ path: ["tenders", "encryptedCardTenders", 0, "vinBalue"], fact: "bin6" }
|
|
575
|
-
],
|
|
576
|
-
adyen: {
|
|
577
|
-
environment: "live",
|
|
578
|
-
clientKey: "live_YJLFKT47JJG2RI7QIYX6HTKKDEDOEGOH",
|
|
579
|
-
publicKeySha256: "da33611149dff3ab715be8671c0550bb8aec6112983b2473db9ee7afb829c110"
|
|
580
|
-
}
|
|
581
|
-
},
|
|
587
|
+
]
|
|
588
|
+
}),
|
|
582
589
|
{
|
|
583
590
|
// Read Sep 25, 2026, from public code only: the WooCommerce plugin super-payments 1.40.1 and
|
|
584
591
|
// cdn.superpayments.com/js/v2/payment.webcomponents.script.js as it stood on Sep 19.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-cards/sdk",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.4",
|
|
4
4
|
"description": "Agentcard's SDK: one client, Agentcard, with two modules. checkout pauses a browser purchase and pays it with the person's own card; voice connects a person to your product once and approves a purchase by voice inside it. Card data never enters your process.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|