@agent-cards/checkout 0.19.0 → 0.21.0
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/README.md +6 -753
- package/cdp.d.ts +1 -0
- package/cdp.js +2 -0
- package/index.d.ts +1 -0
- package/index.js +2 -0
- package/package.json +33 -33
- package/playwright.d.ts +1 -0
- package/playwright.js +2 -0
- package/preflight.d.ts +1 -0
- package/preflight.js +2 -0
- package/CHANGELOG.md +0 -132
- package/PREFLIGHT.md +0 -312
- package/dist/adyen-merchant-hosted.generated.d.ts +0 -277
- package/dist/adyen-merchant-hosted.generated.js +0 -1902
- package/dist/adyen.generated.d.ts +0 -24
- package/dist/adyen.generated.js +0 -64
- package/dist/attachment.d.ts +0 -11
- package/dist/attachment.js +0 -50
- package/dist/braintree.d.ts +0 -2
- package/dist/braintree.generated.d.ts +0 -10
- package/dist/braintree.generated.js +0 -302
- package/dist/braintree.js +0 -2
- package/dist/builtin-registry.generated.d.ts +0 -2
- package/dist/builtin-registry.generated.js +0 -1
- package/dist/card-fields.generated.d.ts +0 -3
- package/dist/card-fields.generated.js +0 -46
- package/dist/cdp.d.ts +0 -192
- package/dist/cdp.js +0 -2393
- package/dist/checkout-com.generated.d.ts +0 -4
- package/dist/checkout-com.generated.js +0 -183
- package/dist/client.d.ts +0 -849
- package/dist/client.js +0 -1754
- package/dist/cse-body.d.ts +0 -25
- package/dist/cse-body.js +0 -41
- package/dist/fiserv.d.ts +0 -65
- package/dist/fiserv.generated.d.ts +0 -73
- package/dist/fiserv.generated.js +0 -830
- package/dist/fiserv.js +0 -104
- package/dist/hosted-form.d.ts +0 -44
- package/dist/hosted-form.js +0 -78
- package/dist/index.d.ts +0 -18
- package/dist/index.js +0 -10
- package/dist/lifecycle.d.ts +0 -179
- package/dist/lifecycle.js +0 -395
- package/dist/mercado-checkout.d.ts +0 -20
- package/dist/mercado-checkout.generated.d.ts +0 -52
- package/dist/mercado-checkout.generated.js +0 -198
- package/dist/mercado-checkout.js +0 -108
- package/dist/merchant-handoff.d.ts +0 -54
- package/dist/merchant-handoff.js +0 -100
- package/dist/merchant-hosted.d.ts +0 -140
- package/dist/merchant-hosted.js +0 -170
- package/dist/merchant-total-watch.d.ts +0 -115
- package/dist/merchant-total-watch.js +0 -268
- package/dist/merchant-total.d.ts +0 -257
- package/dist/merchant-total.js +0 -383
- package/dist/owned-shop.generated.d.ts +0 -24
- package/dist/owned-shop.generated.js +0 -108
- package/dist/paysafe.generated.d.ts +0 -12
- package/dist/paysafe.generated.js +0 -87
- package/dist/playwright.d.ts +0 -3
- package/dist/playwright.js +0 -3
- package/dist/pre-claim.d.ts +0 -123
- package/dist/pre-claim.js +0 -386
- package/dist/preflight-capabilities.generated.d.ts +0 -1253
- package/dist/preflight-capabilities.generated.js +0 -1929
- package/dist/preflight-catalog.json +0 -4727
- package/dist/preflight-playwright.d.ts +0 -34
- package/dist/preflight-playwright.js +0 -355
- package/dist/preflight-schemas.json +0 -1122
- package/dist/preflight.d.ts +0 -1
- package/dist/preflight.generated.d.ts +0 -1965
- package/dist/preflight.generated.js +0 -570
- package/dist/preflight.js +0 -2
- package/dist/preparation.d.ts +0 -38
- package/dist/preparation.js +0 -191
- package/dist/prepared-processor.d.ts +0 -43
- package/dist/prepared-processor.js +0 -172
- package/dist/recurly.generated.d.ts +0 -1
- package/dist/recurly.generated.js +0 -87
- package/dist/registry.d.ts +0 -121
- package/dist/registry.js +0 -310
- package/dist/spreedly.generated.d.ts +0 -10
- package/dist/spreedly.generated.js +0 -332
- package/dist/stripe-checkout.d.ts +0 -81
- package/dist/stripe-checkout.generated.d.ts +0 -82
- package/dist/stripe-checkout.generated.js +0 -1093
- package/dist/stripe-checkout.js +0 -140
- package/dist/substitute.d.ts +0 -38
- package/dist/substitute.js +0 -23
- package/dist/substitutions.generated.d.ts +0 -11
- package/dist/substitutions.generated.js +0 -818
- package/examples/existing-browser.mjs +0 -63
- package/examples/preflight/classify-direct.mjs +0 -21
- package/examples/preflight/classify-kernel.mjs +0 -30
- package/examples/preflight/inspect-browser.mjs +0 -44
- package/examples/preflight/kernel-native/README.md +0 -112
- package/examples/preflight/kernel-native/documented-adapters.json +0 -113
- package/examples/preflight/kernel-native/inventory.json +0 -233
- package/examples/preflight/kernel-native/qualification.mjs +0 -182
- package/examples/preflight/kernel-profile.empty.json +0 -11
- package/examples/preflight/mollie-hosted.observations.json +0 -23
- package/examples/preflight/mollie-hosted.result.json +0 -103
- package/examples/preflight/stripe-script.direct.result.json +0 -92
- package/examples/preflight/stripe-script.observations.json +0 -16
- package/examples/preflight/stripe-script.result.json +0 -87
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
// Maintainer tooling. Reports are trusted review inputs, never merchant-page inputs.
|
|
2
|
-
import { createHash } from 'node:crypto';
|
|
3
|
-
import { readFile, realpath } from 'node:fs/promises';
|
|
4
|
-
import { isAbsolute, relative, resolve, sep } from 'node:path';
|
|
5
|
-
import { pathToFileURL } from 'node:url';
|
|
6
|
-
import { BUILTIN_REGISTRY } from '@agent-cards/checkout';
|
|
7
|
-
import { assessCheckoutSupport, getCheckoutPreflightCatalog } from '@agent-cards/checkout/preflight';
|
|
8
|
-
|
|
9
|
-
export const SUPPORTED_CHECKS = Object.freeze([
|
|
10
|
-
'native_recognition', 'approval_pause_resume', 'processor_replay',
|
|
11
|
-
'merchant_confirmation', 'unrecognized_request_passthrough', 'decline_or_error',
|
|
12
|
-
'no_duplicate_submission', 'authentication_or_explicit_exclusion',
|
|
13
|
-
]);
|
|
14
|
-
const SCENARIOS = ['one_time', 'save_card', 'subscription_initial', 'subscription_renewal'];
|
|
15
|
-
const sha256 = bytes => createHash('sha256').update(bytes).digest('hex');
|
|
16
|
-
const canonical = value => Array.isArray(value) ? value.map(canonical)
|
|
17
|
-
: value !== null && typeof value === 'object'
|
|
18
|
-
? Object.fromEntries(Object.keys(value).sort().map(key => [key, canonical(value[key])])) : value;
|
|
19
|
-
export const digest = value => sha256(JSON.stringify(canonical(value)));
|
|
20
|
-
const fail = message => { throw new Error(message); };
|
|
21
|
-
const requireThat = (condition, message) => { if (!condition) fail(message); };
|
|
22
|
-
const record = value => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
23
|
-
const id = value => typeof value === 'string' && /^[A-Za-z0-9][A-Za-z0-9._+-]{0,119}$/.test(value);
|
|
24
|
-
const hash = value => typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);
|
|
25
|
-
const text = value => typeof value === 'string' && value.trim().length > 0 && value.length <= 256 && !/[\x00-\x1f]/.test(value);
|
|
26
|
-
const keys = (value, required, optional = []) => record(value)
|
|
27
|
-
&& required.every(key => Object.hasOwn(value, key))
|
|
28
|
-
&& Object.keys(value).every(key => [...required, ...optional].includes(key));
|
|
29
|
-
|
|
30
|
-
function requireCompleteCatalog(catalog) {
|
|
31
|
-
requireThat(record(catalog) && catalog.schema_version === 1 && Array.isArray(catalog.processors), 'Invalid catalog.');
|
|
32
|
-
// This projection comes from request recognition, independently of preflight's
|
|
33
|
-
// capability projection. Regenerating a reduced inventory cannot hide a PSP.
|
|
34
|
-
const expected = new Map(BUILTIN_REGISTRY.map(({ psp, mode = 'token' }) => [psp, mode]));
|
|
35
|
-
const seen = new Set();
|
|
36
|
-
for (const processor of catalog.processors) {
|
|
37
|
-
requireThat(record(processor) && !seen.has(processor.psp) && expected.has(processor.psp)
|
|
38
|
-
&& expected.get(processor.psp) === processor.mode, 'Canonical processor membership or mode mismatch.');
|
|
39
|
-
seen.add(processor.psp);
|
|
40
|
-
}
|
|
41
|
-
requireThat(seen.size === expected.size, 'The catalog omits a canonical processor.');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function buildInventory(catalog, baseline) {
|
|
45
|
-
requireCompleteCatalog(catalog);
|
|
46
|
-
requireThat(baseline.evidence_level === 'documentation_only' && baseline.native_build === null
|
|
47
|
-
&& Array.isArray(baseline.documented_adapters), 'Expected a documentation-only baseline.');
|
|
48
|
-
const documented = new Map(baseline.documented_adapters.map(adapter => [adapter.psp, adapter]));
|
|
49
|
-
requireThat(documented.size === baseline.documented_adapters.length
|
|
50
|
-
&& [...documented.keys()].every(psp => catalog.processors.some(processor => processor.psp === psp)), 'Baseline processor drift.');
|
|
51
|
-
return {
|
|
52
|
-
schema_version: 1, catalog_version: catalog.catalog_version, catalog_sha256: digest(catalog),
|
|
53
|
-
baseline_version: baseline.baseline_version, baseline_sha256: digest(baseline), native_build: null,
|
|
54
|
-
processors: catalog.processors.map(({ psp, mode }) => ({
|
|
55
|
-
psp, mode, documentation: documented.has(psp) ? 'documented' : 'not_documented', status: 'unknown',
|
|
56
|
-
limitations: documented.has(psp) ? [...documented.get(psp).limitations, 'Native runtime evidence is missing.']
|
|
57
|
-
: ['No adapter declaration was found in the pinned documentation. Native runtime evidence is missing.'],
|
|
58
|
-
})),
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function profileClaims(catalog, profile, now) {
|
|
63
|
-
requireThat(keys(profile, ['schema_version', 'profile_version', 'catalog_version', 'integration', 'entries'], ['processor_entries', 'expires_at'])
|
|
64
|
-
&& profile.schema_version === 1 && id(profile.profile_version)
|
|
65
|
-
&& keys(profile.integration, ['id', 'version']) && profile.integration.id === 'kernel_native'
|
|
66
|
-
&& id(profile.integration.version), 'Invalid native profile.');
|
|
67
|
-
requireThat(profile.catalog_version === catalog.catalog_version, 'Profile catalog mismatch.');
|
|
68
|
-
// Ask the installed classifier to validate its own contract, including dates.
|
|
69
|
-
// Empty observations exercise profile validation without claiming a checkout.
|
|
70
|
-
const assessment = assessCheckoutSupport({ schema_version: 1, catalog_version: catalog.catalog_version,
|
|
71
|
-
signals: [], observation: { complete: true, truncated: false, reasons: [] } },
|
|
72
|
-
{ integration: profile.integration, profile, now });
|
|
73
|
-
requireThat(assessment.reason_codes.every(code => ['psp_not_detected', 'checkout_flow_unidentified'].includes(code)),
|
|
74
|
-
'The installed classifier rejected the profile, catalog, or current time.');
|
|
75
|
-
requireThat(Array.isArray(profile.entries) && profile.entries.length <= 256
|
|
76
|
-
&& (profile.processor_entries === undefined || (Array.isArray(profile.processor_entries) && profile.processor_entries.length <= 256)), 'Invalid profile declarations.');
|
|
77
|
-
const claims = new Map();
|
|
78
|
-
const add = (entry, kind) => {
|
|
79
|
-
const isFlow = kind === 'flow';
|
|
80
|
-
const required = isFlow ? ['flow', 'operation', 'operation_version', 'mode', 'scenario', 'status', 'limitations']
|
|
81
|
-
: ['psp', 'mode', 'scenario', 'status', 'limitations'];
|
|
82
|
-
requireThat(keys(entry, required) && SCENARIOS.includes(entry.scenario)
|
|
83
|
-
&& ['supported', 'unsupported'].includes(entry.status)
|
|
84
|
-
&& Array.isArray(entry.limitations) && entry.limitations.length > 0 && entry.limitations.length <= 16
|
|
85
|
-
&& entry.limitations.every(text), 'Each declaration needs a valid status, scenario, and explicit limitations.');
|
|
86
|
-
const definition = isFlow ? catalog.flows.find(flow => flow.id === entry.flow)
|
|
87
|
-
: catalog.processors.find(processor => processor.psp === entry.psp);
|
|
88
|
-
requireThat(definition && definition.mode === entry.mode
|
|
89
|
-
&& (!isFlow || (definition.operation === entry.operation && definition.operation_version === entry.operation_version)), 'Unknown declaration or operation/mode mismatch.');
|
|
90
|
-
if (entry.status === 'supported') {
|
|
91
|
-
requireThat(definition.server_constraint !== 'unsupported' && entry.scenario !== 'subscription_renewal'
|
|
92
|
-
&& !(entry.mode === 'hosted_form' && entry.scenario !== 'one_time'), 'Shared Vault exclusion cannot be overridden.');
|
|
93
|
-
}
|
|
94
|
-
const key = isFlow ? `flow:${entry.flow}:${entry.operation}:${entry.operation_version}:${entry.mode}:${entry.scenario}`
|
|
95
|
-
: `processor:${entry.psp}:${entry.mode}:${entry.scenario}`;
|
|
96
|
-
requireThat(!claims.has(key), 'Duplicate profile declaration.');
|
|
97
|
-
const checks = entry.status === 'supported' ? [...SUPPORTED_CHECKS] : ['native_exclusion'];
|
|
98
|
-
if (entry.status === 'supported' && ['save_card', 'subscription_initial'].includes(entry.scenario)) {
|
|
99
|
-
checks.push('stored_card_consent', entry.scenario === 'save_card' ? 'merchant_card_saved' : 'merchant_subscription_confirmation');
|
|
100
|
-
}
|
|
101
|
-
claims.set(key, checks);
|
|
102
|
-
};
|
|
103
|
-
profile.entries.forEach(entry => add(entry, 'flow'));
|
|
104
|
-
(profile.processor_entries ?? []).forEach(entry => add(entry, 'processor'));
|
|
105
|
-
requireThat(claims.size > 0, 'An empty profile is an integration draft, not a qualified release.');
|
|
106
|
-
return claims;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
async function verifyEvidence(evidence, directory) {
|
|
110
|
-
requireThat(keys(evidence, ['path', 'sha256']) && typeof evidence.path === 'string'
|
|
111
|
-
&& evidence.path.length > 0 && evidence.path.length <= 1024 && !/[\x00-\x1f\\]/.test(evidence.path)
|
|
112
|
-
&& !isAbsolute(evidence.path) && !evidence.path.split('/').includes('..') && hash(evidence.sha256), 'Invalid evidence path or digest.');
|
|
113
|
-
const actual = await realpath(resolve(directory, evidence.path));
|
|
114
|
-
const inside = relative(directory, actual);
|
|
115
|
-
requireThat(inside !== '' && inside !== '..' && !inside.startsWith(`..${sep}`) && !isAbsolute(inside), 'Evidence escapes its directory.');
|
|
116
|
-
requireThat(sha256(await readFile(actual)) === evidence.sha256, 'Evidence digest mismatch.');
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/** Validates a trusted attestation and its retained files, not the truth of a test run. */
|
|
120
|
-
export async function verifyRelease({ catalog, profile, report, runtime, evidenceDirectory, now = new Date().toISOString() }) {
|
|
121
|
-
requireCompleteCatalog(catalog);
|
|
122
|
-
const claims = profileClaims(catalog, profile, now);
|
|
123
|
-
requireThat(keys(runtime, ['version', 'artifact_sha256']) && id(runtime.version) && hash(runtime.artifact_sha256), 'Actual native build identity is required.');
|
|
124
|
-
requireThat(keys(report, ['schema_version', 'execution', 'adapter', 'catalog_sha256', 'profile_sha256', 'harness_commit', 'reviewed_by', 'claims'])
|
|
125
|
-
&& report.schema_version === 1 && report.execution === 'kernel_native'
|
|
126
|
-
&& keys(report.adapter, ['version', 'artifact_sha256'])
|
|
127
|
-
&& typeof report.harness_commit === 'string' && /^[a-f0-9]{40}$/.test(report.harness_commit)
|
|
128
|
-
&& text(report.reviewed_by) && Array.isArray(report.claims), 'A reviewed native execution report is required.');
|
|
129
|
-
requireThat(report.adapter.version === runtime.version && report.adapter.artifact_sha256 === runtime.artifact_sha256
|
|
130
|
-
&& profile.integration.version === runtime.version, 'Native build mismatch.');
|
|
131
|
-
requireThat(report.catalog_sha256 === digest(catalog), 'Catalog evidence drift. Requalify this catalog.');
|
|
132
|
-
requireThat(report.profile_sha256 === digest(profile), 'Profile evidence drift. Requalify these declarations.');
|
|
133
|
-
requireThat(report.claims.length === claims.size, 'Evidence must cover exactly the declared claims.');
|
|
134
|
-
const directory = await realpath(evidenceDirectory);
|
|
135
|
-
const seen = new Set();
|
|
136
|
-
for (const claim of report.claims) {
|
|
137
|
-
requireThat(keys(claim, ['key', 'checks']) && claims.has(claim.key) && !seen.has(claim.key)
|
|
138
|
-
&& Array.isArray(claim.checks), 'Unknown or duplicate evidence claim.');
|
|
139
|
-
seen.add(claim.key);
|
|
140
|
-
const expected = claims.get(claim.key);
|
|
141
|
-
requireThat(claim.checks.length === expected.length, 'Missing or extra native checks.');
|
|
142
|
-
const checks = new Set();
|
|
143
|
-
for (const check of claim.checks) {
|
|
144
|
-
requireThat(keys(check, ['id', 'outcome', 'evidence']) && expected.includes(check.id)
|
|
145
|
-
&& !checks.has(check.id) && check.outcome === 'passed', 'Missing, failed, or duplicate native check.');
|
|
146
|
-
checks.add(check.id);
|
|
147
|
-
await verifyEvidence(check.evidence, directory);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return { status: 'qualified', integration: profile.integration, profile_sha256: digest(profile) };
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
async function main(args) {
|
|
154
|
-
const catalog = getCheckoutPreflightCatalog();
|
|
155
|
-
const readJSON = async path => JSON.parse(await readFile(path, 'utf8'));
|
|
156
|
-
if (args[0] === 'inventory' && (args.length === 1 || (args.length === 2 && args[1] === '--check'))) {
|
|
157
|
-
const inventory = buildInventory(catalog, await readJSON(new URL('./documented-adapters.json', import.meta.url)));
|
|
158
|
-
if (args[1] === '--check') {
|
|
159
|
-
requireThat(digest(inventory) === digest(await readJSON(new URL('./inventory.json', import.meta.url))), 'Inventory drift. Review the catalog and documentation before updating inventory.json.');
|
|
160
|
-
console.log('Native inventory matches the reviewed catalog and documentation. Runtime support remains unknown.');
|
|
161
|
-
} else console.log(JSON.stringify(inventory, null, 2));
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
const flags = ['--profile', '--report', '--runtime', '--evidence-dir'];
|
|
165
|
-
requireThat(args[0] === 'release' && args.length === 9, 'Use inventory [--check] or release --profile JSON --report JSON --runtime JSON --evidence-dir DIRECTORY.');
|
|
166
|
-
const values = {};
|
|
167
|
-
for (let index = 1; index < args.length; index += 2) {
|
|
168
|
-
requireThat(flags.includes(args[index]) && !Object.hasOwn(values, args[index]) && args[index + 1], 'Invalid or duplicate release option.');
|
|
169
|
-
values[args[index]] = args[index + 1];
|
|
170
|
-
}
|
|
171
|
-
const result = await verifyRelease({ catalog, profile: await readJSON(values['--profile']), report: await readJSON(values['--report']),
|
|
172
|
-
runtime: await readJSON(values['--runtime']), evidenceDirectory: values['--evidence-dir'] });
|
|
173
|
-
console.log(JSON.stringify(result, null, 2));
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (process.argv[1] && pathToFileURL(resolve(process.argv[1])).href === import.meta.url) {
|
|
177
|
-
main(process.argv.slice(2)).catch(() => {
|
|
178
|
-
// Paths/reports may contain private deployment metadata. Keep failures out of CLI logs.
|
|
179
|
-
console.error('Native qualification failed. Check the arguments, catalog, build identity, profile, and retained evidence against README.md.');
|
|
180
|
-
process.exitCode = 1;
|
|
181
|
-
});
|
|
182
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"signals": [
|
|
3
|
-
{
|
|
4
|
-
"kind": "document",
|
|
5
|
-
"url": "https://www.mollie.com/checkout/credit-card/session/synthetic-example",
|
|
6
|
-
"frame_id": 0,
|
|
7
|
-
"parent_frame_id": null,
|
|
8
|
-
"visible": true
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"kind": "script",
|
|
12
|
-
"url": "https://js.mollie.com/v2/mollie.js",
|
|
13
|
-
"frame_id": 0,
|
|
14
|
-
"parent_frame_id": null,
|
|
15
|
-
"visible": null
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"observation": {
|
|
19
|
-
"complete": true,
|
|
20
|
-
"truncated": false,
|
|
21
|
-
"reasons": []
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"snapshot": {
|
|
3
|
-
"schema_version": 1,
|
|
4
|
-
"catalog_version": "2026-09-15.1",
|
|
5
|
-
"signals": [
|
|
6
|
-
{
|
|
7
|
-
"rule_id": "mollie-hosted-credit-card",
|
|
8
|
-
"kind": "document",
|
|
9
|
-
"frame_id": 0,
|
|
10
|
-
"parent_frame_id": null,
|
|
11
|
-
"visible": true
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"rule_id": "mollie-components-script",
|
|
15
|
-
"kind": "script",
|
|
16
|
-
"frame_id": 0,
|
|
17
|
-
"parent_frame_id": null,
|
|
18
|
-
"visible": null
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"rule_id": "mollie-components-v2",
|
|
22
|
-
"kind": "script",
|
|
23
|
-
"frame_id": 0,
|
|
24
|
-
"parent_frame_id": null,
|
|
25
|
-
"visible": null
|
|
26
|
-
}
|
|
27
|
-
],
|
|
28
|
-
"observation": {
|
|
29
|
-
"complete": true,
|
|
30
|
-
"truncated": false,
|
|
31
|
-
"reasons": []
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"result": {
|
|
35
|
-
"schema_version": 1,
|
|
36
|
-
"catalog_version": "2026-09-15.1",
|
|
37
|
-
"integration": {
|
|
38
|
-
"id": "kernel_native",
|
|
39
|
-
"version": "example-native-adapter"
|
|
40
|
-
},
|
|
41
|
-
"scenario": "one_time",
|
|
42
|
-
"scenario_defaulted": false,
|
|
43
|
-
"psp": "mollie",
|
|
44
|
-
"flow": "mollie.hosted_components",
|
|
45
|
-
"mode": "token",
|
|
46
|
-
"status": "unknown",
|
|
47
|
-
"support_scope": null,
|
|
48
|
-
"checkout_flow_status": "identified",
|
|
49
|
-
"candidates": [
|
|
50
|
-
{
|
|
51
|
-
"psp": "mollie",
|
|
52
|
-
"relevance": "active",
|
|
53
|
-
"evidence": [
|
|
54
|
-
{
|
|
55
|
-
"rule_id": "mollie-hosted-credit-card",
|
|
56
|
-
"kind": "document",
|
|
57
|
-
"frame_id": 0,
|
|
58
|
-
"parent_frame_id": null,
|
|
59
|
-
"visible": true,
|
|
60
|
-
"origin": "https://www.mollie.com",
|
|
61
|
-
"path_pattern": "/checkout/credit-card/session/:session"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"rule_id": "mollie-components-script",
|
|
65
|
-
"kind": "script",
|
|
66
|
-
"frame_id": 0,
|
|
67
|
-
"parent_frame_id": null,
|
|
68
|
-
"visible": null,
|
|
69
|
-
"origin": "https://js.mollie.com",
|
|
70
|
-
"path_pattern": "/v2/mollie.js"
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"rule_id": "mollie-components-v2",
|
|
74
|
-
"kind": "script",
|
|
75
|
-
"frame_id": 0,
|
|
76
|
-
"parent_frame_id": null,
|
|
77
|
-
"visible": null,
|
|
78
|
-
"origin": "https://js.mollie.com",
|
|
79
|
-
"path_pattern": "^/v2/mollie\\.js$"
|
|
80
|
-
}
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
],
|
|
84
|
-
"reason_codes": [
|
|
85
|
-
"integration_flow_undeclared"
|
|
86
|
-
],
|
|
87
|
-
"limitations": [
|
|
88
|
-
"The payment request must match the supported Mollie Components card-token format.",
|
|
89
|
-
"Authentication and merchant confirmation must finish in the merchant browser.",
|
|
90
|
-
"Merchant configuration, card eligibility and processor approval still determine whether the purchase succeeds."
|
|
91
|
-
],
|
|
92
|
-
"missing_evidence": [
|
|
93
|
-
"integration_flow_capability"
|
|
94
|
-
],
|
|
95
|
-
"observation": {
|
|
96
|
-
"complete": true,
|
|
97
|
-
"truncated": false,
|
|
98
|
-
"reasons": []
|
|
99
|
-
},
|
|
100
|
-
"scope": "preflight_hint",
|
|
101
|
-
"merchant_confirmation_required": true
|
|
102
|
-
}
|
|
103
|
-
}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"snapshot": {
|
|
3
|
-
"schema_version": 1,
|
|
4
|
-
"catalog_version": "2026-09-15.1",
|
|
5
|
-
"signals": [
|
|
6
|
-
{
|
|
7
|
-
"rule_id": "stripe-js-v3",
|
|
8
|
-
"kind": "script",
|
|
9
|
-
"frame_id": 0,
|
|
10
|
-
"parent_frame_id": null,
|
|
11
|
-
"visible": null
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"rule_id": "stripe-js-script",
|
|
15
|
-
"kind": "script",
|
|
16
|
-
"frame_id": 0,
|
|
17
|
-
"parent_frame_id": null,
|
|
18
|
-
"visible": null
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
"observation": {
|
|
22
|
-
"complete": true,
|
|
23
|
-
"truncated": false,
|
|
24
|
-
"reasons": []
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
"result": {
|
|
28
|
-
"schema_version": 1,
|
|
29
|
-
"catalog_version": "2026-09-15.1",
|
|
30
|
-
"integration": {
|
|
31
|
-
"id": "direct_sdk",
|
|
32
|
-
"version": "bundled"
|
|
33
|
-
},
|
|
34
|
-
"scenario": "one_time",
|
|
35
|
-
"scenario_defaulted": false,
|
|
36
|
-
"psp": "stripe",
|
|
37
|
-
"flow": null,
|
|
38
|
-
"mode": "token",
|
|
39
|
-
"status": "supported",
|
|
40
|
-
"support_scope": "processor_integration",
|
|
41
|
-
"checkout_flow_status": "unknown",
|
|
42
|
-
"candidates": [
|
|
43
|
-
{
|
|
44
|
-
"psp": "stripe",
|
|
45
|
-
"relevance": "undetermined",
|
|
46
|
-
"evidence": [
|
|
47
|
-
{
|
|
48
|
-
"rule_id": "stripe-js-v3",
|
|
49
|
-
"kind": "script",
|
|
50
|
-
"frame_id": 0,
|
|
51
|
-
"parent_frame_id": null,
|
|
52
|
-
"visible": null,
|
|
53
|
-
"origin": "https://js.stripe.com",
|
|
54
|
-
"path_pattern": "/v3/*"
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"rule_id": "stripe-js-script",
|
|
58
|
-
"kind": "script",
|
|
59
|
-
"frame_id": 0,
|
|
60
|
-
"parent_frame_id": null,
|
|
61
|
-
"visible": null,
|
|
62
|
-
"origin": "https://js.stripe.com",
|
|
63
|
-
"path_pattern": "^/v3/?$"
|
|
64
|
-
}
|
|
65
|
-
]
|
|
66
|
-
}
|
|
67
|
-
],
|
|
68
|
-
"reason_codes": [
|
|
69
|
-
"checkout_flow_unidentified",
|
|
70
|
-
"processor_supported_by_integration"
|
|
71
|
-
],
|
|
72
|
-
"limitations": [
|
|
73
|
-
"Processor assets alone do not establish the active card payment flow.",
|
|
74
|
-
"Tokenization replays a token response; it does not authorize a later PaymentIntent confirm.",
|
|
75
|
-
"Direct PaymentIntent confirms require a card-bearing template; the intent’s amount is read from Stripe and a hint sent as amount with currency must agree with it.",
|
|
76
|
-
"Direct SetupIntent confirms require a card-bearing template and save a card without charging it; future charges are merchant-managed.",
|
|
77
|
-
"Automatic token-to-PaymentIntent or token-to-SetupIntent continuation is unsupported; tokenization does not bind a later intent.",
|
|
78
|
-
"A token response does not bind a later PaymentIntent confirmation.",
|
|
79
|
-
"A token response does not bind a later SetupIntent confirmation."
|
|
80
|
-
],
|
|
81
|
-
"missing_evidence": [
|
|
82
|
-
"active_checkout_flow"
|
|
83
|
-
],
|
|
84
|
-
"observation": {
|
|
85
|
-
"complete": true,
|
|
86
|
-
"truncated": false,
|
|
87
|
-
"reasons": []
|
|
88
|
-
},
|
|
89
|
-
"scope": "preflight_hint",
|
|
90
|
-
"merchant_confirmation_required": true
|
|
91
|
-
}
|
|
92
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"signals": [
|
|
3
|
-
{
|
|
4
|
-
"kind": "script",
|
|
5
|
-
"url": "https://js.stripe.com/v3/?example=discard-this-query",
|
|
6
|
-
"frame_id": 0,
|
|
7
|
-
"parent_frame_id": null,
|
|
8
|
-
"visible": null
|
|
9
|
-
}
|
|
10
|
-
],
|
|
11
|
-
"observation": {
|
|
12
|
-
"complete": true,
|
|
13
|
-
"truncated": false,
|
|
14
|
-
"reasons": []
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"snapshot": {
|
|
3
|
-
"schema_version": 1,
|
|
4
|
-
"catalog_version": "2026-09-15.1",
|
|
5
|
-
"signals": [
|
|
6
|
-
{
|
|
7
|
-
"rule_id": "stripe-js-v3",
|
|
8
|
-
"kind": "script",
|
|
9
|
-
"frame_id": 0,
|
|
10
|
-
"parent_frame_id": null,
|
|
11
|
-
"visible": null
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"rule_id": "stripe-js-script",
|
|
15
|
-
"kind": "script",
|
|
16
|
-
"frame_id": 0,
|
|
17
|
-
"parent_frame_id": null,
|
|
18
|
-
"visible": null
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
"observation": {
|
|
22
|
-
"complete": true,
|
|
23
|
-
"truncated": false,
|
|
24
|
-
"reasons": []
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
"result": {
|
|
28
|
-
"schema_version": 1,
|
|
29
|
-
"catalog_version": "2026-09-15.1",
|
|
30
|
-
"integration": {
|
|
31
|
-
"id": "kernel_native",
|
|
32
|
-
"version": "example-native-adapter"
|
|
33
|
-
},
|
|
34
|
-
"scenario": "one_time",
|
|
35
|
-
"scenario_defaulted": false,
|
|
36
|
-
"psp": "stripe",
|
|
37
|
-
"flow": null,
|
|
38
|
-
"mode": "token",
|
|
39
|
-
"status": "unknown",
|
|
40
|
-
"support_scope": null,
|
|
41
|
-
"checkout_flow_status": "unknown",
|
|
42
|
-
"candidates": [
|
|
43
|
-
{
|
|
44
|
-
"psp": "stripe",
|
|
45
|
-
"relevance": "undetermined",
|
|
46
|
-
"evidence": [
|
|
47
|
-
{
|
|
48
|
-
"rule_id": "stripe-js-v3",
|
|
49
|
-
"kind": "script",
|
|
50
|
-
"frame_id": 0,
|
|
51
|
-
"parent_frame_id": null,
|
|
52
|
-
"visible": null,
|
|
53
|
-
"origin": "https://js.stripe.com",
|
|
54
|
-
"path_pattern": "/v3/*"
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"rule_id": "stripe-js-script",
|
|
58
|
-
"kind": "script",
|
|
59
|
-
"frame_id": 0,
|
|
60
|
-
"parent_frame_id": null,
|
|
61
|
-
"visible": null,
|
|
62
|
-
"origin": "https://js.stripe.com",
|
|
63
|
-
"path_pattern": "^/v3/?$"
|
|
64
|
-
}
|
|
65
|
-
]
|
|
66
|
-
}
|
|
67
|
-
],
|
|
68
|
-
"reason_codes": [
|
|
69
|
-
"checkout_flow_unidentified",
|
|
70
|
-
"integration_processor_undeclared"
|
|
71
|
-
],
|
|
72
|
-
"limitations": [
|
|
73
|
-
"Processor assets alone do not establish the active card payment flow."
|
|
74
|
-
],
|
|
75
|
-
"missing_evidence": [
|
|
76
|
-
"active_checkout_flow",
|
|
77
|
-
"integration_processor_capability"
|
|
78
|
-
],
|
|
79
|
-
"observation": {
|
|
80
|
-
"complete": true,
|
|
81
|
-
"truncated": false,
|
|
82
|
-
"reasons": []
|
|
83
|
-
},
|
|
84
|
-
"scope": "preflight_hint",
|
|
85
|
-
"merchant_confirmation_required": true
|
|
86
|
-
}
|
|
87
|
-
}
|