VB.NET WhatsApp Nachricht senden per Cloud API (2026)

Du kannst WhatsApp-Nachrichten aus VB.NET senden, indem du die offizielle WhatsApp Cloud API mit einem einfachen HttpClient-Request nutzt. Keine externe Bibliothek nötig. Dieser Guide behandelt Setup, Text-Nachrichten, Template-Nachrichten, API-Antworten, Massenversand und eine Twilio-Alternative mit vollständigen Code-Beispielen.

.NET-Hilfe gesucht?

Du baust ein Benachrichtigungssystem?

Ich entwickle seit über 17 Jahren professionell in VB.NET und C#. Von WhatsApp-Integrationen bis zur kompletten Desktop-Lösung kann ich helfen.

Was du brauchst

Bevor du Code schreibst, brauchst du drei Dinge von Meta:

  1. Meta Business Account mit einer registrierten App auf developers.facebook.com
  2. Phone Number ID aus dem WhatsApp-Bereich in deinem App-Dashboard
  3. Access Token (temporär zum Testen, permanent über System User für Produktion)

Meta stellt eine kostenlose Test-Rufnummer und fünf Test-Empfänger bereit. Du kannst während der Entwicklung echte Nachrichten ohne Kosten senden.

So funktioniert die WhatsApp Cloud API

Die WhatsApp Cloud API ist eine REST API, die von Meta gehostet wird. Deine VB.NET-Anwendung sendet einen HTTP-POST-Request mit JSON-Body an Metas Server. Meta liefert die Nachricht dann an die WhatsApp-App des Empfängers. Der Ablauf:

  1. Deine App sendet einen POST-Request an https://graph.facebook.com/v20.0/{phone_number_id}/messages
  2. Meta prüft deinen Token, die Rufnummer und das Nachrichtenformat
  3. Meta stellt die Nachricht über WhatsApp-Server zu
  4. Du erhältst eine JSON-Antwort mit der Nachrichten-ID oder einem Fehler

Eine wichtige Regel: Du kannst nur Template-Nachrichten an Nutzer senden, die dir in den letzten 24 Stunden nicht geschrieben haben. Freitext-Nachrichten sind nur innerhalb eines 24-Stunden-Gesprächsfensters erlaubt. Für die meisten Benachrichtigungs-Szenarien (Bestellbestätigungen, Alerts, Erinnerungen) sind Template-Nachrichten der richtige Weg.

Textnachricht senden

Das einfachste Beispiel. Es sendet eine Klartext-Nachricht an einen einzelnen Empfänger innerhalb eines aktiven Gesprächsfensters:

Imports System.Net.Http
Imports System.Text

Private Async Function SendWhatsAppMessage(recipientPhone As String, message As String) As Task(Of Boolean)
    Dim phoneNumberId As String = "YOUR_PHONE_NUMBER_ID"
    Dim accessToken As String = "YOUR_ACCESS_TOKEN"
    Dim url As String = $"https://graph.facebook.com/v20.0/{phoneNumberId}/messages"

    Dim json As String = "{" &
        """messaging_product"": ""whatsapp""," &
        """to"": """ & recipientPhone & """," &
        """type"": ""text""," &
        """text"": {""body"": """ & message & """}" &
        "}"

    Using client As New HttpClient()
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " & accessToken)
        Dim content As New StringContent(json, Encoding.UTF8, "application/json")
        Dim response = Await client.PostAsync(url, content)
        Return response.IsSuccessStatusCode
    End Using
End Function

Aufruf per Button-Klick oder beliebigem Event-Handler:

Private Async Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
    Dim success = Await SendWhatsAppMessage("491234567890", "Deine Bestellung wurde versendet.")

    If success Then
        lblStatus.Text = "Nachricht gesendet."
    Else
        lblStatus.Text = "Nachricht konnte nicht gesendet werden."
    End If
End Sub

Die Rufnummer muss die Landesvorwahl ohne Pluszeichen oder führende Nullen enthalten. Für eine deutsche Nummer wie +49 123 4567890 verwendest du 491234567890.

Template-Nachricht senden

Template-Nachrichten sind vorab genehmigte Nachrichtenformate, die du in deinem Meta Business Dashboard erstellst. Sie sind erforderlich, wenn du die erste Nachricht an einen Nutzer sendest oder außerhalb des 24-Stunden-Fensters kommunizierst:

Private Async Function SendTemplateMessage(recipientPhone As String, templateName As String) As Task(Of Boolean)
    Dim phoneNumberId As String = "YOUR_PHONE_NUMBER_ID"
    Dim accessToken As String = "YOUR_ACCESS_TOKEN"
    Dim url As String = $"https://graph.facebook.com/v20.0/{phoneNumberId}/messages"

    Dim json As String = "{" &
        """messaging_product"": ""whatsapp""," &
        """to"": """ & recipientPhone & """," &
        """type"": ""template""," &
        """template"": {" &
            """name"": """ & templateName & """," &
            """language"": {""code"": ""de""}" &
        "}" &
        "}"

    Using client As New HttpClient()
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " & accessToken)
        Dim content As New StringContent(json, Encoding.UTF8, "application/json")
        Dim response = Await client.PostAsync(url, content)
        Return response.IsSuccessStatusCode
    End Using
End Function

Meta stellt ein Standard-Template namens hello_world zum Testen bereit. Eigene Templates erstellst du im WhatsApp-Manager-Bereich deines Meta Business Dashboards. Templates können Variablen wie {{1}} enthalten, die du beim Senden mit dynamischen Inhalten füllst.

Template-Nachricht mit Variablen

Die meisten echten Templates enthalten Platzhalter für Kundennamen, Bestellnummern oder Termine. So sendest du ein Template mit variablen Parametern:

Private Async Function SendOrderConfirmation(phone As String, customerName As String, orderId As String) As Task(Of Boolean)
    Dim phoneNumberId As String = "YOUR_PHONE_NUMBER_ID"
    Dim accessToken As String = "YOUR_ACCESS_TOKEN"
    Dim url As String = $"https://graph.facebook.com/v20.0/{phoneNumberId}/messages"

    ' Template "bestellbestaetigung" mit zwei Body-Parametern
    Dim json As String = "{" &
        """messaging_product"": ""whatsapp""," &
        """to"": """ & phone & """," &
        """type"": ""template""," &
        """template"": {" &
            """name"": ""bestellbestaetigung""," &
            """language"": {""code"": ""de""}," &
            """components"": [{" &
                """type"": ""body""," &
                """parameters"": [" &
                    "{""type"": ""text"", ""text"": """ & customerName & """}," &
                    "{""type"": ""text"", ""text"": """ & orderId & """}" &
                "]" &
            "}]" &
        "}" &
        "}"

    Using client As New HttpClient()
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " & accessToken)
        Dim content As New StringContent(json, Encoding.UTF8, "application/json")
        Dim response = Await client.PostAsync(url, content)
        Return response.IsSuccessStatusCode
    End Using
End Function

Die Parameter füllen die {{1}}-, {{2}}-Platzhalter in deinem Template der Reihe nach. Stelle sicher, dass die Anzahl der Parameter mit den Erwartungen des Templates übereinstimmt.

Projekt in Planung?

Brauchst du ein fertiges Benachrichtigungssystem?

Von WhatsApp-Alerts bis zur kompletten Desktop-App mit Datenbankanbindung. Ich entwerfe Software, die hält. Lass uns über dein Projekt sprechen.

API-Antwort auswerten

Eine erfolgreiche Antwort enthält ein JSON-Objekt mit der Nachrichten-ID. Ein Fehler gibt ein strukturiertes Fehlerobjekt zurück. So liest du beides aus:

Private Async Function SendAndLog(recipientPhone As String, message As String) As Task
    Dim phoneNumberId As String = "YOUR_PHONE_NUMBER_ID"
    Dim accessToken As String = "YOUR_ACCESS_TOKEN"
    Dim url As String = $"https://graph.facebook.com/v20.0/{phoneNumberId}/messages"

    Dim json As String = "{" &
        """messaging_product"": ""whatsapp""," &
        """to"": """ & recipientPhone & """," &
        """type"": ""text""," &
        """text"": {""body"": """ & message & """}" &
        "}"

    Using client As New HttpClient()
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " & accessToken)
        Dim content As New StringContent(json, Encoding.UTF8, "application/json")
        Dim response = Await client.PostAsync(url, content)
        Dim body = Await response.Content.ReadAsStringAsync()

        If response.IsSuccessStatusCode Then
            ' body enthält: {"messaging_product":"whatsapp","contacts":[...],"messages":[{"id":"wamid.xxx"}]}
            Console.WriteLine("Gesendet. Antwort: " & body)
        Else
            ' body enthält: {"error":{"message":"...","type":"...","code":100,...}}
            Console.WriteLine("Fehler " & response.StatusCode.ToString() & ": " & body)
        End If
    End Using
End Function

Für Produktionsanwendungen speichere die Antwort in einer Log-Datei zum Debuggen. Siehe den VB.NET Textdatei schreiben Guide für Logging-Muster.

An mehrere Empfänger senden

Die WhatsApp API akzeptiert einen Empfänger pro Request. Um an mehrere Nummern zu senden, iterierst du über eine VB.NET List von Rufnummern:

Private Async Function SendToMultiple(phones As List(Of String), message As String) As Task
    Dim successCount As Integer = 0
    Dim failCount As Integer = 0

    For Each phone In phones
        Dim success = Await SendWhatsAppMessage(phone, message)

        If success Then
            successCount += 1
        Else
            failCount += 1
        End If

        ' Rate-Limit einhalten: max 80 Nachrichten pro Sekunde
        Await Task.Delay(50)
    Next

    Console.WriteLine($"Gesendet: {successCount}, Fehlgeschlagen: {failCount}")
End Function

Das Task.Delay(50) fügt eine kleine Pause zwischen den Requests ein, um innerhalb des API-Rate-Limits zu bleiben. Bei großen Batches (Tausende von Nachrichten) solltest du die Nachrichten in eine Queue stellen und im Hintergrund verarbeiten.

Zugangsdaten sicher speichern

Schreibe deinen Access Token nie fest in den Quellcode. Für Desktop-Anwendungen speicherst du Zugangsdaten in einer externen Config-Datei oder Umgebungsvariablen:

' Aus App.config oder Umgebungsvariable lesen
Dim accessToken As String = Environment.GetEnvironmentVariable("WHATSAPP_TOKEN")
Dim phoneNumberId As String = Environment.GetEnvironmentVariable("WHATSAPP_PHONE_ID")

If String.IsNullOrEmpty(accessToken) OrElse String.IsNullOrEmpty(phoneNumberId) Then
    MessageBox.Show("WhatsApp-Zugangsdaten nicht konfiguriert.", "Konfigurationsfehler",
        MessageBoxButtons.OK, MessageBoxIcon.Error)
    Return
End If

Setze Umgebungsvariablen auf der Maschine, auf der deine App läuft, oder verwende My.Settings mit benutzerbezogenen Einstellungen für Einzelbenutzer-Konfiguration.

Twilio als Alternative

Wenn du ein einfacheres SDK gegenüber rohen HTTP-Requests bevorzugst, bietet Twilio eine WhatsApp-Integration mit einem .NET-NuGet-Paket. Installiere Twilio via NuGet:

Imports Twilio
Imports Twilio.Rest.Api.V2010.Account

' Einmalig beim App-Start initialisieren
TwilioClient.Init("YOUR_ACCOUNT_SID", "YOUR_AUTH_TOKEN")

' Nachricht senden
Dim msg = MessageResource.Create(
    body:="Deine Bestellung wurde versendet.",
    from:=New Twilio.Types.PhoneNumber("whatsapp:+14155238886"),
    [to]:=New Twilio.Types.PhoneNumber("whatsapp:+491234567890")
)

Console.WriteLine("Message SID: " & msg.Sid)

Twilio kostet Geld pro Nachricht, übernimmt aber Rate-Limiting, Retries und Zustellverfolgung für dich. Die direkte Meta API ist kostenlos (du zahlst nur für Conversations über das Freitier hinaus), aber du machst alles selbst.

Häufige Fehler

Freitext außerhalb des 24-Stunden-Fensters senden

Die API gibt Fehlercode 131047 zurück, wenn du eine Textnachricht an jemanden sendest, der dir in den letzten 24 Stunden nicht geschrieben hat. Verwende stattdessen eine Template-Nachricht. Template-Nachrichten funktionieren jederzeit und sind der Standard-Ansatz für Benachrichtigungen.

Falsches Rufnummernformat

Die API erwartet die vollständige internationale Nummer ohne Pluszeichen, Leerzeichen oder Bindestriche. 491234567890 ist korrekt. +49 123 456 7890, 01234567890 oder 0049-123-4567890 schlagen fehl. Bereinige alle Formatierung vor dem Senden:

Dim cleanPhone = phone.Replace("+", "").Replace(" ", "").Replace("-", "")

Access Token fest im Code

Temporäre Tokens laufen nach 24 Stunden ab. Wenn du einen fest einträgst und vergisst ihn zu aktualisieren, hört deine App leise auf zu senden. Verwende für Produktion einen permanenten System-User-Token und speichere ihn in Umgebungsvariablen oder einer sicheren Config-Datei, nie im Quellcode.

Interessiert?

Erfahrenen .NET-Entwickler gesucht?

Ich übernehme dein Projekt, von API-Integrationen bis zur kompletten Desktop-Anwendung. Schreib mir einfach eine Nachricht.

FAQ

Ist die WhatsApp Business API kostenlos?

Meta bietet 1.000 kostenlose Service-Conversations pro Monat. Darüber hinaus zahlst du pro Conversation (nicht pro Nachricht). Template-Nachrichten für Benachrichtigungen kosten eine kleine Gebühr pro Conversation, abhängig vom Land. Entwicklung und Tests mit der Sandbox-Nummer sind kostenlos.

Kann ich WhatsApp-Nachrichten aus VB.NET ohne offizielle API senden?

Technisch könntest du WhatsApp Web mit Selenium automatisieren, aber das verstößt gegen die WhatsApp-Nutzungsbedingungen und kann zur Sperrung deiner Nummer führen. Die offizielle Cloud API oder ein Anbieter wie Twilio sind die einzigen zuverlässigen und konformen Optionen.

Was ist der Unterschied zwischen Textnachricht und Template-Nachricht?

Eine Textnachricht ist frei formulierter Inhalt, den du nur während eines aktiven 24-Stunden-Gesprächsfensters senden kannst. Eine Template-Nachricht ist ein vorab genehmigtes Format, das in deinem Meta-Dashboard registriert ist und jederzeit gesendet werden kann, auch an Nutzer die dir nicht zuerst geschrieben haben.

Brauche ich eine spezielle Rufnummer für die WhatsApp API?

Du brauchst eine Rufnummer, die nicht bereits bei WhatsApp oder der WhatsApp Business App registriert ist. Meta stellt eine kostenlose Testnummer für die Entwicklung bereit. Für Produktion registrierst du eine dedizierte Business-Nummer im Meta Business Dashboard.

Kann ich auch WhatsApp-Nachrichten in VB.NET empfangen?

Ja, aber dafür brauchst du einen Webhook. Meta sendet eingehende Nachrichten an einen öffentlichen HTTPS-Endpunkt, den du konfigurierst. Für eine Desktop-VB.NET-App brauchst du eine Server-Komponente (ASP.NET oder eine Cloud-Funktion), die den Webhook empfängt und Nachrichten an deine App weiterleitet.

Fazit

WhatsApp-Nachrichten aus VB.NET senden läuft über einen einzigen HttpClient.PostAsync-Aufruf an Metas Cloud API. Verwende Template-Nachrichten für Benachrichtigungen, speichere deinen Token sicher und bereinige Rufnummern vor dem Senden. Für einfachere Integration zu höheren Kosten gibt es Twilio als NuGet-Paket. Zum Loggen von API-Antworten in eine Datei, siehe den VB.NET Textdatei schreiben Guide.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Robert Skibbe
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.