102 lines
2.4 KiB
Markdown
102 lines
2.4 KiB
Markdown
# PoW Captcha & Payment Server
|
|
|
|
PHP-basierter Server für kashilo.com mit Proof-of-Work Captcha und BTCPay Payment-Proxy.
|
|
|
|
## Setup
|
|
|
|
1. Subdomain `pow.kashilo.com` auf den Server zeigen
|
|
2. Dateien in das Web-Root kopieren
|
|
3. Secrets setzen:
|
|
```bash
|
|
# In .env oder Apache/Nginx config:
|
|
SetEnv POW_SECRET $(openssl rand -hex 32)
|
|
SetEnv BTCPAY_API_KEY your_btcpay_api_key
|
|
SetEnv BTCPAY_STORE_ID your_btcpay_store_id
|
|
```
|
|
Oder direkt in `config.php` die Werte ändern.
|
|
|
|
4. Testen:
|
|
```bash
|
|
# PoW Challenge
|
|
curl https://pow.kashilo.com/challenge
|
|
|
|
# BTCPay Invoice erstellen
|
|
curl -X POST https://pow.kashilo.com/btcpay/invoice \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"listingId": "test-123", "currency": "EUR"}'
|
|
```
|
|
|
|
## Endpoints
|
|
|
|
### GET /challenge
|
|
Gibt eine signierte PoW-Challenge zurück.
|
|
|
|
### POST /verify
|
|
Prüft die PoW-Lösung. Body (JSON):
|
|
```json
|
|
{
|
|
"challenge": "...",
|
|
"difficulty": 4,
|
|
"nonce": 12345,
|
|
"signature": "...",
|
|
"timestamp": 1700000000000
|
|
}
|
|
```
|
|
|
|
### POST /btcpay/invoice
|
|
Erstellt eine BTCPay Server Invoice für eine Listing-Gebühr.
|
|
Body (JSON):
|
|
```json
|
|
{
|
|
"listingId": "uuid-string",
|
|
"currency": "EUR"
|
|
}
|
|
```
|
|
Response:
|
|
```json
|
|
{
|
|
"invoiceId": "...",
|
|
"checkoutLink": "https://pay.xmr.rocks/i/...",
|
|
"status": "New",
|
|
"expirationTime": 1700000000
|
|
}
|
|
```
|
|
|
|
### GET /btcpay/status?id={invoiceId}
|
|
Prüft den Zahlungsstatus einer Invoice.
|
|
Response:
|
|
```json
|
|
{
|
|
"invoiceId": "...",
|
|
"status": "New|Processing|Settled|Expired|Invalid",
|
|
"additionalStatus": "None|PaidLate|PaidPartial|..."
|
|
}
|
|
```
|
|
|
|
### POST /btcpay/webhook
|
|
Empfängt BTCPay Server Webhook-Events. Wird in BTCPay unter Store → Settings → Webhooks konfiguriert.
|
|
|
|
- **URL**: `https://pow.kashilo.com/btcpay/webhook`
|
|
- **Event**: `InvoiceSettled` (nach 1 Blockchain-Confirmation)
|
|
- **Aktion**: Setzt das zugehörige Listing in Directus auf `status: published`, `payment_status: paid`, setzt `paid_at` und `expires_at` (30 Tage)
|
|
- **Sicherheit**: Webhook-Secret wird serverseitig geprüft
|
|
|
|
## Gebühren
|
|
|
|
| Währung | Betrag |
|
|
|---------|--------|
|
|
| EUR | 1 |
|
|
| USD | 1 |
|
|
| CHF | 1 |
|
|
| GBP | 1 |
|
|
| JPY | 200 |
|
|
|
|
## Sicherheit
|
|
|
|
- HMAC-SHA256 signierte Challenges (nicht fälschbar)
|
|
- TTL: 2 Minuten
|
|
- CORS: nur `https://kashilo.com`
|
|
- `hash_equals()` gegen Timing-Attacks
|
|
- BTCPay API-Key bleibt serverseitig (nie im Frontend)
|
|
- Gebühren serverseitig erzwungen (nicht manipulierbar)
|