Commit Graph
3630 Commits
Author SHA1 Message Date
erio 204fa00bf5 chore: bump version to 0.1.108.108 2026-04-09 01:50:48 +08:00
erio 090f2e721f fix(payment): show result inline for all terminal states instead of auto-returning
Success, cancelled, and expired states now all display a result screen
in-place. User must click confirm to return, matching sub2apipay behavior.
2026-04-09 01:50:48 +08:00
ius 265687b56d fix: 优化调度快照缓存以避免 Redis 大 MGET 2026-04-08 10:39:15 -07:00
erio ad2b240fd8 chore: bump version to 0.1.108.107 2026-04-09 01:24:30 +08:00
erio 373464db26 fix(payment): add cid and fix double-slash in easypay redirect mode
createRedirectPayment was missing the cid parameter (channel ID) that
createAPIPayment already included via resolveCID(). This caused EasyPay
to use a default channel instead of the configured one (e.g. 13256/13264).

Also trim trailing slash from apiBase to prevent double-slash in URLs.
2026-04-09 01:24:15 +08:00
erio bfef48f932 chore: bump version to 0.1.108.106 2026-04-09 01:13:32 +08:00
erio 4f88ee637a fix(payment): inject paymentMode into provider config for correct redirect
The EasyPay provider reads paymentMode from e.config["paymentMode"] to decide
between redirect (submit.php) and API (mapi.php) paths. However, paymentMode
is stored as a separate DB column, not inside the encrypted config JSON.
SelectInstance() returned it in the InstanceSelection struct but never injected
it into the Config map, so the provider always fell through to the API/QR path.

Also includes:
- Subscription success flow: show "订阅成功" and refresh on return
- Active subscription card: platform colors, rate/quota display
- Subscription plan card: compact layout to save height
- Provider list: drag-and-drop reorder via sort_order
2026-04-09 01:13:16 +08:00
erio 47021dae14 chore: bump version to 0.1.108.105 2026-04-09 00:15:25 +08:00
erio 9a0bdaba8e refactor(frontend): extract centralized platform color config
Create utils/platformColors.ts as single source of truth for all
platform color classes (badge, border, accent, text, icon, button,
discount). Refactor SubscriptionPlanCard to use it.
2026-04-09 00:15:25 +08:00
erio e95cc3cbbe chore: bump version to 0.1.108.104 2026-04-09 00:11:01 +08:00
erio 1afb222311 fix(payment): align subscription card colors with platform convention
Change Anthropic color from amber to orange to match GroupsView,
ChannelsView and other admin components.
2026-04-09 00:10:43 +08:00
erio 6a3fa290af chore: bump version to 0.1.108.103 2026-04-09 00:00:44 +08:00
erio 5f4378b4ae feat(payment): show group details and quota info on subscription plan cards
Extend checkout API to return group name, rate multiplier, daily/weekly/monthly
limits and supported model scopes. Redesign SubscriptionPlanCard to display
platform badge, group quota info, and model scope tags.
2026-04-09 00:00:25 +08:00
erio 7324f458de chore: bump version to 0.1.108.102 2026-04-08 22:16:30 +08:00
erio e86c7005b5 fix(payment): subscription plans grid layout from top-left 2026-04-08 22:16:29 +08:00
erio 2cc97a0bda chore: bump version to 0.1.108.101 2026-04-08 22:08:13 +08:00
erio 3f5e277855 refactor(payment): inline subscription flow and simplify payment modes
- EasyPay: remove redirect mode, keep only qrcode and popup
- Stripe: remove mode config entirely, always use inline Payment Element
- Subscription: replace dialog with inline confirm UI (plan summary +
  method selector + fee breakdown), same flow as top-up
- Move PaymentStatusPanel/StripePaymentInline to shared section for
  both recharge and subscription payments
- Hide tabs and help card during payment/subscription confirm phases
2026-04-08 22:07:42 +08:00
erio 17c1f88894 chore: bump version to 0.1.108.100 2026-04-08 21:41:24 +08:00
erio 8e02b123c8 fix(payment): Stripe redirect methods (Alipay) open in new window
When user selects a redirect-based payment method (e.g. Alipay) in the
inline Stripe Element and clicks pay, the payment page opens in a new
window instead of navigating the current page away. The main page
switches to waiting/polling mode. Inline methods (card, WeChat) still
complete directly on the page.
2026-04-08 21:41:24 +08:00
erio bb2ee91ce5 chore: bump version to 0.1.108.99 2026-04-08 21:30:37 +08:00
erio d911245679 fix(payment): add cancel order to Stripe inline + widen popup window 2026-04-08 21:30:07 +08:00
erio fff0caedaa chore: bump version to 0.1.108.98 2026-04-08 21:26:17 +08:00
erio 384a1b3070 feat(payment): embed Stripe Payment Element inline instead of popup
Stripe payment now shows the Payment Element directly on the purchase
page. User selects payment method (Alipay/WeChat/Card) inline, then
confirms. Redirect-based methods (Alipay) navigate to the payment
page; non-redirect methods (Card/WeChat) complete inline.
2026-04-08 21:26:17 +08:00
erio dc731465d5 fix(ui): widen payment popup window from 520px to 680px 2026-04-08 21:20:11 +08:00
erio ff89772c28 chore: bump version to 0.1.108.97 2026-04-08 21:13:13 +08:00
erio aab31329af fix(payment): use global amount range for quick buttons, not per-method
Quick amount buttons and custom input always use the global min/max
range (union of all methods). Payment method availability is
determined by whether the selected amount fits each method's limits.
2026-04-08 21:10:24 +08:00
erio c846eaa444 fix(ui): widen cancel rate limit select dropdowns to prevent text truncation 2026-04-08 21:07:48 +08:00
erio fcf41f901c chore: bump version to 0.1.108.96 2026-04-08 18:21:13 +08:00
erio a56a2f138a test(payment): add unit tests for payment audit fixes + allow empty supported_types
Tests (1033 new lines, 100% coverage on modified functions):
- amount.go: YuanToFen/FenToYuan with precision edge cases
- wxpay: mapWxState, wxSV, formatPEM, NewWxpay validation
- alipay: isTradeNotExist, NewAlipay validation
- webhook: writeSuccessResponse (wxpay JSON, stripe empty, others text)
- config: validateProviderRequest, isSensitiveConfigField, joinTypes
- fulfillment: resolveRedeemAction idempotency logic

Business logic changes:
- Allow empty supported_types on provider instances
- Block removing payment types when instance has pending orders
- Extract resolveRedeemAction as testable pure function
2026-04-08 18:21:12 +08:00
erio 3ba213b27f chore: bump version to 0.1.108.95 2026-04-08 18:05:24 +08:00
erio fafde2a493 feat(payment): configurable payment mode (qrcode/redirect/popup)
- EasyPay supports 3 modes: qrcode (API/QR), redirect (new tab), popup (small window)
- Stripe supports 2 modes: popup (small window, default), redirect (new tab)
- Backend passes payment_mode through to create-order response
- Frontend opens pay URL based on configured mode
2026-04-08 18:05:24 +08:00
erio a3e3e3cd08 chore: bump version to 0.1.108.94 2026-04-08 17:33:19 +08:00
erio 6dcf14f46a refactor(payment): replace dialog overlay with inline payment status
Payment waiting/QR/success states now render inline on the page
instead of as a modal overlay dialog. The page content switches
between selection mode and payment status mode.
2026-04-08 17:33:01 +08:00
erio 067f8f3e77 style: fix gofmt formatting in payment_handler, wire, stubs 2026-04-08 17:20:49 +08:00
erio a47f0f5ca7 chore: bump version to 0.1.108.93 2026-04-08 17:11:49 +08:00
erio be82609939 fix(payment): audit fixes for alipay/wxpay/stripe payment providers
Backend:
- Extract YuanToFen/FenToYuan to payment/amount.go using shopspring/decimal
- Require alipay publicKey in config validation
- Fix wxpay webhook response to return JSON per V3 spec
- Remove wxpay certSerial fallback to publicKeyId
- Define magic strings as named constants in wxpay/alipay providers
- Add slog warning for wxpay H5→Native payment downgrade
- Make EncryptionKey validation return error on invalid (non-empty) key
- Make decryptConfig propagate errors instead of returning nil
- Add idempotency check in doBalance to prevent stuck FAILED retries

Frontend:
- Fix dashboard currency symbol from $ to ¥
- Fix AdminPaymentPlansView any type to proper SubscriptionPlan type
- Make quick amount buttons follow selected payment method limits
- Center help image with larger height and text below
2026-04-08 17:11:32 +08:00
github-actions[bot] 0d69c0cd64 chore: sync VERSION to 0.1.110 [skip ci] 2026-04-08 08:41:32 +00:00
shaw f54e9d0b1c chore: update readme 2026-04-08 16:37:00 +08:00
erio 93a43950fe feat(payment): open Stripe and redirect payments in popup window
Instead of navigating the main page away during payment, open Stripe
and EasyPay redirect payments in a popup window while showing a
waiting dialog on the purchase page. Extract POPUP_WINDOW_FEATURES
constant to providerConfig.ts.
2026-04-08 16:33:01 +08:00
shaw b982076e52 fix: resolve errcheck lint and add missing enable_cch_signing to test
- Suppress errcheck for xxhash Digest.Write (never returns error)
- Add enable_cch_signing field to settings API contract test
2026-04-08 16:23:02 +08:00
shaw 7060596a30 fix: bump Go from 1.26.1 to 1.26.2 to resolve 6 stdlib CVEs
Fixes GO-2026-4947, GO-2026-4946, GO-2026-4870, GO-2026-4869,
GO-2026-4866, GO-2026-4865 in crypto/x509, crypto/tls, archive/tar,
and html/template.
2026-04-08 16:17:15 +08:00
shaw e51c9e50b5 feat: sync billing header cc_version with User-Agent and add opt-in CCH signing
- Sync cc_version in x-anthropic-billing-header with the fingerprint
  User-Agent version, preserving the message-derived suffix
- Implement xxHash64-based CCH signing to replace the cch=00000
  placeholder with a computed hash
- Add admin toggle (enable_cch_signing) under gateway forwarding settings,
  disabled by default
2026-04-08 16:11:19 +08:00
Wesley Liddick 5088e91566 Merge pull request #1417 from YanzheL/fix/openai-empty-base64-image-payloads
fix: sanitize empty base64 image payloads for OpenAI requests
2026-04-08 14:20:38 +08:00
Wesley Liddick 276f499c82 Merge pull request #1418 from YanzheL/fix/1161-gemini-google-search-grounding
fix(gemini): preserve google search grounding tools
2026-04-08 14:19:57 +08:00
Wesley Liddick 5c203ce6c6 Merge pull request #1428 from YanzheL/fix/openai-gateway-content-session-hash-fallback
fix(gateway): add content-based session hash fallback for non-Codex clients
2026-04-08 14:17:49 +08:00
Wesley Liddick 47cd1c5286 Merge pull request #1467 from touwaeriol/refactor/channel-service-cleanup
refactor(channel): split long functions, extract shared validation, move billing validation to service
2026-04-08 14:16:28 +08:00
Wesley Liddick 06e2756ee4 Merge pull request #1501 from StarryKira/fix/1493-non-streaming-empty-output
fix: 非流式响应路径扩展SSE检测至所有账号类型
2026-04-08 14:11:47 +08:00
erio 0ed9816487 feat(payment): click-to-preview help image with fullscreen overlay 2026-04-08 14:06:19 +08:00
shaw 1c9a2128cf fix: 修复非CC客户端OAuth伪装被Anthropic检测为第三方应用的问题
commit f3aa54b 的 rewriteSystemForNonClaudeCode 未能通过 Anthropic 第三方检测,
根因是两个关键信号与真实 Claude Code 不一致:

1. anthropic-beta 头缺少 claude-code-20250219:伪装路径主动将该 beta
   加入 drop set 并移除,但 Anthropic 依赖此 beta 识别 Claude Code 请求。
   修复:非 haiku 模型的伪装请求强制包含 claude-code beta。

2. system 字段使用 string 格式而非 array+cache_control:真实 Claude Code
   始终以 [{type,text,cache_control:{type:"ephemeral"}}] 发送 system,
   string 格式成为第三方检测信号。
   修复:rewriteSystemForNonClaudeCode 改为注入 array 格式。

附带调整:stripSystemCacheControl 按 system 是否被重写动态决定,
重写时保留 CC prompt 的 cache_control,未重写时(haiku/已含CC前缀)
保持原有剥离行为。
2026-04-08 14:06:06 +08:00
erio bb243d1f93 chore: bump version to 0.1.108.90 2026-04-08 13:51:08 +08:00