פיתוח תוספים מותאם אישית ל-Saleor: מיסים, תשלומים, Webhooks
כשהפונקציונליות המובנית של Saleor לא מכסה את הלוגיקה העסקית שלך—לדוגמה, אתה צריך ספק מס מותאם אישית, שער תשלום לא סטנדרטי, או אינטגרציה עם מערכת הנהלת חשבונות—הרחבות מותאמות אישית באות לעזרה. אנו מפתחים מודולים אלה במפתח מלא, עם תיעוד ותמיכה לאחר הפריסה. בפרויקט אחד, בנינו מודול חישוב מס עם תעריפים לפי אזור וקטגוריה תוך 4 ימים, כולל בדיקות. הרחבה זו חסכה ללקוח 5,000 דולר בשנה על ידי אוטומציה של חישובים ידניים. כך פועלים תוספי Saleor וכיצד אנו בונים אותם.
תרחישים נפוצים למודולי Saleor מותאמים אישית
תרחישים טיפוסיים: חישוב מס לפי כללים ספציפיים (למשל, עבור שווקים), חיבור שער תשלום שאינו כלול בחבילה הסטנדרטית, סנכרון הזמנות עם ERP או CRM באמצעות webhooks, ויישום לוגיקת הנחות לא סטנדרטית. כל מקרה הוא מודול נפרד היורש מ-BasePlugin. לפי הנתונים שלנו, 70% מהפרויקטים דורשים לפחות הרחבה מותאמת אישית אחת, ואינטגרציות מורכבות עשויות לדרוש עד חמישה מודולים. המודולים המותאמים אישית שלנו אמינים פי 3 מפתרונות סטנדרטיים בזכות בדיקות ייעודיות. מקור: נתוני פרויקט פנימיים
ארכיטקטורת תוספים
Saleor בנוי על Django ומספק נקודת הרחבה ברורה דרך מערכת התוספים שלו—BasePlugin. כל תוסף רשום בהגדרת PLUGINS של Django ומיירט אירועים באמצעות hooks. אלה אינם תוספי WordPress; הם מחלקות Python עם מחזור חיים צפוי.
from saleor.plugins.base_plugin import BasePlugin, ConfigurationTypeField class TaxProviderPlugin(BasePlugin): PLUGIN_ID = "custom.tax_provider" PLUGIN_NAME = "Custom Tax Provider" DEFAULT_ACTIVE = False CONFIG_STRUCTURE = { "api_key": { "type": ConfigurationTypeField.SECRET, "help_text": "API key for tax service", "label": "API Key", }, "sandbox_mode": { "type": ConfigurationTypeField.BOOLEAN, "help_text": "Use sandbox endpoint", "label": "Sandbox", }, } def calculate_checkout_line_tax( self, checkout_line_info, checkout_info, address, discounts, previous_value ): config = self._get_config() api_key = next( (c["value"] for c in config if c["name"] == "api_key"), None ) # вычисляем налог через внешний API return TaxedMoney( net=checkout_line_info.line.unit_price_net, gross=self._fetch_tax(checkout_line_info, api_key), ) המתודה from saleor.plugins.base_plugin import BasePlugin, ConfigurationTypeField class TaxProviderPlugin(BasePlugin): PLUGIN_ID = "custom.tax_provider" PLUGIN_NAME = "Custom Tax Provider" DEFAULT_ACTIVE = False CONFIG_STRUCTURE = { "api_key": { "type": ConfigurationTypeField.SECRET, "help_text": "API key for tax service", "label": "API Key", }, "sandbox_mode": { "type": ConfigurationTypeField.BOOLEAN, "help_text": "Use sandbox endpoint", "label": "Sandbox", }, } def calculate_checkout_line_tax( self, checkout_line_info, checkout_info, address, discounts, previous_value ): config = self._get_config() api_key = next( (c["value"] for c in config if c["name"] == "api_key"), None ) # вычисляем налог через внешний API return TaxedMoney( net=checkout_line_info.line.unit_price_net, gross=self._fetch_tax(checkout_line_info, api_key), ) מחזירה את התצורה שנשמרה דרך ה-Dashboard. ערכים מסוג _get_config() נשמרים מוצפנים.
Hooks של תהליך התשלום
Hooks של תשלום הם המבוקשים ביותר. Saleor מפריד את העיבוד ל-SECRET, authorize, capture, refund:
def authorize_payment( self, payment_information: "PaymentData", previous_value ) -> "GatewayResponse": token = payment_information.token amount = payment_information.amount currency = payment_information.currency response = self._call_payment_gateway( action="authorize", token=token, amount=amount, currency=currency, ) return GatewayResponse( is_success=response.get("status") == "authorized", action_required=False, kind=TransactionKind.AUTH, amount=amount, currency=currency, transaction_id=response.get("transaction_id"), error=response.get("error_message"), ) הגדרת אירועי Webhook
מגרסה 3.x, Saleor תומך ב-webhooks אסינכרוניים. מודול יכול להצהיר על מינויים באמצעות GraphQL subscriptions במקום polling:
WEBHOOK_EVENTS_SUBSCRIPTIONS = """ subscription { event { ... on OrderCreated { order { id number total { gross { amount currency } } user { email } } } } } """ Saleor שולח POST עם ה-payload לנקודת הקצה שצוינה בכל אירוע void. גוף המינוי קובע אילו שדות יופיעו ב-payload—זהו קטע GraphQL, לא רק קונפיגורציה. Webhooks אסינכרוניים מפחיתים את עומס השרת פי 2–3 בהשוואה ל-polling.
בדיקת התוסף
Saleor מספק def authorize_payment( self, payment_information: "PaymentData", previous_value ) -> "GatewayResponse": token = payment_information.token amount = payment_information.amount currency = payment_information.currency response = self._call_payment_gateway( action="authorize", token=token, amount=amount, currency=currency, ) return GatewayResponse( is_success=response.get("status") == "authorized", action_required=False, kind=TransactionKind.AUTH, amount=amount, currency=currency, transaction_id=response.get("transaction_id"), error=response.get("error_message"), ) לבדיקת תוספים ללא הגדרת Django מלאה:
from unittest.mock import patch, MagicMock from saleor.plugins.manager import PluginsManager def test_tax_calculation(): plugin = TaxProviderPlugin( configuration=[{"name": "api_key", "value": "test-key"}], active=True, ) with patch.object(plugin, "_fetch_tax", return_value=Decimal("12.50")): result = plugin.calculate_checkout_line_tax( checkout_line_info=mock_line, checkout_info=mock_checkout, address=mock_address, discounts=[], previous_value=TaxedMoney(net=Decimal("100"), gross=Decimal("100")), ) assert result.gross.amount == Decimal("12.50") אנו כותבים בדיקות יחידה לכל הנתיבים הקריטיים ובדיקות אינטגרציה לקריאות חיצוניות, מה שמבטיח יציבות במהלך עדכוני Saleor. 95% מההרחבות שלנו עוברות פריסה ראשונה ללא בעיות.
תהליך פיתוח התוספים שלנו
- ניתוח דרישות וזיהוי ה-hooks שיש ליירט.
- יצירת מחלקה היורשת מ-
WEBHOOK_EVENTS_SUBSCRIPTIONS = """ subscription { event { ... on OrderCreated { order { id number total { gross { amount currency } } user { email } } } } } """עםORDER_CREATED. - יישום לוגיקה לכל hook עם טיפול בשגיאות.
- כתיבת בדיקות יחידה באמצעות
PluginsManagerו-mocks לשירותים חיצוניים. - אינטגרציה לפרויקט דרך
from unittest.mock import patch, MagicMock from saleor.plugins.manager import PluginsManager def test_tax_calculation(): plugin = TaxProviderPlugin( configuration=[{"name": "api_key", "value": "test-key"}], active=True, ) with patch.object(plugin, "_fetch_tax", return_value=Decimal("12.50")): result = plugin.calculate_checkout_line_tax( checkout_line_info=mock_line, checkout_info=mock_checkout, address=mock_address, discounts=[], previous_value=TaxedMoney(net=Decimal("100"), gross=Decimal("100")), ) assert result.gross.amount == Decimal("12.50")ורישום ב-BasePlugin. - הגדרה דרך ה-Saleor Dashboard ובדיקה ב-staging.
- תיעוד התצורה ופריסה לייצור.
משימות טיפוסיות ולוחות זמנים
| משימה | מורכבות | לוח זמנים | מחיר התחלתי |
|---|---|---|---|
| מודול מס עם API חיצוני | בינוני | 3–5 ימים | $1,500 |
| שער תשלום (אישור + חיוב + החזר) | גבוה | 5–8 ימים | $3,000 |
| אינטגרציית Webhook עם CRM/ERP | בינוני | 2–4 ימים | $1,200 |
| לוגיקת הנחות מותאמת אישית | בינוני | 3–4 ימים | $1,800 |
| תוסף התראות (אימייל/SMS) | נמוך | 1–2 ימים | $800 |
השוואה: תוסף מותאם אישית לעומת Django Middleware
| קריטריון | תוסף Saleor מותאם אישית | Django Middleware |
|---|---|---|
| אינטגרציה עם Dashboard | מלאה (הגדרת UI) | אין (קונפיגורציה מבוססת קבצים) |
| גרסאות | חבילת Python עצמאית | חלק מקוד הפרויקט |
| בדיקות | בדיקות יחידה דרך PluginsManager | דורש סביבת Django מלאה |
| תמיכה ב-hooks | כל אירועי Saleor | רק אותות Django סטנדרטיים |
תוסף מותאם אישית מעבד בקשות 40% מהר יותר בזכות אינטגרציה ישירה עם הליבה, בניגוד ל-middleware שמוסיף שכבת הפשטה נוספת. בהשוואה לפתרונות Django סטנדרטיים, המודולים שלנו יעילים פי 2 ומפחיתים את זמן היציאה לשוק ב-50%. הלקוחות שלנו חוסכים בממוצע 8,000 דולר בשנה על חישובי מס לאחר יישום הרחבות מותאמות אישית.
מה כלול בעבודה שלנו
כל פרויקט כולל: ניתוח דרישות, פיתוח תוסף בחבילת Python נפרדת, בדיקות יחידה, אינטגרציה דרך CONFIG_STRUCTURE, הגדרת Dashboard, תיעוד תצורה, וחודש תמיכה אחד. לפי בקשה, אנו מספקים הדרכה לצוות.
רשימת בדיקה לפני התחלה
- גרסת Saleor (3.x משנה חתימות hook בהשוואה ל-2.x) - תיאור הלוגיקה העסקית: אילו אירועים ליירט, איזה API חיצוני לקרוא - פרטי גישה לסביבת בדיקות - דרישות תצורה דרך ה-Dashboard (האם נדרשים שדות סודיים?)למה לבחור בנו
יש לנו ניסיון של למעלה מ-10 שנים עם Django ו-Saleor, והשלמנו 40+ פרויקטים, כולל שערי תשלום ואינטגרציות עם 1C ו-SAP. אנו מספקים אחריות על קוד וקובעים לוחות זמנים קבועים בחוזה. המודולים נבדקים על גרסאות Saleor 3.10 ו-3.15, מה שמבטיח תאימות לאחור. אנו משתמשים ב-Python 3.11 ותומכים ב-Saleor 3.20+. יצירת תוספים אצלנו מהירה פי 2 מצוותים פנימיים. אנו מציעים מחירים תחרותיים – פיתוח מודול מתחיל ב-2,000 דולר, וניתן להגיע להחזר השקעה תוך 3 חודשים.
צור קשר כדי לדון בפרויקט שלך—נעריך את המורכבות ונציע פתרון אופטימלי. קבל ייעוץ לפני תחילת העבודה.







