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.
Inhaltsverzeichnis
Was du brauchst
Bevor du Code schreibst, brauchst du drei Dinge von Meta:
- Meta Business Account mit einer registrierten App auf developers.facebook.com
- Phone Number ID aus dem WhatsApp-Bereich in deinem App-Dashboard
- 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:
- Deine App sendet einen POST-Request an
https://graph.facebook.com/v20.0/{phone_number_id}/messages - Meta prüft deinen Token, die Rufnummer und das Nachrichtenformat
- Meta stellt die Nachricht über WhatsApp-Server zu
- 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.
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.
FAQ
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.
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.
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.
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.
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.