תשלומי קריפטו במסחר אלקטרוני: שער תשלום מותאם אישית
טעות אופיינית בשילוב קריפטו במסחר אלקטרוני: התייחסות אליו כאל עוד אמצעי תשלום בקופה הקיימת. במציאות, מדובר בתהליך שונה — לתשלומי קריפטו אין סופיות מיידית (למעט L2), אין החזרים (chargebacks), שער החליפין משתנה בזמן שהמשתמש הולך לארנק שלו, ותשלום חלקי הוא מקרה קצה אמיתי, לא תיאורטי. מניסיוננו, זיהינו צווארי בקבוק אופייניים: חישוב גז שגוי, חוסר בגלגול לאחור (rollback) לתשלומים חלקיים, ובעיות באימות עסקאות ב-L2. להלן פירוט מלא של הארכיטקטורה, מבחירת ספק ועד דיווח חשבונאי.
אינטגרציה מותאמת אישית מחזירה את ההשקעה פי 3 מהר יותר מפתרונות מתארחים (hosted) להיקפים של 100 תשלומים ביום. אנו משלבים תשלומי קריפטו מאז ראשית התחום וראינו חנויות מאבדות עד 12% מההכנסות עקב טיפול לא נכון בניואנסים.
בחירת גישה: מתארח (Hosted) מול מותאם אישית
השוואה בין שלוש אפשרויות:
| פרמטר | שירות מוכן (NOWPayments, CoinGate) | מותאם אישית דרך API של ספק | מותאם אישית מלא On-Chain |
|---|---|---|---|
| זמן השקה | 1-2 ימים | 3-5 ימים | 2-4 שבועות |
| עמלה | 0.5–1% | 0.1–0.5% (רשת בלבד) | גז רשת בלבד |
| מטבעות נתמכים | רשימה קבועה | כל ERC-20/BEP-20 | כל (Solana, Bitcoin) |
| פרטיות | צד שלישי רואה עסקאות | הספק רואה רק תשלומים | פרטיות מלאה |
שירותים מוכנים מתאימים להיקפים של עד כמה מאות תשלומים בחודש. אינטגרציה מותאמת אישית מוצדקת כאשר:
- יש צורך בסט ספציפי של מטבעות/רשתות שאינם נתמכים על ידי הספק
- דרישות פרטיות (הלקוח לא רוצה שצדדים שלישיים יראו עסקאות)
- היקפים גבוהים שבהם עמלות הספק משמעותיות
- לוגיקה ספציפית (למשל, המרה אוטומטית דרך DEX)
להלן — אינטגרציה מותאמת אישית, מכיוון שהיא דורשת יותר פתרונות טכניים. הניסיון שלנו: 30+ פרויקטים, אחריות קוד ל-12 חודשים.
WooCommerce: תוסף שער תשלום מותאם אישית
WooCommerce מספקת את המחלקה המופשטת WC_Payment_Gateway — פשוט להרחיב אותה:
class WC_Crypto_Gateway extends WC_Payment_Gateway { public function __construct() { $this->id = 'crypto_payment'; $this->title = 'Оплата криптовалютой'; $this->method_description = 'Bitcoin, Ethereum, USDT и другие'; $this->supports = ['products']; $this->init_form_fields(); $this->init_settings(); add_action('woocommerce_update_options_payment_gateways_' . $this->id, [$this, 'process_admin_options']); add_action('woocommerce_api_crypto_payment', [$this, 'handle_webhook']); } public function process_payment($order_id): array { $order = wc_get_order($order_id); // Создаём платёж во внешнем сервисе или генерируем адрес $payment = $this->create_crypto_payment($order); // Сохраняем данные для отображения инструкций $order->update_meta_data('_crypto_payment_id', $payment['id']); $order->update_meta_data('_crypto_pay_address', $payment['address']); $order->update_meta_data('_crypto_pay_amount', $payment['amount']); $order->update_meta_data('_crypto_expires_at', $payment['expires_at']); $order->set_status('pending', 'Ожидание криптоплатежа'); $order->save(); return [ 'result' => 'success', 'redirect' => $this->get_return_url($order), ]; } public function handle_webhook(): void { $payload = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_PAYMENT_SIGNATURE'] ?? ''; if (!$this->verify_signature($payload, $signature)) { wp_die('Invalid signature', 401); } $data = json_decode($payload, true); $order = wc_get_order($data['order_id']); if (!$order) wp_die('Order not found', 404); if ($data['status'] === 'confirmed') { $order->payment_complete($data['transaction_hash']); $order->add_order_note( sprintf('Криптоплатёж подтверждён. TX: %s', $data['transaction_hash']) ); } wp_die('OK', 200); } } דף התודה (לאחר הפנייה) צריך להציג את הכתובת, קוד QR, והסכום עם טיימר. WooCommerce קוראת ל-class WC_Crypto_Gateway extends WC_Payment_Gateway { public function __construct() { $this->id = 'crypto_payment'; $this->title = 'Оплата криптовалютой'; $this->method_description = 'Bitcoin, Ethereum, USDT и другие'; $this->supports = ['products']; $this->init_form_fields(); $this->init_settings(); add_action('woocommerce_update_options_payment_gateways_' . $this->id, [$this, 'process_admin_options']); add_action('woocommerce_api_crypto_payment', [$this, 'handle_webhook']); } public function process_payment($order_id): array { $order = wc_get_order($order_id); // Создаём платёж во внешнем сервисе или генерируем адрес $payment = $this->create_crypto_payment($order); // Сохраняем данные для отображения инструкций $order->update_meta_data('_crypto_payment_id', $payment['id']); $order->update_meta_data('_crypto_pay_address', $payment['address']); $order->update_meta_data('_crypto_pay_amount', $payment['amount']); $order->update_meta_data('_crypto_expires_at', $payment['expires_at']); $order->set_status('pending', 'Ожидание криптоплатежа'); $order->save(); return [ 'result' => 'success', 'redirect' => $this->get_return_url($order), ]; } public function handle_webhook(): void { $payload = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_PAYMENT_SIGNATURE'] ?? ''; if (!$this->verify_signature($payload, $signature)) { wp_die('Invalid signature', 401); } $data = json_decode($payload, true); $order = wc_get_order($data['order_id']); if (!$order) wp_die('Order not found', 404); if ($data['status'] === 'confirmed') { $order->payment_complete($data['transaction_hash']); $order->add_order_note( sprintf('Криптоплатёж подтверждён. TX: %s', $data['transaction_hash']) ); } wp_die('OK', 200); } } שמוביל לדף התודה הסטנדרטי — ניתן להתאים אישית באמצעות פעולת get_return_url().
Shopify: שימוש ב-Payment Apps API
Shopify אינה מאפשרת PHP מותאם אישית שרירותי. כדי לשלב קריפטו, יש ליצור אפליקציית Shopify דרך לוח המחוונים של Partner ולהשתמש ב-Payments Apps API.
העיקרון: האפליקציה שלך נרשמת כספק תשלום. במהלך הקופה, Shopify שולחת בקשת HTTP לנקודת הקצה שלך עם נתוני ההזמנה, אתה מחזיר URL להפניה לדף התשלום שלך, ולאחר אישור, אתה שולח resolved/rejected דרך GraphQL mutation.
// Shopify вызывает этот endpoint app.post('/shopify/payment', async (req, res) => { const { gid, amount, currency, cancelUrl, kind } = req.body; // Создаём внутренний платёж const payment = await createCryptoInvoice({ shopifyOrderGid: gid, fiatAmount: parseFloat(amount), fiatCurrency: currency, }); // Редиректим на нашу payment страницу res.json({ redirect_url: `${process.env.APP_URL}/pay/${payment.id}`, }); }); // После подтверждения платежа async function notifyShopifyPaymentComplete(paymentGid: string, txHash: string) { const mutation = ` mutation PaymentSessionResolve($id: ID!) { paymentSessionResolve(id: $id) { paymentSession { id state { ... on PaymentSessionStateResolved { code } } } userErrors { field message } } } `; await shopifyGraphQL(mutation, { id: paymentGid }); } כיצד שער החליפין והטיימר משפיעים על חוויית המשתמש וההכנסות?
המשתמש רואה מחיר של $99, לוחץ על "שלם בקריפטו", ומגיע לדף עם סכום של 0.0271 ETH. סכום זה תקף ל-15–30 דקות. אם המשתמש איטי או שהשער משתנה משמעותית, יש צורך במנגנון רענון.
הטיימר בדף התשלום לא צריך להיות דקורטיבי — כאשר הוא פג, יש לעדכן את החשבונית אוטומטית:
// Клиентский код let expiresAt = new Date(invoice.expiresAt); const timer = setInterval(async () => { const remaining = expiresAt.getTime() - Date.now(); if (remaining <= 0) { clearInterval(timer); // Запрашиваем новый invoice с актуальным курсом const refreshed = await fetch(`/api/payment/${invoiceId}/refresh`, { method: 'POST' }); const newInvoice = await refreshed.json(); expiresAt = new Date(newInvoice.expiresAt); updateUI(newInvoice); // Обновляем QR и сумму } }, 1000); בשרת (backend), בעת רענון — לחשב מחדש את סכום הקריפטו בשער הנוכחי, לעדכן את רשומת מסד הנתונים, תוך שימוש באותה כתובת (אם משתמשים בכתובת ייחודית לכל תשלום).
התאמה ודיווח
לצורכי חשבונאות, יש להמיר את סכום הקריפטו לפייאט (fiat) בזמן הקבלה. לרשום במסד הנתונים: woocommerce_thankyou_{gateway_id}, // Shopify вызывает этот endpoint app.post('/shopify/payment', async (req, res) => { const { gid, amount, currency, cancelUrl, kind } = req.body; // Создаём внутренний платёж const payment = await createCryptoInvoice({ shopifyOrderGid: gid, fiatAmount: parseFloat(amount), fiatCurrency: currency, }); // Редиректим на нашу payment страницу res.json({ redirect_url: `${process.env.APP_URL}/pay/${payment.id}`, }); }); // После подтверждения платежа async function notifyShopifyPaymentComplete(paymentGid: string, txHash: string) { const mutation = ` mutation PaymentSessionResolve($id: ID!) { paymentSessionResolve(id: $id) { paymentSession { id state { ... on PaymentSessionStateResolved { code } } } userErrors { field message } } } `; await shopifyGraphQL(mutation, { id: paymentGid }); } , // Клиентский код let expiresAt = new Date(invoice.expiresAt); const timer = setInterval(async () => { const remaining = expiresAt.getTime() - Date.now(); if (remaining <= 0) { clearInterval(timer); // Запрашиваем новый invoice с актуальным курсом const refreshed = await fetch(`/api/payment/${invoiceId}/refresh`, { method: 'POST' }); const newInvoice = await refreshed.json(); expiresAt = new Date(newInvoice.expiresAt); updateUI(newInvoice); // Обновляем QR и сумму } }, 1000); , crypto_amount, crypto_currency, fiat_amount. מקור השער — Chainlink (on-chain) או CoinGecko API (off-chain) עם חותמת זמן. זה קריטי לדיווח מס.
מה לעשות בנוגע לתשלום חלקי?
מקרה קצה: המשתמש שלח 0.02 ETH במקום 0.0271 ETH. ללא לוגיקה מיוחדת, ההזמנה תיתקע. פתרון: ברמת ה-worker, לבדוק שהסכום שהתקבל >= הצפוי, אחרת לסמן כ-fiat_currency וליצור חשבונית שנייה עבור היתרה. לכלול תמיכה במספר עסקאות בהזמנה אחת.
למה לבחור באינטגרציה מותאמת אישית?
אינטגרציה מותאמת אישית נותנת לך שליטה מלאה על המחסנית (stack): מבחירת בלוקצ'יין ועד לוגיקת טיפול בשגיאות. אתה לא תלוי בעמלות ובמגבלות של ספקים. בהיקפים מ-100 תשלומים ביום, החיסכון בעמלות עולה על עלויות הפיתוח תוך 3 חודשים. אנו גם מיישמים הגנה מפני התקפות reentrancy וממטבים את צריכת הגז לפעולות המוניות.
אופטימיזציית גז להיקפי תשלומים גבוהים
השתמשו באורקל מחיר גז ובעסקאות אצווה (batch) דרך relayer. זה מפחית את עלויות העמלה בעד 40%.מה כלול בעבודה
- ביקורת טכנית של החנות הנוכחית שלך (CMS, אחסון, מודולי תשלום)
- בחירת ארכיטקטורה: מתארח או מותאם אישית, on-chain או L2
- פיתוח שער התשלום (WooCommerce, Shopify, מותאם אישית)
- אינטגרציה עם ארנקים (MetaMask, WalletConnect, Ledger)
- הגדרת webhooks וסטטוסי הזמנות
- פיתוח דף תשלום עם קוד QR וטיימר
- אינטגרציה של אורקל שער (Chainlink) או API של בורסה
- בדיקות מלאות ב-testnet
- ביקורת חוזה חכם (Slither, Mythril) — במידת הצורך
- תיעוד והדרכת צוות
- תמיכה לאחר השחרור למשך חודש
בקשו ייעוץ — נחזור אליכם תוך 3 שעות ונראה דוגמה לאינטגרציה דומה לנישה שלכם. הזמינו אינטגרציית פיילוט בדומיין בדיקה — 3 ימים להבטחת תאימות.







