Commit Graph
3478 Commits
Author SHA1 Message Date
erio 8c73ded205 chore: bump version to 0.1.108.128 2026-04-09 17:34:23 +08:00
erio 49a36e55a9 feat(payment): show out_trade_no in order list 2026-04-09 17:34:23 +08:00
erio 2f6d926a9b chore: bump version to 0.1.108.127 2026-04-09 17:29:18 +08:00
erio cb9dcaec2e fix(payment): show both order ID and order number in result pages
Display order ID (#24) and order number (sub2_xxx) as separate rows
in payment result and status panel success views.
2026-04-09 17:29:18 +08:00
erio e42838eb82 chore: bump version to 0.1.108.126 2026-04-09 17:23:23 +08:00
erio 01864a7a1e fix(payment): ensure providers loaded before webhook, show out_trade_no
- Call EnsureProviders before webhook provider lookup to fix
  "provider not registered" error after restart or config changes
- Display out_trade_no instead of numeric ID in payment result pages
2026-04-09 17:23:23 +08:00
erio 3f557d0f9d chore: bump version to 0.1.108.125 2026-04-09 17:14:39 +08:00
erio cfc20f6670 fix(admin): preserve provider list order after editing
Update provider in place instead of reloading the entire list,
which could change the display order.
2026-04-09 17:14:39 +08:00
erio 8e4641e176 chore: bump version to 0.1.108.124 2026-04-09 16:39:22 +08:00
erio 5ae2061d05 fix(admin): fix payment provider settings issues
- Remove "at least one payment type required" validation, allow
  saving providers with no payment types selected
- Auto-fill current domain for empty notify/return URL on save
  (trim whitespace, fall back to window.location.origin)
- Add type="button" to all buttons inside the settings form that
  are not submit buttons (edit, delete, refresh, create provider)
  to prevent accidental form submission triggering main settings save
2026-04-09 16:39:22 +08:00
erio 9fdc7c92e2 chore: bump version to 0.1.108.123 2026-04-09 16:07:26 +08:00
erio 11ba3b6ecd fix(payment): restore Stripe popup flow, fix WeChat double QR dialog
Restore popup handling for Stripe Alipay/WeChat (reverts inline-only change).
Fix WeChat double QR issue by passing handleActions: false to
confirmWechatPayPayment, which prevents Stripe's built-in QR dialog
and lets our popup render the QR code directly.

Flow after fix:
- Stripe Alipay: popup → redirects to Alipay
- Stripe WeChat: popup → directly shows QR code (no Stripe dialog)
- Stripe Card: inline confirm → success page
2026-04-09 16:07:26 +08:00
erio 1ffea8faec chore: bump version to 0.1.108.122 2026-04-09 15:41:24 +08:00
erio 8b4e6bf317 refactor(payment): unify Stripe payment flow, remove StripePopupView dependency
All Stripe methods now use confirmPayment({redirect: 'if_required'}):
- Card: confirms inline, shows success page
- WeChat: Stripe shows QR modal overlay on same page, no popup
- Alipay: Stripe redirects to Alipay page, returns to result page

Removes POPUP_METHODS, StripePopupView postMessage handshake, and
onStripeRedirect handler. Eliminates double-popup issue for WeChat
(3 windows → 1) and simplifies Alipay (2 windows → 1 redirect).
2026-04-09 15:41:07 +08:00
erio 7505c745d2 chore: bump version to 0.1.108.121 2026-04-09 15:21:44 +08:00
erio 8a98f726b9 fix(payment): show success screen after Stripe card payment instead of auto-returning
Stripe card payment now shows a success page with order details and a
manual confirm button, matching the QR code payment success flow.
Previously it auto-returned to the recharge page after 1.5 seconds.
2026-04-09 15:21:23 +08:00
erio 5c94b51d04 chore: bump version to 0.1.108.120 2026-04-09 14:56:38 +08:00
erio 03b97f14ad fix(payment): add return_url verification for popup payment mode
EasyPay popup mode relies on notify_url (webhook) to update order status,
but if the callback is missed, orders stay PENDING forever. This adds:

- POST /api/v1/payment/orders/verify endpoint that actively queries
  the upstream provider to check payment status
- Frontend PaymentResultView calls verify when receiving EasyPay
  return_url params (out_trade_no)
- Fix checkPaid to fall back to OutTradeNo when PaymentTradeNo is empty
  (popup mode doesn't have trade_no until the notify callback)
2026-04-09 14:56:24 +08:00
erio 6575fc1d1c chore: bump version to 0.1.108.119 2026-04-09 13:09:28 +08:00
erio 3844c8688e refactor(payment): remove DB ID from order number, use out_trade_no lookup
Order ID format changed from sub2_5 to sub2_20250409aB3kX9mQ
(prefix + date + 8-char random, no DB ID embedded).

- Add out_trade_no column to payment_orders table
- Store generated external ID on order creation
- Webhook handler looks up order by out_trade_no instead of parsing DB ID
- Fallback to legacy sub2_N format for existing orders
2026-04-09 13:09:27 +08:00
erio a7a7257603 chore: bump version to 0.1.108.118 2026-04-09 12:21:13 +08:00
erio f211c7f22b fix: order ID format sub2_20250409aB3kX9mQ_N, parse via last underscore 2026-04-09 12:21:13 +08:00
erio 7ef11b3180 chore: bump version to 0.1.108.117 2026-04-09 11:58:49 +08:00
erio 6c9fd2ed00 fix: prevent settings save on provider edit, randomize order IDs
- Remove saveSettings() call from handleSaveProvider - editing a
  provider should not save the entire settings form
- Change order ID format from sub2_5 to sub2_20250409_5_aB3kX9mQ
  (prefix + date + dbID + 8-char alphanumeric random) to avoid
  collisions with external payment providers
- parseOrderID supports both legacy and new format
2026-04-09 11:58:49 +08:00
erio 7de6de09d7 chore: bump version to 0.1.108.116 2026-04-09 11:44:32 +08:00
erio 53bcd4ce53 fix(admin): compact provider dialog layout, fix broken template 2026-04-09 11:44:32 +08:00
erio 1d8f39e473 chore: bump version to 0.1.108.115 2026-04-09 03:35:38 +08:00
erio 7c2dbb07b5 fix(admin): skip null values when loading settings from backend
Backend returns null for unconfigured fields. Object.assign overwrites
form defaults (e.g. payment_enabled_types: []) with null, causing
"Cannot read properties of null" errors. Now only non-null values
are applied, preserving safe defaults for unconfigured environments.
2026-04-09 03:35:38 +08:00
erio 7d45fad287 chore: bump version to 0.1.108.114 2026-04-09 03:20:53 +08:00
erio 382b96b7b4 feat(payment): support alipay_direct/wxpay_direct in method selector
Add alipay_direct and wxpay_direct to METHOD_ORDER so they appear
in the correct position when enabled. The checkout API already returns
these types from direct provider instances; the method selector's
icon/style matching (includes('alipay')) already handles them.
2026-04-09 03:20:52 +08:00
erio 2fc413c82e chore: bump version to 0.1.108.113 2026-04-09 03:13:35 +08:00
erio 7f2877363d feat(payment): lightweight Stripe popup with postMessage credentials
Create StripePopupView.vue - a standalone minimal page (no AppLayout)
that receives clientSecret/publishableKey via postMessage from parent:
- Alipay: auto-calls confirmAlipayPayment(), shows "正在跳转..."
- WeChat: calls confirmWechatPayPayment(), shows QR code inline
- Much faster than loading full StripePaymentView (no API calls needed)
2026-04-09 03:13:35 +08:00
erio dd87c273da chore: bump version to 0.1.108.112 2026-04-09 03:00:49 +08:00
erio f50b48c482 fix(payment): restore easypay toggle, disable instances when provider disabled
- Add easypay back to enabled provider toggles (alongside alipay, wxpay, stripe)
- Disabling a provider toggle now also disables all matching provider instances
- Simplify enabledProviderKeyOptions - direct mapping instead of special cases
- Label: "启用的服务商" with hint about instance auto-disable
2026-04-09 03:00:49 +08:00
erio 173aa9325e chore: bump version to 0.1.108.111 2026-04-09 02:29:18 +08:00
erio a8a98cc5a1 fix: order expiry cancels upstream, subscription layout, popup & label fixes
- ExpireTimedOutOrders now cancels upstream payment (Stripe PaymentIntent)
  before marking order as expired
- Active subscriptions moved below plan list with compact inline style
- StripePaymentView uses minimal layout (no AppLayout) in popup mode
- Fix misleading "服务商" label → "支持的支付方式" for payment type toggles
2026-04-09 02:29:18 +08:00
erio 302e6acbd9 chore: bump version to 0.1.108.110 2026-04-09 02:13:34 +08:00
erio 21bcc04356 fix(payment): widen Stripe popup for Alipay checkout page (1250px) 2026-04-09 02:13:34 +08:00
erio 74a38ead49 chore: bump version to 0.1.108.109 2026-04-09 02:04:23 +08:00
erio fbdb68a0aa refactor(payment): direct Stripe confirm for alipay/wechat popup
Instead of opening a popup that renders the full Payment Element again
(forcing users to re-select payment method), pass the selected method
via query param. The popup now directly calls:
- confirmAlipayPayment() for Alipay (redirects to Alipay page)
- confirmWechatPayPayment() for WeChat (displays QR code)
Card and Google Pay remain inline on the main page.
2026-04-09 02:04:23 +08:00
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
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