@agent-cards/sdk 0.23.26 → 0.23.27
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 +8 -0
- package/README.md +9 -1
- package/dist/agent-amount.generated.js +1 -1
- package/dist/capabilities.generated.js +1 -1
- package/dist/client.d.ts +12 -0
- package/dist/client.js +12 -0
- package/dist/merchant-card-endpoints.generated.js +68 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@ An unreleased change waits as a file of its own in `changes/` (`changes/README.m
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.23.27
|
|
8
|
+
|
|
9
|
+
- Pause Pin Payments' card request for the cardholder's device, for a company Agentcard turned Pin Payments on for. Pin's Hosted Fields (its control frame on `cdn.pinpayments.com`) and Pin.js on a merchant's own page send the card as JSON to `https://api.pinpayments.com/1/cards` under the merchant's publishable key, and Pin answers with a card token the merchant's server charges afterwards. The sync now also asks for `capabilities=pin_payments_card_token`, and the API serves Pin's recognizer only for a company Agentcard turned Pin on for. The SDK pauses only the card fields' own request at that exact URL: a secret key, an amount or any other body there fails in your browser before anything is created, and Pin's JSONP form and a card's own record are never paused. The cardholder's device sends the request to Pin itself with the real card, and the page gets Pin's card token. Pin's request names no price, so pass `amount` and `currency`, above zero: without them `authorize()` throws `AmountRequiredError` before anything is created. The API pays only a Pin account Agentcard reviewed for the checkout page the request comes from. Matching API and Vault releases are required. Pin Payments stays off for every company Agentcard has not turned it on for.
|
|
10
|
+
|
|
11
|
+
- Stop the card request Nike's checkout sends from its own card frame. Nike's guest checkout on `www.nike.com` takes the card in a frame on `paymentcc.nike.com`, and that frame posts it, once the three fields are valid and before any button is pressed, to `https://paymentcc.nike.com/creditcardsubmit/<creditCardInfoId>/store`. No processor is on the page, so before this change nothing armed that request. The adapters now pause it and refuse it as `unsupported_checkout` while Nike's profile, `nike_paymentcc_store`, is in `observe`, so the agent's dummy card never reaches Nike. The frame's security code update, a `PUT` to `/creditcardsubmit/<creditCardInfoId>/update`, is aborted in every status as `card_endpoint_refused` with reason `card_resend`. The profile reads the body the frame builds: `accountNumber`, `cardType` one of `VISA`, `MASTERCARD`, `AMERICANEXPRESS` or `DISCOVER`, a two-digit `expirationMonth`, a four-digit `expirationYear`, `cvNumber`, and a `creditCardInfoId` equal to the one in the URL.
|
|
12
|
+
|
|
7
13
|
## 0.23.26
|
|
8
14
|
|
|
9
15
|
- Pause Paymob's card payment for the cardholder's device. Paymob's own checkout in Egypt, the UAE, Saudi Arabia and Oman, Unified Checkout on `<country>.checkout.paymob.com` (where Paymob's payment links and its WooCommerce redirects land) and the Pixel card frame a merchant's page embeds, posts the card as JSON to `https://<accept|uae|ksa|oman>.paymob.com/api/acceptance/payments/pay` with the merchant's payment key. The sync now also asks for `capabilities=paymob_checkout_pay`, and the API serves Paymob's recognizer only for a company Agentcard turned Paymob on for. The SDK pauses only the card form's own payment at that exact URL: a card Paymob saved, a payment that keeps the card, pays in installments, splits the amount, converts its currency or names a Paymob account, and a payment key that enrolls a subscription or names no amount are refused at the pause, and another method's payment with no card (a wallet, Apple Pay, cash) continues to Paymob untouched. The cardholder's device sends the payment to Paymob itself with the real card, and the checkout gets Paymob's answer and runs 3-D Secure in the agent's browser. The payment key names the amount and currency, so `amount` and `currency` are optional; a pair you pass must match the key's. The API and the Vault already carry Paymob's side. Paymob stays off for every company Agentcard has not turned it on for.
|
|
@@ -12,6 +18,8 @@ An unreleased change waits as a file of its own in `changes/` (`changes/README.m
|
|
|
12
18
|
|
|
13
19
|
- Stop continuing Tap Payments' card token request for any merchant. Casefilegame, the Bahrain store that was the one Tap merchant Agentcard had reviewed, is no longer listed: since 2026-10-22 every page of that store shows a fake security check that tells a Mac visitor to open Terminal and paste a command. This build's copy of Agentcard's checkout rules lists no Tap merchant, so the SDK writes the device's ciphertext into no Tap token request, and an approved one fails in the agent's browser instead of continuing. The API already refuses the create for a Tap card form with `unsupported_checkout` (reason `tap_payments_merchant_unreviewed`) before anyone is asked, whatever SDK version sends it. Every other processor is unchanged.
|
|
14
20
|
|
|
21
|
+
- Pay a Nexi Checkout card payment through the checkout relay, for a company Agentcard turns Nexi Checkout on for (dark launch). Nexi Checkout (formerly Nets Easy, used by Danish, Norwegian, Swedish and Finnish merchants) takes the card in its own card frame, which posts it to `https://checkout.dibspayment.eu/api/v1/pay` under the merchant's checkout key. This build declares `nexi_checkout_pay` on every sync, and the API serves the Nexi entry only to a company Agentcard turned Nexi Checkout on for, so every other company's Nexi payments go through untouched, as for an unsupported processor. For an enabled company the SDK pauses only the card form's own payment; a post with "save my card", "remember me" or a card fee is refused before anything is sent, and the frame's card lookup while the number is typed continues untouched. The payment names its amount in minor units but not its currency, so `authorize()` refuses one without `amount` above zero and `currency` (`AmountRequiredError`): send the total the checkout shows. The SDK sends the checkout page's origin as `checkout_origin` (`https://checkout.dibspayment.eu` for Nexi's hosted page), and the API pays only a merchant reviewed for that page. The cardholder's device reads Nexi's own record of the payment and sends the card through the checkout relay, and the frame gets Nexi's answer: the payment done, or Nexi's 3-D Secure step, which the frame runs in the agent's browser, where a challenge needs a person at that browser. A Nexi payment also needs the matching API, Vault and checkout relay releases, and a merchant Agentcard reviewed.
|
|
22
|
+
|
|
15
23
|
## 0.23.25
|
|
16
24
|
|
|
17
25
|
- Pause Barion's Smart Gateway (where Hungarian, Czech and Slovak shops send a buyer who pays by card) for the cardholder's device. The sync now also asks for `capabilities=barion_hosted_payment_page`, and the API serves Barion's recognizer only for a company Agentcard turned Barion on for. The SDK pauses the gateway link, `https://secure.barion.com/Pay?Id=<payment id>` (or `secure.test.barion.com` for a test payment), which carries no card, as a `hosted_form` authorization, and answers the paused navigation with the `submitted_on_device` page once the cardholder's device has paid it. The API takes a Barion entry only from the checkout page of a shop Agentcard reviewed, the page the SDK names as `checkout_origin`. The link names no amount, so send the total Barion's gateway shows, with its currency: `authorize()` throws `AmountRequiredError` without it, and the API refuses a create without one (`amount_required`). A merchant's server usually sends the buyer to the gateway with a redirect, and only `attachToCdp` pauses a redirect, so attach to a Barion checkout with `attachToCdp`. Every post a page the SDK watches makes to the gateway, such as its email check and its card posts, leads to a card: the SDK fails each one and reads `unsupported` with reason `processor_card_page`. Matching API and Vault releases are required, and no Barion shop is reviewed yet. Barion stays off for every company Agentcard has not turned it on for.
|
package/README.md
CHANGED
|
@@ -301,7 +301,7 @@ so new processors work without you shipping a release. `attachToCdp` derives the
|
|
|
301
301
|
`Fetch.enable` url patterns from that same list rather than a constant, which is
|
|
302
302
|
why the sync call belongs before the attach. `agentcard.checkout.cardUrlPatterns()` returns
|
|
303
303
|
those patterns if you arm a CDP connection yourself. Call
|
|
304
|
-
`GET /v2/checkout/recognizers?modes=token,cse,hosted_form,device_encrypt&capabilities=fiserv_card_capture,gmo_shared_pk,capture_context,juspay_txns.v1,datatrans_secure_fields_tokenize,authorize_net_dpm_form,pelecard_transaction,aci_split_card.v1,creditguard_pps_process,primer_payment_instruments,payrails_device_encrypt,converge_hpp_process,worldpay_eprotect_jsonp,wspay_confirm,shiji_sts_pinned_key,amadeus_checkout_actions.v1,worldline_mycheckout_form,verifone_card_capture,ekashu_hosted_payment_page,cybersource_sa_token_create,gravy_session_fields_put,moneris_hosted_tokenization,paddle_vgs_cards,paddle_tokenex_pay,redsys_hosted_payment_page,lyra_krypton_payment,payfast_card_pay,wix_payments_tokenize,paymongo_checkout_pay,paygent_token,pay_nl_card_token,hipay_vault_token,twoc2p_secure_pay,quickpay_hosted_payment_page,revolut_card_field,paypal_card_fields,gopay_card_form,payrexx_card_frame,comgate_hosted_payment_page,przelewy24_hosted_payment_page,makecommerce_card_frame,poynt_collect_nonce,tokenex_iframe_tokenize,transbank_webpay_hosted_payment_page,sumup_checkout_process,clover_card_token,eximbay_hosted_payment_page,toast_pinned_key,xendit_card_token,omise_card_token,paytrail_hosted_payment_page,fastspring_card_payment,openpay_tokenizer,barion_hosted_payment_page,paymob_checkout_pay,payu_latam_webcheckout_card,nexi_checkout_pay`
|
|
304
|
+
`GET /v2/checkout/recognizers?modes=token,cse,hosted_form,device_encrypt&capabilities=fiserv_card_capture,gmo_shared_pk,capture_context,juspay_txns.v1,datatrans_secure_fields_tokenize,authorize_net_dpm_form,pelecard_transaction,aci_split_card.v1,creditguard_pps_process,primer_payment_instruments,payrails_device_encrypt,converge_hpp_process,worldpay_eprotect_jsonp,wspay_confirm,shiji_sts_pinned_key,amadeus_checkout_actions.v1,worldline_mycheckout_form,verifone_card_capture,ekashu_hosted_payment_page,cybersource_sa_token_create,gravy_session_fields_put,moneris_hosted_tokenization,paddle_vgs_cards,paddle_tokenex_pay,redsys_hosted_payment_page,lyra_krypton_payment,payfast_card_pay,wix_payments_tokenize,paymongo_checkout_pay,paygent_token,pay_nl_card_token,hipay_vault_token,twoc2p_secure_pay,quickpay_hosted_payment_page,revolut_card_field,paypal_card_fields,gopay_card_form,payrexx_card_frame,comgate_hosted_payment_page,przelewy24_hosted_payment_page,makecommerce_card_frame,poynt_collect_nonce,tokenex_iframe_tokenize,transbank_webpay_hosted_payment_page,sumup_checkout_process,clover_card_token,eximbay_hosted_payment_page,toast_pinned_key,xendit_card_token,omise_card_token,paytrail_hosted_payment_page,fastspring_card_payment,openpay_tokenizer,barion_hosted_payment_page,paymob_checkout_pay,payu_latam_webcheckout_card,nexi_checkout_pay,pin_payments_card_token`
|
|
305
305
|
for the list this build syncs. The API serves Fiserv's card capture only to a
|
|
306
306
|
build that lists `fiserv_card_capture`, and only for a company Agentcard turned
|
|
307
307
|
Fiserv on for. An older SDK never pauses a Fiserv request it could not finish,
|
|
@@ -429,6 +429,14 @@ page, the cardholder's device sends it to Omise itself with the real card, and
|
|
|
429
429
|
the page gets Omise's token. The API pays only a merchant Agentcard reviewed
|
|
430
430
|
for the page the request comes from. Omise's request names no price, so pass
|
|
431
431
|
`amount` and `currency`, above zero: that is the amount the cardholder approves.
|
|
432
|
+
Pin Payments' card request (`pin_payments_card_token`) is served on the same
|
|
433
|
+
terms: this build pauses the card request Pin's Hosted Fields or Pin.js sends to
|
|
434
|
+
`https://api.pinpayments.com/1/cards`, the cardholder's device sends it to Pin
|
|
435
|
+
itself with the real card, and the page gets Pin's card token, which the
|
|
436
|
+
merchant's server charges afterwards. The API pays only a Pin account Agentcard
|
|
437
|
+
reviewed for the page the request comes from. Pin's request names no price, so
|
|
438
|
+
pass `amount` and `currency`, above zero: that is the amount the cardholder
|
|
439
|
+
approves.
|
|
432
440
|
FastSpring's checkout (`fastspring_card_payment`) is served on the same terms:
|
|
433
441
|
this build pauses the card payment the checkout posts to
|
|
434
442
|
`<store>.onfastspring.com/.../session/<id>/payment`, the cardholder's device
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Written by scripts/generate-agent-amount.mjs from agent-amount-processors.json. Do not edit; git ignores it.
|
|
2
2
|
/** agent-amount-processors.json, sorted; client.ts reads its amount tables from it. */
|
|
3
|
-
export const AGENT_AMOUNT = { "processors": ["amazon_payment_services", "barion", "clover", "comgate", "cybersource_secure_acceptance", "fastspring", "gmo_pg", "gopay", "hipay", "makecommerce", "midtrans", "moneris", "nexi_checkout", "omise", "openpay_bbva", "paddle_vgs", "pay_nl", "payfast", "paygent", "paymongo", "paypal", "payrexx", "paytrail", "payu_latam", "pelecard", "poynt", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p", "wix_payments", "wspay"], "aboveZero": ["amazon_payment_services", "barion", "clover", "comgate", "fastspring", "gopay", "hipay", "makecommerce", "midtrans", "moneris", "nexi_checkout", "omise", "openpay_bbva", "pay_nl", "payfast", "paymongo", "paypal", "payrexx", "payu_latam", "poynt", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p"], "pageAmount": ["pelecard", "sb_payment_service"], "names": { "amazon_payment_services": "Amazon Payment Services", "barion": "Barion", "clover": "Clover", "comgate": "ComGate", "cybersource_secure_acceptance": "CyberSource Secure Acceptance", "fastspring": "FastSpring", "gmo_pg": "GMO", "gopay": "GoPay", "hipay": "HiPay", "makecommerce": "MakeCommerce", "midtrans": "Midtrans", "moneris": "Moneris", "nexi_checkout": "Nexi Checkout", "omise": "Omise", "openpay_bbva": "Openpay", "paddle_vgs": "Paddle", "pay_nl": "Pay.", "payfast": "Payfast", "paygent": "Paygent", "paymongo": "PayMongo", "paypal": "PayPal", "payrexx": "Payrexx", "paytrail": "Paytrail", "payu_latam": "PayU Latam", "pelecard": "Pelecard", "poynt": "GoDaddy Payments", "przelewy24": "Przelewy24", "revolut": "Revolut", "sb_payment_service": "SB Payment Service", "sumup": "SumUp", "tap_payments": "Tap", "toast": "Toast", "tokenex_iframe": "TokenEx", "transbank_webpay": "Webpay", "twoc2p": "2C2P", "wix_payments": "Wix", "wspay": "WSPay" } };
|
|
3
|
+
export const AGENT_AMOUNT = { "processors": ["amazon_payment_services", "barion", "clover", "comgate", "cybersource_secure_acceptance", "fastspring", "gmo_pg", "gopay", "hipay", "makecommerce", "midtrans", "moneris", "nexi_checkout", "omise", "openpay_bbva", "paddle_vgs", "pay_nl", "payfast", "paygent", "paymongo", "paypal", "payrexx", "paytrail", "payu_latam", "pelecard", "pin_payments", "poynt", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p", "wix_payments", "wspay"], "aboveZero": ["amazon_payment_services", "barion", "clover", "comgate", "fastspring", "gopay", "hipay", "makecommerce", "midtrans", "moneris", "nexi_checkout", "omise", "openpay_bbva", "pay_nl", "payfast", "paymongo", "paypal", "payrexx", "payu_latam", "pin_payments", "poynt", "przelewy24", "revolut", "sb_payment_service", "sumup", "tap_payments", "toast", "tokenex_iframe", "transbank_webpay", "twoc2p"], "pageAmount": ["pelecard", "sb_payment_service"], "names": { "amazon_payment_services": "Amazon Payment Services", "barion": "Barion", "clover": "Clover", "comgate": "ComGate", "cybersource_secure_acceptance": "CyberSource Secure Acceptance", "fastspring": "FastSpring", "gmo_pg": "GMO", "gopay": "GoPay", "hipay": "HiPay", "makecommerce": "MakeCommerce", "midtrans": "Midtrans", "moneris": "Moneris", "nexi_checkout": "Nexi Checkout", "omise": "Omise", "openpay_bbva": "Openpay", "paddle_vgs": "Paddle", "pay_nl": "Pay.", "payfast": "Payfast", "paygent": "Paygent", "paymongo": "PayMongo", "paypal": "PayPal", "payrexx": "Payrexx", "paytrail": "Paytrail", "payu_latam": "PayU Latam", "pelecard": "Pelecard", "pin_payments": "Pin Payments", "poynt": "GoDaddy Payments", "przelewy24": "Przelewy24", "revolut": "Revolut", "sb_payment_service": "SB Payment Service", "sumup": "SumUp", "tap_payments": "Tap", "toast": "Toast", "tokenex_iframe": "TokenEx", "transbank_webpay": "Webpay", "twoc2p": "2C2P", "wix_payments": "Wix", "wspay": "WSPay" } };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Written by scripts/generate-capabilities.mjs from capabilities.json. Do not edit; git ignores it.
|
|
2
2
|
/** capabilities.json's list, sorted; client.ts exports it as SUPPORTED_CAPABILITIES. */
|
|
3
|
-
export const DECLARED_CAPABILITIES = ["aci_split_card.v1", "amadeus_checkout_actions.v1", "aps_custom_merchant_page", "authorize_net_dpm_form", "barion_hosted_payment_page", "capture_context", "clover_card_token", "comgate_hosted_payment_page", "converge_hpp_process", "creditguard_pps_process", "cybersource_sa_token_create", "datatrans_secure_fields_tokenize", "ekashu_hosted_payment_page", "eximbay_hosted_payment_page", "fastspring_card_payment", "fiserv_card_capture", "gmo_shared_pk", "gopay_card_form", "gravy_session_fields_put", "hipay_vault_token", "juspay_txns.v1", "lyra_krypton_payment", "makecommerce_card_frame", "midtrans_card_token", "moneris_hosted_tokenization", "nexi_checkout_pay", "omise_card_token", "openpay_tokenizer", "paddle_tokenex_pay", "paddle_vgs_cards", "pay_nl_card_token", "payfast_card_pay", "paygent_token", "paymob_checkout_pay", "paymongo_checkout_pay", "paypal_card_fields", "payrails_device_encrypt", "payrexx_card_frame", "paytrail_hosted_payment_page", "payu_latam_webcheckout_card", "pelecard_transaction", "poynt_collect_nonce", "primer_payment_instruments", "przelewy24_hosted_payment_page", "quickpay_hosted_payment_page", "redsys_hosted_payment_page", "revolut_card_field", "sbps_token_jsonp", "shiji_sts_pinned_key", "sumup_checkout_process", "tap_card_sdk_token", "toast_pinned_key", "tokenex_iframe_tokenize", "transbank_webpay_hosted_payment_page", "twoc2p_secure_pay", "verifone_card_capture", "wix_payments_tokenize", "worldline_mycheckout_form", "worldpay_eprotect_jsonp", "wspay_confirm", "xendit_card_token"];
|
|
3
|
+
export const DECLARED_CAPABILITIES = ["aci_split_card.v1", "amadeus_checkout_actions.v1", "aps_custom_merchant_page", "authorize_net_dpm_form", "barion_hosted_payment_page", "capture_context", "clover_card_token", "comgate_hosted_payment_page", "converge_hpp_process", "creditguard_pps_process", "cybersource_sa_token_create", "datatrans_secure_fields_tokenize", "ekashu_hosted_payment_page", "eximbay_hosted_payment_page", "fastspring_card_payment", "fiserv_card_capture", "gmo_shared_pk", "gopay_card_form", "gravy_session_fields_put", "hipay_vault_token", "juspay_txns.v1", "lyra_krypton_payment", "makecommerce_card_frame", "midtrans_card_token", "moneris_hosted_tokenization", "nexi_checkout_pay", "omise_card_token", "openpay_tokenizer", "paddle_tokenex_pay", "paddle_vgs_cards", "pay_nl_card_token", "payfast_card_pay", "paygent_token", "paymob_checkout_pay", "paymongo_checkout_pay", "paypal_card_fields", "payrails_device_encrypt", "payrexx_card_frame", "paytrail_hosted_payment_page", "payu_latam_webcheckout_card", "pelecard_transaction", "pin_payments_card_token", "poynt_collect_nonce", "primer_payment_instruments", "przelewy24_hosted_payment_page", "quickpay_hosted_payment_page", "redsys_hosted_payment_page", "revolut_card_field", "sbps_token_jsonp", "shiji_sts_pinned_key", "sumup_checkout_process", "tap_card_sdk_token", "toast_pinned_key", "tokenex_iframe_tokenize", "transbank_webpay_hosted_payment_page", "twoc2p_secure_pay", "verifone_card_capture", "wix_payments_tokenize", "worldline_mycheckout_form", "worldpay_eprotect_jsonp", "wspay_confirm", "xendit_card_token"];
|
package/dist/client.d.ts
CHANGED
|
@@ -447,6 +447,18 @@ export declare const SUPPORTED_REGISTRY_FEATURES: readonly string[];
|
|
|
447
447
|
* page the create names. Served on the same terms: only to a build that lists it, for a company
|
|
448
448
|
* Agentcard turned Omise on for.
|
|
449
449
|
*
|
|
450
|
+
* `pin_payments_card_token`: the card request Pin Payments' card fields send, from Hosted Fields'
|
|
451
|
+
* control frame on cdn.pinpayments.com or from Pin.js on a merchant's own page: a JSON POST to
|
|
452
|
+
* https://api.pinpayments.com/1/cards (test-api.pinpayments.com in test) under the merchant's
|
|
453
|
+
* publishable key. This build pauses only the card fields' own body at that exact URL (payment-core
|
|
454
|
+
* pin-payments.js); a secret key, an amount or any other body there fails in the browser before
|
|
455
|
+
* anything is created, and the JSONP form and a card's own record are never paused. The cardholder's
|
|
456
|
+
* device sends the request itself with the real card, and the page gets the token answer
|
|
457
|
+
* payment-core's judge rebuilt. The request names no amount, so the agent's pair, above zero, is the
|
|
458
|
+
* one the cardholder approves, and the API pays only a Pin account payment-core pins for the checkout
|
|
459
|
+
* page the create names. Served on the same terms: only to a build that lists it, for a company
|
|
460
|
+
* Agentcard turned Pin Payments on for.
|
|
461
|
+
*
|
|
450
462
|
* `sbps_token_jsonp`: SB Payment Service's card token request, the JSONP <script>
|
|
451
463
|
* GET its token script sends to /token/generateToken on token.sps-system.com. This
|
|
452
464
|
* build pauses it only as the browser writes it, aborts any other request on that
|
package/dist/client.js
CHANGED
|
@@ -440,6 +440,18 @@ export const SUPPORTED_REGISTRY_FEATURES = ['card_fields', 'checkout_sessions'];
|
|
|
440
440
|
* page the create names. Served on the same terms: only to a build that lists it, for a company
|
|
441
441
|
* Agentcard turned Omise on for.
|
|
442
442
|
*
|
|
443
|
+
* `pin_payments_card_token`: the card request Pin Payments' card fields send, from Hosted Fields'
|
|
444
|
+
* control frame on cdn.pinpayments.com or from Pin.js on a merchant's own page: a JSON POST to
|
|
445
|
+
* https://api.pinpayments.com/1/cards (test-api.pinpayments.com in test) under the merchant's
|
|
446
|
+
* publishable key. This build pauses only the card fields' own body at that exact URL (payment-core
|
|
447
|
+
* pin-payments.js); a secret key, an amount or any other body there fails in the browser before
|
|
448
|
+
* anything is created, and the JSONP form and a card's own record are never paused. The cardholder's
|
|
449
|
+
* device sends the request itself with the real card, and the page gets the token answer
|
|
450
|
+
* payment-core's judge rebuilt. The request names no amount, so the agent's pair, above zero, is the
|
|
451
|
+
* one the cardholder approves, and the API pays only a Pin account payment-core pins for the checkout
|
|
452
|
+
* page the create names. Served on the same terms: only to a build that lists it, for a company
|
|
453
|
+
* Agentcard turned Pin Payments on for.
|
|
454
|
+
*
|
|
443
455
|
* `sbps_token_jsonp`: SB Payment Service's card token request, the JSONP <script>
|
|
444
456
|
* GET its token script sends to /token/generateToken on token.sps-system.com. This
|
|
445
457
|
* build pauses it only as the browser writes it, aborts any other request on that
|
|
@@ -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: fedc712140db2d5651bed3391ac158d67dc04d8be58db9926ed328e9be20eb1b
|
|
4
4
|
// src/json-path.js
|
|
5
5
|
var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
6
6
|
function isPlainObject(v) {
|
|
@@ -2412,6 +2412,73 @@ var MERCHANT_CARD_ENDPOINT_PROFILES = /* @__PURE__ */ deepFreeze([
|
|
|
2412
2412
|
charge_timing: "deferred",
|
|
2413
2413
|
once_per: { query: "cartId" },
|
|
2414
2414
|
pending: ["the exporch form, never seen live: a HAR of a cart AT&T sends to /msapi/checkoutexporch/v1"]
|
|
2415
|
+
},
|
|
2416
|
+
{
|
|
2417
|
+
id: "nike_paymentcc_store",
|
|
2418
|
+
merchant: "Nike",
|
|
2419
|
+
status: "observe",
|
|
2420
|
+
evidence: [
|
|
2421
|
+
"www.nike.com guest checkout, read live on Oct 23, 2026 in a Kernel browser with every non-GET request aborted before it left (a placeholder card, nothing sent): the card is typed into Nike's own card frame, https://paymentcc.nike.com/services/default?id=<creditCardInfoId>&ctx=…&language=…&maskerEnabled=…, a form #creditCardForm with #creditCardNumber, #expirationDate (MM/YY) and #cvNumber and hidden expirationMonth and expirationYear. No processor frame, tokenizer or client-side encryption is on the page.",
|
|
2422
|
+
"The frame's own script (/resources/js/common.js) posts the card once all three fields are valid, on a field's blur or keyup, with no button press: XHR POST /creditcardsubmit/<creditCardInfoId>/store, Content-Type application/json; charset=utf-8, body {accountNumber (digits), cardType, expirationMonth (MM), expirationYear ('20' + YY), creditCardInfoId (the frame's id query value, the same as the path), cvNumber}. The captured request carried the .nike.com cookies (Akamai's ak_bmsc and bm_sv among them), Origin https://paymentcc.nike.com, and no CSRF or auth header.",
|
|
2423
|
+
"cardType comes from the frame's own validator table, first match wins: AMERICANEXPRESS (34, 37), CARTASI (a list of Italian 4 and 5 BINs), CARTEBLEUE, DANKORT, DISCOVER, DINERS, DOMESTICMAESTRO, INTERNATIONALMAESTRO, JCB, MASTERCARD (51-55 and 2221-2720), VISAELECTRON, VISA (4).",
|
|
2424
|
+
"After the post the frame asks GET /creditcardsubmit/<id>/isValid?mode=1 and tells the page its brand, last four and expiry by postMessage. A CVV-only change sends PUT /creditcardsubmit/<id>/update {cvNumber}. Continue to Order Review then posts https://api.nike.com/payment/preview/v3 with paymentInfo naming the creditCardInfoId, the brand, the last four and a masked accountNumber, beside the checkout total and currency: no card number leaves the page outside the store request."
|
|
2425
|
+
],
|
|
2426
|
+
har: null,
|
|
2427
|
+
checkout: "https://www.nike.com",
|
|
2428
|
+
checkout_frame: false,
|
|
2429
|
+
frame: "https://paymentcc.nike.com",
|
|
2430
|
+
endpoint: "https://paymentcc.nike.com",
|
|
2431
|
+
method: "POST",
|
|
2432
|
+
path: "/creditcardsubmit/:creditCardInfoId/store",
|
|
2433
|
+
query: {},
|
|
2434
|
+
navigation: null,
|
|
2435
|
+
encoding: "json",
|
|
2436
|
+
session: {
|
|
2437
|
+
cookies: true,
|
|
2438
|
+
cookie_names: null,
|
|
2439
|
+
headers: [...BROWSER_HEADERS, "content-type"],
|
|
2440
|
+
required: []
|
|
2441
|
+
},
|
|
2442
|
+
card: {
|
|
2443
|
+
pan: { at: ["accountNumber"], format: "digits" },
|
|
2444
|
+
cvv: { at: ["cvNumber"], format: "digits" },
|
|
2445
|
+
exp_month: { at: ["expirationMonth"], format: "mm" },
|
|
2446
|
+
exp_year: { at: ["expirationYear"], format: "yyyy" },
|
|
2447
|
+
expiry: null,
|
|
2448
|
+
last4: null,
|
|
2449
|
+
leading: null,
|
|
2450
|
+
brands: [{ at: ["cardType"], map: { visa: "VISA", mastercard: "MASTERCARD", amex: "AMERICANEXPRESS", discover: "DISCOVER" } }],
|
|
2451
|
+
bins: null
|
|
2452
|
+
},
|
|
2453
|
+
merchant_key: null,
|
|
2454
|
+
requires: [
|
|
2455
|
+
{ at: ["creditCardInfoId"], matches: "guid" },
|
|
2456
|
+
{ at: ["creditCardInfoId"], equals_path: "creditCardInfoId" }
|
|
2457
|
+
],
|
|
2458
|
+
refuse: [],
|
|
2459
|
+
payment_method: null,
|
|
2460
|
+
// The store request carries no total: the order's total first travels in payment/preview/v3, after it.
|
|
2461
|
+
amount: null,
|
|
2462
|
+
currency: "USD",
|
|
2463
|
+
response: { headers: ["content-type"], withhold: [] },
|
|
2464
|
+
resends: [
|
|
2465
|
+
// The frame's CVV-only update, which sends the typed security code again outside the store request.
|
|
2466
|
+
{ method: "PUT", path: "/creditcardsubmit/:creditCardInfoId/update", query: {} }
|
|
2467
|
+
],
|
|
2468
|
+
challenge: null,
|
|
2469
|
+
facts: null,
|
|
2470
|
+
// paymentcc.nike.com answers /robots.txt with a 404; the frame's own masking script is a harmless GET it serves.
|
|
2471
|
+
bootstrap: "/resources/js/masker.js",
|
|
2472
|
+
timeout_ms: 3e4,
|
|
2473
|
+
charge_timing: "deferred",
|
|
2474
|
+
once_per: { path: "creditCardInfoId" },
|
|
2475
|
+
pending: [
|
|
2476
|
+
"the answer to the store request (status, body and headers) and to isValid, which this capture aborted before they were sent",
|
|
2477
|
+
"a total to hold the agent's amount to: the store request names none, and Nike's checkout total travels only in payment/preview/v3 after it",
|
|
2478
|
+
"which call authorizes the card (payment/preview/v3 or the order submit), and whether the charge when the order ships needs the card to stay open",
|
|
2479
|
+
"a card the frame names CARTASI, CARTEBLEUE, DANKORT or a Maestro type, which the brand map writes as its network's code",
|
|
2480
|
+
"whether Akamai accepts the relay's request with cookies the agent's browser minted"
|
|
2481
|
+
]
|
|
2415
2482
|
}
|
|
2416
2483
|
]);
|
|
2417
2484
|
function wireProjection(profiles) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-cards/sdk",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.27",
|
|
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",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"_comment_test": "check:built runs first and names the command when a file the build generates (the copies in src/, the preflight contracts in dist/, the Kernel inventory) is missing or stale; verify:pack runs last, on the same dist.",
|
|
31
31
|
"check:built": "node scripts/generate-payment-core.mjs --check && node scripts/generate-voice-stream.mjs --check && node scripts/generate-url-masks.mjs --check && node scripts/generate-capabilities.mjs --check && node scripts/generate-agent-amount.mjs --check && node scripts/generate-preflight-contract.mjs --check && node scripts/generate-kernel-native-inventory.mjs --check",
|
|
32
32
|
"verify:pack": "node scripts/verify-pack.mjs",
|
|
33
|
-
"test": "npm run check:built && node test.mjs && node --test lifecycle.test.mjs merchant-abort.test.mjs preparation.test.mjs braintree.test.mjs pre-claim.test.mjs ekashu.test.mjs redsys.test.mjs quickpay.test.mjs paytrail.test.mjs paypal-hosted-fields.test.mjs paypal-card-forms.test.mjs cybersource-secure-acceptance.test.mjs ebanx.test.mjs payrexx.test.mjs payrexx-follow-ups.test.mjs payrexx-adapters.test.mjs autopilot.test.mjs stripe-checkout.test.mjs stripe-setup.test.mjs stripe-legacy-checkout.test.mjs payment-core.test.mjs prepared-processor.test.mjs merchant-hosted.test.mjs merchant-total.test.mjs sandbox-declaration.test.mjs minimum-delay.test.mjs paysafe.test.mjs wix-payments.test.mjs hipay.test.mjs openpay.test.mjs payu.test.mjs attachment.test.mjs worker-targets.test.mjs mercado-checkout.test.mjs mercado-polling.test.mjs amadeus.test.mjs pelecard.test.mjs aci.test.mjs primer.test.mjs payrails.test.mjs elavon-converge.test.mjs voice.test.mjs agentcard.test.mjs buy.test.mjs readme.test.mjs gmo.test.mjs cybersource-flex.test.mjs juspay-gate.test.mjs card-endpoint.test.mjs card-endpoint-fastspring.test.mjs card-endpoint-navigation.test.mjs merchant-session-probe.test.mjs datatrans.test.mjs authorize-net-dpm.test.mjs creditguard.test.mjs eprotect.test.mjs wspay.test.mjs shiji-sts.test.mjs worldline-mycheckout.test.mjs verifone.test.mjs gravy.test.mjs paddle-vgs.test.mjs sbps.test.mjs hold.test.mjs paddle-tokenex.test.mjs lyra.test.mjs gopay.test.mjs paygent.test.mjs twoc2p.test.mjs tap-payments.test.mjs pay-nl.test.mjs toast.test.mjs redact-url.test.mjs hosted-entry.test.mjs comgate.test.mjs przelewy24.test.mjs tokenex-iframe.test.mjs transbank.test.mjs sumup.test.mjs clover.test.mjs eximbay.test.mjs xendit.test.mjs omise.test.mjs fastspring.test.mjs amazon-payment-services.test.mjs barion.test.mjs paymob.test.mjs payu-latam.test.mjs nexi-checkout.test.mjs && node --test preflight-package.test.mjs preflight-collector.test.mjs browser-tests.test.mjs && node --test kernel-native-qualification.test.mjs && node --test ../vault/scripts/recurly-validation/watch-duty-sdk-result.test.mjs && node scripts/verify-pack.mjs",
|
|
33
|
+
"test": "npm run check:built && node test.mjs && node --test lifecycle.test.mjs merchant-abort.test.mjs preparation.test.mjs braintree.test.mjs pre-claim.test.mjs ekashu.test.mjs redsys.test.mjs quickpay.test.mjs paytrail.test.mjs paypal-hosted-fields.test.mjs paypal-card-forms.test.mjs cybersource-secure-acceptance.test.mjs ebanx.test.mjs payrexx.test.mjs payrexx-follow-ups.test.mjs payrexx-adapters.test.mjs autopilot.test.mjs stripe-checkout.test.mjs stripe-setup.test.mjs stripe-legacy-checkout.test.mjs payment-core.test.mjs prepared-processor.test.mjs merchant-hosted.test.mjs merchant-total.test.mjs sandbox-declaration.test.mjs minimum-delay.test.mjs paysafe.test.mjs wix-payments.test.mjs hipay.test.mjs openpay.test.mjs payu.test.mjs attachment.test.mjs worker-targets.test.mjs mercado-checkout.test.mjs mercado-polling.test.mjs amadeus.test.mjs pelecard.test.mjs aci.test.mjs primer.test.mjs payrails.test.mjs elavon-converge.test.mjs voice.test.mjs agentcard.test.mjs buy.test.mjs readme.test.mjs gmo.test.mjs cybersource-flex.test.mjs juspay-gate.test.mjs card-endpoint.test.mjs card-endpoint-fastspring.test.mjs card-endpoint-navigation.test.mjs merchant-session-probe.test.mjs datatrans.test.mjs authorize-net-dpm.test.mjs creditguard.test.mjs eprotect.test.mjs wspay.test.mjs shiji-sts.test.mjs worldline-mycheckout.test.mjs verifone.test.mjs gravy.test.mjs paddle-vgs.test.mjs sbps.test.mjs hold.test.mjs paddle-tokenex.test.mjs lyra.test.mjs gopay.test.mjs paygent.test.mjs twoc2p.test.mjs tap-payments.test.mjs pay-nl.test.mjs toast.test.mjs redact-url.test.mjs hosted-entry.test.mjs comgate.test.mjs przelewy24.test.mjs tokenex-iframe.test.mjs transbank.test.mjs sumup.test.mjs clover.test.mjs eximbay.test.mjs xendit.test.mjs omise.test.mjs fastspring.test.mjs amazon-payment-services.test.mjs barion.test.mjs paymob.test.mjs payu-latam.test.mjs nexi-checkout.test.mjs pin-payments.test.mjs && node --test preflight-package.test.mjs preflight-collector.test.mjs browser-tests.test.mjs && node --test kernel-native-qualification.test.mjs && node --test ../vault/scripts/recurly-validation/watch-duty-sdk-result.test.mjs && node scripts/verify-pack.mjs",
|
|
34
34
|
"test:browser": "node browser-tests.mjs",
|
|
35
35
|
"check:payment-core": "node scripts/generate-payment-core.mjs --check",
|
|
36
36
|
"check:voice-stream": "node scripts/generate-voice-stream.mjs --check",
|