שילוב BitPay: קבלת תשלומי קריפטו באמצעות API

שילוב שער תשלומי קריפטו במסחר אלקטרוני הוא יותר מסתם חיבור SDK. אנו נתקלים לעתים קרובות במצבים שבהם לאחר יצירת חשבונית, ה-webhook לא מגיע או שהסטטוסים משוכפלים, ומחלקת הנהלת החשבונות לא יכולה לבצע התאמות. BitPay פותר את הבעיות האלה, אך דורש מקצוענות.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    פיתוח אפליקציית ווב עבור FEEDME
    1308
  • image_websites_belfingroup_462_0.webp
    פיתוח אתר עבור BELFINGROUP
    1003
  • image_ecommerce_furnoro_435_0.webp
    פיתוח חנות מקוונת לחברת FURNORO
    1269
  • image_logo-advance_0.webp
    עיצוב לוגו לחברת B2B Advance
    717
  • image_crm_enviok_479_0.webp
    פיתוח אפליקציית ווב עבור Enviok
    1009

שילוב שער תשלום קריפטו במסחר אלקטרוני הוא יותר מסתם חיבור SDK. לעיתים קרובות אנו נתקלים במצבים שבהם לאחר יצירת חשבונית, ה-webhook לא מגיע או שהסטטוסים מוכפלים, ומחלקת החשבונאות לא מצליחה להתאים נתונים. BitPay פותר את הבעיות האלה, אך דורש טיפול נכון בסטטוסים ו-idempotency.

אנו משלבים את BitPay בעסק שלך: מגדירים קבלת BTC, ETH, USDC, USDT דרך Ethereum, Polygon, Arbitrum, Base. BitPay דואג לתיעוד המשפטי ולהמרת פייט. הצוות שלנו ביצע 25+ אינטגרציות קריפטו. BitPay מהיר פי 3 להקמה מאשר שער מותאם אישית. נבחן את הפרויקט שלך בחינם — צור קשר.

איך זורם תהליך התשלום?

ה-API עובד דרך חשבוניות: השרת שלך יוצר חשבונית ב-BitPay, מקבל URL להפניית המשתמש, BitPay מקבל את התשלום ומודיע ל-webhook שלך. תיעוד מלא זמין ב-BitPay API Reference.

למה אימות ECDSA מורכב יותר ממפתח API?

BitPay חותם על בקשות עם מפתח פרטי במקום טוקן סטטי. זה מאובטח יותר, אך דורש יצירת זוג מפתחות ECDSA ורישום המפתח הציבורי כטוקן.

עבור רוב האינטגרציות, קל יותר להשתמש ב-SDK הרשמי של BitPay (Node.js, PHP, Python, Ruby, Java) — הוא כולל את חתימת הבקשות.

const BitPaySDK = require('bitpay-sdk'); const fs = require('fs'); // Генерация ключей и получение токена (один раз) async function setupBitPay() { const client = new BitPaySDK.Client( null, // конфиг файл BitPaySDK.Env.Prod, // или Env.Test для testnet fs.readFileSync('./private.key', 'utf8') // ECDSA приватный ключ ); // Токен из BitPay Dashboard → API Tokens await client.authorizeClient('your-pairing-code'); return client; } 

יצירת חשבונית

const BitPaySDK = require('bitpay-sdk'); async function createInvoice(orderId, amount, currency = 'USD') { const invoice = new BitPaySDK.Models.Invoice(amount, currency); invoice.orderId = orderId; invoice.notificationUrl = `https://yourapp.com/webhooks/bitpay`; invoice.redirectUrl = `https://yourapp.com/orders/${orderId}/success`; invoice.closeUrl = `https://yourapp.com/orders/${orderId}/cancel`; // Метаданные для reconciliation invoice.buyer = new BitPaySDK.Models.Buyer(); invoice.buyer.email = customerEmail; // Опционально: принимать только конкретную монету // invoice.paymentCurrencies = ['BTC', 'USDC']; const created = await client.createInvoice(invoice); return { invoiceId: created.id, paymentUrl: created.url, // редирект пользователя expirationTime: created.expirationTime }; } 

חשבונית תקפה ל-15 דקות כברירת מחדל — המשתמש חייב לשלם בתוך פרק זמן זה. הסכום בדולרים נקבע לפי שער החליפין של BitPay ברגע יצירת החשבונית.

טיפול ב-Webhook

BitPay שולח IPN (Instant Payment Notification) אל const BitPaySDK = require('bitpay-sdk'); const fs = require('fs'); // Генерация ключей и получение токена (один раз) async function setupBitPay() { const client = new BitPaySDK.Client( null, // конфиг файл BitPaySDK.Env.Prod, // или Env.Test для testnet fs.readFileSync('./private.key', 'utf8') // ECDSA приватный ключ ); // Токен из BitPay Dashboard → API Tokens await client.authorizeClient('your-pairing-code'); return client; } . חשוב לוודא את סטטוס החשבונית דרך ה-API, ולא רק לסמוך על גוף ה-webhook.

const express = require('express'); const router = express.Router(); router.post('/webhooks/bitpay', async (req, res) => { const { id: invoiceId, status } = req.body.data || {}; if (!invoiceId) { return res.status(400).json({ error: 'Missing invoice ID' }); } // ВАЖНО: верифицируем через API, не доверяем телу webhook const invoice = await client.getInvoice(invoiceId); switch (invoice.status) { case 'paid': // Оплачен, но ждём подтверждений (обычно 1-6 блоков) await updateOrderStatus(invoice.orderId, 'paid_unconfirmed'); break; case 'confirmed': // Достаточно подтверждений (обычно 1 для большинства монет) await updateOrderStatus(invoice.orderId, 'confirmed'); break; case 'complete': // Все подтверждения получены, средства зачислены await fulfillOrder(invoice.orderId); break; case 'expired': await updateOrderStatus(invoice.orderId, 'expired'); break; case 'invalid': // Underpayment или другая ошибка await handleInvalidPayment(invoice.orderId, invoice); break; } res.json({ success: true }); }); 
סטטוס תיאור פעולה
const BitPaySDK = require('bitpay-sdk'); async function createInvoice(orderId, amount, currency = 'USD') { const invoice = new BitPaySDK.Models.Invoice(amount, currency); invoice.orderId = orderId; invoice.notificationUrl = `https://yourapp.com/webhooks/bitpay`; invoice.redirectUrl = `https://yourapp.com/orders/${orderId}/success`; invoice.closeUrl = `https://yourapp.com/orders/${orderId}/cancel`; // Метаданные для reconciliation invoice.buyer = new BitPaySDK.Models.Buyer(); invoice.buyer.email = customerEmail; // Опционально: принимать только конкретную монету // invoice.paymentCurrencies = ['BTC', 'USDC']; const created = await client.createInvoice(invoice); return { invoiceId: created.id, paymentUrl: created.url, // редирект пользователя expirationTime: created.expirationTime }; } החשבונית נוצרה, ממתין לתשלום המתן
notificationUrl שולם אך לא אושר הכנס לתור
const express = require('express'); const router = express.Router(); router.post('/webhooks/bitpay', async (req, res) => { const { id: invoiceId, status } = req.body.data || {}; if (!invoiceId) { return res.status(400).json({ error: 'Missing invoice ID' }); } // ВАЖНО: верифицируем через API, не доверяем телу webhook const invoice = await client.getInvoice(invoiceId); switch (invoice.status) { case 'paid': // Оплачен, но ждём подтверждений (обычно 1-6 блоков) await updateOrderStatus(invoice.orderId, 'paid_unconfirmed'); break; case 'confirmed': // Достаточно подтверждений (обычно 1 для большинства монет) await updateOrderStatus(invoice.orderId, 'confirmed'); break; case 'complete': // Все подтверждения получены, средства зачислены await fulfillOrder(invoice.orderId); break; case 'expired': await updateOrderStatus(invoice.orderId, 'expired'); break; case 'invalid': // Underpayment или другая ошибка await handleInvalidPayment(invoice.orderId, invoice); break; } res.json({ success: true }); }); אישורים מינימליים (בדרך כלל 1) זיכוי חלקי
new כל האישורים, הכספים זוכו בצע הזמנה
paid המשתמש לא שילם תוך 15 דקות בטל
confirmed תשלום חלקי או שגיאה החזר

למימוש ההזמנה, השתמש ב-complete או expired בהתאם לרמת הסיכון שלך. invalid הוא הבטוח ביותר אך יש לו עיכוב ארוך יותר.

החזרים

BitPay דורש כתובת החזרה — יש לבקש אותה מהמשתמש בזמן התשלום או בעת ייזום החזר.

async function createRefund(invoiceId, amount, currency) { const refund = new BitPaySDK.Models.Refund(); refund.invoiceId = invoiceId; refund.amount = amount; refund.currency = currency; // валюта возврата const created = await client.createRefund(refund); // BitPay отправит email пользователю с запросом адреса return created; } 

סיכונים המכוסים על ידי BitPay

BitPay מטפל באבטחת העסקאות, מבטיח ללא chargebacks (תשלומים בלתי הפיכים), ומספק דוחות מאושרים לחשבונאות. לפי התיעוד הרשמי, הפלטפורמה אינה דורשת אישור רגולטורי נוסף.

השוואה: BitPay מול שער מותאם אישית

פרמטר BitPay שער מותאם אישית
זמן עד השקה 2–3 ימים 2–4 שבועות
תמיכה משפטית תיעוד מוכן נדרש עורך דין
המרת פייט אוטומטית נדרשת בורסה
אבטחה ECDSA + PCI-certified אחריות מלאה

בעיות אינטגרציה נפוצות

Webhook לא מגיע. BitPay דורש HTTPS עם תעודה תקפה על confirmed. Localhost אינו נגיש — לפיתוח השתמש ב-ngrok או ב-BitPay Testnet עם URL ציבורי.

Webhooks כפולים. BitPay עשוי לשלוח מספר התראות עבור אותו סטטוס (ניסיון חוזר על timeout). השתמש ב-complete כמפתח idempotency: complete.

תשלום חלקי. אם המשתמש משלם פחות, הסטטוס הופך ל-async function createRefund(invoiceId, amount, currency) { const refund = new BitPaySDK.Models.Refund(); refund.invoiceId = invoiceId; refund.amount = amount; refund.currency = currency; // валюта возврата const created = await client.createRefund(refund); // BitPay отправит email пользователю с запросом адреса return created; } . BitPay מחזיר אוטומטית את התשלום החסר אם כתובת האימייל של הקונה זמינה.

אזור זמן ב-expirationTime. השדה מוחזר כחותמת זמן Unix במילישניות. notificationUrl — זכור שזה מילישניות, לא שניות.

בדיקות

BitPay מספק סביבת Testnet (invoiceId) עם ביטקוין לבדיקה. צור חשבונית, שלם עם ארנק testnet — כל התהליך ללא כסף אמיתי. קוד ההתאמה לסביבת הבדיקה נוצר בנפרד בלוח הבקרה.

מה כלול בעבודה

  1. אינטגרציית BitPay SDK (Node.js, PHP, Python, Ruby, Java)
  2. הקמת נקודת webhook עם idempotency
  3. טיפול בסטטוסים ובמקרי קצה (חשבונית שפגה, תשלום חלקי, ניסיון חוזר)
  4. בדיקות Testnet והעלאה לאוויר
  5. תיעוד המימוש שלך
  6. 30 ימי תמיכה לאחר ההשקה

לוח זמנים משוער

2–3 ימים: יום אחד ל-SDK, יום אחד ל-webhook + מכונת מצבים, יום אחד לבדיקות. העלות המדויקת מחושבת באופן אישי לפי מורכבות האינטגרציה. קבל ייעוץ — צור קשר להערכת פרויקט. הזמן אינטגרציית BitPay, ונגדיר קבלת קריפטו תוך 48 שעות.

פרטי בדיקות בלוח הבקרה של BitPay, צור טוקן API נפרד ל-Testnet. לתשלום, השתמש בארנק בדיקה, למשל Bitcoin Testnet ב-Electrum. בדוק את כל הסטטוסים מ-new ועד complete ו-invalid.