כיצד לשלב תשלומי QR Code ב-1C-Bitrix עם SBP, Tinkoff ו-YooKassa
כאשר לקוח מבצע הזמנה בחנות מקוונת, הוא רוצה לשלם בשתי לחיצות — ללא הזנת פרטי כרטיס.
קוד QR בדף התשלום פותר זאת: סריקה, אישור באפליקציית הבנק, סיום. אבל מתחת למכסה המנוע, מדובר בשילוב של API של סולק, יצירת QR, בדיקת סטטוס ו-UX נכון. אנו מתמחים בשילובי turnkey עבור 1C-Bitrix ו-Bitrix24. עם ניסיון של למעלה מ-10 שנים, אנו מזהים מיד נקודות תורפה. לדוגמה, בפרויקט עם מלאי של 150,000 SKU, יישמנו QR SBP דרך Tinkoff. הבעיה הייתה שבזמן עומסי שיא של 100 הזמנות במקביל, בדיקת הסטטוס לא עמדה בקצב עדכוני המצב, מה שגרם לחלק מהתשלומים להיתקע. ייעלנו זאת על ידי הוספת תורי סוכנים של Bitrix והגדלת מרווח הבדיקה ל-5 שניות עם backoff אקספוננציאלי. כתוצאה מכך, 99.9% מהתשלומים הושלמו כהלכה. שילוב טיפוסי עולה בין $500–1.5k, אך מחזיר את עצמו תוך 3 חודשים באמצעות חיסכון בעמלות.
סוגי קודי QR לתשלום
QR SBP דרך מערכת התשלומים המהירים
עובד עם כל בנק משתתף. לפי תקנת בנק רוסיה מס' 580-P, העברות מתבצעות תוך שניות. העמלות הן 0.4–0.7% מהסכום — פי 3–5 נמוכות יותר מעיבוד כרטיסים. עם מחזור חודשי של $9k–13k, החיסכון בעמלות מגיע ל-$360–520. זו האפשרות הטובה ביותר בשל עמלות נמוכות וקבלה רחבה.
QR בנקאי — פורמט קנייני
ספציפי לבנק (SberPay QR, Tinkoff QR). עובד רק עם אפליקציית אותו בנק. מתאים לקהל של מותג יחיד.
QR כתמונת קישור
קישור רגיל לדף התשלום המקודד ב-QR. נפתח בדפדפן נייד; הלקוח בוחר אמצעי תשלום באתר. פשוט יותר ליישום אך מוסיף שלב נוסף.
QR SBP — הבחירה האופטימלית לחנות מקוונת
QR SBP מנצח בפרמטרים מרכזיים: עמלות נמוכות פי 2–3 מכרטיסים, העברת כספים מיידית והחזרים קלים. עבור הלקוח, זהו תרחיש מוכר: סריקת QR בכל אפליקציית בנק. לפי סטטיסטיקות, 70% מהמשתמשים מעדיפים SBP כאשר הוא זמין. החיסכון בעמלות יכול להגיע ל-80% בהשוואה לכרטיסים. לדוגמה, עם מחזור חודשי של $4.5k–6.5k, החיסכון הוא כ-$180–260; ב-$18k–26k, זה $720–1k.
כיצד אנו מגדירים תשלום בקוד QR ב-1C-Bitrix
סקירת שילוב שלב אחר שלב
תהליך ההגדרה כולל מספר שלבים: 1. בחירת סולק ורישום טרמינל (Tinkoff, YooKassa וכו'). 2. יצירת קוד QR לכל הזמנה דרך API של הסולק. 3. יישום בדיקת סטטוס עם idempotency ונעילות עסקאות כדי למנוע תשלומים כפולים. 4. שילוב ברכיבי 1C-Bitrix הסטנדרטיים באמצעות תורי סוכנים אסינכרוניים. 5. בדיקת כל התרחישים (הצלחה, ביטול, פסק זמן) עם אימות חתימת SHA-256 של קריאות חוזרות.כיצד לחבר QR SBP דרך Tinkoff
ראשית, צור תשלום בסולק באמצעות Init, קבל את PaymentId. לאחר מכן בקש את קוד ה-QR באמצעות GetQr. קוד PHP:
// Создаём платёж с типом QR $params = [ 'TerminalKey' => TINKOFF_TERMINAL, 'Amount' => (int)($order->getPrice() * 100), 'OrderId' => $order->getAccountNumber(), 'Description' => 'Заказ #' . $order->getAccountNumber(), 'NotificationURL' => 'https://shop.ru/bitrix/tools/sale_ps_result.php', 'PayType' => 'O', ]; $params['Token'] = tinkoffSign($params, TINKOFF_SECRET); $initResult = tinkoffPost('/v2/Init', $params); $paymentId = $initResult['PaymentId']; // Запрашиваем QR для СБП $qrParams = [ 'TerminalKey' => TINKOFF_TERMINAL, 'PaymentId' => $paymentId, 'DataType' => 'IMAGE', // или 'PAYLOAD' для получения строки ссылки ]; $qrParams['Token'] = tinkoffSign($qrParams, TINKOFF_SECRET); $qrResult = tinkoffPost('/v2/GetQr', $qrParams); // $qrResult['Data'] — base64-encoded PNG с QR-кодом (при DataType=IMAGE) // или строка-ссылка СБП (при DataType=PAYLOAD) חשוב לטפל בשגיאות: אם התשלום לא נוצר, החזר הודעה ברורה למשתמש. אנו תמיד מוסיפים fallback במקרה ש-API של הסולק אינו זמין, כגון שמירת ההזמנה וניסיון חוזר עם backoff אקספוננציאלי.
כיצד ליישם QR SBP דרך YooKassa
YooKassa יוצר אוטומטית QR SBP בעת יצירת תשלום עם שיטת // Создаём платёж с типом QR $params = [ 'TerminalKey' => TINKOFF_TERMINAL, 'Amount' => (int)($order->getPrice() * 100), 'OrderId' => $order->getAccountNumber(), 'Description' => 'Заказ #' . $order->getAccountNumber(), 'NotificationURL' => 'https://shop.ru/bitrix/tools/sale_ps_result.php', 'PayType' => 'O', ]; $params['Token'] = tinkoffSign($params, TINKOFF_SECRET); $initResult = tinkoffPost('/v2/Init', $params); $paymentId = $initResult['PaymentId']; // Запрашиваем QR для СБП $qrParams = [ 'TerminalKey' => TINKOFF_TERMINAL, 'PaymentId' => $paymentId, 'DataType' => 'IMAGE', // или 'PAYLOAD' для получения строки ссылки ]; $qrParams['Token'] = tinkoffSign($qrParams, TINKOFF_SECRET); $qrResult = tinkoffPost('/v2/GetQr', $qrParams); // $qrResult['Data'] — base64-encoded PNG с QR-кодом (при DataType=IMAGE) // или строка-ссылка СБП (при DataType=PAYLOAD) :
$payment = $client->createPayment([ 'amount' => ['value' => '1500.00', 'currency' => 'USD'], 'payment_method_data' => ['type' => 'sbp'], 'confirmation' => ['type' => 'qr'], 'description' => 'Заказ #' . $orderId, ], uniqid('', true)); $qrUrl = $payment->getConfirmation()->getConfirmationData(); // qrUrl — строка вида https://qr.nspk.ru/... — кодируем в QR на клиенте כדי להציג את ה-QR מ-URL בצד הלקוח, השתמש בספריית JS sbp או $payment = $client->createPayment([ 'amount' => ['value' => '1500.00', 'currency' => 'USD'], 'payment_method_data' => ['type' => 'sbp'], 'confirmation' => ['type' => 'qr'], 'description' => 'Заказ #' . $orderId, ], uniqid('', true)); $qrUrl = $payment->getConfirmation()->getConfirmationData(); // qrUrl — строка вида https://qr.nspk.ru/... — кодируем в QR на клиенте . זה מהיר יותר ואינו מעמיס על השרת.
הצגת QR בעמוד ובדיקת סטטוס
// Показываем QR и полим статус платежа async function showQRPayment(orderId) { const resp = await fetch('/api/get-payment-qr.php', { method: 'POST', body: JSON.stringify({ orderId }), }); const data = await resp.json(); document.getElementById('qr-image').src = 'data:image/png;base64,' + data.qrBase64; document.getElementById('qr-block').style.display = 'block'; // Polling: проверяем статус каждые 3 секунды const pollInterval = setInterval(async () => { const status = await checkPaymentStatus(orderId); if (status === 'paid') { clearInterval(pollInterval); window.location.href = '/payment/success/'; } if (status === 'expired') { clearInterval(pollInterval); showExpiredMessage(); } }, 3000); // Останавливаем polling через 15 минут setTimeout(() => clearInterval(pollInterval), 15 * 60 * 1000); } סקריפט בדיקת סטטוס בצד השרת עם idempotency ושלמות עסקאות:
// local/api/check-payment-status.php $orderId = (int)($_POST['orderId'] ?? 0); $paymentId = getExternalPaymentId($orderId); // сохранённый PaymentId Тинькофф $params = [ 'TerminalKey' => TINKOFF_TERMINAL, 'PaymentId' => $paymentId, ]; $params['Token'] = tinkoffSign($params, TINKOFF_SECRET); $status = tinkoffPost('/v2/GetState', $params); $map = [ 'CONFIRMED' => 'paid', 'CANCELED' => 'cancelled', 'DEADLINE_EXPIRED' => 'expired', ]; echo json_encode([ 'status' => $map[$status['Status']] ?? 'pending', ]); בדיקת הסטטוס חייבת להיות עמידה: בשגיאות רשת, נסה שוב עם backoff אקספוננציאלי, ולעולם אל תחסום את ממשק המשתמש. בנוסף, יישם נעילת עסקאות MySQL בעת עיבוד הודעות קריאה חוזרת כדי למנוע תשלומים כפולים.
טעויות נפוצות בהגדרת תשלום QR
בעיה נפוצה אחת היא פסק זמן ביצירת ה-QR דרך API של הסולק. אם הסולק לא מגיב תוך 10 שניות, יש צורך ב-fallback: הצג אמצעי תשלום חלופי או נסה שוב את הבקשה במרווח של 1-2 שניות. אנו מגדירים פסק זמן של לפחות 30 שניות עבור API של Tinkoff ובודקים את סטטוס התשלום ברקע באמצעות סוכנים.
בעיה נפוצה נוספת היא חוסר טיפול בהודעות כפולות. כאשר הסולק שולח מספר קריאות חוזרות, עליך לבדוק את סטטוס התשלום במסד הנתונים עם נעילת עסקאות לפני העדכון. אחרת, הזמנה עלולה להיות משולמת פעמיים. זה נפתר בקלות עם qrcodejs ב-MySQL.
מה כלול בהגדרת תשלום QR Turnkey
| רכיב | תיאור |
|---|---|
| בחירת סולק וחיבור | Tinkoff, YooKassa או בנק אחר עם SBP |
| יצירת קוד QR בדף ההזמנה | תמונת Base64 או URL + עיבוד בצד הלקוח |
| בדיקת סטטוס תשלום עם idempotency | סקריפט שרת + מרווח לקוח עם טיפול בפסק זמן |
| שילוב עם 1C-Bitrix | מערכת תשלום, מטפלי הודעות, רישום לוגים |
| תיעוד ובדיקות | הוראות למנהל, כל התרחישים נבדקו |
| תמיכה לאחר השקה | אחריות לחודש, ייעוץ לשינויים |
לוחות זמנים משוערים
| שלב | זמן |
|---|---|
| QR SBP דרך Tinkoff/YooKassa | 1–2 ימים |
| בדיקת סטטוס + עדכון UX עם backoff אקספוננציאלי | 0.5–1 יום |
| שילוב בדף התשלום | 0.5–1 יום |
| סה"כ (כולל בדיקות) | מ-2 עד 4 ימים |
צור קשר להערכת פרויקט ופתרון אופטימלי. עם ניסיון של למעלה מ-10 שנים בשילובים, אנו מבטיחים עיבוד תשלומים יציב. קבל הערכה לפרויקט שלך — השאר בקשה. משאבים נוספים: מערכת תשלומים מהירים, קוד QR.







