SaaS och betalning · 9 min läsning · Uppdaterad 15 augusti 2026

Så tar du betalt i en AI-byggd app med dina egna Stripe-nycklar

Betalningarna går genom ditt eget Stripe-konto. På Pro-planen klistrar du in din Stripe-nyckel under Mer och Stripe (Klarna) på projektkortet, där den krypteras innan den lagras. Appen anropar sedan den injicerade kassametoden med sina orderrader, och kunden skickas vidare till en Stripe-kassa som tar kort och Klarna. NorthernGo ser aldrig några kortuppgifter.

Det är ditt Stripe-konto, inte en betaltjänst från NorthernGo

Det här är delen att vara exakt med innan någon kod. NorthernGo säljer inte betalningar vidare. Du tar med ditt eget Stripe-konto, dina egna nycklar och ditt eget pengaflöde, och plattformen gör en enda sak: den håller din hemliga nyckel krypterad och använder den på servern för att skapa en kassasession när din app ber om det.

Följderna av det står i villkoren i stället för att bara antydas. Du är juridiskt ansvarig gentemot dina egna kunder för support, återbetalningar och köpvillkor. NorthernGo underlättar enbart kopplingen till Stripe och bearbetar, ser eller lagrar aldrig dina kunders kortuppgifter — de matas in på Stripes egen sida, på Stripes domän, och rör aldrig en app du byggt här. Av samma skäl får du aldrig lagra kortnummer i appens inbyggda databas; det är uttryckligen förbjudet, tillsammans med personnummer och medicinska uppgifter, och det finns ingenting i API:t som skulle göra det till en god idé ändå.

Funktionen ligger på Pro-planen. Både sparningen av nyckeln och själva kassan kontrollerar ägarens plan var för sig, vilket spelar roll längre ner.

Steg 1: Spara din Stripe-nyckel

Gå till Mina projekt, klicka på Mer på projektkortet och välj Stripe (Klarna). Panelen ber dig klistra in din Stripe Secret Key och länkar direkt till sidan med API-nycklar i din Stripe Dashboard. Fältet är ett lösenordsfält, platshållaren visar sk_live_... och knappen heter Spara nyckel.

Använd en testnyckel först. En nyckel som börjar på sk_test_ går exakt samma väg och ger dig Stripes testläge, där du kan slutföra ett köp med ett testkort och se sessionen dyka upp i din instrumentpanel utan att några verkliga pengar rör sig. Byt till den skarpa nyckeln när flödet sitter.

Vad som händer med nyckeln är värt att veta, för "vi lagrar din nyckel" är en formulering som förtjänar detaljer. Anropet verifierar din inloggning, verifierar att du faktiskt äger projektet, och nekar sparningen om din plan inte är Pro. Nyckeln krypteras därefter med AES-256-CBC, med en krypteringsnyckel härledd med scrypt ur en serverhemlighet och en ny slumpad initieringsvektor per värde, och resultatet läggs i en privat systemkollektion som de publika databasrutterna vägrar läsa eller skriva. Appens egna slutanvändare kan inte hämta den, och inte någon annans app heller. Om serverhemligheten någon gång byts läses nyckeln transparent med den föregående hemligheten och krypteras om med den nya vid nästa användning, så ett nyckelbyte kan inte fälla en pågående kassa.

När sparningen lyckas flaggas projektet som kopplat och projektkortet börjar visa Betalningar aktiva. Den texten är den synliga bekräftelsen på att nyckeln kom fram.

Steg 2: Be om kassa-anropet med namn

Varje genererad app har plattformens SDK injicerad, och betalningar exponeras som window.NorthernGoPayments.checkout(). Metoden tar en lista med orderrader:

await window.NorthernGoPayments.checkout([
  { name: 'Årslicens', price: 1490, quantity: 1 }
]);

price anges i hela kronor, inte i ören — 1490 betyder 1490 kronor, och servern multiplicerar med 100 innan beloppet når Stripe. quantity blir 1 om du utesluter den. name är produktnamnet kunden läser på Stripes sida, så skriv det som en kundvänlig etikett och inte som ett internt artikelnummer.

Här finns en hake som är värd att säga rakt ut. Genereringsprompterna beskriver databasen, AI-delen, e-post, Shopify och webhookarna i SDK:n, men de beskriver inte betalningar. Ber du om "en köpknapp" finns alltså ingen instruktion som berättar för AI:n att den här metoden existerar, så den kan bygga ett formulär eller en död knapp i stället. Nämn anropet i din prompt:

Lägg till en Köp-knapp som anropar window.NorthernGoPayments.checkout([{ name: 'Årslicens', price: 1490, quantity: 1 }]) inuti try/catch och visar error.message i gränssnittet om det misslyckas.

Den instruktionen är tillräckligt exakt för att de tre agenterna i kedjan inte ska ha något kvar att gissa. Det är också värt att spara ordern i din egen data innan du skickar iväg kunden, eftersom omdirigeringen lämnar din app helt:

async function kop(vara) {
  try {
    await window.NorthernGoDB.save('ordrar', {
      vara: vara.name, belopp: vara.price, status: 'startad',
      skapad: new Date().toISOString()
    });
    await window.NorthernGoPayments.checkout([vara]);
  } catch (err) {
    visaMeddelande(err.message);
  }
}

Den inbyggda databasen är redan inkopplad, så det kostar dig ingenting extra och ger dig ett spår av kundens avsikt som överlever att fliken stängs.

Steg 3: Testa på den skarpa länken, inte i förhandsvisningen

Kassan fungerar inte i arbetsytans förhandsvisning. Förhandsvisningsbryggan svarar med ett tydligt nej: Fungerar inte i förhandsgranskningen — spara projektet och öppna appen via dess ?app=-länk. Det är medvetet och inte trasigt; förhandsvisningen körs i en sandlådad ram som inte ska kunna starta skarpa betalsessioner.

Alltså: spara projektet, öppna det via dess egen länk — ?app=-reservlänken, en PWA-subdomän eller en egen domän — och köp något med ett testkort där. När sessionen skapats skickas webbläsaren till Stripes sida. Efter betalning återvänder kunden till northerngo.com/?app=<projektId>&payment=success, eller &payment=cancelled om hen avbröt.

Vad sessionen faktiskt är

Exakthet här räddar dig från att lova dina kunder något som integrationen inte gör.

Den sista punkten är nödutgången för de tre första. Den underliggande rutten tar emot currency, successUrl och cancelUrl — SDK-metoden skickar bara inte vidare dem:

const res = await fetch(
  'https://northerngo-backend.onrender.com/api/app-db/' + window.NG_PROJECT_ID + '/stripe/checkout',
  {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      items: [{ name: 'Årslicens', price: 149, quantity: 1 }],
      currency: 'eur',
      successUrl: 'https://din-app.northerngo.com/?betald=1',
      cancelUrl: 'https://din-app.northerngo.com/?avbruten=1'
    })
  }
);
const json = await res.json();
if (json.success) window.location.href = json.url;

Begränsningar du måste bygga runt

Beloppen skickas från webbläsaren. Kassarutten är publik med flit — dina betalande kunder är inte inloggade i NorthernGo — och den bygger Stripes orderrader utifrån namnet och priset i anropet. Den som kan öppna utvecklarverktygen kan därför begära en session till ett pris du inte satt. Behandla återkomsten till ?payment=success som ett tips och inte som ett bevis: kontrollera det faktiska beloppet i din Stripe Dashboard innan du skickar en vara eller låser upp något värdefullt, och sälj helst sådant där en manuell eller efterhandskontroll är realistisk.

Det finns ingen leveransbekräftelse via webhook. Ingenting i plattformen lyssnar på checkout.session.completed och skriver tillbaka resultatet i appens data. Omdirigeringen är allt du får, och en kund som betalar och stänger fliken innan omdirigeringen hunnit klart registreras inte alls av din app. Stripe har sanningen; din app har en avsikt.

Inga prenumerationer. Se ovan. Återkommande intäkter kräver Stripes eget prenumerationsläge, som den här rutten inte skapar.

En nedgradering stänger av betalningarna. Plankontrollen körs om vid varje kassa, mot ägarens konto. Går du från Pro till Premium möts levande kunder av Betalningar är avstängda eftersom appens ägare saknar Pro-plan. Din sparade nyckel är orörd och gäller igen så snart planen gör det, men butiken är stängd under tiden.

Exporterade byggen har inget betalningsobjekt. ZIP-exporten levererar appen med den inbyggda SDK:n, som täcker databas, inloggning och AI men inte definierar window.NorthernGoPayments. I ett exporterat eller Capacitor-byggt paket använder du fetch-varianten ovan.

Regelefterlevnaden är din. Köpvillkor, återbetalningspolicy, kvitton, moms och konsumenträtt ligger hos dig, inte hos plattformen. Säljer du till konsumenter inom EU bör du läsa noteringarna om GDPR och EU-krav tillsammans med den här sidan — en app som tar betalt och har inloggning behöver dessutom ha sin kontoradering på plats.

Felsökning

"App-ägaren har inte konfigurerat sin Stripe-nyckel ännu." Ingen nyckel finns sparad för projektet. Spara den igen under Mer → Stripe (Klarna) och kontrollera att kortet därefter visar Betalningar aktiva.

"Betalningar är avstängda eftersom appens ägare saknar Pro-plan." Det ägande kontot ligger inte på Pro. Det kontrolleras vid betalning, inte bara vid sparningen.

"Stripe Checkout kräver Pro-planen." Samma orsak, men uppmätt när nyckeln sparas i stället för när någon betalar.

Knappen gör ingenting och konsolen är tom. Nästan alltid har window.NorthernGoPayments.checkout() aldrig anropats — AI:n byggde ett formulär i stället. Sök i den genererade koden efter NorthernGoPayments; finns det inte där, be om det igen med anropet utskrivet.

Det misslyckas bara i arbetsytan. Förväntat. Öppna appen via dess egen länk i stället.

Stripe svarar med ett fel om betalsättet. Klarna begärs för varje session. Är det inte aktiverat i ditt Stripe-konto, eller stöds inte din valuta och ditt land för det, avvisar Stripe sessionen — aktivera Klarna i instrumentpanelen eller hör med Stripe om tillgängligheten.

Beloppet är hundra gånger för stort eller för litet. price anges i kronor, inte i ören. 1490 är 1490 kr.

Vanliga frågor

Kan jag ta emot riktiga betalningar i en app jag byggt med AI?

Ja, genom ditt eget Stripe-konto på Pro-planen. Du sparar din Stripe-nyckel på projektet, appen anropar den injicerade kassametoden med sina orderrader, och kunden betalar på Stripes egen sida med kort eller Klarna. Pengarna hamnar på ditt Stripe-saldo och utbetalningarna följer dina egna Stripe-inställningar.

Är det säkert att klistra in min Stripe-nyckel i NorthernGo?

Nyckeln krypteras med AES-256-CBC med en krypteringsnyckel härledd ur en serverhemlighet och en unik initieringsvektor per värde, och lagras i en privat systemkollektion som de publika databasrutterna inte kan läsa. Den dekrypteras bara på servern när en kassasession skapas och skickas aldrig till webbläsaren. Börja med en testnyckel om du vill se flödet först.

Kan jag sälja månadsabonnemang på det här sättet?

Nej. Sessionen skapas som en engångsbetalning, så det finns ingen återkommande debitering, ingen provperiod och ingen förnyelse. Du kan sälja en månads tillgång som ett enskilt köp och sköta förnyelsen själv, men riktig abonnemangsfakturering kräver Stripes eget prenumerationsläge, som den här integrationen inte skapar.

Varför fungerar köpknappen på den skarpa länken men inte i arbetsytan?

Förhandsvisningen i arbetsytan blockerar betalanrop med flit och svarar att åtgärden inte fungerar där. Förhandsvisningen körs i en sandlådad ram som inte ska kunna starta skarpa betalsessioner. Spara projektet och öppna appen via dess egen länk, en PWA-subdomän eller en egen domän, och testa med en testnyckel från Stripe.

Vem är ansvarig om en kund vill ha pengarna tillbaka?

Du. Villkoren är tydliga med att om du använder Stripe-integrationen för att ta betalt i din app är du juridiskt ansvarig gentemot dina egna kunder för support, återbetalningar och köpvillkor. NorthernGo underlättar enbart kopplingen till Stripe och bearbetar, ser eller lagrar aldrig dina kunders kortuppgifter. Återbetalningar gör du från din egen Stripe Dashboard.

Bygg det själv

NorthernGo förvandlar en beskrivning i ren text till en fungerande webbapp med databas, inloggning och en live-adress. Lokal AI-generering körs på ditt eget grafikkort, är obegränsad och ingår gratis i alla prisplaner.

Börja bygga gratis