เอกสารฉบับนี้อธิบายวิธีใช้ API เพื่อส่งข้อความถึงผู้ใช้ WhatsApp
คุณสามารถใช้ API เพื่อส่งข้อความประเภทต่อไปนี้ได้ คุณสามารถส่งข้อความประเภทเหล่านี้ทั้งหมด (ยกเว้นข้อความแสดงความรู้สึก) เป็นข้อความตอบกลับถึงข้อความก่อนหน้าได้
ข้อความขอที่อยู่ ช่วยให้คุณขอที่อยู่ในการจัดส่งจากผู้ใช้ WhatsApp ได้อย่างง่ายดาย | ![]() |
ข้อความเสียง จะแสดงไอคอนเสียงและลิงก์ไปยังไฟล์เสียง เมื่อผู้ใช้ WhatsApp แตะที่ไอคอนนี้ ไคลเอ็นต์ WhatsApp จะโหลดและเล่นไฟล์เสียงดังกล่าว | ![]() |
ข้อความผู้ติดต่อ ช่วยให้คุณสามารถส่งข้อมูลต่างๆ สำหรับติดต่อ เช่น ชื่อ หมายเลขโทรศัพท์ ที่อยู่จริง และอีเมลถึงผู้ใช้ WhatsApp ได้โดยตรง | ![]() |
ข้อความเอกสาร จะแสดงไอคอนเอกสารซึ่งลิงก์กับเอกสารที่ผู้ใช้ WhatsApp สามารถแตะเพื่อดาวน์โหลด | ![]() |
ข้อความรูปภาพ จะแสดงรูปภาพหนึ่งรูปและคำบรรยายซึ่งจะระบุหรือไม่ก็ได้ | ![]() |
ข้อความปุ่ม URL สำหรับ CTA แบบอินเทอร์แอคทีฟ ช่วยให้คุณสามารถแมป URL ใดก็ได้กับปุ่ม เพื่อให้คุณไม่ต้องใส่ URL แบบดิบที่ยาวหรือคลุมเครือไว้ในเนื้อหาข้อความ | ![]() |
ข้อความแบบขั้นตอนอินเทอร์แอคทีฟช่วยให้คุณสามารถส่งข้อความที่มีการจัดโครงสร้างที่ดูเป็นธรรมชาติหรือใช้งานได้สะดวกยิ่งขึ้นสำหรับลูกค้า ตัวอย่างเช่น คุณสามารถใช้ WhatsApp Flows เพื่อจองการนัดหมาย เลือกดูสินค้า รวบรวมคำติชมจากลูกค้า รับข้อมูลลูกค้าใหม่เพื่อสร้างยอดขาย หรือดำเนินการอื่นๆ | ![]() |
ข้อความแบบรายการอินเทอร์แอคทีฟ ช่วยให้คุณสามารถนำเสนอรายการตัวเลือกที่ผู้ใช้ WhatsApp สามารถเลือกได้ | ![]() |
ข้อความคำขอตำแหน่งแบบอินเทอร์แอคทีฟ จะแสดงเนื้อความและปุ่มส่งตำแหน่ง เมื่อผู้ใช้ WhatsApp แตะปุ่มนี้ หน้าจอแชร์ตำแหน่งที่ตั้งจะปรากฏขึ้นมา ซึ่งผู้ใช้สามารถใช้แชร์ตำแหน่งที่ตั้งของตนได้ | ![]() |
ข้อความปุ่มตอบกลับแบบอินเทอร์แอคทีฟ ช่วยให้คุณสามารถส่งข้อความตอบกลับที่กำหนดไว้ล่วงหน้าให้ผู้ใช้เลือกได้สูงสุด 3 ข้อความ | ![]() |
ข้อความแสดงตำแหน่ง ช่วยให้คุณสามารถส่งพิกัดละติจูดและลองจิจูดของตำแหน่งที่ตั้งถึงผู้ใช้ WhatsApp ได้ | ![]() |
ข้อความสติกเกอร์ จะแสดงสติกเกอร์ที่เป็นภาพเคลื่อนไหวหรือภาพนิ่งในข้อความ WhatsApp | ![]() |
ข้อความตัวอักษร เป็น��้อความที่ประกอบด้วยเนื้อความที่เป็นตัวอักษรและพรีวิวลิงก์ (ซึ่งระบุหรือไม่ก็ได้) เท่านั้น | ![]() |
ข้อความเทมเพลต ช่วยให้คุณสามารถส่งเทมเพลตข้อความเพื่อการตลาด อรรถประโยชน์ และการยืนยันตัวตนถึงผู้ใช้ WhatsApp คุณไม่จำเป็นต้องเปิดช่วงเวลาการให้บริการลูกค้า 24 ชั่วโมงระหว่างคุณกับผู้รับข้อความก่อนเพื่อให้สามารถส่งข้อความเทมเพลตได้ ซึ่งแตกต่างจากข้อความประเภทอื่นๆ ทั้งหมด | ![]() |
ข้อความวิดีโอ จะแสดงพรีวิวภาพขนาดย่อของรูปภาพของวิดีโอพร้อมคำบรรยายที่จะระบุหรือไม่ก็ได้ เมื่อผู้ใช้ WhatsApp แตะที่พรีวิว วิดีโอจะโหลดและแสดงให้ผู้ใช้เห็น | ![]() |
ข้อความแสดงความรู้สึก คือการแสดงความรู้สึกด้วยอีโมจิที่คุณสามารถนำไปใช้กับข้อความก่อนหน้าที่คุณได้รับจากผู้ใช้ WhatsApp | ![]() |
เมื่อผู้ใช้ WhatsApp ส่งข้อความถึงคุณ ระบบจะเริ่มนับเวลา 24 ชั่วโมง ซึ่งเรียกว่าช่วงเวลาการให้บริการลูกค้า (หรือรีเฟรช)
คุณจะส่งข้อความทุกประเภทที่ไม่ใช่ข้อความเทมเพลตถึงผู้ใช้ได้ก็ต่อเมื่อมีการเปิดช่วงเวลาการให้บริการลูกค้า 24 ชั่วโมงระหว่างคุณกับผู้ใช้ดังกล่าวเท่านั้น
ส่วนข้อความเทมเพลตจะสามารถส่งถึงผู้ใช้ได้ตลอดเวลา ตราบใดที่ผู้ใช้ดังกล่าวเลือกที่จะรับข้อความจากคุณ
คำขอส่งข้อความทั้งหมดใช้ตำแหน่งข้อมูล POST /<WHATSAPP_BUSINESS_PHONE_NUMBER_ID/messages ดังนี้
POST /<WHATSAPP_BUSINESS_PHONE_NUMBER_ID>/messages
เนื้อความของโพสต์จะแตกต่างกันออกไป โดยขึ้นอยู่กับประเภทของข้อความที่คุณต้องการส่ง แต่เพย์โหลดจะใช้รูปแบบคำสั่งเดียวกันดังต่อไปนี้
{ "messaging_product": "whatsapp", "recipient_type": "individual", "to": "<WHATSAPP_USER_PHONE_NUMBER>", "type": "<MESSAGE_TYPE>", "<MESSAGE_TYPE>": {<MESSAGE_CONTENTS>} }
ค่าคุณสมบัติ type
ในเพย์โหลดเนื้อความของโพสต์เป็นตัวระบุประเภทของข้อความที่จะส่ง และจะต้อง��ีคุณสมบัติที่ตรงกับประเภทนั้นๆ ซึ่งอธิบายเนื้อหาของข้อความรวมอยู่ด้วย
ตัวอย่างเช่น ด้านล่างนี้คือคำขอส่งข้อความตัวอักษร ถึงผู้ใช้ WhatsApp ให้สังเกตว่ามีการตั้งค่า type
เป็น text
และต่อด้วยอ็อบเจ็กต์ text
ซึ่งบรรยายเนื้อหาของข้อความดังกล่าว
curl 'https://graph.facebook.com/v20.0
/106540352242922/messages' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer EAAJB...' \
-d '
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "+16505551234",
"type": "text",
"text": {
"preview_url": true,
"body": "As requested, here'\''s the link to our latest product: https://www.meta.com/quest/quest-3/"
}
}'
ด้านล่างนี้คือข้อความที่จะปรากฏในไคลเอ็นต์ WhatsApp หากส่งข้อความตัวอักษรถึงผู้ใช้ WhatsApp สำเร็จ
API จะส่งการตอบกลับต่อไปนี้หากยอมรับคำขอส่งข้อความของคุณสำเร็จโดยไม่พบข้อผิดพลาดในคำขอดังกล่าว
{ "messaging_product": "whatsapp", "contacts": [ { "input": "<WHATSAPP_USER_PHONE_NUMBER>", "wa_id": "<WHATSAPP_USER_ID>" } ], "messages": [ { "id": "<WHATSAPP_MESSAGE_ID>" "message_status": "<PACING_STATUS>" } ] }
ให้สังเกตว่าการตอบกลับนี้ระบุเพียงว่า API ยอมรับคำขอของคุณสำเร็จแล้วเท่านั้น แต่ไม่ได้ระบุว่านำส่งข้อความของคุณสำเร็จหรือไม่ โดยระบบจะแจ้งสถานะการส่งข้อความผ่าน Webhooks messages
การตอบกลับจะมีคุณสมบัติ message_status
รวมอยู่ด้วยก็ต่อเมื่อคุณส่งข้อความเทมเพลตที่ใช้เทมเพลตซึ่งได้รับการกำหนดช่วงจังหวะจัดแสดงเท่านั้น
ข้อความที่ส่งถึงผู้ใช้ WhatsApp จะทริกเกอร์ Webhooks messages ดังนั้นอย่าลืมสมัครรับข้อมูลหัวข้อนี้เพื่อรับการแจ้งเตือนสถานะข้อความ
ข้อความทางการค้าเป็นข้อความแบบอินเทอร์แอคทีฟที่ใช้ร่วมกับแค็ตตาล็อกสินค้า ดูวิธีใช้ข้อความประเภทเหล่านี้ได้ที่ "แชร์สินค้ากับลูกค้า"
คุณสามารถส่งข้อความประเภทใดก็ได้เพื่อเป็นการตอบกลับข้อความก่อนหน้า ซึ่งข้อความก่อนหน้าจะปรากฏอยู่เหนือข้อความใหม่ โดยถูกอ้างอิงอยู่ในบับเบิลแสดงบริบท
บับเบิลแสดงบริบทจะไม่ปรากฏอยู่เหนือข้อความที่ส่งเป็นข้อความตอบกลับหากมีกรณีต่อไปนี้เกิดขึ้น
POST /<WHATSAPP_BUSINESS_PHONE_NUMBER_ID>/messages
{ "messaging_product": "whatsapp", "recipient_type": "individual", "to": "<WHATSAPP_USER_PHONE_NUMBER>", "context": { "message_id": "WAMID_TO_REPLY_TO" }, /* Message type and type contents goes here */ }
ตัวยึดตำแหน่ง | คำอธิบาย | ค่าตัวอย่าง |
---|---|---|
สตริง | จำเป็นต้องระบุ ID ข้อความบน WhatsApp (wamid) ของข้อความก่อนหน้าที่คุณต้องการตอบกลับ |
|
String | Required. WhatsApp user phone number. |
|
ตัวอย่างข้อความตัวอักษรที่ส่งเพื่อเป็นการตอบกลับข้อความก่อนหน้า
curl 'https://graph.facebook.com/v19.0/106540352242922/messages' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer EAAJB...' \ -d ' { "messaging_product": "whatsapp", "recipient_type": "individual", "to": "+16505551234", "context": { "message_id": "wamid.HBgLMTY0NjcwNDM1OTUVAgASGBQzQTdCNTg5RjY1MEMyRjlGMjRGNgA=" }, "type": "text", "text": { "body": "You'\''re welcome, Pablo!" } }'
Plus signs (+
), hyphens (-
), parenthesis ((
,)
), and spaces are supported in send message requests.
We highly recommend that you include both the plus sign and country calling code when sending a message to a customer. If the plus sign is omitted, your business phone number's country calling code is prepended to the customer's phone number. This can result in undelivered or misdelivered messages.
For example, if your business is in India (country calling code 91
) and you send a message to the following customer phone number in various formats:
Number In Send Message Request | Number Message Delivered To | Outcome |
---|---|---|
|
| Correct number |
|
| Correct number |
|
| Potentially wrong number |
|
| Potentially wrong number |
คุณจะต้องอัพโหลดองค์ประกอบสื่อที่ส่งในข้อความไปยังหมายเลขโทรศัพท์ของธุรกิจที่จะใช้สำหรับส่งข้อความ หรือโฮสต์องค์ประกอบดังกล่าวบนเซิร์ฟเวอร์สาธารณะและรวม URL ในคำขอส่งข้อความด้วย
เพื่อลดโอกาสที่จะเกิดข้อผิดพลาดและหลีกเลี่ยงการส่งคำขอไปยังเซิร์ฟเวอร์สาธารณะโดยไม่จำเป็น เราขอแนะนำให้คุณอัพโหลดองค์ประกอบสื่อของคุณและใช้ ID ขององค์ประกอบ��ังกล่าวเมื่อส่งข้อความ
Cloud API ของ WhatsApp รองรับการแคชแบบ HTTP สำหรับสื่อ หากคุณใช้ลิงก์ (link
) ไปยังองค์ประกอบสื่อบนเซิร์ฟเวอร์ของคุณ (แทน ID (id
) ขององค์ประกอบที่คุณอัพโหลดไปยังเซิร์ฟเวอร์ของเรา) คุณจะสามารถกำหนดให้เราแคชองค์ประกอบของคุณเพื่อนำกลับมาใช้กับข้อความต่างๆ ในภายหลังได้ โดยใส่ส่วนหัวด้านล่างนี้ไว้ในการตอบกลับเซิร์ฟเวอร์เมื่อเราส่งคำขอองค์ประกอบ หากไม่ได้ใส่ส่วนหัวใดๆ เหล่านี้ไว้ เราก็จะไม่แคชองค์ประกอบของคุณ
Cache-Control: <CACHE_CONTROL> Last-Modified: <LAST_MODIFIED> ETag: <ETAG>
ส่วนหัว Cache-Control
จะบอกให้เราทราบวิธีจัดการกับการแคชองค์ประกอบ เรารองรับตัวบ่งชี้ดังต่อไปนี้
max-age=n
: ระบุว่าจะแคชองค์ประกอบเป็นเวลากี่วินาที (n
) เราจะนำองค์ประกอบที่แคชไว้กลับมาใช้ในข้อความต่างๆ หลังจากนั้นจนกว่าจะเกินเวลาดังกล่าวนี้ โดยหลังจากนั้น เราจะส่งคำขอองค์ประกอบอีกครั้งหากจำเป็น ตัวอย่าง: Cache-Control: max-age=604800
no-cache
: ระบุว่าสามารถแคชองค์ประกอบได้แต่องค์ประกอบก็ควรได้รับการอัพเดตหากค่าของส่วนหัว Last-Modified
ต่างจากการตอบกลับก่อนหน้านี้ จำเป็นต้องใช้ส่วนหัว Last-Modified
ตัวอย่าง: Cache-Control: no-cache
no-store
: ระบุว่าองค์ประกอบไม่ควรได้รับการแคช ตัวอย่าง: Cache-Control: no-store
private
: ระบุว่าองค์ประกอบได้รับการป��ับให้เหมาะกับผู้รับแต่ละราย และไม่ควรได้รับการแคชระบุเวลาที่องค์ประกอบได้รับการแก้ไขครั้งล่าสุด โดยใช้ร่วมกับ Cache-Control: no-cache
หากค่า Last-Modified
ต่างจากการตอบกลับก่อนหน้านี้ และ Cache-Control: no-cache
รวมอยู่ในการตอบกลับ เราจะอัพเดตองค์ประกอบเวอร์ชั่นที่เราแคชไว้สำหรับองค์ประกอบในการตอบกลับ ตัวอย่าง: Date: Tue, 22 Feb 2022 22:22:22 GMT
ส่วนหัว ETag
เป็นสตริงที่ไม่ซ้ำกัน ซึ่งระบุเวอร์ชั่นที่เฉพาะเจาะจงขององค์ประกอบ ตัวอย่าง: ETag: "33a64df5"
. ระบบจะไม่สนใจส่วนหัว เว้นแต่��่วนหัวทั้ง Cache-Control
และ Last-Modified
จะไม่รวมอยู่ในการตอบกลับ ในกรณีนี้ เราจะแคชองค์ประกอบตามตรรกะภายในของเราเอง (ซึ่งเราจะไม่เปิดเผยให้ทราบ)
HTTP/1.1 200 OK Content-Type: image/png Content-Length: 1024 Date: Tue, 22 Feb 2022 22:22:22 GMT ETag: "33a64df5" Cache-Control: max-age=604800 <IMAGE_PAYLOAD>
เมื่อส่งข้อความหลายรายการ ระบบไม่รับรองว่าลำดับการส่งข้อความจะตรงกับลำดับคำขอ API ของคุณ หากคุณต้องการส่งข้อความตามลำดับที่ต้องการ ให้ยืนยันว่าได้รับสถานะ delivered
ใน Webhook ข้อความก่อนจะส่งข้อความถัดไปในลำดับข้อความของคุณ
หากเราไม่สามารถส่งข้อความถึงผู้ใช้ WhatsApp ได้ เราจะพยายามส่งข้อความต่อไปเป็นระยะเวลาหนึ่ง ซึ่งเราเรียกช่วงเวลานี้ว่า Time-To-Live (TTL) หรือช่วงเวลาที่ข้อความใช้งานได้ หากเราไม่สามารถนำส่งข้อความเกินระยะเวลา TTL เราจะหยุดการพยายามส่งซ้ำและละทิ้งข้อความ
คุณสามารถปรับแต่งค่าเริ่มต้นเหล่านี้โดยตั้งค่า TTL แบบกำหนดเองให้กับเทมเพลตเพื่อการยืนยันตัวตนและเทมเพลตเพื่ออรรถประโยชน์ โปรดดู การปรับแต่ง Time-To-Live
หากคุณส่งข้อความแต่ไม่ได้รับ Webhook messages ที่เกี่ยวข้องซึ่งระบุว่าข้อความถูกนำส่งก่อนสิ้นสุดระยะเวลา TTL ให้ถือว่าข้อความดังกล่าวถูกละทิ้ง
โปรดทราบว่า หากส่งข้อความไม่สำเร็จด้วยเหตุผลบางประการที่ไม่เกี่ยวข้องและไปทริกเกอร์ Webhook messagesนำส่งไม่สำเร็จ คุณอาจได้รับ Webhook ดังกล่าวล่าช้าเล็กน้อย ดังนั้นคุณอาจต้องรอสักนิดก่อนที่จะสรุปว่าข้อความถูกละทิ้ง
หากคุณประสบปัญหาในการส่งข้อความ โปรดดูที่หัวข้อ "ส่งข้อความไม่ถึงผู้รับ"