adding
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user