Skip to content

Basic Usage Examples

This guide provides practical examples of how to integrate with the Crypto Payment Gateway API for common use cases.

Getting Started

Authentication Setup

First, obtain your API key from the dashboard and set up authentication:

javascript
const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://api.your-gateway.com/api/v1';

const headers = {
  'X-Api-Key': apiKey,
  'Content-Type': 'application/json'
};

Basic Payment Flow

1. Create a Deposit Address

Generate a unique address for receiving payments:

javascript
// Create address for USDT on Ethereum
async function createDepositAddress(customerID) {
  const response = await fetch(`${BASE_URL}/addresses`, {
    method: 'POST',
    headers,
    body: JSON.stringify({
      network: 'ethereum',
      coin: 'usdt',
      label: `Customer ${customerID}`,
      metadata: {
        customer_id: customerID,
        purpose: 'deposit'
      }
    })
  });
  
  const result = await response.json();
  return result.data;
}

// Usage
const address = await createDepositAddress('cust_123');
console.log('Deposit address:', address.address);

2. Monitor Address Balance

Check the balance of a specific address:

javascript
async function getAddressBalance(addressId) {
  const response = await fetch(`${BASE_URL}/addresses/${addressId}/balances`, {
    method: 'GET',
    headers
  });
  
  const result = await response.json();
  return result.data;
}

// Usage
const balances = await getAddressBalance(address.id);
balances.forEach(balance => {
  console.log(`${balance.coin}: ${balance.available}`);
});

3. List Transactions

Retrieve transaction history for an address:

javascript
async function getTransactions(addressId, options = {}) {
  const params = new URLSearchParams({
    address_id: addressId,
    page: options.page || 1,
    limit: options.limit || 20,
    ...options
  });
  
  const response = await fetch(`${BASE_URL}/transactions?${params}`, {
    method: 'GET',
    headers
  });
  
  const result = await response.json();
  return result.data;
}

// Usage
const transactions = await getTransactions(address.id, {
  status: 'confirmed',
  coin: 'usdt'
});

Payment Processing Examples

E-commerce Integration

Complete example for an e-commerce payment flow:

javascript
class CryptoPaymentProcessor {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseURL = 'https://api.your-gateway.com/api/v1';
    this.headers = {
      'X-Api-Key': apiKey,
      'Content-Type': 'application/json'
    };
  }

  // Create payment request
  async createPayment(orderData) {
    const { orderId, amount, currency, customerEmail } = orderData;
    
    // Create deposit address
    const address = await this.createAddress({
      network: this.getNetworkForCurrency(currency),
      coin: currency.toLowerCase(),
      label: `Order ${orderId}`,
      metadata: {
        order_id: orderId,
        customer_email: customerEmail,
        amount_expected: amount
      }
    });

    return {
      paymentId: address.id,
      address: address.address,
      amount,
      currency,
      qrCode: this.generateQRCode(address.address, amount, currency)
    };
  }

  // Check payment status
  async checkPaymentStatus(paymentId) {
    const balances = await this.getAddressBalance(paymentId);
    const transactions = await this.getTransactions(paymentId);
    
    const confirmedBalance = balances.find(b => b.coin === 'usdt')?.confirmed || '0';
    const latestTx = transactions[0];
    
    return {
      status: this.determinePaymentStatus(confirmedBalance, latestTx),
      received: confirmedBalance,
      transactions: transactions.map(tx => ({
        hash: tx.hash,
        amount: tx.amount,
        confirmations: tx.confirmations,
        timestamp: tx.created_at
      }))
    };
  }

  // Helper methods
  async createAddress(data) {
    const response = await fetch(`${this.baseURL}/addresses`, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify(data)
    });
    return (await response.json()).data;
  }

  async getAddressBalance(addressId) {
    const response = await fetch(`${this.baseURL}/addresses/${addressId}/balances`, {
      headers: this.headers
    });
    return (await response.json()).data;
  }

  async getTransactions(addressId) {
    const response = await fetch(`${this.baseURL}/transactions?address_id=${addressId}`, {
      headers: this.headers
    });
    return (await response.json()).data;
  }

  getNetworkForCurrency(currency) {
    const networkMap = {
      'USDT': 'ethereum',
      'USDC': 'ethereum',
      'ETH': 'ethereum',
      'BTC': 'bitcoin',
      'TRX': 'tron'
    };
    return networkMap[currency.toUpperCase()] || 'ethereum';
  }

  generateQRCode(address, amount, currency) {
    // Generate payment URI for QR code
    return `${currency.toLowerCase()}:${address}?amount=${amount}`;
  }

  determinePaymentStatus(balance, latestTx) {
    if (parseFloat(balance) === 0) return 'pending';
    if (latestTx && latestTx.confirmations >= 12) return 'confirmed';
    return 'unconfirmed';
  }
}

// Usage example
const processor = new CryptoPaymentProcessor('your_api_key');

// Create payment
const payment = await processor.createPayment({
  orderId: 'ORD-123',
  amount: '100.00',
  currency: 'USDT',
  customerEmail: 'customer@example.com'
});

console.log('Payment created:', payment);

// Check status periodically
setInterval(async () => {
  const status = await processor.checkPaymentStatus(payment.paymentId);
  console.log('Payment status:', status);
  
  if (status.status === 'confirmed') {
    console.log('Payment confirmed! Processing order...');
    // Process the order
  }
}, 30000); // Check every 30 seconds

Subscription Service Integration

Example for recurring payments or subscription services:

javascript
class SubscriptionManager {
  constructor(apiKey) {
    this.processor = new CryptoPaymentProcessor(apiKey);
    this.subscriptions = new Map();
  }

  async createSubscription(subscriptionData) {
    const { customerId, planId, amount, currency, interval } = subscriptionData;
    
    // Create dedicated address for subscription
    const address = await this.processor.createAddress({
      network: this.processor.getNetworkForCurrency(currency),
      coin: currency.toLowerCase(),
      label: `Subscription ${customerId}-${planId}`,
      metadata: {
        customer_id: customerId,
        plan_id: planId,
        subscription_amount: amount,
        billing_interval: interval
      }
    });

    const subscription = {
      id: address.id,
      customerId,
      planId,
      address: address.address,
      amount,
      currency,
      interval,
      status: 'active',
      nextBilling: this.calculateNextBilling(interval),
      totalPaid: '0'
    };

    this.subscriptions.set(address.id, subscription);
    return subscription;
  }

  async processSubscriptionPayments() {
    for (const [subId, subscription] of this.subscriptions) {
      if (subscription.status !== 'active') continue;

      const status = await this.processor.checkPaymentStatus(subId);
      const newPayments = this.getNewPayments(subscription, status.transactions);

      if (newPayments.length > 0) {
        await this.processNewPayments(subscription, newPayments);
      }

      // Check if subscription needs renewal
      if (Date.now() > subscription.nextBilling) {
        await this.handleSubscriptionRenewal(subscription);
      }
    }
  }

  getNewPayments(subscription, transactions) {
    // Filter transactions that haven't been processed yet
    return transactions.filter(tx => 
      tx.confirmations >= 12 && 
      !subscription.processedTxs?.includes(tx.hash)
    );
  }

  async processNewPayments(subscription, payments) {
    let totalReceived = 0;
    
    for (const payment of payments) {
      totalReceived += parseFloat(payment.amount);
      
      // Mark transaction as processed
      if (!subscription.processedTxs) subscription.processedTxs = [];
      subscription.processedTxs.push(payment.hash);
    }

    subscription.totalPaid = (parseFloat(subscription.totalPaid) + totalReceived).toString();
    
    // Extend subscription based on payments received
    const periodsExtended = Math.floor(totalReceived / parseFloat(subscription.amount));
    if (periodsExtended > 0) {
      subscription.nextBilling = this.extendBilling(subscription.nextBilling, 
                                                   subscription.interval, 
                                                   periodsExtended);
      
      console.log(`Subscription ${subscription.id} extended by ${periodsExtended} periods`);
    }
  }

  calculateNextBilling(interval) {
    const now = new Date();
    switch (interval) {
      case 'monthly':
        return new Date(now.setMonth(now.getMonth() + 1)).getTime();
      case 'yearly':
        return new Date(now.setFullYear(now.getFullYear() + 1)).getTime();
      default:
        return Date.now() + (30 * 24 * 60 * 60 * 1000); // 30 days
    }
  }

  extendBilling(currentBilling, interval, periods) {
    const date = new Date(currentBilling);
    switch (interval) {
      case 'monthly':
        return new Date(date.setMonth(date.getMonth() + periods)).getTime();
      case 'yearly':
        return new Date(date.setFullYear(date.getFullYear() + periods)).getTime();
      default:
        return currentBilling + (periods * 30 * 24 * 60 * 60 * 1000);
    }
  }
}

Withdrawal Examples

Basic Withdrawal

Send cryptocurrency to external addresses:

javascript
async function createWithdrawal(withdrawalData) {
  const { toAddress, amount, coin, network } = withdrawalData;
  
  const response = await fetch(`${BASE_URL}/withdrawals`, {
    method: 'POST',
    headers,
    body: JSON.stringify({
      to_address: toAddress,
      amount: amount,
      coin: coin,
      network: network,
      metadata: {
        purpose: 'user_withdrawal',
        requested_at: new Date().toISOString()
      }
    })
  });
  
  const result = await response.json();
  return result.data;
}

// Usage
const withdrawal = await createWithdrawal({
  toAddress: '0x742d35Cc6634C0532925a3b8D4C9db4C4C4b4C4C',
  amount: '50.00',
  coin: 'usdt',
  network: 'ethereum'
});

console.log('Withdrawal created:', withdrawal.id);

Batch Withdrawals

Process multiple withdrawals efficiently:

javascript
async function processBatchWithdrawals(withdrawals) {
  const results = [];
  
  for (const withdrawal of withdrawals) {
    try {
      const result = await createWithdrawal(withdrawal);
      results.push({ success: true, data: result });
    } catch (error) {
      results.push({ success: false, error: error.message, data: withdrawal });
    }
    
    // Rate limiting - wait between requests
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
  
  return results;
}

// Usage
const withdrawalBatch = [
  { toAddress: '0x123...', amount: '10.00', coin: 'usdt', network: 'ethereum' },
  { toAddress: '0x456...', amount: '25.50', coin: 'usdt', network: 'ethereum' },
  { toAddress: '0x789...', amount: '5.75', coin: 'usdt', network: 'ethereum' }
];

const results = await processBatchWithdrawals(withdrawalBatch);
console.log('Batch results:', results);

Webhook Integration

Setting Up Webhooks

Configure webhooks to receive real-time notifications:

javascript
// Webhook endpoint handler (Express.js example)
const express = require('express');
const crypto = require('crypto');

const app = express();
app.use(express.json());

// Webhook secret for verification
const WEBHOOK_SECRET = 'your_webhook_secret';

app.post('/webhooks/crypto', (req, res) => {
  // Verify webhook signature
  const signature = req.headers['x-signature'];
  const payload = JSON.stringify(req.body);
  const expectedSignature = crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(payload)
    .digest('hex');
  
  if (signature !== expectedSignature) {
    return res.status(401).send('Invalid signature');
  }
  
  // Process webhook event
  const { event, data } = req.body;
  
  switch (event) {
    case 'transaction.confirmed':
      handleTransactionConfirmed(data);
      break;
    case 'withdrawal.completed':
      handleWithdrawalCompleted(data);
      break;
    case 'balance.updated':
      handleBalanceUpdated(data);
      break;
    default:
      console.log('Unknown event:', event);
  }
  
  res.status(200).send('OK');
});

function handleTransactionConfirmed(transaction) {
  console.log('Transaction confirmed:', transaction.hash);
  
  // Update order status, send confirmation email, etc.
  updateOrderStatus(transaction.metadata?.order_id, 'paid');
}

function handleWithdrawalCompleted(withdrawal) {
  console.log('Withdrawal completed:', withdrawal.id);
  
  // Notify user, update balance, etc.
  notifyUser(withdrawal.metadata?.user_id, 'withdrawal_completed', withdrawal);
}

function handleBalanceUpdated(balance) {
  console.log('Balance updated:', balance);
  
  // Update internal records, trigger alerts, etc.
  updateInternalBalance(balance.address_id, balance.coin, balance.available);
}

Error Handling

Robust Error Handling

Implement proper error handling for production use:

javascript
class APIError extends Error {
  constructor(message, code, details) {
    super(message);
    this.code = code;
    this.details = details;
  }
}

async function makeAPIRequest(endpoint, options = {}) {
  const maxRetries = 3;
  let retries = 0;
  
  while (retries < maxRetries) {
    try {
      const response = await fetch(`${BASE_URL}${endpoint}`, {
        headers,
        ...options
      });
      
      const result = await response.json();
      
      if (!response.ok) {
        throw new APIError(
          result.error?.message || 'API request failed',
          result.error?.code || 'UNKNOWN_ERROR',
          result.error?.details
        );
      }
      
      return result.data;
    } catch (error) {
      retries++;
      
      if (retries >= maxRetries) {
        throw error;
      }
      
      // Exponential backoff
      const delay = Math.pow(2, retries) * 1000;
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
}

// Usage with error handling
async function safeCreateAddress(addressData) {
  try {
    return await makeAPIRequest('/addresses', {
      method: 'POST',
      body: JSON.stringify(addressData)
    });
  } catch (error) {
    if (error instanceof APIError) {
      console.error(`API Error [${error.code}]: ${error.message}`);
      if (error.details) {
        console.error('Details:', error.details);
      }
    } else {
      console.error('Network or other error:', error.message);
    }
    throw error;
  }
}

Testing

Unit Tests Example

javascript
const { describe, it, expect, beforeEach } = require('@jest/globals');

describe('CryptoPaymentProcessor', () => {
  let processor;
  
  beforeEach(() => {
    processor = new CryptoPaymentProcessor('test_api_key');
  });
  
  it('should create payment successfully', async () => {
    const orderData = {
      orderId: 'TEST-123',
      amount: '100.00',
      currency: 'USDT',
      customerEmail: 'test@example.com'
    };
    
    const payment = await processor.createPayment(orderData);
    
    expect(payment).toHaveProperty('paymentId');
    expect(payment).toHaveProperty('address');
    expect(payment.amount).toBe('100.00');
    expect(payment.currency).toBe('USDT');
  });
  
  it('should handle API errors gracefully', async () => {
    // Mock API to return error
    global.fetch = jest.fn().mockResolvedValue({
      ok: false,
      json: () => Promise.resolve({
        error: { code: 'INVALID_NETWORK', message: 'Network not supported' }
      })
    });
    
    await expect(processor.createPayment({
      orderId: 'TEST-123',
      amount: '100.00',
      currency: 'INVALID',
      customerEmail: 'test@example.com'
    })).rejects.toThrow('Network not supported');
  });
});

These examples provide a solid foundation for integrating with the Crypto Payment Gateway. Remember to always test thoroughly in a sandbox environment before deploying to production.

Released under the MIT License.