POS cihazı ve mağaza sistemi nasıl bağlanır

IBRESE merkezi bir ödeme şirketi değildir. Kasa veya e-ticaret, kendi merchant-pos servisinizi çalıştırır; müşteri IBRESE Cüzdan ile öder; durum kendi düğümünüzün (veya güvendiğiniz public node’un) GET /payments/:id yanıtından türetilir. Bu sayfa ve yanındaki dosyalar bağlanmak için yeterlidir.

ibrese.com /v1/pos barındırmaz. Cihaz kaydı ve fatura, sizin makinenizdeki servise gider (http://127.0.0.1:8101 veya iç ağ). Public RPC yalnız gözlemdir: https://rpc.ibrese.com. consensusAuthority ve finalityAuthority her zaman false.

Kim ne bağlar

Senaryo Ne yapılır
Fiziksel kasa / Android-Windows POS yazılımı Mağazada merchant-pos çalışır. Cihaz POST /v1/pos/devices ile kaydolur, her satışta fatura açar, QR gösterir. İsterseniz hazır kasa teması: GET /.
E-ticaret, ERP, WooCommerce, özel checkout Shop backend bir “cihaz” gibi kaydolur. Webhook URL sipariş sisteminize aittir. Ödeme sayfasında fatura + QR. payment.finalized gelince siparişi kendi node doğrulamanızdan sonra ödendi işaretlersiniz.
Doğrudan Payment Protocol (POS servisi yok) Kendi kodunuz canonical PaymentRequest + cryptoproject://pay üretir. Durumu GET https://rpc.ibrese.com/payments/{paymentId} ile okursunuz. Webhook zorunlu değildir.

Mimari

POS cihazı veya shop checkout
        │  POST /v1/pos/invoices   (sizin merchant-pos)
        ▼
canonical PaymentRequest + QR + URI
        │  müşteri IBRESE Wallet tarar / açar
        ▼
imzalı transfer  →  ibrese-l1  (data = PAYMENT_BIND)
        │
        ▼
sizin merchant-pos  GET {node}/payments/:id  (gözlem)
        │  HMAC POST
        ▼
sizin webhook URL  (kasa “ödendi” / sipariş paid)
        │  yeniden doğrulayın
        ▼
GET https://rpc.ibrese.com/payments/:id  veya kendi node’unuz

Ağ: networkId=ibrese, chainId=ibrese-l1, varlık NATIVE (IBR). URI şeması: cryptoproject://pay?…

Tutar

Zincir 5 ondalık kullanır. 1 IBR = 100000 alt birim. API amount alanı ondalık string alt birimdir, fiat değildir.

Vitrin Kuruş (2 ondalık) API amount
0,01 IBR 1 "1000"
1,00 IBR 100 "100000"
12,50 IBR 1250 "1250000"

merchantReference sipariş numarasıdır; consensus alanı değildir. Her fatura için benzersiz tutun.

1. merchant-pos’u çalıştırın

POS_MERCHANT_ADDRESS=<64-hex-alıcı-adres> \
POS_NODE_URL=https://rpc.ibrese.com \
POS_NETWORK_ID=ibrese \
POS_CHAIN_ID=ibrese-l1 \
POS_HOST=127.0.0.1 \
POS_PORT=8101 \
npm run pos

POS_MERCHANT_ADDRESS IBR’nin yatacağı hesap. Cihaz kaydında recipient ile kasa bazında değiştirebilirsiniz. Üretim webhook’ları için POS_REQUIRE_HTTPS=1. Kasa arayüzü: http://127.0.0.1:8101/

2. POS cihazını bağlayın

  1. Cihazın ulaşabileceği bir webhook URL’si hazırlayın (aşağıdaki örnek dosyalar).
  2. POST /v1/pos/devices — yanıtta apiKey ve webhookSecret bir kez gelir. Kasada ve sunucuda saklayın.
  3. POST /v1/pos/webhooks/test ile pos.ping doğrulayın.
  4. Satışta POST /v1/pos/invoices + Bearer apiKey. Yanıttaki qrPng (data URL) veya uri müşteriye gösterilir.
  5. Cihaz GET /v1/pos/invoices/:paymentId poll eder veya webhook bekler. Satışı yalnız invoicePaid: true iken kapatın.
curl -s -X POST http://127.0.0.1:8101/v1/pos/devices \
  -H 'content-type: application/json' \
  -d '{"name":"Kasa-1","webhookUrl":"https://magaza.example/ibrese/webhook"}'

Hazır kasa ekranı için tarayıcıyı http://127.0.0.1:8101/ açın — tuş takımı, QR, ödendi. Üçüncü parti POS yazılımı aynı REST’i çağırır; IBRESE’ye doğrudan bağlanmaz.

3. Shop sistemini bağlayın

  1. Checkout backend’i bir cihaz olarak kaydedin; webhook = sipariş endpoint’iniz.
  2. Müşteri ödeye tıklayınca fatura açın; merchantReference=ORDER-{id}.
  3. Sayfada QR (qrPng) ve “cüzdanla aç” (uri) gösterin.
  4. Webhook payment.finalized + invoicePaid true → X-IBRESE-Webhook-Id ile idempotent olun → GET https://rpc.ibrese.com/payments/{paymentId} (veya kendi node) FINALIZED ve MATCH/OVERPAYMENT ise siparişi paid yapın.

WooCommerce iskeleti: woocommerce-ibrese.php.example. Checkout script: shop-checkout.mjs.

HTTP API

Açık API: openapi.json · keşif: discovery.json

Yöntem Yol Auth Açıklama
GET / — Kasa HTML
GET /v1/info — role: merchant-pos
POST /v1/pos/devices — Cihaz; apiKey + webhookSecret bir kez
POST /v1/pos/invoices Bearer Fatura, uri, qr, qrPng
GET /v1/pos/invoices/:paymentId Bearer Durum; node yenilenir; otorite değil
GET /v1/pos/invoices Bearer Bu cihazın faturaları
POST /v1/pos/webhooks/test Bearer pos.ping
POST /v1/pos/poll Bearer Toplu yenileme
GET https://rpc.ibrese.com/payments/:id — Public node gözlemi

Fatura yanıtı (özet): paymentId, amount, recipient, uri, qr, qrPng, paid, lastVerification, authoritative: false.

Webhook

JSON POST. Ham gövdeyi byte-byte kullanın (JSON’u yeniden stringify etmeyin).

X-IBRESE-Webhook-Signature: t=<unix-ms>,v1=<hmac-sha256-hex>
X-IBRESE-Webhook-Event: payment.finalized
X-IBRESE-Webhook-Id: <event-id>

HMAC-SHA256(webhookSecret, "<t>.<raw-body>"). |now − t| > 5 dakika ise reddedin. 2xx dönün. 4xx (429 hariç) yeniden denenmez; 5xx / ağ 5 denemeye kadar (50ms · 2^(n−1)) tekrarlanır.

Olaylar: pos.ping · payment.updated · payment.finalized · payment.expired.

Gövde her zaman authoritative: false, source: "merchant-pos-observer" taşır. Satışı payment.finalized ve invoicePaid: true olmadan kapatmayın.

Settlement politikası

Gözlem invoicePaid policy
Mempool / blok QC’siz false UNFINALIZED
FINALIZED, tutar eksik false UNDERPAYMENT
FINALIZED, tutar eşit true PAID
FINALIZED, fazla true OVERPAYMENT
Aynı paymentId’ye birden fazla finalized tx true MULTIPLE

Durum kodları: REQUESTED, PENDING, INCLUDED, FINALIZED, FAILED, EXPIRED, UNKNOWN.

Güvenlik

Dosyalar

Hepsi statik; PHP örnekleri .example uzantılıdır (sunucuda çalışmaz). Toplu indirme: ibrese-pos-connect.zip

Özet sayfa: /pos.html · soru: info@ibrese.com