formbasedocs
Naar de appApp

Handleidingen · REST API

De callback ontvangen en verifiëren

Een aanvraag met een callbackUrl eindigt met een ondertekende POST naar die URL: de antwoorden zodra de ontvanger indient, of het bericht dat hij is verlopen of geannuleerd. Deze handleiding draait een ontvanger op je eigen machine, controleert de handtekening, en print de antwoorden.

Last checked


Je hebt een API-token en een gepubliceerd formulier nodig, zoals in Een aanvraag versturen met de REST API, en Node of Python op je machine. Wat een callback draagt, en hoe nieuwe pogingen werken, staat in Callbacks & ondertekening.

1. Kopieer het ondertekeningsgeheim

formbase ondertekent elke callback met het ondertekeningsgeheim voor aanvragen van je werkruimte. Open OAuth en API-sleutels in de zijbalk van de werkruimte en zoek de kaart Ondertekeningsgeheim voor aanvragen:

De kaart Ondertekeningsgeheim voor aanvragen: Werkruimtegeheim, gemaskeerd als rqs_ gevolgd door sterretjes, met knoppen om het te tonen, kopiëren en opnieuw te genereren

Klik op de kopieerknop en bewaar het geheim in een omgevingsvariabele in de terminal waar je ontvanger zal draaien:

bash
export FORMBASE_SIGNING_SECRET='rqs_...'

2. Schrijf de ontvanger

Bewaar de functie verify uit Callbacks & ondertekening naast je ontvanger: als verify.mjs voor Node, omdat het import gebruikt, of als verify.py voor Python. De ontvanger leest de ruwe body, controleert de handtekening, en parseert pas daarna de JSON:

Hash de body precies zoals hij is binnengekomen. Hem parsen en terug omzetten naar JSON verandert de bytes, en de handtekening komt dan niet meer overeen.

3. Draai hem en geef hem een publieke URL

Start de ontvanger:

bash
node receiver.mjs      # or: python3 receiver.py

formbase roept alleen publieke HTTPS-adressen aan, dus localhost volstaat niet. Terwijl je test, geeft een tunnel je machine er een.

Cloudflare’s quick tunnel

heeft geen account nodig. Draai hem in een tweede terminal:

bash
cloudflared tunnel --url http://localhost:8787

Dat print een adres zoals https://horn-cod-classics-arab.trycloudflare.com. ngrok en vergelijkbare tools werken op dezelfde manier. Gebruik in productie de eigen HTTPS-URL van je server in plaats daarvan.

4. Verstuur een aanvraag met een callback-URL

Maak een testaanvraag aan zoals in de vorige handleiding, en voeg callbackUrl toe met het tunneladres. Gebruik je eigen formulier-id:

bash
curl -X POST https://api.formbase.so/api/v1 \
  -H "Authorization: Bearer $FORMBASE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "method": "requests.create",
    "params": {
      "formId": "jx75hdx8vb5hy1x85gm17nqgkn8f674g",
      "recipient": { "email": "ada@acme.example", "name": "Ada Lovelace" },
      "prefill": { "company_name": "Analytical Engines Ltd" },
      "readonly": ["company_name"],
      "externalId": "supplier-2044",
      "idempotencyKey": "supplier-2044",
      "callbackUrl": "https://horn-cod-classics-arab.trycloudflare.com/formbase",
      "test": true
    }
  }'

Gebruik een nieuwe idempotencyKey: dezelfde sleutel met een andere body wordt geweigerd. Open de url uit het antwoord, beantwoord het formulier, en dien in.

5. Zie de callback binnenkomen

Een paar seconden nadat je indient, print de ontvanger het event-type, jouw externe id en de antwoorden. De Node-ontvanger print:

text
request.completed supplier-2044 {"certificate_of_incorporation":[{"name":"certificate-of-incorporation.pdf","size":635,"type":"application/pdf","url":"https://api.formbase.so/api/storage/...",...}],"company_name":"Analytical Engines Ltd","contact_email":"ada@acme.example","do_you_accept_our_30_day_payment_terms":"yes","vat_number":"GB123456789"}

Om een weigering te zien, stuur je de ontvanger zelf een willekeurige POST, bijvoorbeeld curl -X POST -d ‘’ http://localhost:8787. Die heeft geen geldige handtekening, dus de ontvanger print rejected: bad signature en antwoordt met 401.

Voordat je live gaat

  • Antwoord binnen 10 seconden met 2xx. formbase markeert de callback als afgeleverd bij elke 2xx. Een 5xx, een 408, een 429 of een timeout wordt zo’n vier uur lang opnieuw geprobeerd; elke andere 4xx, zoals de 401 hierboven, stopt de nieuwe pogingen. Zie Nieuwe pogingen.

  • Vertak op type.

    Dezelfde URL hoort ook request.expired en request.canceled, die geen antwoorden dragen.

  • Verwerk elk event maar één keer. Een nieuwe poging draagt hetzelfde id. Bewaar de id’s die je al hebt verwerkt en sla een herhaling over.

  • Controleer test.

    Een callback van een testaanvraag heeft “test”: true. Laat test weg bij requests.create voor echte ontvangers.

Als je ontvanger langer offline was dan de nieuwe pogingen duren, zijn de antwoorden niet verloren. Lees ze met requests.get, of speel de callback opnieuw af met requests.replayCallback of vanaf de pagina Aanvragen.

Vervolgens