From 8235581bf10f87b7fedb12a66cbf7360abb16254 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Mon, 20 Jul 2026 10:19:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor(payment):=20=E9=80=9A=E9=81=93?= =?UTF-8?q?=E5=AF=86=E9=92=A5=E7=8E=AF=E5=A2=83=E8=B7=9F=E9=9A=8F=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E4=BA=A7=E5=93=81=E7=94=9F=E6=95=88=E7=8E=AF=E5=A2=83?= =?UTF-8?q?(=E5=8F=AA=E8=AF=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 resolveProductSandbox 工具统一从 pay_md_product_config.activeEnv 读取生效环境, adapay/alipay/ums/yeepay 四家直连密钥配置页把环境 radio 改为只读 tag, 禁止在密钥页切换环境; UmsDirectMchManage 透传 product 参数; payment/common 补 envFollowProductHint 六语种; 顺带 prettier 格式化 gateway-order.api.ts --- .../api/payment/order/gateway-order.api.ts | 4 +- .../locales/langs/en-US/payment/common.json | 3 + .../locales/langs/ja-JP/payment/common.json | 3 + .../locales/langs/ko-KR/payment/common.json | 3 + .../locales/langs/zh-CN/payment/common.json | 3 + .../locales/langs/zh-HK/payment/common.json | 3 + .../locales/langs/zh-TW/payment/common.json | 3 + .../daxpay-admin/src/utils/pay-product-env.ts | 15 +++++ .../manage/AdapayDirectKeyConfigEdit.vue | 49 +++++++++------- .../mch/app/tabs/AlipayMchAppKeyConfig.vue | 58 +++++++++++-------- .../ums/manage/UmsDirectKeyConfigEdit.vue | 52 ++++++++++------- .../channel/ums/manage/UmsDirectMchManage.vue | 6 +- .../yeepay/config/YeepayKeyConfigEdit.vue | 28 +++++---- 13 files changed, 153 insertions(+), 77 deletions(-) create mode 100644 apps/daxpay-admin/src/locales/langs/en-US/payment/common.json create mode 100644 apps/daxpay-admin/src/locales/langs/ja-JP/payment/common.json create mode 100644 apps/daxpay-admin/src/locales/langs/ko-KR/payment/common.json create mode 100644 apps/daxpay-admin/src/locales/langs/zh-CN/payment/common.json create mode 100644 apps/daxpay-admin/src/locales/langs/zh-HK/payment/common.json create mode 100644 apps/daxpay-admin/src/locales/langs/zh-TW/payment/common.json create mode 100644 apps/daxpay-admin/src/utils/pay-product-env.ts diff --git a/apps/daxpay-admin/src/api/payment/order/gateway-order.api.ts b/apps/daxpay-admin/src/api/payment/order/gateway-order.api.ts index b656c1139..19c7e7e70 100644 --- a/apps/daxpay-admin/src/api/payment/order/gateway-order.api.ts +++ b/apps/daxpay-admin/src/api/payment/order/gateway-order.api.ts @@ -9,7 +9,9 @@ export const GatewayOrderApi = { /** * 分页查询网关业务订单 */ - page(params: GatewayOrderQuery & { current?: number; size?: number }): Promise>> { + page( + params: GatewayOrderQuery & { current?: number; size?: number }, + ): Promise>> { return defHttp.get({ url: '/admin/order/gateway-pay/page', params }); }, diff --git a/apps/daxpay-admin/src/locales/langs/en-US/payment/common.json b/apps/daxpay-admin/src/locales/langs/en-US/payment/common.json new file mode 100644 index 000000000..5eed55a55 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/en-US/payment/common.json @@ -0,0 +1,3 @@ +{ + "envFollowProductHint": "Follows the payment product setting. Switch the active environment in Product Configuration." +} diff --git a/apps/daxpay-admin/src/locales/langs/ja-JP/payment/common.json b/apps/daxpay-admin/src/locales/langs/ja-JP/payment/common.json new file mode 100644 index 000000000..3152c7708 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/ja-JP/payment/common.json @@ -0,0 +1,3 @@ +{ + "envFollowProductHint": "決済製品設定に従います。有効環境は「決済製品設定」で切り替えてください" +} diff --git a/apps/daxpay-admin/src/locales/langs/ko-KR/payment/common.json b/apps/daxpay-admin/src/locales/langs/ko-KR/payment/common.json new file mode 100644 index 000000000..88594d58e --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/ko-KR/payment/common.json @@ -0,0 +1,3 @@ +{ + "envFollowProductHint": "결제 상품 설정을 따릅니다. 유효 환경은 「결제 상품 설정」에서 전환하세요" +} diff --git a/apps/daxpay-admin/src/locales/langs/zh-CN/payment/common.json b/apps/daxpay-admin/src/locales/langs/zh-CN/payment/common.json new file mode 100644 index 000000000..5df7c71cf --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/zh-CN/payment/common.json @@ -0,0 +1,3 @@ +{ + "envFollowProductHint": "跟随支付产品配置,请在「支付产品配置」中切换生效环境" +} diff --git a/apps/daxpay-admin/src/locales/langs/zh-HK/payment/common.json b/apps/daxpay-admin/src/locales/langs/zh-HK/payment/common.json new file mode 100644 index 000000000..01e1337b3 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/zh-HK/payment/common.json @@ -0,0 +1,3 @@ +{ + "envFollowProductHint": "跟隨支付產品配置,請在「支付產品配置」中切換生效環境" +} diff --git a/apps/daxpay-admin/src/locales/langs/zh-TW/payment/common.json b/apps/daxpay-admin/src/locales/langs/zh-TW/payment/common.json new file mode 100644 index 000000000..01e1337b3 --- /dev/null +++ b/apps/daxpay-admin/src/locales/langs/zh-TW/payment/common.json @@ -0,0 +1,3 @@ +{ + "envFollowProductHint": "跟隨支付產品配置,請在「支付產品配置」中切換生效環境" +} diff --git a/apps/daxpay-admin/src/utils/pay-product-env.ts b/apps/daxpay-admin/src/utils/pay-product-env.ts new file mode 100644 index 000000000..e05a457aa --- /dev/null +++ b/apps/daxpay-admin/src/utils/pay-product-env.ts @@ -0,0 +1,15 @@ +import { PayProductConfigApi } from '#/api/payment/config/pay-product-config.api'; + +/** + * 读取支付产品当前生效环境是否为沙箱 + * 生效环境唯一真相源: pay_md_product_config.activeEnv + * 商户/密钥配置层禁止自行切换环境, 只能跟随产品 + */ +export async function resolveProductSandbox(product: string): Promise { + if (!product) { + return false; + } + const { data } = await PayProductConfigApi.listAll(); + const cfg = (data || []).find((item) => item.product === product); + return cfg?.activeEnv === 'sandbox'; +} diff --git a/apps/daxpay-admin/src/views/payment/channel/adapay/manage/AdapayDirectKeyConfigEdit.vue b/apps/daxpay-admin/src/views/payment/channel/adapay/manage/AdapayDirectKeyConfigEdit.vue index 4863b8668..09f97425b 100644 --- a/apps/daxpay-admin/src/views/payment/channel/adapay/manage/AdapayDirectKeyConfigEdit.vue +++ b/apps/daxpay-admin/src/views/payment/channel/adapay/manage/AdapayDirectKeyConfigEdit.vue @@ -5,9 +5,11 @@ import { AdapayDirectChannelMerchantApi, type AdapayDirectKeyConfig } from '#/api/payment/channel/adapay/channel-merchant.api'; import { PermCodes } from '#/constants/perm-codes'; + import { ProductEnum } from '#/enums/payment/productEnum'; import { useFormEdit } from '#/hooks/useFormEdit'; import { useMessage } from '#/hooks/useMessage'; import { usePermission } from '#/hooks/usePermission'; + import { resolveProductSandbox } from '#/utils/pay-product-env'; defineOptions({ name: 'AdapayDirectKeyConfigEdit' }); @@ -28,7 +30,7 @@ const form = ref({} as AdapayDirectKeyConfig); let rawForm: Record = {}; - // 是否沙箱环境 + // 跟随支付产品生效环境(只读, 禁止在密钥页切换) const sandbox = ref(false); const canEdit = computed(() => hasPermission(PermCodes.Channel.Merchant.MANAGE)); @@ -41,26 +43,27 @@ privateKey: [{ required: true, message: $t('payment.channel.adapay.validation.privateKey') }], }; - /** 打开抽屉并加载密钥配置 */ - function init() { + /** 打开抽屉并加载密钥配置(自动跟随产品生效环境) */ + async function init() { visible.value = true; - // 默认加载生产环境配置 - sandbox.value = false; resetForm(); - loadConfig(); + await loadConfig(); } - function loadConfig() { + async function loadConfig() { if (!props.channelMchNo) return; confirmLoading.value = true; - AdapayDirectChannelMerchantApi.findKeyConfig(props.channelMchNo, sandbox.value) - .then(({ data }) => { - rawForm = { ...data }; - form.value = { ...data } as AdapayDirectKeyConfig; - }) - .finally(() => { - confirmLoading.value = false; - }); + try { + sandbox.value = await resolveProductSandbox(ProductEnum.ADA_PAY); + const { data } = await AdapayDirectChannelMerchantApi.findKeyConfig( + props.channelMchNo, + sandbox.value, + ); + rawForm = { ...data }; + form.value = { ...data } as AdapayDirectKeyConfig; + } finally { + confirmLoading.value = false; + } } function handleOk() { @@ -116,12 +119,18 @@ > {{ $t('payment.channel.adapayManage.keyConfigSection') }} - + - - {{ $t('payment.channel.adapayManage.prodEnv') }} - {{ $t('payment.channel.adapayManage.sandboxEnv') }} - + + {{ + sandbox + ? $t('payment.channel.adapayManage.sandboxEnv') + : $t('payment.channel.adapayManage.prodEnv') + }} + + + {{ $t('payment.common.envFollowProductHint') }} + diff --git a/apps/daxpay-admin/src/views/payment/channel/alipay/manage/mch/app/tabs/AlipayMchAppKeyConfig.vue b/apps/daxpay-admin/src/views/payment/channel/alipay/manage/mch/app/tabs/AlipayMchAppKeyConfig.vue index 412e7582d..a58853e35 100644 --- a/apps/daxpay-admin/src/views/payment/channel/alipay/manage/mch/app/tabs/AlipayMchAppKeyConfig.vue +++ b/apps/daxpay-admin/src/views/payment/channel/alipay/manage/mch/app/tabs/AlipayMchAppKeyConfig.vue @@ -7,11 +7,13 @@ import { AlipayMchAppApi, type AlipayMchAppKeyConfig } from '#/api/payment/channel/alipay/mch-app.api'; import { PermCodes } from '#/constants/perm-codes'; + import { ProductEnum } from '#/enums/payment/productEnum'; import { useDict } from '#/hooks/useDict'; import { useFormEdit } from '#/hooks/useFormEdit'; import { useMessage } from '#/hooks/useMessage'; import { usePermission } from '#/hooks/usePermission'; import { readFileAsText } from '#/utils/file'; + import { resolveProductSandbox } from '#/utils/pay-product-env'; const props = defineProps<{ aliAppId?: string; @@ -28,7 +30,7 @@ const loading = ref(false); const saving = ref(false); const isEditing = ref(false); - // 是否沙箱环境 + // 跟随支付产品生效环境(只读, 禁止在密钥页切换) const sandbox = ref(false); const formRef = ref(); const formState = ref({ @@ -67,26 +69,30 @@ ], })); - /** 加载密钥配置 */ - function loadConfig() { + /** 加载密钥配置(自动跟随支付宝直连产品生效环境) */ + async function loadConfig() { if (!props.alipayDirectAppId) { return; } loading.value = true; - AlipayMchAppApi.findKeyConfigByAlipayDirectAppId(props.alipayDirectAppId, sandbox.value) - .then(({ data }) => { - formState.value = { - authType: 'public_key', - ...data, - alipayDirectAppId: props.alipayDirectAppId, - mchNo: props.mchNo, - channelMchNo: props.channelMchNo, - }; - originalForm.value = { ...formState.value }; - }) - .finally(() => { - loading.value = false; - }); + try { + // 环境由支付产品配置决定, 商户密钥页不可切换 + sandbox.value = await resolveProductSandbox(ProductEnum.ALIPAY); + const { data } = await AlipayMchAppApi.findKeyConfigByAlipayDirectAppId( + props.alipayDirectAppId, + sandbox.value, + ); + formState.value = { + authType: 'public_key', + ...data, + alipayDirectAppId: props.alipayDirectAppId, + mchNo: props.mchNo, + channelMchNo: props.channelMchNo, + }; + originalForm.value = { ...formState.value }; + } finally { + loading.value = false; + } } function handleEdit() { @@ -177,8 +183,6 @@ () => props.alipayDirectAppId, (alipayDirectAppId) => { if (alipayDirectAppId) { - // 切换应用默认加载生产环境配置 - sandbox.value = false; isEditing.value = false; loadConfig(); } @@ -221,12 +225,18 @@ > {{ $t('payment.channel.alipayIsv.basicConfig') }} - + - - {{ $t('payment.channel.alipayIsv.prodEnv') }} - {{ $t('payment.channel.alipayIsv.sandboxEnv') }} - + + {{ + sandbox + ? $t('payment.channel.alipayIsv.sandboxEnv') + : $t('payment.channel.alipayIsv.prodEnv') + }} + + + {{ $t('payment.common.envFollowProductHint') }} + diff --git a/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectKeyConfigEdit.vue b/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectKeyConfigEdit.vue index 654bde710..e71fe3580 100644 --- a/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectKeyConfigEdit.vue +++ b/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectKeyConfigEdit.vue @@ -8,11 +8,14 @@ import { useFormEdit } from '#/hooks/useFormEdit'; import { useMessage } from '#/hooks/useMessage'; import { usePermission } from '#/hooks/usePermission'; + import { resolveProductSandbox } from '#/utils/pay-product-env'; defineOptions({ name: 'UmsDirectKeyConfigEdit' }); const props = defineProps<{ channelMchNo: string; + /** 支付产品编码(银联商务多产品, 用于读取生效环境) */ + product?: string; }>(); const emit = defineEmits<{ @@ -28,7 +31,7 @@ const form = ref({} as UmsDirectKeyConfig); let rawForm: Record = {}; - // 是否沙箱环境 + // 跟随支付产品生效环境(只读, 禁止在密钥页切换) const sandbox = ref(false); const canEdit = computed(() => hasPermission(PermCodes.Channel.Merchant.MANAGE)); @@ -42,26 +45,29 @@ secretKey: [{ required: true, message: $t('payment.channel.ums.validation.secretKey') }], }; - /** 打开抽屉并加载密钥配置 */ - function init() { + /** 打开抽屉并加载密钥配置(自动跟随产品生效环境) */ + async function init() { visible.value = true; - // 默认加载生产环境配置 - sandbox.value = false; resetForm(); - loadConfig(); + await loadConfig(); } - function loadConfig() { + async function loadConfig() { if (!props.channelMchNo) return; confirmLoading.value = true; - UmsDirectChannelMerchantApi.findKeyConfig(props.channelMchNo, sandbox.value) - .then(({ data }) => { - rawForm = { ...data }; - form.value = { ...data } as UmsDirectKeyConfig; - }) - .finally(() => { - confirmLoading.value = false; - }); + try { + // 银联商务多产品, 优先用通道商户所属 product + const product = props.product || 'ums_qrcode'; + sandbox.value = await resolveProductSandbox(product); + const { data } = await UmsDirectChannelMerchantApi.findKeyConfig( + props.channelMchNo, + sandbox.value, + ); + rawForm = { ...data }; + form.value = { ...data } as UmsDirectKeyConfig; + } finally { + confirmLoading.value = false; + } } function handleOk() { @@ -117,12 +123,18 @@ > {{ $t('payment.channel.umsManage.keyConfigSection') }} - + - - {{ $t('payment.channel.umsManage.prodEnv') }} - {{ $t('payment.channel.umsManage.sandboxEnv') }} - + + {{ + sandbox + ? $t('payment.channel.umsManage.sandboxEnv') + : $t('payment.channel.umsManage.prodEnv') + }} + + + {{ $t('payment.common.envFollowProductHint') }} + diff --git a/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectMchManage.vue b/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectMchManage.vue index b42c78664..d9d0746e5 100644 --- a/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectMchManage.vue +++ b/apps/daxpay-admin/src/views/payment/channel/ums/manage/UmsDirectMchManage.vue @@ -153,7 +153,11 @@ - + diff --git a/apps/daxpay-admin/src/views/payment/channel/yeepay/config/YeepayKeyConfigEdit.vue b/apps/daxpay-admin/src/views/payment/channel/yeepay/config/YeepayKeyConfigEdit.vue index e4a0dff4e..3d9d88432 100644 --- a/apps/daxpay-admin/src/views/payment/channel/yeepay/config/YeepayKeyConfigEdit.vue +++ b/apps/daxpay-admin/src/views/payment/channel/yeepay/config/YeepayKeyConfigEdit.vue @@ -8,6 +8,7 @@ import { type YeepayDirectKeyConfigParam, } from '#/api/payment/channel/yeepay/channel-merchant.api'; import { useMessage } from '#/hooks/useMessage'; +import { resolveProductSandbox } from '#/utils/pay-product-env'; defineOptions({ name: 'YeepayKeyConfigEdit' }); @@ -19,7 +20,9 @@ const formRef = ref(); // 当前编辑的通道商户号 const channelMchNo = ref(''); -// 是否沙箱环境 +// 所属支付产品(用于读取生效环境) +const product = ref(''); +// 跟随支付产品生效环境(只读, 禁止在密钥页切换) const sandbox = ref(false); // 已配置标志(回显用) const configured = ref({ @@ -55,11 +58,12 @@ const rules = { ], }; -/** 由通用框架初始化(传入通道商户号后加载密钥配置并打开弹窗) */ -async function init(mchNo: string) { +/** 由通用框架初始化(传入通道商户号与产品编码后加载密钥配置并打开弹窗) */ +async function init(mchNo: string, productCode?: string) { channelMchNo.value = mchNo; - // 默认加载生产环境配置 - sandbox.value = false; + product.value = productCode || 'yee_pay'; + // 跟随支付产品生效环境 + sandbox.value = await resolveProductSandbox(product.value); visible.value = true; form.value = { channelMchNo: mchNo, @@ -73,7 +77,7 @@ async function init(mchNo: string) { await loadConfig(); } -/** 加载当前环境(生产/沙箱)的密钥配置(脱敏返回) */ +/** 加载当前产品生效环境对应的密钥配置(脱敏返回) */ async function loadConfig() { if (!channelMchNo.value) return; const { data } = await YeepayChannelMerchantApi.findKeyConfig(channelMchNo.value, sandbox.value); @@ -113,12 +117,14 @@ defineExpose({ init }); @ok="handleSubmit" > - + - - {{ $t('payment.channel.yeepay.prodEnv') }} - {{ $t('payment.channel.yeepay.sandboxEnv') }} - + + {{ sandbox ? $t('payment.channel.yeepay.sandboxEnv') : $t('payment.channel.yeepay.prodEnv') }} + + + {{ $t('payment.common.envFollowProductHint') }} +