GELİŞTİRİCİ DOKÜMANTASYONU

Ödeme API v2

Sunucunuzdan bir ödeme oluşturun, müşteriyi ödeme sayfasına gönderin ve Coino Live ödemeyi ağda onayladığında siparişi ödendi olarak işaretleyin.

Hızlı başlangıç

1. Panelde Geliştiriciler bölümünden ağ geçidiniz için bir API anahtarı oluşturun. 2. Sipariş tutarıyla bir ödeme oluşturun. 3. Müşteriyi dönen checkout_url adresine yönlendirin. 4. Webhook geldiğinde (veya müşteri geri döndüğünde) ödemeyi tekrar okuyun ve durumu "paid" olunca siparişi gönderin.

 curl https://coino.live/api/v2/payments \
  -H "Authorization: Bearer ck_live_..." \
  -H "Idempotency-Key: order-1001" \
  -H "Content-Type: application/json" \
  -d '{"amount": "25.00", "currency": "EUR", "order_id": "1001",
       "success_url": "https://shop.example/thanks",
       "notify_url": "https://shop.example/coino-webhook"}' 

Kimlik doğrulama

Gizli anahtarınızı her isteğin Authorization başlığında gönderin. Anahtarlar tek bir ağ geçidine aittir ve yalnızca o ağ geçidinin ödemelerini görür. Anahtarı sunucunuzda tutun: asla tarayıcıya, uygulamaya veya herkese açık bir depoya koymayın. Anahtar sızarsa panelden iptal edin ve yenisini oluşturun.

Authorization: Bearer ck_live_...
Temel URL: https://coino.live/api/v2

Tüm tutarlar ondalık metindir (sayı değil), tüm zamanlar UTC'de ISO 8601 biçimindedir ve her yanıt, sonucu "data" altında içeren JSON'dur.

POST · /payments

Ödeme oluşturun

Fiyatlar USD veya GET /currencies listesindeki herhangi bir para biriminde olabilir; diğer para birimleri ödeme oluşturulurken güncel kurla USD'ye çevrilir. Müşteri coin ve ağı ödeme sayfasında seçer.

AlanAçıklama
amountZorunlu. En fazla 2 ondalık, örneğin "25.00". En az 1 USD (veya karşılığı) gerekir.
currencyÜç harfli kod; boş bırakılırsa USD.
order_idSipariş numaranız, en fazla 128 karakter. Size gösterilir, GET /payments ile aranabilir.
descriptionÖdeme sayfasında müşteriye gösterilir, en fazla 500 karakter.
customer_emailİsteğe bağlı müşteri e-postası.
success_url, cancel_urlÖdeme sayfasının müşteriyi geri gönderdiği adres. success_url'e dönüş, ödemenin kanıtı değildir.
notify_urlBu ödeme için webhook adresi (yalnızca https). Ağ geçidi ayarlarındaki webhook adresinin yerine geçer.
metadataKendi anahtar/değer verileriniz, en fazla 20 anahtar ve 4 KB. Değiştirilmeden geri döner.
assetCoin seçimini atlamak için GET /assets'ten isteğe bağlı coin kodu (örneğin "usdt-tron").
expires_inMüşterinin ödeme için sahip olduğu dakika, 15 ile 10080 arası. Varsayılan 1440 (bir gün).
Idempotency-Key

Her sipariş denemesi için benzersiz bir anahtar gönderin (en fazla 128 harf, rakam ve -_:.). Aynı anahtarla tekrarlanan istek ikinci bir ödeme oluşturmak yerine aynı ödemeyi döndürür; böylece zaman aşımından veya çift tıklamadan sonra tekrar denemek güvenlidir. Tutar değiştiğinde veya son ödemenin süresi dolduğunda yeni bir anahtar kullanın.

Yanıt (oluşturulduğunda 201, tekrarlanan anahtarda 200) aşağıdaki ödeme nesnesidir.

Ödeme nesnesi

{
  "data": {
    "id": "01m62ewd502p9774d6trd7rhr7",
    "status": "paid",
    "amount": "22.32",
    "currency": "USD",
    "requested_amount": "20.00",
    "requested_currency": "EUR",
    "exchange_rate_usd": "1.115926958947",
    "received_usd": "22.32",
    "remaining_usd": "0.00",
    "order_id": "943",
    "description": "Order #943",
    "customer_email": "[email protected]",
    "metadata": {"cart": "abc"},
    "checkout_url": "https://coino.live/pay/01m62ewd502p9774d6trd7rhr7",
    "success_url": "https://shop.example/thanks",
    "cancel_url": "https://shop.example/cart",
    "asset": null,
    "quote": {
      "asset": "usdc-ethereum", "symbol": "USDC", "network": "Ethereum",
      "address": "0x8e2e…61bc", "amount": "22.330545",
      "network_fee": "0.000001", "rate_usd": "0.9995", "expires_at": "…"
    },
    "deposits": [{
      "asset": "usdc-ethereum", "symbol": "USDC", "network": "Ethereum",
      "tx_hash": "0xf13d…1439", "explorer_url": "https://etherscan.io/tx/0xf13d…1439",
      "amount": "22.330545", "network_fee": "0.000001",
      "platform_fee": "0.223305", "net": "22.107239",
      "usd_value": "22.32", "credited_at": "…"
    }],
    "expires_at": "…", "paid_at": "…", "created_at": "…"
  }
}

amount ve currency müşterinin USD olarak ödediği tutardır; requested_amount ve requested_currency sizin istediğinizdir. quote, müşteriye şu anda gösterilen coin, adres ve tutardır; deposits alınan her işlemi, kesilen ücret ve bakiyenize eklenen tutarla (net) birlikte listeler.

DurumAnlamıNe yapılmalı
openMüşterinin ödemesi bekleniyor.Henüz bir şey yok.
confirmingBir işlem görüldü ve ağ onaylarını bekliyor."Ödeme alındı, onaylanıyor" gösterin. Henüz göndermeyin.
partially_paidTutardan az geldi. Ödeme sayfası kalanı (remaining_usd) istiyor.Bekleyin; müşteri kalanı hâlâ gönderebilir.
paidTamamen ödendi ve onaylandı. Kesin.Siparişi ödendi olarak işaretleyin ve gönderin.
expiredSüre doldu. received_usd sıfırdan büyükse o kısım bakiyenizdedir.Siparişi iptal edin veya ödenen kısmı müşteriyle mahsuplaşın.
cancelledHerhangi bir ödeme gelmeden sizin tarafınızdan iptal edildi. Kesin.Bir şey yok.

Tutara çok yakın bir ödeme ödendi sayılır, böylece cüzdanların yuvarlaması siparişleri açık bırakmaz.

GET · /payments/{id}

Ödemeleri okuma ve iptal etme

Ödemenin güncel durumuna ihtiyaç duyduğunuzda onu tekrar okuyun: webhook'tan sonra, müşteri döndüğünde veya zamanlanmış bir görevden. Bilinmeyen kimlikler ve diğer ağ geçitlerinin ödemeleri 404 döner.

GET · /payments?status=paid&order_id=1001&cursor=…

Ödemelerinizi en yeniden başlayarak, sayfa başına 50 adet listeler. İki filtre de isteğe bağlıdır. meta.next_cursor ve meta.prev_cursor sonuçlar arasında gezinir.

POST · /payments/{id}/cancel

Hiçbir şey almamış açık bir ödemeyi iptal eder, örneğin müşteri sepeti boşalttığında. Para yatırılmış ödemeler iptal edilemez (422).

Webhook'lar

Coino Live, bir ödemenin durumu her değiştiğinde notify_url adresine (veya ağ geçidi webhook adresine) bir POST gönderir. Webhook'lar yalnızca ağ geçidinizin bir imza anahtarı varsa gönderilir: onu ağ geçidi ayarlarında oluşturun.

 POST /coino-webhook
X-Coino-Event: payment.paid
X-Coino-Delivery: 01m62f23xhkz39ahqv4h64ttfk
X-Coino-Signature: t=1761696953,v1=5f2c…

{"id": "01m62f23xhkz39ahqv4h64ttfk", "event": "payment.paid",
 "created_at": "…", "data": { …the payment object… }} 
OlayNe zaman
payment.confirming, payment.partially_paid, payment.paid, payment.expired, payment.cancelledÖdeme bu duruma ulaştı.
custody.deposit.detected, custody.deposit.creditedBir custody kullanıcısının yatırımı görüldü, ardından bakiyeye eklendi.
withdrawal.<status>Bir API çekiminin durumu değişti.

İmzayı doğrulayın: imza anahtarınızla "<t>.<raw body>" için HMAC-SHA256 hesaplayın, sabit sürede v1 ile karşılaştırın ve beş dakikadan eski zaman damgalarını reddedin.

// PHP
$header = $_SERVER['HTTP_X_COINO_SIGNATURE'] ?? '';
$body = file_get_contents('php://input');
parse_str(str_replace(',', '&', $header), $sig);
$ok = isset($sig['t'], $sig['v1'])
    && abs(time() - (int) $sig['t']) <= 300
    && hash_equals(hash_hmac('sha256', $sig['t'] . '.' . $body, $secret), $sig['v1']);

// Node.js
const [t, v1] = header.split(',').map(p => p.split('=')[1]);
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
const ok = Math.abs(Date.now() / 1000 - t) <= 300
  && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));

# Python
t, v1 = (p.split('=', 1)[1] for p in header.split(','))
expected = hmac.new(secret.encode(), f'{t}.{raw_body}'.encode(), 'sha256').hexdigest()
ok = abs(time.time() - int(t)) <= 300 and hmac.compare_digest(expected, v1)
Webhook'u bir tetikleyici olarak görün

Siparişi ödendi olarak işaretlemeden önce ödemeyi GET /payments/{id} ile okuyun ve durumunu, tutarını ve order_id değerinizi kontrol edin. 10 saniye içinde herhangi bir 2xx durumuyla yanıt verin. Başarısız gönderimler 1, 5, 30, 120, 360, 720 ve 1440 dakika sonra tekrarlanır; yönlendirmeler izlenmez. Aynı olay birden fazla gelebilir, bu yüzden tekrarlara dayanıklı işleyin.

Para birimleri, coinler ve bakiyeler

GET · /currencies

Bir ödemenin fiyatlandırılabileceği para birimleri, her biri USD değeriyle: {"code": "EUR", "usd_per_unit": "1.09"}. Mağaza para biriminiz listede yoksa kripto ödemeyi gizleyin.

GET · /assets

Müşterilerin şu anda ödeme yapabileceği coinler: code (örneğin "usdt-tron"), symbol, name, network, decimals ve price_usd.

GET · /balances

Ücretler düşüldükten sonra coin başına hesap bakiyeniz: asset, symbol, network, balance ve usd_value (fiyat yokken null).

Custody hesapları

Kullanıcı hesapları olan uygulamalar için: her kullanıcı kalıcı yatırma adresleri alır ve yatırımlar o kullanıcının ağ geçidinizdeki bakiyesine eklenir.

İstekAçıklama
POST /custody/usersKullanıcı oluşturun (external_id zorunlu; name, email, metadata isteğe bağlı). Aynı external_id mevcut kullanıcıyı döndürür.
GET /custody/users?external_id=…Kullanıcıları listeleyin, sayfa başına 50.
GET /custody/users/{id}Adresler (her birinin kabul ettiği coinlerle) ve bakiyeler.
GET /custody/users/{id}/depositsBakiyeye eklenen yatırımlar, en yeniden başlayarak, next_cursor ile.
POST /custody/users/{id}/transfersBir kullanıcının tek bir varlıktaki bakiyesini ana bakiyenize taşır (amount verilmezse tamamını). İsteğe bağlı reference, isteği güvenle tekrarlamanızı sağlar.
Saklama (custody) kılavuzunu okuyun
POST · /withdrawals

Para çekme

Bakiyenizden bir adrese ödeme yapar: asset, amount ve address zorunludur; custody_user bir saklama kullanıcısının bakiyesinden düşer; reference (ağ geçidi başına benzersiz) isteği güvenle tekrarlamanızı sağlar. Varsayılan olarak kapalıdır: API ile para çekmeyi ağ geçidi ayarlarından açın; orada günlük USD sınırını ve çağırmasına izin verilen sunucu IP adreslerini de belirlersiniz (her iki uç nokta yalnızca bu IP'lere yanıt verir). Farklı bir çekim için yeniden kullanılan reference 409 ile reddedilir. Büyük çekimler incelemeyi bekleyebilir.

GET · /withdrawals/{id}

Durum: pending_review, approved, processing, broadcast, completed, rejected (error'a bakın), cancelled veya failed. Gönderildiğinde tx_hash dolar.

Hatalar ve sınırlar

HTTPAnlamı
401Anahtar eksik, yanlış veya iptal edilmiş ya da ağ geçidi askıya alınmış.
404Bulunamadı (veya başka bir ağ geçidine ait).
422İstek reddedildi: "message" nedenini söyler, "errors" alanları adlandırır.
429Çok fazla istek: anahtar başına dakikada 120. Bekleyin ve tekrar deneyin.
5xxBizim tarafımızda geçici bir sorun. Aynı Idempotency-Key ile tekrar deneyin.
{"message": "The minimum payment is 1.00 USD."}

{"message": "amount must be a decimal string with at most 2 decimals, e.g. \"25.00\".",
 "errors": {"amount": ["amount must be a decimal string with at most 2 decimals, e.g. \"25.00\"."]}}

Kod kütüphaneleri

Bu API için resmi kütüphaneler, hiçbir bağımlılık olmadan. Webhook imzalarını doğrular, her ret için anlaşılır bir hata verir ve ağ hatalarını yalnızca isteği tekrarlamak güvenliyse yeniden dener.

DilSürümGereksinimler
PHP1.0.0PHP 8.1+ with cURLİndir
Node.js1.0.0Node.js 18+, TypeScript types includedİndir
Python1.0.0Python 3.8+İndir
// PHP
$coino = new \CoinoLive\Client('ck_live_...');
$payment = $coino->payments->create(['amount' => '25.00', 'currency' => 'EUR', 'order_id' => '1001']);

// Node.js
const coino = new CoinoLive('ck_live_...');
const payment = await coino.payments.create({ amount: '25.00', currency: 'EUR', order_id: '1001' });

# Python
coino = coinolive.Client("ck_live_...")
payment = coino.payments.create(amount="25.00", currency="EUR", order_id="1001") 

Her indirmede tüm çağrıları, webhook işlemeyi ve hata sınıflarını anlatan bir README bulunur.

Platform entegrasyonları

Bu API üzerine kurulu hazır eklentiler. Birini kurun, bir API anahtarı yapıştırın ve etkinleştirin: siparişler otomatik güncellenir ve her eklenti bakiyenizi ve ödemelerinizi kendi yönetim panelinde gösterir.

PlatformSürümGereksinimler
WooCommerce1.1.0WordPress 6.2+, WooCommerce 7.6+, PHP 7.4+İndir
WHMCS1.0.0WHMCS 8.0+, PHP 7.4+İndir
OpenCart 41.0.0OpenCart 4.0.2+, PHP 8.0+İndir
Shopware 61.0.0Shopware 6.6.5+ or 6.7, PHP 8.2+İndir
PrestaShop1.0.0PrestaShop 8.0+ or 9, PHP 7.2+İndir
Easy Digital Downloads1.0.0Easy Digital Downloads 3, WordPress 6.7+, PHP 8.0+İndir
GiveWP1.0.0GiveWP 3+, WordPress 6.6+, PHP 7.4+İndir

Diğer platformlar: API'yi yukarıda anlatıldığı gibi doğrudan kullanın.