64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
# apps/messaging/providers/whatsapp.py
|
|
"""
|
|
ارسال از طریق WhatsApp Business Cloud API رسمی (Meta) —
|
|
https://developers.facebook.com/docs/whatsapp/cloud-api
|
|
|
|
برای ارسال گروهی/تبلیغاتی (business-initiated، نه پاسخ به پیام کاربر)،
|
|
واتساپ فقط اجازهی ارسال «Template Message» از قبل تاییدشده را میدهد؛ پیام
|
|
آزاد فقط داخل پنجرهی ۲۴ ساعتهی پاسخ به مشتری مجاز است. یعنی این تابع یک
|
|
Template با یک متغیر ({{1}}) صدا میزند که همان متن رندرشدهی قالب داخل اپ
|
|
در آن جای میگیرد — این Template باید از قبل در Meta Business Manager ثبت و
|
|
تایید شده باشد.
|
|
|
|
سه مقدار از .env لازم است: WHATSAPP_ACCESS_TOKEN، WHATSAPP_PHONE_NUMBER_ID،
|
|
WHATSAPP_TEMPLATE_NAME. اگر ساختار Template حساب تو (تعداد متغیرها، زبان)
|
|
فرق دارد، فقط بدنهی payload در send_whatsapp را هماهنگ کن.
|
|
"""
|
|
|
|
import logging
|
|
|
|
import requests
|
|
from django.conf import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
REQUEST_TIMEOUT_SECONDS = 15
|
|
GRAPH_API_VERSION = "v20.0"
|
|
|
|
|
|
def send_whatsapp(phone: str, text: str) -> bool:
|
|
token = settings.WHATSAPP_ACCESS_TOKEN
|
|
phone_number_id = settings.WHATSAPP_PHONE_NUMBER_ID
|
|
template_name = settings.WHATSAPP_TEMPLATE_NAME
|
|
|
|
if not token or not phone_number_id or not template_name:
|
|
logger.error("تنظیمات WhatsApp Business API کامل نیست")
|
|
return False
|
|
|
|
url = f"https://graph.facebook.com/{GRAPH_API_VERSION}/{phone_number_id}/messages"
|
|
payload = {
|
|
"messaging_product": "whatsapp",
|
|
"to": phone,
|
|
"type": "template",
|
|
"template": {
|
|
"name": template_name,
|
|
"language": {"code": "fa"},
|
|
"components": [
|
|
{"type": "body", "parameters": [{"type": "text", "text": text}]},
|
|
],
|
|
},
|
|
}
|
|
|
|
try:
|
|
response = requests.post(
|
|
url,
|
|
json=payload,
|
|
headers={"Authorization": f"Bearer {token}"},
|
|
timeout=REQUEST_TIMEOUT_SECONDS,
|
|
)
|
|
response.raise_for_status()
|
|
return True
|
|
except requests.RequestException as exc:
|
|
logger.error(f"❌ خطا در ارسال WhatsApp به {phone}: {exc}")
|
|
return False
|