Tombol balas WhatsApp
Tombol balas menempatkan hingga tiga pilihan yang dapat diketuk di bawah pesan WhatsApp, sehingga penerima menjawab dengan satu ketukan alih-alih teks bebas. Gunakan untuk keputusan cepat, seperti mengonfirmasi atau membatalkan pemesanan. Untuk lebih dari tiga pilihan, gunakan menu daftar.
Kirim tombol balas
Atur interactive.type ke button, dengan sebuah body_text dan satu hingga tiga buttons, masing-masing berupa quick_reply:
const msg = await bird.whatsapp.send({
to: "+16505551234",
from: "+13124495648",
interactive: {
type: "button",
body_text: "Your gardening workshop is scheduled for 9am tomorrow.",
buttons: [{ type: "quick_reply", quick_reply: { slug: "change-booking", text: "Change" } }],
},
});
console.log(msg.id, msg.status);msg = client.whatsapp.send(
to="+16505551234",
from_="+13124495648",
interactive={
"type": "button",
"body_text": "Your gardening workshop is scheduled for 9am tomorrow.",
"buttons": [{"type": "quick_reply", "quick_reply": {"slug": "change-booking", "text": "Change"}}],
},
)
print(msg.id, msg.status)package main
import (
"context"
"fmt"
"log"
"os"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
if err != nil {
log.Fatal(err)
}
msg, err := client.Whatsapp.Send(context.Background(), bird.WhatsappSendParams{
To: "+16505551234",
From: "+13124495648",
Interactive: &bird.WhatsAppInteractiveSend{
Type: "button",
BodyText: "Your gardening workshop is scheduled for 9am tomorrow.",
Buttons: &[]bird.WhatsAppInteractiveButtonSend{
{Type: "quick_reply", QuickReply: &bird.WhatsAppInteractiveQuickReplyButtonSend{Slug: "change-booking", Text: "Change"}},
},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(msg.Id, *msg.Status)
}$interactive = (new WhatsAppMessageSendRequestInteractive())
->setType('button')
->setBodyText('Your gardening workshop is scheduled for 9am tomorrow.')
->setButtons([
(new WhatsAppInteractiveButtonSend())
->setType('quick_reply')
->setQuickReply((new WhatsAppInteractiveButtonSendQuickReply())->setSlug('change-booking')->setText('Change')),
]);
$message = $bird->whatsapp->send(
to: '+16505551234',
from: '+13124495648',
interactive: $interactive,
);
echo $message->getId(), ' ', $message->getStatus();bird whatsapp send \
--from +13124495648 \
--interactive '{"body_text":"Your gardening workshop is scheduled for 9am tomorrow.","buttons":[{"quick_reply":{"slug":"change-booking","text":"Change"},"type":"quick_reply"}],"type":"button"}' \
--to +16505551234{
"name": "whatsapp_send",
"arguments": {
"from": "+13124495648",
"interactive": {
"body_text": "Your gardening workshop is scheduled for 9am tomorrow.",
"buttons": [
{
"quick_reply": {
"slug": "change-booking",
"text": "Change"
},
"type": "quick_reply"
}
],
"type": "button"
},
"to": "+16505551234"
}
}curl -X POST "https://{region}.platform.bird.com/v1/whatsapp/messages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to": "+16505551234",
"from": "+13124495648",
"interactive": {
"type": "button",
"body_text": "Your gardening workshop is scheduled for 9am tomorrow.",
"buttons": [
{ "type": "quick_reply", "quick_reply": { "slug": "change-booking", "text": "Change" } }
]
}
}'from wajib ada di setiap pesan layanan: nomor yang dimiliki workspace Anda, bukan nomor yang dikelola Bird. Bentuk lengkapnya menambahkan header opsional, footer, kutipan pesan sebelumnya, dan tombol kedua:
Contoh kode
{
"to": "+16505551234",
"from": "+13124495648",
"in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
"interactive": {
"type": "button",
"header": {
"type": "image",
"url": "https://cdn.example.com/banners/workshop.png"
},
"body_text": "Your gardening workshop is scheduled for 9am tomorrow.",
"footer_text": "Lucky Shrub, your gateway to succulents",
"buttons": [
{ "type": "quick_reply", "quick_reply": { "slug": "change-booking", "text": "Change" } },
{ "type": "quick_reply", "quick_reply": { "slug": "cancel-booking", "text": "Cancel" } }
]
},
"tags": [{ "name": "category", "value": "booking" }],
"metadata": { "order_id": "A-1" }
}in_reply_to_message_id mengutip pesan sebelumnya dalam percakapan yang sama. Lihat bagian hub mengutip pesan untuk mencocokkan balasan untuk cara resolusi bekerja dan apa yang bisa terlewat.
Tipe ini hanya mengirim tombol quick_reply. Tombol cta_url termasuk dalam interactive.type terpisah dan tidak dapat muncul bersama buttons; lihat bagian tombol di hub untuk bentuk tombol yang digunakan bersama.
Header dan footer
Header bersifat opsional, dan memiliki salah satu dari empat bentuk:
Contoh kode
"header": { "type": "text", "text": "New workshop dates" }
"header": { "type": "image", "url": "https://cdn.example.com/a.png" }
"header": { "type": "video", "url": "https://cdn.example.com/a.mp4" }
"header": { "type": "document", "url": "https://cdn.example.com/a.pdf" }Header media (image, video, atau document) membawa filenya sebagai URL https publik yang diambil WhatsApp saat pengiriman, bukan sebagai handle media yang diunggah. footer_text bersifat opsional dan menambahkan baris di bawah tombol.
Batas
| Field | Batas |
|---|---|
| buttons | 1 hingga 3 entri, setiap entri berupa quick_reply |
| quick_reply.slug | wajib, 1 hingga 256 karakter |
| quick_reply.text (label) | wajib, 1 hingga 20 karakter, unik dalam satu pesan |
| body_text | wajib, 1 hingga 1.024 karakter |
| footer_text | opsional, 1 hingga 60 karakter |
| header.text | 1 hingga 60 karakter |
Bird memeriksa bahwa label tombol (quick_reply.text) bersifat unik, tetapi tidak memeriksa apakah nilai slug juga unik, meskipun setiap slug dimaksudkan untuk mengidentifikasi satu tombol. Dua tombol yang berbagi slug sama-sama terkirim dan tersampaikan, dan balasannya kembali tanpa bisa dibedakan.
Membaca balasan
Ketukan tiba sebagai pesan masuk tersendiri, membawa interactive_reply:
Contoh kode
{
"id": "wam_01kyb2m4xq7whs0d8n3prv6tez",
"direction": "inbound",
"from": { "phone_number": "+16505551234" },
"to": { "phone_number": "+13124495648" },
"status": "received",
"in_reply_to_message_id": "wam_01kya19eknftrs2s6p82asmvnh",
"interactive_reply": {
"type": "button",
"button": {
"slug": "cancel-booking",
"text": "Cancel"
}
},
"created_at": "2026-08-25T09:04:11Z"
}slug yang Anda atur saat pengiriman dikembalikan persis sama, sehingga Anda dapat langsung melakukan percabangan tanpa tabel pencarian. Anda melihat balasan ini melalui daftar pesan atau GET /v1/whatsapp/messages/{id}; lihat bagian hub membaca balasan untuk alur lengkapnya.
Batas dan kasus khusus
- Jendela layanan pelanggan harus terbuka. Tombol balas adalah pesan layanan, hanya dapat dikirim di dalam jendela yang terbuka; lihat bagian hub jendela layanan pelanggan. Pemeriksaan jendela bersifat fail-open, sehingga 202 bukan bukti bahwa jendela benar-benar terbuka saat pengiriman berlangsung.
- from harus berupa nomor yang dimiliki workspace Anda. Menghilangkannya, atau menyebut nomor yang bukan pengirim terhubung, akan ditolak sebelum pengiriman dibuat.
- Label harus unik, atau pengiriman ditolak. Dua tombol dengan quick_reply.text yang sama gagal dengan 422 E15056 WhatsAppInteractiveDuplicateLabel, karena Meta akan menolak duplikat tersebut setelah pengiriman sudah diterima dan dikenai biaya.
- Label adalah yang dilihat penerima; slug tidak pernah ditampilkan. Menaruh teks untuk pengguna di slug tidak memberikan efek apa pun, karena hanya text yang ditampilkan di chat.
- URL header media yang tidak dapat diambil WhatsApp gagal setelah pengiriman diterima. Bird tidak memvalidasi url header seperti memvalidasi URL pesan media, sehingga URL http:// atau URL yang mengembalikan error lolos dari permintaan lalu gagal secara asinkron, dengan media_rejected pada last_error pesan.
- Mengirim nama field milik Meta sendiri akan menggagalkan permintaan. Tipe ini langsung menolak properti yang tidak dikenal, sehingga JSON yang disalin dari referensi Cloud API Meta, seperti objek body atau wrapper action.buttons, perlu diubah bentuknya menjadi field datar Bird terlebih dahulu.
Kutipan yang tidak dapat diresolusi menggagalkan permintaan sebelum apa pun dibuat atau dikenai biaya: 404 E15071 jika id menyebut pesan yang tidak dimiliki workspace ini, 422 E15072 jika id menyebut pesan yang tidak dapat dikutip. Untuk error yang dapat terjadi pada pengiriman WhatsApp mana pun, jendela tertutup, pengirim tidak ada atau tidak valid, atau penerima tidak valid, lihat bagian hub error dan Mengirim pesan WhatsApp.
Langkah selanjutnya
- Pesan interaktif WhatsApp: apa yang dimiliki bersama oleh keenam tipe interaktif
- Menu daftar: untuk lebih dari tiga pilihan
- Mengirim pesan WhatsApp: envelope permintaan, model 202, dan percobaan ulang yang aman
Sumber daya terkait
Lanjutkan dengan dokumentasi, panduan, dan contoh untuk topik ini. Sumber daya tersedia dalam bahasa Inggris.
Tonton panduannyaConnecting WhatsApp to Bird: from buying a number to a live channelPahami konsepnyaWhat is the 24-hour customer service window on WhatsApp?Gunakan alatnyaWhatsApp message builderJelajahi kemampuannyaWhatsApp
Coba praktiknya dan dapatkan ringkasan implementasi