Skip to content

集成指南

本指南将帮助您将 Crypton Studio 支付网关集成到您的应用程序中。

集成流程概览

'''mermaid graph TD A[注册商户账户] --> B[获取 API 密钥] B --> C[选择集成方式] C --> D[SDK 集成] C --> E[直接 API 调用] D --> F[测试集成] E --> F F --> G[配置 Webhook] G --> H[上线部署] '''

第一步:环境准备

1. 注册账户

2. 获取 API 密钥

  • 在控制台生成测试环境密钥
  • 保存 Client Key 和 Admin Key
  • 配置 IP 白名单(推荐)

3. 选择开发环境

第二步:选择集成方式

方式一:使用 SDK(推荐)

我们提供多种语言的官方 SDK:

'''bash [Node.js] npm install @crypton/payment-sdk '''

'''bash [Python] pip install crypton-payment-sdk '''

'''bash [Go] go get github.com/crypton-studio/payment-sdk-go '''

'''bash [PHP] composer require crypton/payment-sdk '''

方式二:直接 API 调用

如果您的语言没有官方 SDK,可以直接调用 REST API。

第三步:基础集成

JavaScript/TypeScript 示例

'''javascript import { CryptonClient } from '@crypton/payment-sdk'

// 初始化客户端 const client = new CryptonClient({ apiKey: 'ck_test_your_key_here', environment: 'sandbox' })

// 创建支付地址 async function createPaymentAddress(amount, currency) { try { const address = await client.addresses.create({ network: 'ethereum', coin: currency, label: 'Payment for order ' + orderId + '', metadata: { orderId: orderId, amount: amount, currency: currency } })

return {
  address: address.address,
  qrCode: address.qrCode,
  id: address.id
}

} catch (error) { console.error('创建地址失败:', error) throw error } }

// 检查支付状态 async function checkPaymentStatus(addressId) { try { const transactions = await client.addresses.getTransactions(addressId)

for (const tx of transactions) {
  if (tx.status === 'confirmed') {
    return {
      status: 'paid',
      amount: tx.amount,
      hash: tx.hash,
      confirmations: tx.confirmations
    }
  }
}

return { status: 'pending' }

} catch (error) { console.error('检查支付状态失败:', error) throw error } } '''

Python 示例

'''python from crypton_sdk import CryptonClient import asyncio

初始化客户端

client = CryptonClient( api_key='ck_test_your_key_here', environment='sandbox' )

async def create_payment_address(amount, currency, order_id): """创建支付地址""" try: address = await client.addresses.create({ 'network': 'ethereum', 'coin': currency, 'label': f'Payment for order {order_id}', 'metadata': { 'order_id': order_id, 'amount': amount, 'currency': currency } })

    return {
        'address': address.address,
        'qr_code': address.qr_code,
        'id': address.id
    }
except Exception as error:
    print(f'创建地址失败: {error}')
    raise

async def check_payment_status(address_id): """检查支付状态""" try: transactions = await client.addresses.get_transactions(address_id)

    for tx in transactions:
        if tx.status == 'confirmed':
            return {
                'status': 'paid',
                'amount': tx.amount,
                'hash': tx.hash,
                'confirmations': tx.confirmations
            }
    
    return {'status': 'pending'}
except Exception as error:
    print(f'检查支付状态失败: {error}')
    raise

'''

Go 示例

'''go package main

import ( "context" "fmt" "log"

"github.com/crypton-studio/payment-sdk-go"

)

func main() { // 初始化客户端 client := crypton.NewClient(&crypton.Config{ APIKey: "ck_test_your_key_here", Environment: "sandbox", })

// 创建支付地址
address, err := createPaymentAddress(client, "100.00", "USDT", "order_123")
if err != nil {
    log.Fatal(err)
}

fmt.Printf("支付地址: %s\n", address.Address)
fmt.Printf("二维码: %s\n", address.QRCode)

}

func createPaymentAddress(client *crypton.Client, amount, currency, orderID string) (*crypton.Address, error) { ctx := context.Background()

req := &crypton.CreateAddressRequest{
    Network: "ethereum",
    Coin:    currency,
    Label:   fmt.Sprintf("Payment for order %s", orderID),
    Metadata: map[string]interface{}{
        "order_id": orderID,
        "amount":   amount,
        "currency": currency,
    },
}

return client.Addresses.Create(ctx, req)

}

func checkPaymentStatus(client *crypton.Client, addressID string) (*PaymentStatus, error) { ctx := context.Background()

transactions, err := client.Addresses.GetTransactions(ctx, addressID)
if err != nil {
    return nil, err
}

for _, tx := range transactions {
    if tx.Status == "confirmed" {
        return &PaymentStatus{
            Status:        "paid",
            Amount:        tx.Amount,
            Hash:          tx.Hash,
            Confirmations: tx.Confirmations,
        }, nil
    }
}

return &PaymentStatus{Status: "pending"}, nil

}

type PaymentStatus struct { Status string 'json:"status"' Amount string 'json:"amount,omitempty"' Hash string 'json:"hash,omitempty"' Confirmations int 'json:"confirmations,omitempty"' } '''

第四步:配置 Webhook

Webhook 允许您实时接收支付状态更新:

1. 创建 Webhook 端点

'''javascript [Express.js] const express = require('express') const crypto = require('crypto')

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

app.post('/webhook', (req, res) => { // 验证签名 const signature = req.headers['x-crypton-signature'] const payload = JSON.stringify(req.body)

if (!verifySignature(payload, signature, process.env.WEBHOOK_SECRET)) { return res.status(401).send('Invalid signature') }

// 处理事件 const { event, data } = req.body

switch (event) { case 'transaction.confirmed': handlePaymentConfirmed(data) break case 'transaction.failed': handlePaymentFailed(data) break default: console.log('未知事件:', event) }

res.status(200).send('OK') })

function verifySignature(payload, signature, secret) { const expectedSignature = crypto .createHmac('sha256', secret) .update(payload) .digest('hex')

return 'sha256=' + expectedSignature + '' === signature }

function handlePaymentConfirmed(data) { console.log('支付确认:', data) // 更新订单状态 // 发送确认邮件 // 处理业务逻辑 }

app.listen(3000) '''

'''python [Flask] from flask import Flask, request, jsonify import hmac import hashlib import json

app = Flask(name)

@app.route('/webhook', methods=['POST']) def webhook(): # 验证签名 signature = request.headers.get('X-Crypton-Signature') payload = request.get_data()

if not verify_signature(payload, signature, WEBHOOK_SECRET):
    return jsonify({'error': 'Invalid signature'}), 401

# 处理事件
data = request.get_json()
event = data['event']
event_data = data['data']

if event == 'transaction.confirmed':
    handle_payment_confirmed(event_data)
elif event == 'transaction.failed':
    handle_payment_failed(event_data)
else:
    print(f'未知事件: {event}')

return jsonify({'status': 'ok'})

def verify_signature(payload, signature, secret): expected_signature = hmac.new( secret.encode('utf-8'), payload, hashlib.sha256 ).hexdigest()

return f'sha256={expected_signature}' == signature

def handle_payment_confirmed(data): print(f'支付确认: {data}') # 更新订单状态 # 发送确认邮件 # 处理业务逻辑

if name == 'main': app.run(port=3000) '''

2. 注册 Webhook

'''bash curl -X POST "https://api-sandbox.crypton.studio/v1/webhooks"
-H "X-Api-Key: ak_test_your_admin_key"
-H "Content-Type: application/json"
-d '{ "url": "https://your-domain.com/webhook", "events": [ "transaction.confirmed", "transaction.failed", "withdrawal.completed" ] }' '''

第五步:错误处理

常见错误处理

'''javascript async function handleApiCall(apiCall) { try { return await apiCall() } catch (error) { switch (error.code) { case 'INSUFFICIENT_BALANCE': // 余额不足 throw new Error('账户余额不足,请充值后重试')

  case 'INVALID_ADDRESS':
    // 地址无效
    throw new Error('提现地址格式不正确')
  
  case 'NETWORK_CONGESTION':
    // 网络拥堵
    throw new Error('网络繁忙,请稍后重试')
  
  case 'RATE_LIMIT_EXCEEDED':
    // 频率限制
    await sleep(60000) // 等待 1 分钟
    return handleApiCall(apiCall) // 重试
  
  default:
    console.error('API 调用失败:', error)
    throw error
}

} }

function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)) } '''

重试机制

'''javascript async function retryApiCall(apiCall, maxRetries = 3, delay = 1000) { for (let i = 0; i < maxRetries; i++) { try { return await apiCall() } catch (error) { if (i === maxRetries - 1) throw error

  // 指数退避
  await sleep(delay * Math.pow(2, i))
}

} } '''

第六步:测试

单元测试示例

'''javascript const { CryptonClient } = require('@crypton/payment-sdk')

describe('Crypton Payment Integration', () => { let client

beforeEach(() => { client = new CryptonClient({ apiKey: 'ck_test_mock_key', environment: 'sandbox' }) })

test('should create payment address', async () => { const address = await client.addresses.create({ network: 'ethereum', coin: 'USDT', label: 'Test payment' })

expect(address).toHaveProperty('address')
expect(address).toHaveProperty('qrCode')
expect(address.network).toBe('ethereum')

})

test('should handle payment confirmation', async () => { const mockTransaction = { status: 'confirmed', amount: '100.000000', hash: '0x123...' }

const result = await handlePaymentConfirmed(mockTransaction)
expect(result.status).toBe('processed')

}) }) '''

第七步:上线部署

生产环境检查清单

  • [ ] 使用生产环境 API 密钥
  • [ ] 配置 HTTPS
  • [ ] 设置 IP 白名单
  • [ ] 配置监控和日志
  • [ ] 测试 Webhook 端点
  • [ ] 设置错误告警
  • [ ] 准备客服支持

环境变量配置

'''bash

生产环境配置

CRYPTON_API_KEY=ck_live_your_production_key CRYPTON_ADMIN_KEY=ak_live_your_admin_key CRYPTON_ENVIRONMENT=production WEBHOOK_SECRET=your_webhook_secret '''

最佳实践

1. 安全性

  • 使用 HTTPS
  • 验证 Webhook 签名
  • 定期轮换 API 密钥
  • 实施 IP 白名单

2. 性能优化

  • 使用连接池
  • 实施缓存策略
  • 异步处理 Webhook
  • 监控 API 调用频率

3. 错误处理

  • 实施重试机制
  • 记录详细日志
  • 设置告警通知
  • 准备降级方案

4. 监控

  • 监控支付成功率
  • 跟踪 API 响应时间
  • 监控余额变化
  • 设置异常告警

技术支持

如果您在集成过程中遇到问题:

  • 文档: 查看详细的 API 文档
  • 示例: 参考 GitHub 上的示例项目
  • 支持: 联系技术支持团队
  • 社区: 加入开发者社区

准备好开始集成了吗?查看 API 文档 获取详细信息。

Released under the MIT License.