Toteutus · Shopify
Rakenna Shopify-sovellus try-on-sovitukseen
Yhdellä lauseella
Shopify try-on -sovellus lukee tuotekuvan Admin API:sta, tekee POST-kutsun Phottaan, pollaa työtä taustaprosessissa ja antaa sitten valmiin URL-osoitteen Shopifylle productCreateMedia-kutsulla.
- Credits: 5 credits resoluutiolla 2K · 6 credits resoluutiolla 4K
- Tyypillinen kesto: 1.5–4 min
- Käsittely: asynkroninen, polling
Jokainen luku tällä sivulla on peräisin Photta-rajapinnan dokumentaatiosta · tarkistettu
Lue tuotekuva Admin API:sta, renderöi try-on Phottalla ja vie tulos takaisin tuotemediana. Neljä kutsua, ei omaa kuvankäsittelyä.
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
-H "Authorization: Bearer $PHOTTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/tryon/apparel",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": True,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
},
)
data = res.json()["data"] # data["id"], data["status"]Miten se toimii
Tuotesivulta try-on-kuvaksi
Määritä sovelluksen scopet, lue kuva, lähetä pyyntö, pollaa pyyntöpolun ulkopuolella, liitä media.
Vaihe 1
Määritä sovelluksen scopet
Try-on-sovelluksen täytyy lukea tuotteita ja kirjoittaa mediaa. Pyydä vain ne tuote-scopet, joita sovelluksesi todella käyttää, älä mitään muuta — kauppiaat lukevat suostumusnäkymän.
Vaihe 2
Hanki Photta API -avain
Yksi avain ympäristöä kohden, säilytettynä sovelluksesi palvelinpuolen konfiguraatiossa. Se ei koskaan kulje storefrontiin tai kauppiaan selaimeen.
Vaihe 3
Lue tuotekuva
Hae tuotteelta sen ensimmäinen kuva. Kyseinen URL on julkinen, mikä on juuri sitä mitä Photta-endpoint odottaa — ei uudelleenlatausta, ei hallittavia allekirjoitettuja URL-osoitteita.
Vaihe 4
Lähetä try-on-pyyntö
Lähetä kuva POST-pyynnöllä mannekiinin ja asennon kanssa. Vastaus on välitön ja sisältää generointi-id:n; mitään ei ole vielä renderöity.
Vaihe 5
Pollaa taustatyössä
Shopify odottaa webhook-käsittelijän vastaavan sekunneissa, ja generointi kestää sitä kauemmin. Kuittaa pyyntö, lisää työnjonoon ja pollaa 3 sekunnin välein workerista.
Vaihe 6
Liitä media
Anna valmis URL Shopifylle, ja se lataa tiedoston itse. Tallenna kuva myös omalle puolellesi, jotta galleria säilyy itsenäisesti.
Neljä kutsua alusta loppuun
Photta-pyyntö ja polling on renderöity suoraan API-dokumentaatiosta; Shopify-kutsut ovat Admin API:n omia.
// Shopify Admin GraphQL — the product's first image is your source photo
const query = `query($id: ID!) {
product(id: $id) { title images(first: 1) { nodes { url } } }
}`;
const res = await admin.graphql(query, { variables: { id: productGid } });
const { data } = await res.json();
const productImage = data.product.images.nodes[0].url;const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}),
});
const { data } = await res.json(); // data.id, data.statusasync function waitFor(id) {
for (let attempt = 0; attempt < 120; attempt++) {
const res = await fetch(`https://api.photta.app/api/v1/tryon/apparel/${id}`, { headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}` } });
const { data } = await res.json();
if (data.status === "completed") return data.output_url;
if (data.status === "failed") throw new Error(data.error_message ?? "generation failed");
await new Promise((r) => setTimeout(r, 3000));
}
throw new Error("timed out after 6 minutes");
}// Shopify downloads the URL itself, so hand it the Photta output_url
const mutation = `mutation($id: ID!, $media: [CreateMediaInput!]!) {
productCreateMedia(productId: $id, media: $media) {
mediaUserErrors { field message }
}
}`;
await admin.graphql(mutation, {
variables: {
id: productGid,
media: [{ originalSource: outputUrl, mediaContentType: "IMAGE", alt: "Virtual try-on" }],
},
});Kehittäjien usein kysymää
Shopify-kehittäjien usein kysymät kysymykset
Missä Photta-avainta säilytetään Shopify-sovelluksessa?
Sovelluspalvelimesi ympäristössä, ei koskaan teemassa, app blockissa tai app proxy -vastauksessa. Kaiken, minkä storefront voi lukea, voi lukea myös asiakas.
Mitä Shopify-scopeja tämä vaatii?
Tuotekuvan lukemisen ja tuotemedian kirjoittamisen. Photta ei tarvitse lainkaan Shopify-pääsyä — sovelluksesi on ainoa osapuoli, joka keskustelee molempien suuntien kanssa.
Miten pidän webhookin nopeana?
Kuittaa heti, lisää työ jonoon ja pollaa workerista. Generointi kestää kauemmin kuin webhook-käsittelijän tulisi kestää, joten mikään sitä odottava ei kuulu käsittelijään.
Voinko laskuttaa kauppiaita kuvakohtaisesti?
Tämä on oma hinnoittelupäätöksesi. Photta veloittaa tiliäsi kutsuittain credits-yksiköissä, joten kuvakohtainen kustannus on tiedossa ennen renderöintiä; se, mitä laskutat päälle, on sinusta kiinni.
Entä jos tuotteella ei ole kuvaa?
Ohita se sen sijaan, että lähettäisit paikkamerkkikuvan. Endpoint vaatii oikean valokuvan vaatteesta, ja paikkamerkki kuluttaa credits-yksiköitä kuvaan, jota kukaan ei julkaise.
Liittyvät sivut
Aiheeseen liittyvää luettavaa
Ominaisuudet
Virtuaalinen try-on API vaatteille
REST API, joka asettaa vaatteet tekoälymallinukkejen päälle. Asynkroninen, 1.5–4 minuutin generointi, 5 credits resoluutiolla 2K, 6 resoluutiolla 4K. cURL-, Node.js- ja Python-esimerkit.
LuePikaopas
Ensimmäinen Photta-kuva alle viidessä minuutissa.
Rekisteröidy, luo API-avain, suorita ensimmäinen cURL-kutsusi, tee pollingia valmistumiseen asti ja tallenna tulos. Viisi vaihetta, dokumentoitu alusta loppuun.
LueKielet
Node.js walkthrough
LueRate limits
Lue
Jokainen luku tällä sivulla on peräisin Photta-rajapinnan dokumentaatiosta · tarkistettu
Julkaise sovellus, älä putkistoa
Tämän sivun Photta-kutsut tulevat suoraan API-dokumentaatiosta. Hanki avain, ja ensimmäinen renderöinti on valmis muutamassa minuutissa.