যা পেতে পারো
নেটিভ XTZ-এর জন্য TzKT বা সামঞ্জস্যপূর্ণ Octez উৎসের প্রয়োগ করা অপারেশন লাগে। ব্যর্থ অপারেশন ইনভয়েস পেমেন্ট করে না। FA1.2 আর FA2 টোকেন গৃহীত ইনভয়েস অ্যাসেট নয়।
Store সেট করো
- Wholly Crypto install করে project/store বানাও, private wallet backup রাখো।
- Scanner-compatible connection দেখে Store → Payment methods-এ chain আর intended asset চালু করো।
- Confirmation/expiry সেট করো। ছোট invoice পরীক্ষা করে order fulfil-এর আগে settlement verify করো।
Payment কোথায় আসে
Invoice আলাদা receiving address নেয়। Full backup, address list/derivation detail রাখো; imported wallet সব invoice address সঙ্গে সঙ্গে নাও খুঁজে পেতে পারে।
অর্থ গ্রহণের গাইডপ্রস্তুত হলে fund সরাও
ম্যানুয়াল সেন্ড আর অটো সুইপ নেটিভ কয়েন সমর্থন করে। ফি আর নেটওয়ার্কের রিজার্ভ বা স্টোরেজ চাহিদার জন্য যথেষ্ট রাখো। শুধু গ্রহণ সমর্থিত হলেই সেবাদাতা ট্রান্সফার জমা দিতে পারে প্রমাণ হয় না।
Automatic sweep tutorialPayment সমস্যা সমাধান
আগে এই network দেখো
শুধু প্রয়োগ করা নেটিভ XTZ ট্রান্সফার গণনা হয়। ব্যর্থ অপারেশন আর FA1.2/FA2 টোকেনে ইনভয়েস পেইড হয় না। পাঠাতে সামঞ্জস্যপূর্ণ যাচাই করা প্রোটোকল লাগে।
Payment missing বা delayed
Network, address, asset আর required reference invoice-এর সঙ্গে মিলাও। Scanner readiness/confirmation progress দেখো। প্রথম transaction না দেখে দ্বিতীয় payment চেয়ো না।
অর্থ গ্রহণের গাইডWallet restore বা একত্র করো
Private backup/derivation detail রাখো। অন্য wallet app সব receiving address নাও দেখাতে পারে। Sending/recovery chain আর wallet format-এর ওপর নির্ভর করে; শুধু recovery word import-এ কোনোটি নিশ্চিত নয়।
ব্যাকআপ ও পুনরুদ্ধারFee আর verification
Default processing fee invoice fiat value-এর 1%, separate credit থেকে। তোমার assigned rate প্রযোজ্য। Network fee/server cost আলাদা।
Public provider outage/rate limit হতে পারে। Submitted transaction বা return redirect payment-এর প্রমাণ নয়। Verified invoice status আর signed notification নাও।
প্রসেসিং ক্রেডিট API, IPN ও ওয়েবহুকরেট ক্যালকুলেটর
একটি পরিমাণ রূপান্তর করো
এটি আনুমানিক হিসাব, পেমেন্ট কোট নয়। নেটওয়ার্ক ফি, এক্সচেঞ্জ ফি ও মার্চেন্টের স্প্রেড ধরা নেই।
রেট কোথা থেকে আসে?
ক্রিপ্টোর অনুমানে ক্যাশ করা পাবলিক Kraken দাম ব্যবহৃত হয়, যেখানে আছে সেখানে Binance-ও। কিছু Binance দামে USD-এর রেফারেন্স হিসেবে USDT ব্যবহৃত হয়। প্রচলিত মুদ্রার রেট Frankfurter থেকে আসে; এগুলো দৈনিক রেফারেন্স, লাইভ ট্রেডিং কোট নয়।
স্ন্যাপশট নিজে থেকে রিফ্রেশ হয়। ফলের নিচে উৎসের তারিখ দেখো। তোমার দেওয়া পরিমাণ ব্রাউজারেই থাকে। অ্যাসেট তালিকায় থাকা পেমেন্ট সমর্থনের নিশ্চয়তা নয়।
Kraken · Binance · Frankfurter · অ্যাসেটের নাম ও আইকন: CoinGecko
API দিয়ে invoice তৈরি
Server-এ example চালাও। API host, project/store ID বদলাও, credential private রাখো। Amount decimal string।
আগে store-এ method চালু করো। Selection enabled method কমায়, asset যোগ করে না। কিছু না মিললে store default। Checkout দেখানোর আগে returned method দেখো।
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "tezos",
"asset_tickers": [
"XTZ"
]
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "tezos",
"asset_tickers": [
"XTZ"
]
}
]
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "tezos",
"asset_tickers": [
"XTZ"
]
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "tezos",
"asset_tickers": [
"XTZ"
]
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))