From b1a8252f252d872d3327ebb1b33cddcdf435fd19 Mon Sep 17 00:00:00 2001 From: erio Date: Mon, 6 Apr 2026 23:58:16 +0800 Subject: [PATCH] feat(payment): independent callback URLs + sensitive field visibility toggle - Split callback URLs into two independent inputs (notify/return each with own base URL + fixed path) - Add eye icon toggle for sensitive fields (PKey etc.) to reveal/hide values - Bump version to 0.1.108.35 --- backend/cmd/server/VERSION | 2 +- .../payment/PaymentProviderDialog.vue | 66 +++++++++++++------ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/backend/cmd/server/VERSION b/backend/cmd/server/VERSION index 4390d3851c..d68f45dd38 100644 --- a/backend/cmd/server/VERSION +++ b/backend/cmd/server/VERSION @@ -1 +1 @@ -0.1.108.34 +0.1.108.35 diff --git a/frontend/src/components/payment/PaymentProviderDialog.vue b/frontend/src/components/payment/PaymentProviderDialog.vue index 6f247e26ce..00296422b5 100644 --- a/frontend/src/components/payment/PaymentProviderDialog.vue +++ b/frontend/src/components/payment/PaymentProviderDialog.vue @@ -81,9 +81,25 @@ rows="3" class="input font-mono text-xs" /> +
+ + +
- +
-
- - +
+ +
+ + {{ callbackPaths.notifyUrl }} +
-
- {{ t('admin.settings.payment.field_notifyUrl') }}: - {{ callbackBaseUrl || defaultBaseUrl }}{{ callbackPaths.notifyUrl }} -
-
- {{ t('admin.settings.payment.field_returnUrl') }}: - {{ callbackBaseUrl || defaultBaseUrl }}{{ callbackPaths.returnUrl }} +
+ +
+ + {{ callbackPaths.returnUrl }} +
@@ -231,14 +249,16 @@ const form = reactive({ }) const config = reactive>({}) const limits = reactive>>({}) -const callbackBaseUrl = ref('') +const notifyBaseUrl = ref('') +const returnBaseUrl = ref('') const limitsExpanded = ref(false) +const visibleFields = reactive>({}) // --- Computed --- const defaultBaseUrl = typeof window !== 'undefined' ? window.location.origin : '' const stripeWebhookUrl = computed(() => - form.provider_key === 'stripe' ? (callbackBaseUrl.value || defaultBaseUrl) + WEBHOOK_PATHS.stripe : '', + form.provider_key === 'stripe' ? defaultBaseUrl + WEBHOOK_PATHS.stripe : '', ) const callbackPaths = computed(() => PROVIDER_CALLBACK_PATHS[form.provider_key] || null) @@ -284,7 +304,9 @@ function onKeyChange() { function clearConfig() { Object.keys(config).forEach(k => delete config[k]) Object.keys(limits).forEach(k => delete limits[k]) - callbackBaseUrl.value = '' + Object.keys(visibleFields).forEach(k => delete visibleFields[k]) + notifyBaseUrl.value = '' + returnBaseUrl.value = '' limitsExpanded.value = false } @@ -352,12 +374,11 @@ function handleSave() { filteredConfig[k] = v } - // Inject computed callback URLs from base URL + fixed paths + // Inject computed callback URLs (each URL = independent base + fixed path) const paths = PROVIDER_CALLBACK_PATHS[form.provider_key] if (paths) { - const base = callbackBaseUrl.value || defaultBaseUrl - if (paths.notifyUrl) filteredConfig['notifyUrl'] = base + paths.notifyUrl - if (paths.returnUrl) filteredConfig['returnUrl'] = base + paths.returnUrl + if (paths.notifyUrl) filteredConfig['notifyUrl'] = (notifyBaseUrl.value || defaultBaseUrl) + paths.notifyUrl + if (paths.returnUrl) filteredConfig['returnUrl'] = (returnBaseUrl.value || defaultBaseUrl) + paths.returnUrl } emit('save', { @@ -402,10 +423,13 @@ function loadProvider(provider: ProviderInstance) { if (k === 'notifyUrl' || k === 'returnUrl') continue config[k] = v } - // Extract base URL from existing notifyUrl + // Extract base URLs from existing callback URLs const paths = PROVIDER_CALLBACK_PATHS[provider.provider_key] if (paths?.notifyUrl && provider.config['notifyUrl']) { - callbackBaseUrl.value = extractBaseUrl(provider.config['notifyUrl'], paths.notifyUrl) + notifyBaseUrl.value = extractBaseUrl(provider.config['notifyUrl'], paths.notifyUrl) + } + if (paths?.returnUrl && provider.config['returnUrl']) { + returnBaseUrl.value = extractBaseUrl(provider.config['returnUrl'], paths.returnUrl) } } applyDefaults()