받을 수 있는 자산
네이티브 HBAR 청구서는 자금이 들어오면 Hedera 계정으로 연결되는 EVM 별칭을 써요. 수신 이력은 Mirror REST API에서 오며 EVM 릴레이만으로는 부족해요. HTS 토큰은 받지 않아요.
스토어 설정
- Wholly Crypto를 설치하고 프로젝트와 스토어를 만든 뒤 지갑 백업을 안전하게 보관하세요.
- 스캐너 호환 연결을 확인하고 Store → Payment methods에서 체인과 받을 자산을 활성화하세요.
- 확인 수와 만료 시간을 설정하세요. 소액 청구서로 테스트하고 결제 완료를 확인한 뒤 주문을 처리하세요.
결제가 도착하는 곳
청구서는 별도 수신 주소를 사용해요. 전체 백업, 주소 목록, 파생 정보를 보관하세요. 가져온 지갑이 모든 주소를 바로 찾지 못할 수 있어요.
수신 가이드준비되면 자금을 옮기세요
수동 송금과 자동 스윕은 네이티브 코인을 지원해요. 수수료, 준비금, 저장소 비용을 남기세요. 수신 지원만으로 제공업체의 전송 기능이 보장되지는 않아요.
자동 스윕 튜토리얼결제 문제 해결
이 네트워크부터 확인
계정 충전 후 수신 별칭이 해석되어야 해요. HBAR 입금 확인에는 Mirror 내역이 필요하고 송금은 읽기 전용 Mirror API가 아닌 호환 EVM 릴레이를 사용해요.
지갑 복구 또는 자금 모으기
개인 백업과 파생 정보를 보관하세요. 다른 앱은 모든 주소를 표시하지 않을 수 있어요. 송금과 복구는 체인과 지갑 형식에 달려 있으며 복구 단어 가져오기만으로 보장되지 않아요.
백업 및 복원수수료와 검증
기본 처리 수수료는 청구서 법정화폐 금액의 1%이며 별도 크레딧에서 차감돼요. 계정에 지정된 요율이 적용되고 네트워크와 서버 비용은 별도예요.
공개 제공자는 장애나 요청 제한이 생길 수 있어요. 거래 제출이나 리디렉션만으로 결제를 확인할 수는 없어요. 검증된 청구서 상태와 서명된 알림을 사용하세요.
처리 크레딧 API, IPN 및 웹훅환율 계산기
금액 환산
예상치이며 결제 견적은 아니에요. 네트워크 수수료, 거래소 수수료, 판매자 스프레드는 포함하지 않아요.
환율은 어디서 가져오나요?
암호화폐 예상치는 캐시된 Kraken 공개 가격과 가능한 경우 Binance 가격을 사용해요. 일부 Binance 가격은 USDT를 USD 기준으로 써요. 법정화폐 환율은 Frankfurter의 일일 참고 환율이며 실시간 거래 호가는 아니에요.
스냅샷은 자동 갱신돼요. 결과 아래에서 출처 날짜를 확인하세요. 입력한 금액은 브라우저 안에만 남아요. 자산 목록에 있다고 결제 지원을 보장하지는 않아요.
API로 청구서 만들기
예제는 서버에서 실행하세요. API 호스트, 프로젝트 ID, 매장 ID를 바꾸고 인증 정보는 비공개로 유지하세요. 금액은 십진 문자열이에요.
먼저 매장에서 방법을 활성화하세요. 선택은 활성 방법만 좁히며 자산을 추가하지 않아요. 일치 항목이 없으면 매장 기본값이 적용돼요. 결제 화면을 열기 전 반환된 방법을 확인하세요.
: "${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": "hedera",
"asset_tickers": [
"HBAR"
]
}
]
}'// 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": "hedera",
"asset_tickers": [
"HBAR"
]
}
]
}`;
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": "hedera",
"asset_tickers": [
"HBAR"
]
}
]
}
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": "hedera",
"asset_tickers": [
"HBAR"
]
}
]
}""".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))