סקירה כללית
Takbull שולחת התראות Webhook אל כתובת URL לבחירתכם כאשר אירועים מסוימים מתרחשים במערכת. לדוגמה: תשלום שהושלם בהצלחה, ניסיון תשלום שנכשל, חשבונית חדשה שנוצרה או הזמנה שננטשה על ידי הלקוח.
הגדרת Webhook
Webhooks מוגדרים לכל סוחר במערכת הניהול האחורית של Takbull. עבור כל Webhook יש להגדיר את כתובת היעד, סוג הבקשה, סוג הנתונים והאירוע שמפעיל את הקריאה.
| הגדרה | תיאור |
|---|---|
| Hook Address | כתובת ה־URL המלאה של נקודת הקצה שלכם, לדוגמה: https://yoursite.com/webhooks/takbull |
| Request Type | סוג הבקשה: GET או POST |
| Request Data Type | סוג הנתונים: JSON, XML או Query |
| Event Trigger Type | האירוע שמפעיל את ה־Webhook, למשל תשלום מוצלח, תשלום שנכשל או חשבונית חדשה. |
אירועים נתמכים
כל Webhook מופעל לפי סוג אירוע. ניתן לבחור אירוע ספציפי, או אירוע כללי שמופעל בכל שינוי מצב הזמנה.
| Event | Value | Description |
|---|---|---|
| General | 0 | מופעל בכל שינויי מצב הזמנה. |
| NewInvoice | 10 | חשבונית חדשה נוצרה. |
| SuccessPayment | 20 | תשלום הושלם בהצלחה. |
| FailedPayment | 30 | ניסיון תשלום נכשל. |
| PendingOrder | 40 | הזמנה חדשה נוצרה וממתינה לתשלום. |
| AbandonedOrder | 50 | הזמנה ננטשה על ידי הלקוח. |
Headers ופרטי בקשה
בכל קריאת Webhook נשלחים Headers קבועים, בהתאם לסוג הבקשה והפורמט שנבחר.
| Header | Value |
|---|---|
| User-Agent | TakbullIPNAgent |
| Content-Type | application/json עבור POST בפורמט JSON בלבד. |
POST – JSON Payload עבור אירועי הזמנה
כאשר Request Type = POST ו־ Request Data Type = JSON, גוף הבקשה נשלח כאובייקט JSON.
{
"Id": 123456,
"uniqId": "a1b2c3d4-e5f6-...",
"OrderNumber": 1001,
"order_reference": "your-internal-ref",
"CustomerFullName": "Israel Israeli",
"CustomerEmail": "customer@example.com",
"CustomerPhone": "0501234567",
"OrderStatus": 2,
"StatusCode": 0,
"StatusDescription": "Success",
"OrderTotalSum": 250.00,
"Token": "card-external-token",
"Last4Digs": "1234",
"Cardtype": "Visa",
"Action": "Charge",
"IsSubscriptionPayment": false
}
הצגת טבלת שדות Order Notification
| Field | Type | Description |
|---|---|---|
| Id | integer | מזהה הזמנה פנימי. |
| uniqId | string | מזהה הזמנה ייחודי, UUID. |
| OrderNumber | integer | מספר הזמנה רציף שמוצג לסוחר. |
| order_reference | string | הפניית ההזמנה המותאמת שהועברה בעת checkout. |
| DealType | integer | סוג העסקה, 0 = Regular. |
| CustomerFullName | string | השם המלא של הלקוח. |
| CustomerEmail | string | כתובת האימייל של הלקוח. |
| CustomerPhone | string | מספר הטלפון של הלקוח. |
| CustomerIdentity | string | מספר תעודת הזהות של הלקוח. |
| OrderStatus | integer | קוד מצב ההזמנה הסופי. |
| StatusCode | integer | מצב עיבוד פנימי. 0 = success. |
| StatusDescription | string | תיאור קריא לאדם של StatusCode. |
| InvoiceStatusCode | integer | null | מצב יצירת החשבונית. 0 = success. |
| InvoiceStatusDescription | string | תיאור מצב החשבונית. |
| InvoiceUniqId | string | מזהה ייחודי של החשבונית שנוצרה. |
| DocumentNumber | integer | מספר מסמך רציף. |
| DocumentType | integer | סוג המסמך שהופק. |
| IsSubscriptionPayment | boolean | true אם זהו חיוב מנוי חוזר. |
| TransactionId | integer | null | מזהה עסקה פנימי. |
| Token | string | טוקן כרטיס שמור לחיובים עתידיים. |
| Last4Digs | string | 4 הספרות האחרונות של הכרטיס. |
| Cardtype | string | מותג הכרטיס, לדוגמה Visa או Mastercard. |
| OrderTotalSum | decimal | הסכום הכולל שחויב. |
| Action | string | פעולת התשלום שבוצעה, לדוגמה Charge או Refund. |
| InitialRecuringPaymentStatusCode | integer | מצב הגדרת התשלום החוזר הראשוני. |
| InitialRecuringPaymentDescription | string | תיאור מצב הגדרת התשלום החוזר. |
| SubscriptionStatusCode | integer | קוד מצב עבור חיוב מנוי. |
| SubscriptionStatusDescription | string | תיאור עבור מצב חיוב מנוי. |
POST – XML Payload
כאשר Request Type = POST ו־ Request Data Type = XML, אותם נתונים נשלחים כאובייקט OrderNotification שעבר סריאליזציה ל־XML.
<?xml version="1.0" encoding="utf-16"?>
<OrderNotification xmlns:xsi="..." xmlns:xsd="...">
<Id>123456</Id>
<uniqId>a1b2c3d4-e5f6-...</uniqId>
<OrderNumber>1001</OrderNumber>
<CustomerFullName>Israel Israeli</CustomerFullName>
<OrderStatus>2</OrderStatus>
<StatusCode>0</StatusCode>
<StatusDescription>Success</StatusDescription>
<OrderTotalSum>250.00</OrderTotalSum>
<!-- ... all other fields ... -->
</OrderNotification>
GET – Query Parameters
כאשר משתמשים ב־GET, הנתונים נשלחים בפרמטרים של כתובת ה־URL. עבור אירועי הזמנה מתקבל בדרך כלל מזהה ייחודי של ההזמנה.
| Parameter | Type | Description |
|---|---|---|
| orderUniqId | string (UUID) | מזהה הזמנה ייחודי. |
| uniqId | string (UUID) | כינוי עבור orderUniqId — אותו ערך, כלול לצורך תאימות. |
GET https://yoursite.com/webhooks/takbull
?orderUniqId=a1b2c3d4-e5f6-7890-abcd-ef1234567890
&uniqId=a1b2c3d4-e5f6-7890-abcd-ef1234567890
אירוע NewInvoice
כאשר נוצרת חשבונית או מסמך חדש, ניתן לקבל Webhook מסוג NewInvoice.
GET – Query Parameters
| Parameter | Type | Description |
|---|---|---|
| invoiceUniqId | string (UUID) | מזהה ייחודי של החשבונית או המסמך החדש שנוצר. |
GET https://yoursite.com/webhooks/takbull
?invoiceUniqId=a1b2c3d4-e5f6-7890-abcd-ef1234567890
POST – JSON Payload
כאשר Request Type = POST ו־ Request Data Type = JSON עבור אירוע NewInvoice, גוף הבקשה הוא אובייקט DocumentVM.
{
"Id": 501,
"DocumentNumber": 1042,
"Mid": "merchant-id",
"DocumentType": 1,
"DocumentCreationDate": "2024-06-01T12:00:00",
"uniqId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"CustomerName": "Israel Israeli",
"Email": "customer@example.com",
"Currency": "ILS",
"TotalPriceWithTax": 295.00,
"TotalTaxAmount": 45.00,
"InvoiceStatusCode": 0,
"InvoiceItems": [
{
"Name": "Product A",
"Quantity": 2,
"UnitPrice": 100.00,
"TotalPrice": 200.00,
"IsTaxteble": true
}
]
}
הצגת טבלת שדות DocumentVM
| Field | Type | Description |
|---|---|---|
| Id | integer | מזהה מסמך פנימי. |
| DocumentNumber | integer | מספר מסמך רציף. |
| Mid | string | מזהה סוחר. |
| DocumentType | integer | סוג מסמך. |
| DocumentCreationDate | string (ISO 8601) | חותמת הזמן שבה המסמך נוצר. |
| DocumentDate | string | null | תאריך המסמך הרשמי. |
| uniqId | string (UUID) | מזהה מסמך ייחודי. |
| InvoiceUniqId | string (UUID) | כינוי עבור uniqId. |
| CustomerName | string | השם המלא של הלקוח. |
| FirstName | string | השם הפרטי של הלקוח. |
| LastName | string | שם המשפחה של הלקוח. |
| string | כתובת האימייל של הלקוח. | |
| PhoneNumber | string | מספר הטלפון של הלקוח. |
| CustomerIdentityNumber | string | מספר תעודת הזהות של הלקוח. |
| AddressLine1 | string | כתובת הרחוב של הלקוח. |
| City | string | העיר של הלקוח. |
| Country | string | קוד המדינה של הלקוח. |
| Currency | string | קוד מטבע, לדוגמה ILS או USD. |
| Language | string | שפת המסמך, לדוגמה he או en. |
| TotalPriceWithTax | decimal | סכום כולל כולל מס. |
| TotalTaxAmount | decimal | סכום המע״מ או המס הכולל. |
| TotalTaxFree | decimal | סכום כולל פטור ממס. |
| Discount | decimal | ערך ההנחה שהוחל. |
| DiscountType | integer | 0 = Amount, 1 = Percentage. |
| InvoiceStatusCode | integer | מצב דיווח לרשות המסים. 0 = success. |
| ConfirmationNumber | string | מספר אישור מרשות המסים. |
| PaymentMethod | integer | אמצעי התשלום העיקרי שבו נעשה שימוש. |
| TotalSumPaidInCreditcard | decimal | null | סכום ששולם בכרטיס אשראי. |
| TotalSumPaidInCash | decimal | null | סכום ששולם במזומן. |
| TotalSumPaidInCheck | decimal | null | סכום ששולם בצ׳ק. |
| TotalSumPaidInWIreTransfer | decimal | null | סכום ששולם בהעברה בנקאית. |
| InvoiceItems | array | שורות פריטים במסמך. |
הצגת שדות InvoiceItem
| Field | Type | Description |
|---|---|---|
| Name | string | שם מוצר או שירות. |
| Quantity | decimal | כמות שנמכרה. |
| UnitPrice | decimal | מחיר ליחידה, לפני מס. |
| TotalPrice | decimal | סך הכול לשורה: Quantity x UnitPrice. |
| IsTaxteble | boolean | האם מע״מ חל על שורת פריט זו. |
סוגי מסמכים ומצבי הזמנה
סוגי מסמכים
| Value | Name | Description |
|---|---|---|
| 1 | HeshbonitMas | חשבונית מס. |
| 2 | Kabala | קבלה. |
| 3 | HeshbonitMasKabala | חשבונית מס + קבלה. |
| 4 | HeshbonitMasZikui | חשבונית מס זיכוי. |
| 5 | HeshbonitMasZikuiAndKabala | חשבונית מס זיכוי + קבלה. |
| 6 | KabalaTruma | קבלה על תרומה. |
| 7 | Heshbonit | חשבונית עסקה / חשבונית פרופורמה. |
| 8 | HeshbonIska | חשבון עסקה. |
| 9 | Hazmana | אישור הזמנה. |
| 10 | HatzaatMehir | הצעת מחיר. |
| 11 | TeudatMishloah | תעודת משלוח. |
מצבי הזמנה
| Value | Name | Description |
|---|---|---|
| 0 | Pending | הזמנה נוצרה, ממתינה לתשלום. |
| 1 | Processing | התשלום נמצא בעיבוד. |
| 2 | Completed | התשלום הצליח. |
| 3 | Failed | התשלום נכשל. |
| 4 | Refunded | ההזמנה הוחזרה / זוכתה. |
| 5 | Abandoned | הלקוח נטש את checkout. |
מדיניות ניסיונות חוזרים
אם נקודת הקצה שלכם אינה מחזירה קוד סטטוס HTTP מסוג 2xx, Takbull תנסה לשלוח שוב את ה־Webhook באופן אוטומטי.
| Attempt | Delay after previous attempt |
|---|---|
| Initial delivery | שליחה ראשונית ללא עיכוב. |
| 1st retry | 15 דקות לאחר הכשל הקודם. |
| 2nd retry | 15 דקות לאחר הכשל הקודם. |
| Final failure | ה־Webhook יסומן כ־Failed ולא יבוצעו ניסיונות נוספים. |
תגובה ל־Webhook והמלצות אבטחה
תגובה תקינה
נקודת הקצה שלכם צריכה להחזיר קוד HTTP מסוג 2xx כאשר ההתראה התקבלה בהצלחה. אם מוחזר קוד שאינו 2xx או שהשרת חורג מזמן ההמתנה, Takbull תתזמן ניסיון חוזר.
- להחזיר תגובת HTTP 2xx לאחר קבלת ההתראה.
- להגיב במהירות, בתוך כמה שניות.
- לבצע עיבוד כבד באופן אסינכרוני ולא לעכב את התגובה.
- לשמור לוג של מזהה ההזמנה או החשבונית לצורך בדיקות ומעקב.
המלצות אבטחה
דוגמאות יישום
C# / ASP.NET Core
[HttpPost]
public async Task<IActionResult> TakbullWebhook([FromBody] OrderNotification notification)
{
if (notification == null)
return BadRequest();
// Only process successful payments
if (notification.StatusCode == 0)
{
// TODO: fulfill the order using notification.uniqId
// or notification.order_reference
}
return Ok();
}
Node.js / Express
app.post('/webhooks/takbull', express.json(), (req, res) => {
const notification = req.body;
if (notification.StatusCode === 0) {
// Payment successful – fulfill the order
console.log('Order paid:', notification.uniqId);
}
res.sendStatus(200);
});
PHP
<?php
$payload = json_decode(file_get_contents('php://input'), true);
if ($payload && $payload['StatusCode'] === 0) {
// Payment successful – fulfill the order
error_log('Order paid: ' . $payload['uniqId']);
}
http_response_code(200);
צ׳ק ליסט לפני עלייה לאוויר
- נקודת הקצה נגישה ציבורית.
- ה־URL מוגדר בצורה מלאה ונכונה בשדה Hook Address.
- נבחר Request Type מתאים: GET או POST.
- נבחר Request Data Type מתאים: JSON, XML או Query.
- נבחר Event Trigger Type מתאים לתרחיש העסקי.
- השרת מחזיר HTTP 2xx כאשר ההתראה מתקבלת בהצלחה.
- העיבוד הכבד מתבצע אסינכרונית ולא חוסם את התגובה ל־Webhook.
- קיים טיפול במניעת כפילות לפי uniqId.
- קיימים לוגים לצורך בדיקות, תמיכה ושחזור תקלות.
- נקודת הקצה עובדת ב־HTTPS.
