嗨 dev.to,
這是一個很奇怪的故事,我想分享它。跟著我,支付處理的部分真的很有趣。
我15歲,住在俄羅斯,在過去三週的密集獨自編程中,我建成了Doday — 一款可作為網頁應用程式、Telegram Mini App 和 Telegram 頻道的待辦事項應用程式,所有功能共享一個後端。基本上是一個帶有 Pomodoro 功能、看板、學校入口網站同步(針對俄羅斯學生——這才是真正的護城河,說真的)以及團隊協作的 Todoist 替代品。
您可以在此嘗試:getdoday.ru · 代码:github.com/SwairIt/doday · 頻道:Telegram上的DodayTaskBot
我想談論商業化部分,因為我想它可能對其他嘗試發貨的未成年人士有用
問題
我從5月2日起一直在開發Doday。到我想增加付費方案時,這個應用程式已經有一小群用戶(主要是朋友和我學校的人,還有幾個隨機的人)。我正在運行在BETA_FREE_FOR_ALL=true 環境變數旗標,意味著每個人都免費獲得 Pro 功能。這在發布期間是可行的,但我實際上想要驗證人們是否願意為此付費。
計劃很簡單:註冊一個俄羅斯支付處理商(YooKassa,前身為 Yandex Kassa — 幾乎是本地 Stripe 的對等物),實現他們的結賬流程,完成。
我註冊為「自僱業者」(самозанятый — 俄羅斯一種稅制,14歲以上需父母同意方可申請),所以我有一個稅號和一個真正的銀行帳戶。我認為這已經足夠了。
兩天內被拒絕了三次
YooKassa — 通過gov-ID(Госуслуги,我們的e-gov / 政府服務單一登錄系統)登錄。立即拒絕:"使用Госуслуги兒童帳戶的用戶無法登入。" 我的Госуслуги帳戶是 完全驗證 — 我透過它繳稅,做所有成年人的事。但YooKassa檢查出生日期,如果你未滿18歲,沒有爭辯。硬性規定.
好,手動輸入. 我打開手冊表單 — 他們要一個掃描的彩色護照上傳。他們的 OCR 讀取出生日期並拒絕了。我試過用策略性地模糊的日期 — 一個小時後得到「無法驗證身份」。同樣的障礙.
好的,T-Bank 繁殖 (另一款主要的俄羅斯處理器)。註冊流程會到達「你需要成為註冊的IP(個體經營者)或LLC」。允許自僱,但必須年滿18歲。要註冊成為IP,你也必須年滿18歲(16歲需父母同意並有公證聲明,但銀行不接納這些用於獲取資金)。
好的,以父母的名義註冊。現在錢在法律上屬於他們。如果與客戶發生爭議,我父母必須爭論。稅務機構認為這筆收入是他們的。如果他們決定明天不想參與,我會在一夜之間失去整個支付基礎設施。不會發生的.
OK,等到了18歲.那是三年多了。我無法為為了看到一些財務上的證明而投入更多時間到一個產品上
我誠實地說,即將放棄盈利。然後我記起了 Telegram Stars 的存在
Telegram Stars (XTR)
如果你不知道——Telegram 有自己的應用內貨幣,叫做 Stars (貨幣代碼XTR 在他們的 Bot API 中)。用戶透過 Telegram 客戶端(Apple/Google 內部購買)購買它們。機器人可以透過 createInvoiceLink 接受 Stars 的支付。開發者獲得 ~70% 的 Stars 价值,透過 TON 加密貨幣或透過 Fragment 提款。
關鍵點:BotFather(Telegram 的機器人管理機器人)從 13 歲開始提供服務。 沒有文件。沒有稅務識別碼。沒有銀行。你的合約是與 Telegram 簽訂,不是與銀行簽訂的.
對我來說,在 15 歲時,這是唯一存在的合法支付途徑.
我坐了下來並寫下了它.
我所建立的(技術)
-
架構遷移 (
alembic 0039):users.pro_until(時間戳),star_payments表格與UNIQUE(telegram_payment_charge_id)用於確保一意性 -
商品目錄 (
app/billing/products.py) — 定價的唯一真實來源。Pro 1個月 = 250⭐,Pro 12個月 = 2500⭐,Pro 毕生 = 12500⭐。編輯這個檔案,就這樣. -
HMAC簽名的發票負載 —
v1:{product}:{user_id_hex}:{nonce}:{sig}。若無此機制,任何人都可以截取發票網址,並在付款前將產品代碼換成"pro_forever"。有了它,簽名會失效,Bot API 就會拒絕。有效負載 ≤80 字節(Telegram 的限制是 128 字節)。 -
單一支付應用 — Telegram 在失敗時會重試 webhook。我會將資料插入到
star_payments中,並使用UNIQUE作為 charge_id;第二次插入會引發錯誤。IntegrityError→ 我捕捉並回傳現有的資料列。從不會有雙倍信用。 -
effective_tier()榮譽pro_until— 已過期的付費用戶pro_until自動回復到免費,沒有cron jobs。每個請求都進行惰性評估。終身購買設置pro_until到2099年作為衛兵。 -
續期從現有開始
pro_until— 在你還剩下 10 天的時候購買 Pro,並不會重置為 30 天。它會延長至current_pro_until + 30 days。(Todoist 這樣做是錯的, FYI.) -
退款流程 — 管理端點調用
refundStarPaymentBot API + 撤銷pro_until。Telegram 允許在 21 天內退款. -
Bot 處理程序 —
PreCheckoutQueryHandler(需在10秒內回答,驗證簽名+金額),MessageHandler(filters.SUCCESSFUL_PAYMENT)(呼叫apply_successful_payment).
測試:24個單元測試涵蓋簽名、篡改拒絕、金額不匹配、可重入性、續期計算、生命週期哨兵、過期→免費回退.
迷你應用程式UI使用Telegram.WebApp.openInvoice(url, callback)進行應用程式內支付。網頁UI以桌面回退方式在新分頁中打開發票URL。
我還關閉了一個我一直沒處理的安全漏洞 — POST /api/billing/change-tier過去允許任何已驗證用戶透過POSTing {"tier": "pro"}免費升級到Pro。我在發布Stars的同一個禮拜內就關閉了它:升級現在需要402支付需求,只有降級到免費才是自助服務.
目前關於營收的重要保留事項
我剛發布了Stars,但目前服務處於測試階段,Pro 功能對所有人免費。目前沒有人付費,我也沒有強推。等我結束測試階段,就會開啟付費模式,現有的用戶(任何在那個轉折點之前註冊的人)將能免費保留他們已經創建的內容。在 Mini App 中有一個創始人風格的"Pro 永恆"優惠,價格為 12500 ⭐ — 為了在付費模式回歸前鎖定 Pro,
非強制性。如果你不購買,你將在切換後使用免費版本。
因此,盈利模式是設計為可選的。當產品穩定並開始增長時,它將正式啟動。
- 堆疊(如果你在乎的話)
- FastAPI 0.115 + 非同步 SQLAlchemy 2.0 + Pydantic v2__JHSNS_SEG_7e13455d_96__PostgreSQL 16 (asyncpg)
- Jinja2 + HTMX + Alpine.js + Tailwind 透過 CDN — 不使用 React,無建置步驟
- 使用 python-telegram-bot v21 作為機器人工作程序
-
mypy --strict透過 pre-commit 在每次提交時強制執行 - ~20k 行 Python 代码,850+ pytest 測試,39 Alembic 迁移
- 一行部署指令:
git push→ 在生產 VPS 上每分鐘執行一次 cron-poll,應用迁移,重新啟動 uvicorn。約 60 秒內即可啟動。
有關使用Claude Code
我與Claude Code(Anthropic的AI程式輔助工具)一起寫了Doday。我不隱瞞——架構決策是我做的,但Claude打字速度快且記得程式碼庫很清楚。每個提交都會在推送前進行審查。我不懂的程式行會被重寫,直到我能夠大聲解釋它們為止.
程式碼庫沒有AI爛泥氣味的理由是因為軌道:mypy --strict 在類型錯誤上失敗,每個行為變更都帶有一個測試,Jinja 驗證器抓取到 Claude 倾向於產生的糟糕 Alpine 模式。有了這些護衛措施,一個 AI 助手就只是一個快速的配對程式設計師。
你是否認為這是「真正」的程式設計取決於你的定義。我認為是的。如果沒有對架構和審查的品味,我不會在三週內發布這麼多,但我也沒有在沒有對架構和審查的品味下很好地發布它。
誠實數據
- 首次提交:2026年5月2日
- 總提交次數:511
- 測試:850
- ~20k 行 Python 程式碼
- 活躍用戶:不多,主要來自我的學校 + 與朋友的朋友。我還沒有真正嘗試過行銷——這篇 Reddit 討論是其中第一次嘗試。
- 付費使用者:0 — 測試模式,Pro 免費供所有人使用,終身優惠是選擇性
- 至今收入:$0
- 發展路線:Family 等級的父系儀表板,公共 API 金鑰,透過 Capacitor 包裝的小程序原生 iOS
我所詢問的
如果你感到好奇,實時示範位於 getdoday.ru — UI 是俄文的,但英文使用者可以透過瀏覽器翻譯來使用。如果你想知道所有組件如何整合(小型應用程式驗證、星星支付流程、團隊分享、選項功能旗標),那麼在 github.com/SwairIt/doday 的程式碼基礎更有趣。
如果你對架構、支付流程有回饋,或者你也經歷過「未成年且嘗試發貨 SaaS」的問題 — 我很樂意聽聽你的想法.
如果你已經實現了自己的 Stars 整合 — 有個部分我還不太確定:我目前把 provider_payment_charge_id 設為可為空,因為我不確定 Telegram 當實際上會填充它。有人知道嗎?
如果你按讚這個倉儲 — 真的很有幫助。我不只是為了好玩才做這個,我希望能夠最終靠它賺錢.
來自俄羅斯的一位15歲少年的祝酒.
編輯: 如果你好奇為何一位俄羅斯青少年會在 Reddit 上發帖 — 今天是開源 MIT,我希望它能超越俄羅斯用戶。代碼庫是英文(文件註解、變量名稱、提交訊息除外 — 這些是俄語過去式),所以歡迎貢獻。特別是 Telegram Stars 的整合是通用的 — 任何人向使用 Telegram 的任何人銷售任何東西都可以使用。












