שילוב Webpay: קבלת תשלומים באתר שלך
בעת שילוב שער התשלומים Webpay, מפתחים עושים לעיתים קרובות את אותה טעות — סדר חיבור שגוי בעת יצירת החתימה. כתוצאה מכך, התשלומים נכשלים עם שגיאת אימות, ולקוחות מאבדים אמון. נפרק כיצד להגדיר קבלת כרטיסי Visa, Mastercard ו-Belkart ללא בעיות נסתרות, ונראה אלגוריתם מוכח. חיסכון בזמן על ניפוי באגים יכול להגיע ל-40%.
Webpay נותר שער תשלום מרכזי עבור פרויקטים בלארוסיים בזכות תמיכתו ב-ERIP וב-Belkart. בלעדיו, אתה מאבד עד 30% מהקהל שאינו משתמש בכרטיסים בינלאומיים. בניגוד ל-Stripe או PayPal, Webpay מספק עיבוד מקומי ומפחית עמלה ב-15–20%. במקרה אמיתי לחנות מקוונת עם מחזור של 10,000 BYN, חיסכון העמלה הסתכם ב-250 BYN לחודש. שילבנו את Webpay עבור 20+ פרויקטים וצברנו ניסיון המאפשר לנו להימנע ממלכודות טיפוסיות.
Webpay מעבד תשלומים דרך ERIP פי 3 מהר יותר מאשר ממשקי API של ספקים אחרים — זה קריטי עבור שליחות המוניות ומבצעים.
אילו בעיות אנו פותרים במהלך השילוב?
שגיאות חתימה הן נקודת הכאב הנפוצה ביותר. הפרמטרים מחוברים בסדר קפדני: seed, store_id, order_num, test_flag, currency, amount, secret_key. אם תשנה את הסדר, החתימה לא תתאים. השתמש בתבנית שלנו.
עיבוד שגוי של הודעות — מטפל ה-notify חייב לבדוק לא רק את החתימה אלא גם את קוד התוצאה (wsb_result_code). הצלחה היא רק קוד 1. כל דבר אחר הוא דחייה או ביטול.
אובדן סשן בעת הפנייה מחדש — Webpay משתמש בהפניית POST. צור טופס עם שליחה אוטומטית באמצעות JavaScript כדי למנוע לחיצות ושגיאות. לפי תיעוד Webpay, כל השדות הם חובה.
כיצד להימנע משגיאות חתימה בעת שילוב Webpay?
הנה דוגמה לאתחול תשלום ב-Laravel:
function buildWebpayForm(int $orderId, float $amount, string $currency = 'BYN'): string {
$storeId = env('WEBPAY_STORE_ID');
$secretKey = env('WEBPAY_SECRET_KEY');
$wsb_order_num = $orderId;
$wsb_total = number_format($amount, 2, '.', '');
$wsb_currency_id = $currency;
$seed = time();
$wsb_test = env('WEBPAY_TEST', 1);
$signature = md5(
$seed . $storeId . $wsb_order_num . $wsb_test . $wsb_currency_id . $wsb_total . $secretKey
);
$action = $wsb_test ? 'https://test.webpay.by' : 'https://payment.webpay.by';
return <<<HTML
<form method="POST" action="{$action}" id="webpay-form">
<input type="hidden" name="*scart" value="">
<input type="hidden" name="wsb_version" value="2">
<input type="hidden" name="wsb_storeid" value="{$storeId}">
<input type="hidden" name="wsb_store" value="Магазин">
<input type="hidden" name="wsb_order_num" value="{$wsb_order_num}">
<input type="hidden" name="wsb_currency_id" value="{$wsb_currency_id}">
<input type="hidden" name="wsb_version" value="2">
<input type="hidden" name="wsb_test" value="{$wsb_test}">
<input type="hidden" name="wsb_total" value="{$wsb_total}">
<input type="hidden" name="wsb_signature" value="{$signature}">
<input type="hidden" name="wsb_seed" value="{$seed}">
<input type="hidden" name="wsb_return_url" value="https://example.com/payment/return">
<input type="hidden" name="wsb_fail_url" value="https://example.com/payment/fail">
<input type="hidden" name="wsb_notify_url" value="https://example.com/webhook/webpay">
<input type="hidden" name="wsb_lang" value="russian">
<button type="submit">Перейти к оплате</button>
</form>
HTML;
} מדוע מטפל ה-notify צריך להחזיר HTTP 200?
בעת קבלת POST אל function buildWebpayForm(int $orderId, float $amount, string $currency = 'BYN'): string { $storeId = env('WEBPAY_STORE_ID'); $secretKey = env('WEBPAY_SECRET_KEY'); $wsb_order_num = $orderId; $wsb_total = number_format($amount, 2, '.', ''); $wsb_currency_id = $currency; $seed = time(); $wsb_test = env('WEBPAY_TEST', 1); $signature = md5( $seed . $storeId . $wsb_order_num . $wsb_test . $wsb_currency_id . $wsb_total . $secretKey ); $action = $wsb_test ? 'https://test.webpay.by' : 'https://payment.webpay.by'; return <<<HTML <form method="POST" action="{$action}" id="webpay-form"> <input type="hidden" name="*scart" value=""> <input type="hidden" name="wsb_version" value="2"> <input type="hidden" name="wsb_storeid" value="{$storeId}"> <input type="hidden" name="wsb_store" value="Магазин"> <input type="hidden" name="wsb_order_num" value="{$wsb_order_num}"> <input type="hidden" name="wsb_currency_id" value="{$wsb_currency_id}"> <input type="hidden" name="wsb_version" value="2"> <input type="hidden" name="wsb_test" value="{$wsb_test}"> <input type="hidden" name="wsb_total" value="{$wsb_total}"> <input type="hidden" name="wsb_signature" value="{$signature}"> <input type="hidden" name="wsb_seed" value="{$seed}"> <input type="hidden" name="wsb_return_url" value="https://example.com/payment/return"> <input type="hidden" name="wsb_fail_url" value="https://example.com/payment/fail"> <input type="hidden" name="wsb_notify_url" value="https://example.com/webhook/webpay"> <input type="hidden" name="wsb_lang" value="russian"> <button type="submit">Перейти к оплате</button> </form> HTML; } , בדוק את החתימה ואת קוד התוצאה:
public function notify(Request $request): Response
{
$data = $request->all();
$expected = md5(
$data['wsb_seed'] .
env('WEBPAY_STORE_ID') .
$data['wsb_order_num'] .
$data['wsb_test'] .
$data['wsb_currency_id'] .
$data['wsb_total'] .
env('WEBPAY_SECRET_KEY')
);
if ($data['wsb_signature'] !== $expected) {
Log::warning('Webpay: invalid signature', $data);
return response('ERROR', 400);
}
if ((int)$data['wsb_result_code'] === 1) {
$orderId = (int)$data['wsb_order_num'];
Order::where('id', $orderId)->update([
'status' => 'paid',
'transaction_id' => $data['wsb_transaction_num'] ?? null,
]);
}
return response('OK');
}wsb_notify_url: 1 — הצלחה, 2 — דחייה, 3 — ביטול על ידי הקונה.
מה לעשות בדף החזרה?
אל תסתמך על פרמטרים ב-returnUrl — השתמש בסטטוס ההזמנה ממסד הנתונים, שמתעדכן על ידי מטפל ה-notify:
public function return(Request $request): View
{
$orderId = $request->input('wsb_order_num');
$order = Order::findOrFail($orderId);
return view('payment.result', ['paid' => $order->status === 'paid', 'order' => $order]);
} כיצד לטפל בהחזרים דרך Webpay?
החזרים מבוצעים דרך לוח הניהול של Webpay או API. ודא שסכום ההחזר אינו עולה על המקורי. לצורך ניפוי באגים, השתמש בסביבת הבדיקה: בדוק שתעודת הבדיקה לא פגה. עבור החזרים דרך API, החתימה נוצרת באמצעות אותו אלגוריתם אך עם פרמטרי הפעולה.
מה לעשות במקרה של פסק זמן בחיבור?
אם הבקשה ל-Webpay אינה מגיבה במשך יותר מ-30 שניות, יזם בקשה חדשה עם אותו order_num. אידמפוטנטיות מובטחת על ידי הייחודיות של order_num — שליחה חוזרת עם אותו מספר לא תיצור כפילות. הגדר פסק זמן בצד הלקוח ורשום את כל פסקי הזמן לניתוח.
השוואה בין סביבת בדיקה לסביבת ייצור
| פרמטר | סביבת בדיקה | סביבת ייצור |
|---|---|---|
| URL | test.webpay.by | payment.webpay.by |
| wsb_test | 1 | 0 |
| כרטיסים | כרטיסי בדיקה מהתיעוד | כרטיסים אמיתיים |
| הפעלה | מיידית | 1–3 ימי עסקים לאחר הבדיקות |
טבלת קודי שגיאה וטיפול בהם
| קוד תוצאה | תיאור | פעולה |
|---|---|---|
| 1 | תשלום מוצלח | עדכן סטטוס הזמנה ל-'שולם' |
| 2 | דחיית בנק | הודע ללקוח והצע כרטיס אחר |
| 3 | ביטול על ידי הקונה | חזור לדף העגלה |
| אחר | שגיאה טכנית | רשום ביומן והחזר HTTP 400 |
בעת בדיקת החזרים, הצלב סכומים והשתמש באותם מפתחות. יש להריץ את כל התרחישים לפני המעבר למצב ייצור.
תהליך עבודה: מניתוח ועד פריסה
- ניתוח — אנו לומדים את החנות שלך, בוחרים את שיטת השילוב (מודולים מוכנים או מותאם אישית).
- עיצוב — אנו מסכמים על תוכנית זרימת התשלום, כתובות URL להודעות.
- יישום — אנו מיישמים את טופס התשלום, מטפלים, החזרים.
- בדיקות — אנו מריצים את כל התרחישים בסביבת הבדיקה: הצלחה, דחייה, פסק זמן.
- פריסה — אנו מפעילים מצב ייצור, עוקבים אחר העסקאות הראשונות.
מה כלול בעבודה?
- תיעוד שילוב (תוכנית, תיאורי שיטות).
- בדיקת 10+ תרחישי תשלום.
- הדרכת מנהל המערכת שלך על טיפול בהחזרים ודוחות Webpay.
- תמיכה למשך 30 יום לאחר ההשקה.
לוח זמנים ועלות
שילוב Webpay אורך בין 5 ל-10 ימי עסקים בהתאם למורכבות החנות. העלות מחושבת באופן אישי. אנו נעריך את הפרויקט שלך לאחר סקירת האתר שלך — צור קשר. הזמן שילוב וקבל ייעוץ ממהנדס.
למה להפקיד בידינו את השילוב?
למעלה מ-10 שנות ניסיון בפיתוח אתרים, 50+ שילובים שהושקו בהצלחה עם מערכות תשלום. אנו מבטיחים עיבוד נכון של כל סוגי העסקאות והיעדר שגיאות חתימה. הפתרונות שלנו עוברים ביקורות אבטחה. קבל ייעוץ — אנו נעריך את הפרויקט שלך תוך יום אחד.







