This commit is contained in:
2026-08-24 15:54:08 +03:30
commit 236002a87c
133 changed files with 5946 additions and 0 deletions
+63
View File
@@ -0,0 +1,63 @@
# 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