Skip to content

Биллинг: отдельный токен Crypto Pay для testnet - #372

Merged
spacesarmat merged 7 commits into
mainfrom
cursor/crypto-pay-testnet-token-c9f9
Nov 12, 2026
Merged

spacesarmat merged 7 commits into
mainfrom
cursor/crypto-pay-testnet-token-c9f9

Conversation

@spacesarmat

@spacesarmat spacesarmat commented Nov 12, 2026 •

Copy link
Copy Markdown
Owner

Зачем

Переключатель cryptoTestnet менял только хост и продолжал слать CRYPTO_PAY_TOKEN. Теперь боевой и testnet-токены живут рядом, а счет и вебхук используют только активный режим.

Что сделано

  • Секрет CRYPTO_PAY_TESTNET_TOKEN в envSecrets.mjs (подпись «Токен Crypto Pay (testnet)»), маска в админке как у остальных секретов, проброс в ops/vps/docker-compose.yml и .env.example.
  • cryptoPayCredentials(settings) возвращает { testnet, host, token, ready }. Эту функцию можно переиспользовать для донатов.
  • cryptoTestnet=true: хост testnet-pay.crypt.bot и testnet-токен. false: pay.crypt.bot и CRYPTO_PAY_TOKEN.
  • Если testnet включен, а testnet-токен пуст, создание счета возвращает disabled и боевой токен на testnet не уходит.
  • POST /v1/crypto-pay принимает подпись только активного режима. Подпись другого режима отвечает 200, пишется в журнал как ignored («игнорирован») и подписку не продлевает.
  • Ссылка хранится отдельно для каждого режима. Ссылка другого режима не выдаётся повторно, ссылка того же режима переиспользуется. Без токена активного режима старая ссылка тоже не выдаётся.
  • Оплата сверяется со счетом активного режима, а не с последним запрошенным invoiceId. Режим берется из той же проверки подписи, чтобы смена настройки между чтением и записью не оставляла bad_label.
  • Рядом с переключателем testnet админка показывает, задан ли токен выбранного режима.
  • README биллинга и CHANGELOG ([tech], «Не выпущено»). Образ не выкатывался.

Проверка

  • ops/billing vitest на последнем коммите: 641 passed, 1 skipped (Postgres 16 локально).
  • tsc админки и сборка ops/billing/public на первом коммите.
  • npm run check:changelog.
  • CI (build, android, billing) зеленый на первом коммите 663812fb. Повторные push этим токеном не запускают Actions (workflow_dispatch отвечает 403). Greptile Review на последнем коммите зеленый, новых замечаний нет.

Не вливать и не деплоить. На NUC .env нужно будет добавить CRYPTO_PAY_TESTNET_TOKEN отдельно, когда дойдет до выкладки.

Open in Web Open in Cursor 

RetriggerView in GreptileConfidence Score: 5/5

No new blocking issue was found; the PR’s stated hold on merging and deployment should still be respected.

Summary

Adds a separate Crypto Pay testnet token and selects it together with the payment host.

  • The testnet switch now uses its own Crypto Pay token.
  • Each purchase keeps a separate Crypto Pay link for live and testnet.
  • Crypto Pay webhooks only extend subscriptions for the active mode.

No new actionable findings were identified. The previous live-link, invoice-matching, and webhook mode-switch findings are addressed. The legacy-link fix preserves old live invoices; old testnet links remain outside that migration.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Selected payment mode] --> B[Choose matching token and host]
  B --> C{Token present?}
  C -->|No| D[Return disabled]
  C -->|Yes| E[Reuse or create link for that mode]
  F[Payment webhook] --> G{Signature matches selected mode?}
  G -->|Yes| H[Match saved invoice using signed mode]
  H --> I[Apply payment once]
  G -->|Other mode| J[Log ignored and return 200]
  G -->|Neither| K[Return 400]
Loading

Reviews (7) · Last reviewed commit: "Merge branch 'main' into cursor/crypto-p..." · Reviewed by Greptile

Переключатель testnet выбирает CRYPTO_PAY_TESTNET_TOKEN и testnet-хост.
Без этого токена счет не создается, боевой токен на testnet не уходит.
Вебхук другого режима отвечает 200 и не продлевает подписку.

Co-authored-by: ANDY BUM <spacesarmat@users.noreply.github.com>
Comment thread ops/billing/src/server.mjs Resolved
Старая ссылка другого режима больше не выдается. У каждого режима своя,
повтор того же режима переиспользует ее. Без токена режима счет disabled.

Co-authored-by: ANDY BUM <spacesarmat@users.noreply.github.com>
Comment thread ops/billing/src/server.mjs Resolved
Смена режима больше не подменяет invoiceId так, чтобы уже выданная
ссылка этого режима отклонялась как bad_label.

Co-authored-by: ANDY BUM <spacesarmat@users.noreply.github.com>
Comment thread ops/billing/src/logic.mjs Resolved
cursoragent and others added 2 commits November 12, 2026 02:57
Смена testnet между чтением и записью не превращает уже принятый счет
в постоянный bad_label.

Co-authored-by: ANDY BUM <spacesarmat@users.noreply.github.com>
Co-authored-by: ANDY BUM <spacesarmat@users.noreply.github.com>

# Conflicts:
#	CHANGELOG.en.md
#	CHANGELOG.md
Comment thread ops/billing/src/server.mjs Resolved
cursoragent and others added 2 commits November 12, 2026 03:10
Ссылка без метки режима считается боевой и переиспользуется.
Если потом создается testnet-счет, старый invoice id остается в проверке оплаты.

Co-authored-by: ANDY BUM <spacesarmat@users.noreply.github.com>
@spacesarmat
spacesarmat merged commit 4b55da1 into main Nov 12, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants