Praktinis vadovas: sukurkite turiniu paremtą Stripe vitriną Profound CMS sistemoje — katalogą, kurį pirklys redaguoja be kodo, du parametrinius maršrutus, be galvos krepšelį ir Stripe talpinamą atsiskaitymą.
Baigta parduotuvė veiksme — naršykite kategoriją, atidarykite produktą, įdėkite į krepšelį, atsiskaitykite.
Praktinis žingsnis po žingsnio vadovas, kuriame Profound CMS platformoje sukuriama turiniu paremta parduotuvė: produktų katalogas (kategorijos + prekės), modeliuotas CMS sistemoje, sąrašų ir detalių puslapiai iš vieno maršrutų rinkinio ir „Stripe“ talpinamas atsiskaitymas, pateikiamas kaip be galvos komponentas.
Stuburas — ranka rašytas „Next.js“ ir Profound administravimo sąsaja. Claude Code (per Profound MCP) atlieka didžiąją dalį darbo trijuose užduotyse — katalogo užpildymas, dizaino sistemos paruošimas ir vitrinos komponentų (įskaitant be galvos krepšelį) kūrimas. Trijų dalių planas: Paruošimas, Kūrimas, Perkėlimas į gamybą.
Atsiskaitymai vienoje eilutėje. Naudojame „Stripe“ talpinamą „Checkout“: pirkėjas atsiskaito Stripe puslapyje, ne jūsų. Jūsų programai tereikia atlikti du serverio veiksmus — sukurti „Checkout Session“ ir patvirtinti vieną žiniatinklio kablį. Jokio kortelių laukų, jokių „Stripe Elements“, jokios PCI naštos.
/products/{item_code}, /categories/{category_code}) ir statinį /cart, visus iš vieno komponentų rinkinio.useCart) ir „Stripe“ talpinamą atsiskaitymą, kai kaina visada nustatoma serverio pusėje pagal „Stripe Price ID“.curl -fsSL https://bun.sh/install | bashstripe login) vietiniams žiniatinklio kabliams.gh) ir su GitHub susieta Vercel paskyra.Profound atskiria turinį nuo vaizdavimo:
category, item); vienas pažymėtas UI Element gali būti patalpintas puslapyje (nav, product_grid, …).meta.params.* CEL, routeParams React).cms-renderer; „Stripe“ pridedamas kaip paprasti API maršrutai.Pagrindinė taisyklė, formuojanti kūrimą: CEL sieja tik string/number laukus. Taigi skaliariniai apvalkalai (navigacijos ženklelis, poraštė, antraštės) susiejami per CEL, o visa, kas yra turtingesnė ar kolekcija (produktų tinklelis, vaizdų galerija, turtingas tekstas), gaunama React komponente pagal maršruto parametrą. Ir Stripe yra kainų tiesos šaltinis — CMS price skirtas tik rodymui; apmokestinimas visada nustatomas serverio pusėje pagal „Stripe Price ID“.
Galutinis rezultatas: nedidelis publikuotas katalogas, programa prijungta prie jo, „Stripe“ įdiegta, dizainas vietoje — dar nieko nerodoma.
Prisiregistruokite Profound (WorkOS autentifikacija). Sukurkite svetainę pavadinimu store, tada nukopijuokite jos svetainės ID (UUID administratoriaus URL) ir skaitymo lygio API raktą (Deployments → Create API key). Programa tik skaitys; katalogo užpildymas vėliau vyks per MCP, kuris autentifikuojasi atskirai.
bunx create-profound-next store
cd store
bun add stripe
Sugeneruota struktūra — „Next.js App Router“ projektas, iš anksto sujungtas su Profound (cms-renderer SDK, viską apimantis maršrutas, scenarijus generate-schemas, <Refresher>). Stilistikos nėra.
bun add stripe įtraukia serverio SDK — vienintelę mokėjimų priklausomybę, kurios reikia talpinamam atsiskaitymui.
Įrašykite savo reikšmes į .env.local:
# CMS
PROFOUND_API_KEY=<your read key>
NEXT_PUBLIC_PROFOUND_WEBSITE_ID=<your website id>
NEXT_PUBLIC_CMS_API_URL=https://cms.dev.tryprofound.com
NEXT_PUBLIC_BUNNY_CDN_URL=https://cms-profound.b-cdn.net # serves CMS-hosted images
# Stripe
STRIPE_SECRET_KEY=sk_test_... # test key here; swap to your live key when you go live
STRIPE_WEBHOOK_SECRET=whsec_... # filled in Build step 4
NEXT_PUBLIC_SITE_URL=http://localhost:3000
Gaukite STRIPE_SECRET_KEY Stripe → Developers → API keys. Naudojame bandomąjį raktą (sk_test_…), kad kūrimo metu pinigai nebūtų pajudinami; kai būsite pasirengę priimti tikrus mokėjimus, pakeiskite į aktyvų raktą. Paleiskite bun dev ir atidarykite localhost:3000 — pradinė versija rodoma.
Talpinamas atsiskaitymas nukreipia naršyklę į Stripe URL, todėl serverio slaptasis raktas yra viskas, ko Stripe reikia — jokių viešų raktų, jokio kliento Stripe SDK.
category, product_image ir itemSukurkite tris Custom Components (Components → Create new component) — duomenų šaltinius, tad be UI Element žymos. Nustatykite kiekvieną Active.
CMS neturi „masyvo iš paveikslėlių“ lauko, tad galerija yra nuorodų masyvas į nedidelį product_image komponentą. Sukurkite category ir product_image (ir nustatykite Active) prieš item — nuorodos laukas gali rodyti tik į Active komponentus.
category — name (Text), code (Text, Route Slug), description (Rich text), heroImage (Image)product_image — image (Image)item — name (Text), code (Text, Route Slug), description (Rich text), images (array of references → product_image), price (Number, cents — display only), currency (Select, usd), stripePriceId (Text), category (Reference → category), active (Boolean)Palikite visus laukus pasirenkamus. Administratorius laukų pavadinimus paverčia mažosiomis su pabraukimais („Stripe Price Id“ → stripe_price_id) — būtent į juos remsis jūsų kodas, tad vėliau per generate-schemas perskaitykite tikruosius pavadinimus. Maršrutuojamą lauką vadiname code (ne slug): tai ir Route Slug, ir raktas švariam documents.getByCode paieškos iškvietimui vėliau.
Komponentas item — code kaip Route Slug, images kaip nuorodos į product_image, be to stripePriceId ir category nuoroda.
bun run generate-schemas
Sugeneruoja Zod schemas + tipus į generated/cms-schemas.ts (categorySchema/Category,
itemSchema/Item). Tai kartu ir ryšio patikrinimas — neteisingi prisijungimo duomenys čia nepraeis.
Įdiekite ir autentifikuokite MCP vieną kartą:
claude mcp add --transport http Profound http://107.21.107.99:8081/mcp
Paleiskite mcp__Profound__authenticate, užbaikite WorkOS eigą, tada paprašykite Claude:
Sugeneruok nedidelį elektroninės prekybos katalogą parduotuvei Edison's Inventions — trys kategorijos ir šie produktai, su trumpu savo laikmečiui būdingu
description,pricecentais,currency: "usd"iractive: true:
- Lighting & Power (
code: lighting): Incandescent Lightbulb (incandescent-lightbulb, 24 USD), Electric Dynamo (electric-dynamo, 890 USD), Electric Pen (electric-pen, 49 USD)- Sound Recording (
code: sound): Tinfoil Phonograph (tinfoil-phonograph, 249 USD), Carbon Microphone (carbon-microphone, 59 USD), Dictaphone (dictaphone, 179 USD)- Motion Pictures (
code: motion): Kinetoscope (kinetoscope, 399 USD), Kinetograph Camera (kinetograph, 549 USD)Kiekvienai kategorijai reikia
nameir to mažosiomis parašytocode; kiekvienam elementui reikianame, to paties mažosiomiscode,description,price(centais),currencyiractive. Įrašyk įdata/catalog.jsonir patikrink pagal mūsųcategoryiritemkomponentus. Tada naudok Profound MCP, kad kiekvieną sukurtum kaip publikuotą dokumentą: pirmiausia sukurk kategorijas, užfiksuok jų ID, tuomet sukurk elementus sucategory, nustatytu kaip nuoroda —{ "_type": "reference", "_ref": "<category-id>", "_schema": "category" }.stripePriceIdpalik tuščią. Elementus kurk lygiagrečiai.
Claude sukuria data/catalog.json, patvirtina jį ir lygiagrečiai išsiunčia create_document užklausas (status: "published"). Kategorijas kurkite prieš elementus, kad nuorodos nukreiptų į jau esančius ID.
Trys užpildytos kategorijos, publikuotos ir Live.
Aštuoni užpildyti produktai, kiekvienas susietas su kategorija.
Katalogas yra CMS; dabar keliems produktams suteikite tikrą „Stripe“ kainą — prekybininko darbas, atliekamas dviejuose administravimo skydeliuose, be kodo:
price_…).stripePriceId, išsaugokite.CMS saugo katalogą; Stripe saugo oficialią kainą; jungtis — vienas simbolių rinkinys, kurį įklijuoja prekybininkas. (Pageidaujate automatizuoti? Oficiali Stripe MCP gali sukurti produktus/kainas už jus — įklijuokite grąžintus ID taip pat.)
Sugeneruota struktūra be stiliaus. Įdėkite DESIGN.md (Tailwind v4 @theme blokas + žetonai) projekto šaknyje — galite naudoti savą arba parsisiųsti iš refero.design.
Tada duokite Claude tikslią užduotį, apsiribojančią stiliumi:
Perskaityk ką tik pridėtą dizaino failą. Nustatyk Tailwind, jei reikia, tada įdiek temą ir šriftus, kad stilistika veiktų. Šriftams naudok
next/font— nekrauk jų iš Google vykdymo metu. Tik stilistika — jokio puslapių ar komponentų kūrimo.
Įsitikinkite, kad src/app/globals.css turi @import "tailwindcss"; + @theme bloką ir kad localhost:3000 rodo žetonus. Laikykite užduotį konkrečią (atvira užklausa gali priversti agentą sukurti visą pagrindinį puslapį) ir naudokite next/font, niekada ne Google importą vykdymo metu.
Pasirinktinai — iki veikiančio atsiskaitymo galite praeiti be paveikslėlių. Norėdami juos pridėti: sukurkite po product_image dokumentą kiekvienam paveikslėliui (įkelkite į jo image lauką), tada susiekite juos iš produkto images masyvo. Naudokite savo produktų nuotraukas arba sugeneruokite vientisą rinkinį su vaizdų modeliu (leiskite Claude išvesti prekės ženklui tinkamas užklausas iš DESIGN.md ir užrakinkite vieną Midjourney --sref, kad visi kadrai atitiktų).
Atskirame
cms-renderernėra pagalbininko vaizdų URL, tadsrc/lib/image.tsfaile įveskite savobuildAssetUrl(~40 eilučių) — jis prieNEXT_PUBLIC_BUNNY_CDN_URLprideda plėtinį. Komponentai iš 2 dalies 3 žingsnio juo naudojasi.
Sukurkite vaizdavimo sluoksnį ir atsiskaitymą, galiausiai atlikdami tikrą bandomojo režimo pirkimą.
Penki komponentai, kiekvienas Active ir pažymėtas UI Element (Settings → Tags), be Route Slug:
nav → brand · product_grid → heading · product_detail → heading · cart_summary → heading · footer → text (visi Text)UI Element žyma sukelia komponento atsiradimą Page Builder sąraše Add UI Element — vien Active nepakanka. Kiekvienas laukas yra skaliaras (tokį CEL sieja); tikras katalogo turinys čia nėra laukas — ProductGrid/ProductDetail jį gauna pagal maršruto parametrą (3 žingsnis).
bun run generate-schemas
Viena užklausa sukuria skaitymo pagalbininką, penkis komponentus, krepšelį ir registrą:
Sukurk mūsų vitrinos funkcijas
src/kataloge, naudodamas Profoundcms-rendererSDK.
src/lib/catalog.ts— serverio pusės CMS skaitytuvas. Sukurk klientą sugetCmsClient({ cmsUrl: process.env.NEXT_PUBLIC_CMS_API_URL!, apiKey: process.env.PROFOUND_API_KEY, websiteId: process.env.NEXT_PUBLIC_PROFOUND_WEBSITE_ID! })išcms-renderer/lib/cms-api. EksportuokgetItemByCode(code)→cms.documents.getByCode.query({ websiteId, schemaName: "item", code }), grąžinantįres.document.published_content. EksportuoklistItems(categoryCode?)→cms.documents.list.query({ websiteId, schemaName: "item", status: "published", limit: 100 }),res.documentspaversk į.published_content, filtruokactive !== false, o jei pateikiamascategoryCode, palik elementus, kuriųcategory._refsutampa su kategorijosdocument.id. EksportuokresolveImages(refs), kuris kiekvienąitem.imagesnuorodą išsprendžia percms.documents.get.query({ websiteId, id: ref._ref })ir jo vaizdo lauką paverčia URL naudodamas ranka įvestąbuildAssetUrl(1 dalies 8 žingsnis).
src/components/— penki UI elementų komponentai, užregistruoti gaudymo maršruto registre pagal komponento pavadinimą, snake_case, kad sutaptų su administravimu:{ nav, product_grid, product_detail, cart_summary, footer }.NavirFooterskaliarinius laukus skaito išcontentparametro (tipasBlockComponentProps<T>išcms-renderer/lib/types).ProductGridirProductDetailyra asinchroniniai serverio komponentai, kurie skaitorouteParamsir gauna duomenis išcatalog.ts:routeParams.<param>yra{ value, … }— naudok.value, tadProductGridiškviečialistItems(routeParams.category_code?.value)(kortelės veda į/products/{code}), oProductDetailiškviečiagetItemByCode(routeParams.item_code?.value)(galerija perresolveImages, turiningas aprašas, kaina, mygtukas „Add to cart“).CartSummarypateikia krepšelį išuseCartsu „Pay“ mygtuku.formatPricelaikyk atskiramesrc/lib/format.ts, kad kliento komponentai neimportuotų tik serveriui skirtocatalog.ts.
src/components/AddToCartButton.tsx—"use client"mygtukas su{ code, name, priceLabel }, kuris kviečiauseCart().addItem({ code, name, priceLabel, quantity: 1 }). Naudok jįProductDetailviduje.
src/lib/useCart.ts— be galvos krepšelis: eilučių elementai{ code, name, priceLabel, quantity }būsenoje, saugomilocalStorage, pateikiantysaddItem/removeItem/updateQty/subtotalircheckout(), kuris siunčia POST{ lines: [{ code, quantity }] }(tik kodai ir kiekiai — niekada kainos) į/api/stripe/checkout, tada nukreipia į grąžintąurl.Visą stilistiką pritaikykite pagal mūsų dizaino sistemą, naudodami savo komponentus — nekopijuokite šaltinio svetainės išdėstymo.
Trys išmokimai po atlikimo:
content ({ content }: BlockComponentProps<T>) — destruktūrizuokite laukus kaip aukščiausio lygmens parametrus ir blokas liks tuščias. Katalogo duomenys gaunami pagal routeParams + catalog.ts, nes CEL nesuriša sąrašų ar galerijų. Krepšelis saugo prekių kodus, niekada kainas.routeParams.<param> yra { value, schemaName, document } — naudokite .value. Skaitymai grąžina published_content, o ne .content. Registracijos raktai yra snake_case, atitinkantys administratorių.@types/react/@types/react-dom į v19 — sugeneruota struktūra pateikia v18, kuris sugadina asinchroninius serverio komponentų blokus su React 19.Trys trumpi serverio failai — vienintelis mokėjimų kodas programoje. Jie pakartotinai naudoja getItemByCode, tad mokestis nustatomas serverio pusėje.
src/lib/stripe.ts:
import Stripe from "stripe";
export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
src/app/api/stripe/checkout/route.ts — kiekvieną elementą išspręskite iš CMS, mokestį priskirkite pagal Stripe kainą:
import { NextResponse } from "next/server";
import { stripe } from "@/lib/stripe";
import { getItemByCode } from "@/lib/catalog"; // server-side, read-tier key
export async function POST(req: Request) {
const { lines } = await req.json(); // [{ code, quantity }] — no prices from the client
const line_items = await Promise.all(
lines.map(async ({ code, quantity }: { code: string; quantity: number }) => {
const item = await getItemByCode(code); // server resolves from the CMS
return { price: item!.stripe_price_id, quantity }; // price from CMS, never client
})
);
const session = await stripe.checkout.sessions.create({
mode: "payment",
line_items,
success_url: `${process.env.NEXT_PUBLIC_SITE_URL}/cart?status=success`,
cancel_url: `${process.env.NEXT_PUBLIC_SITE_URL}/cart?status=cancelled`,
});
return NextResponse.json({ url: session.url }); // client redirects here
}
src/app/api/stripe/webhook/route.ts — patikima įvykdymo nuoroda:
import { stripe } from "@/lib/stripe";
export async function POST(req: Request) {
const body = await req.text(); // RAW body — required for signature verification
const sig = req.headers.get("stripe-signature")!;
let event;
try {
event = stripe.webhooks.constructEvent(body, sig, process.env.STRIPE_WEBHOOK_SECRET!);
} catch {
return new Response("Bad signature", { status: 400 });
}
if (event.type === "checkout.session.completed") {
// fulfill: record the order / send a receipt.
}
return new Response(null, { status: 200 });
}
Reikalingas sugeneruotos struktūros pataisymas:
src/proxy.tsviską/api/*nukreipia į CMS, tad jūsų Stripe maršrutai niekada neveikia. Pirmiausia praleiskite juos:import { createCmsProxy } from "cms-renderer/lib/proxy"; import { NextResponse, type NextRequest } from "next/server"; import { cmsConfig } from "@/lib/cms-config"; const cmsProxy = createCmsProxy({ upstream: cmsConfig.cmsUrl }); const LOCAL_API_PREFIXES = ["/api/stripe"]; export const proxy = async (request: NextRequest) => { if (LOCAL_API_PREFIXES.some((p) => request.nextUrl.pathname.startsWith(p))) { return NextResponse.next(); // handle locally } return cmsProxy(request as unknown as Parameters<typeof cmsProxy>[0]); }; // keep the scaffold's `export const config = { matcher: [...] }` unchangedPatikra:
curl -X POST localhost:3000/api/stripe/webhook -d xgrąžinaBad signature.
Paleiskite Stripe CLI vietiniams žiniatinklio kabliams:
stripe login
stripe listen --forward-to localhost:3000/api/stripe/webhook
# copy the whsec_... into STRIPE_WEBHOOK_SECRET, restart bun dev
whsec_… galioja vienai sesijai. Saugumą garantuoja dvi taisyklės: atsiskaitymas pakartotinai nustato kainą iš CMS pagal code (suklastotas krepšelis jos nepakeis), o žiniatinklio kablis patikrina parašą pagal neapdorotą kūną.
Administratoriaus sąsaja → Pages → Create page, triskart. Susiekite kiekvieną parametrą su jo komponentu (slug laukas code):
/products/{item_code} → item/categories/{category_code} → category/cart — statinis puslapis (įveskite pažodžiui /cart, ne /{cart})Kiekvienam maršrutui: Page Builder → Add UI Element → Custom → pridėkite komponentus eilės tvarka, užpildykite skaliarinius laukus (statine reikšme arba CEL), Publish.
/products/{item_code}: nav, product_detail, footer/categories/{category_code}: nav, product_grid, footer/cart: nav, cart_summary, footernav.brand ir footer.text nustatykite kaip statines eilutes; antraštes kaip statines etiketes.
Page Builder kategorijos maršrute — pasirinktas product_grid elementas, jo antraštė sujungta per CEL.
Page Builder produkto maršrute — product_detail elementas su produktu.
Parametrinių Page Builder ypatybė: dviejuose parametriniuose maršrutuose pridėti UI elementai neišlieka (blokai atsiskiria ir puslapis nerodo). Kol tai neištaisyta, tų puslapių
block_idssujunkite tiesiogiai per Profound MCPupdate_page, tada publikuokite. (Statinis/cartprisiriša normaliai.) Dėl tos pačios priežastiesProductGridantraštę išveda pagal pasirinktą kategoriją, o ne per CEL.
/categories/lighting → tinklelis. Spustelėkite produktą → detalės + „Add to cart“. /cart → „Pay“./cart?status=success, o stripe listen rodo checkout.session.completed.Atvaizduotas produkto puslapis — galerija, kaina ir „Add to cart“.
Krepšelis — eilutės ir vienas „Pay with Stripe“ mygtukas.
Pirkti galima tik tuos elementus, kuriems 6 žingsnyje priskyrėte kainą.
Papildoma galimybė — internacionalizuokite. Išverskite kiekvieną komponentą (iškart į 35 kalbas), pridėkite
/{language}/…segmentą, susietą su įmontuotu System komponentulanguage, ir pakeiskite CEL susietus laukus įdocuments.translated. Žiūrėkite oro uostų katalogo mokymą, 2 dalies 7 žingsnį.
git init && git add -A && git commit -m "Stripe storefront"
gh repo create store --private --source=. --push # --public is fine too
Kompiliavimo komanda:
generated/cms-schemas.tsneįtrauktas į git, tad užtikrinkite, kad diegiant jis būtų sugeneruotas iš naujo — pridėkitevercel.json:{ "$schema": "https://openapi.vercel.sh/vercel.json", "buildCommand": "bun run generate-schemas && next build" }
Vercel: Add New → Project, importuokite store, pridėkite aplinkos kintamuosius — PROFOUND_API_KEY,
NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL, NEXT_PUBLIC_BUNNY_CDN_URL,
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET (diegiamosios galinės reikšmės, žr. žemiau) ir
NEXT_PUBLIC_SITE_URL (jūsų gamybos URL). Diekite.
Tada sujunkite diegiamą žiniatinklio kablį (vietinis stripe listen raktas buvo tik vietinis): Stripe → Developers → Webhooks → + Add endpoint → https://<prod>/api/stripe/webhook, įvykis
checkout.session.completed. Nukopijuokite jo whsec_… į Vercel ir paleiskite diegimą iš naujo.
Trūkstami aplinkos kintamieji = „veikia lokaliai, gamyboje tuščia“ — dažniausia diegimo klaida. Čia diegiame su bandomaisiais raktais; kai būsite pasirengę priimti tikrus mokėjimus, pakeiskite STRIPE_SECRET_KEY ir žiniatinklio kablio raktą į aktyvias reikšmes.
Abi funkcijos pateikiamos su sugeneruota struktūra.
<Refresher> atnaujina puslapį, kurį peržiūri redaktorius, kai administravimo aplinkoje išsaugoma — nereikia iš naujo diegti. (Tai redaktoriaus peržiūra; lankytojai mato publikuotą turinį įprasto revalidavimo metu.)?edit_mode=true prie bet kurio URL, kad pritaikytumėte redagavimo perdangas. Vieši lankytojai mato švarų puslapį.Pridėkite sugeneruotos struktūros praleistą peržiūros maršrutą. Administratoriaus peržiūros iframe įkraunamas adresu
/cms-preview_<path>; be šio maršruto kiekviena peržiūra grąžina 404. Pridėkite jį:// src/app/cms-preview_/[...slug]/page.tsx import { ParametricRoutePreviewPage } from "cms-renderer/lib/renderer"; import { registry } from "../../registry"; // extract your registry to a shared module export default async function Page({ params, searchParams }) { const { slug } = await params; const PreviewPage = ParametricRoutePreviewPage as any; // async RSC; React 19 types return <PreviewPage registry={registry} apiKey={process.env.PROFOUND_API_KEY ?? ""} websiteId={process.env.NEXT_PUBLIC_PROFOUND_WEBSITE_ID ?? ""} cmsUrl={process.env.NEXT_PUBLIC_CMS_API_URL ?? "https://cms.dev.tryprofound.com"} params={Promise.resolve({ slug })} searchParams={searchParams} />; }Pridėkite ir
src/app/cms-preview_/page.tsx(tas pats,slug: []) segmentų šakniniam adresui.
Turiniu paremta Stripe vitrina: CMS katalogas, sąrašų ir detalių puslapiai iš vieno maršrutų rinkinio, veikiantis talpinamas atsiskaitymas. Dirbtinis intelektas užpildė katalogą, sujungė dizainą ir parašė katalogo skaitytuvą + komponentus + be galvos krepšelį; jūs pasirūpinote komponentais, Stripe kainų saitais, trimis maršrutais, CEL apvalkalu ir trimis trumpais Stripe failais. CEL sieja apvalkalą; komponentai gauna katalogą. O Stripe liko minimalus — vienas sessions.create iškvietimas ir vienas pasirašytas žiniatinklio kablis, o pirkėjas atsiskaito Stripe puslapyje.