From 4319fedece8600657b9d1a0b84e481b14039d8f3 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Sun, 14 Jun 2026 21:48:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=BE=AE=E4=BF=A1=E9=80=9A?= =?UTF-8?q?=E9=81=93=E6=8C=89=20ISV/=E7=9B=B4=E8=BF=9E=E6=8B=86=E5=88=86?= =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=8C=E8=B0=83=E6=95=B4=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=AE=9D=E9=80=9A=E9=81=93=E5=95=86=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 微信:新增 WechatDirectChannelMerchant / WechatIsvChannelMerchant 直连与服务商通道商户,目录按 direct/isv 重组,枚举移至 code 包 --- _config/sql/update-tables.sql | 235 ++++++++++++++++++ .../AlipayDirectAppAuthConfigConvert.java | 2 +- .../{ => direct}/AlipayDirectAppConvert.java | 2 +- .../AlipayDirectAppKeyConfigConvert.java | 2 +- .../AlipayDirectChannelMerchantConvert.java | 2 +- .../AlipayIsvAppAuthConfigConvert.java | 2 +- .../{ => isv}/AlipayIsvAppConvert.java | 2 +- .../AlipayIsvAppKeyConfigConvert.java | 2 +- .../AlipayIsvChannelMerchantConvert.java | 5 +- .../isv/AlipayIsvChannelMerchantManager.java | 4 +- .../alipay/entity/direct/AlipayDirectApp.java | 2 +- .../direct/AlipayDirectAppAuthConfig.java | 2 +- .../direct/AlipayDirectAppKeyConfig.java | 2 +- .../direct/AlipayDirectChannelMerchant.java | 2 +- .../alipay/entity/isv/AlipayIsvApp.java | 2 +- .../entity/isv/AlipayIsvAppAuthConfig.java | 2 +- .../entity/isv/AlipayIsvAppKeyConfig.java | 2 +- .../entity/isv/AlipayIsvChannelMerchant.java | 4 +- .../AlipayIsvChannelMerchantCreateParam.java | 2 +- .../isv/AlipayIsvChannelMerchantResult.java | 1 - .../AlipayDirectAppAuthConfigService.java | 2 +- .../AlipayDirectAppKeyConfigService.java | 26 +- .../direct/AlipayDirectAppService.java | 2 +- .../isv/AlipayIsvAppAuthConfigService.java | 2 +- .../isv/AlipayIsvAppKeyConfigService.java | 26 +- .../service/isv/AlipayIsvAppService.java | 2 +- .../isv/AlipayIsvChannelMerchantService.java | 10 +- .../{enums => code}/WechatAuthTypeEnum.java | 2 +- .../{enums => code}/WechatIsvAppTypeEnum.java | 2 +- ...WechatDirectChannelMerchantController.java | 47 ++++ .../{app => isv}/WechatIsvAppController.java | 14 +- .../WechatIsvChannelMerchantController.java | 47 ++++ .../WechatIsvKeyConfigController.java | 8 +- .../WechatDirectChannelMerchantConvert.java | 16 ++ .../WechatIsvAppAuthConfigConvert.java | 8 +- .../{ => isv}/WechatIsvAppConvert.java | 8 +- .../isv/WechatIsvChannelMerchantConvert.java | 16 ++ .../{ => isv}/WechatIsvKeyConfigConvert.java | 8 +- .../WechatDirectChannelMerchantManager.java | 19 ++ .../WechatDirectChannelMerchantMapper.java | 13 + .../WechatIsvAppAuthConfigManager.java | 4 +- .../WechatIsvAppAuthConfigMapper.java | 4 +- .../dao/{app => isv}/WechatIsvAppManager.java | 4 +- .../dao/{app => isv}/WechatIsvAppMapper.java | 4 +- .../isv/WechatIsvChannelMerchantManager.java | 19 ++ .../isv/WechatIsvChannelMerchantMapper.java | 13 + .../WechatIsvKeyConfigManager.java | 4 +- .../WechatIsvKeyConfigMapper.java | 4 +- .../direct/WechatDirectChannelMerchant.java | 37 +++ .../entity/{app => isv}/WechatIsvApp.java | 6 +- .../WechatIsvAppAuthConfig.java | 6 +- .../entity/isv/WechatIsvChannelMerchant.java | 38 +++ .../{config => isv}/WechatIsvKeyConfig.java | 6 +- ...echatDirectChannelMerchantCreateParam.java | 34 +++ .../WechatIsvAppAuthConfigParam.java | 2 +- .../param/{app => isv}/WechatIsvAppParam.java | 2 +- .../WechatIsvChannelMerchantCreateParam.java | 34 +++ .../WechatIsvKeyConfigParam.java | 2 +- .../WechatDirectChannelMerchantResult.java | 27 ++ .../WechatIsvAppAuthConfigResult.java | 2 +- .../{app => isv}/WechatIsvAppResult.java | 2 +- .../isv/WechatIsvChannelMerchantResult.java | 27 ++ .../WechatIsvKeyConfigResult.java | 2 +- .../WechatDirectChannelMerchantService.java | 67 +++++ .../WechatIsvAppAuthConfigService.java | 23 +- .../{app => isv}/WechatIsvAppService.java | 16 +- .../isv/WechatIsvChannelMerchantService.java | 68 +++++ .../WechatIsvKeyConfigService.java | 31 +-- .../config/MerchantCredentialConvert.java | 3 + .../strategy/PayRouteStrategyConvert.java | 9 + .../route/facade/PayRouteConfigService.java | 15 +- .../i18n/en-US/error/channel/wechat.json | 4 +- .../i18n/zh-CN/error/channel/wechat.json | 4 +- 73 files changed, 888 insertions(+), 192 deletions(-) create mode 100644 _config/sql/update-tables.sql rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => direct}/AlipayDirectAppAuthConfigConvert.java (95%) rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => direct}/AlipayDirectAppConvert.java (94%) rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => direct}/AlipayDirectAppKeyConfigConvert.java (95%) rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => direct}/AlipayDirectChannelMerchantConvert.java (90%) rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => isv}/AlipayIsvAppAuthConfigConvert.java (95%) rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => isv}/AlipayIsvAppConvert.java (94%) rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => isv}/AlipayIsvAppKeyConfigConvert.java (95%) rename daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/{ => isv}/AlipayIsvChannelMerchantConvert.java (68%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/{enums => code}/WechatAuthTypeEnum.java (91%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/{enums => code}/WechatIsvAppTypeEnum.java (92%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/direct/WechatDirectChannelMerchantController.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/{app => isv}/WechatIsvAppController.java (90%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvChannelMerchantController.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/{config => isv}/WechatIsvKeyConfigController.java (83%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/direct/WechatDirectChannelMerchantConvert.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/{ => isv}/WechatIsvAppAuthConfigConvert.java (74%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/{ => isv}/WechatIsvAppConvert.java (69%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvChannelMerchantConvert.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/{ => isv}/WechatIsvKeyConfigConvert.java (74%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantManager.java create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantMapper.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/{config => isv}/WechatIsvAppAuthConfigManager.java (86%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/{config => isv}/WechatIsvAppAuthConfigMapper.java (65%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/{app => isv}/WechatIsvAppManager.java (91%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/{app => isv}/WechatIsvAppMapper.java (64%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantManager.java create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantMapper.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/{config => isv}/WechatIsvKeyConfigManager.java (84%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/{config => isv}/WechatIsvKeyConfigMapper.java (63%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/direct/WechatDirectChannelMerchant.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/{app => isv}/WechatIsvApp.java (84%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/{config => isv}/WechatIsvAppAuthConfig.java (85%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvChannelMerchant.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/{config => isv}/WechatIsvKeyConfig.java (88%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/direct/WechatDirectChannelMerchantCreateParam.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/{config => isv}/WechatIsvAppAuthConfigParam.java (93%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/{app => isv}/WechatIsvAppParam.java (95%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvChannelMerchantCreateParam.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/{config => isv}/WechatIsvKeyConfigParam.java (95%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/direct/WechatDirectChannelMerchantResult.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/{config => isv}/WechatIsvAppAuthConfigResult.java (94%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/{app => isv}/WechatIsvAppResult.java (91%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvChannelMerchantResult.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/{config => isv}/WechatIsvKeyConfigResult.java (95%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/direct/WechatDirectChannelMerchantService.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/{config => isv}/WechatIsvAppAuthConfigService.java (80%) rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/{app => isv}/WechatIsvAppService.java (86%) create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvChannelMerchantService.java rename daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/{config => isv}/WechatIsvKeyConfigService.java (67%) diff --git a/_config/sql/update-tables.sql b/_config/sql/update-tables.sql new file mode 100644 index 000000000..b58fa8fd3 --- /dev/null +++ b/_config/sql/update-tables.sql @@ -0,0 +1,235 @@ +-- ===================================================================== +-- 微信服务商相关表 (DROP + CREATE 重建) +-- 对应实体: +-- org.dromara.daxpay.channel.wechat.entity.app.WechatIsvApp +-- org.dromara.daxpay.channel.wechat.entity.config.WechatIsvKeyConfig +-- org.dromara.daxpay.channel.wechat.entity.config.WechatIsvAppAuthConfig +-- org.dromara.daxpay.channel.wechat.entity.mch.WechatIsvChannelMerchant +-- 执行方式: 手动执行(业务表 DDL 不入库, 由开发者按需在数据库执行) +-- 注意: 加密字段(DataEncryptTypeHandler)在数据库层均为普通 text, 加解密在应用层完成 +-- ===================================================================== + +-- ========================= +-- 1. 微信服务商应用 wechat_isv_app +-- ========================= +DROP TABLE IF EXISTS "public"."wechat_isv_app"; + +CREATE TABLE "public"."wechat_isv_app" ( + "id" int8 NOT NULL, + "app_name" varchar(64), + "app_type" varchar(32), + "wx_app_id" varchar(64), + "creator" int8, + "create_time" timestamptz(6), + "last_modifier" int8, + "last_modified_time" timestamptz(6), + "version" int4 DEFAULT 0 NOT NULL, + "deleted" bool DEFAULT false NOT NULL +); + +COMMENT ON TABLE "public"."wechat_isv_app" IS '微信服务商应用'; +COMMENT ON COLUMN "public"."wechat_isv_app"."id" IS '主键'; +COMMENT ON COLUMN "public"."wechat_isv_app"."app_name" IS '应用名称'; +COMMENT ON COLUMN "public"."wechat_isv_app"."app_type" IS '应用类型'; +COMMENT ON COLUMN "public"."wechat_isv_app"."wx_app_id" IS '微信应用AppId'; +COMMENT ON COLUMN "public"."wechat_isv_app"."creator" IS '创建人'; +COMMENT ON COLUMN "public"."wechat_isv_app"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."wechat_isv_app"."last_modifier" IS '最后修改人'; +COMMENT ON COLUMN "public"."wechat_isv_app"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."wechat_isv_app"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."wechat_isv_app"."deleted" IS '逻辑删除标志'; + +ALTER TABLE "public"."wechat_isv_app" + ADD CONSTRAINT "pk_wechat_isv_app" PRIMARY KEY ("id"); + +CREATE UNIQUE INDEX IF NOT EXISTS "uk_wechat_isv_app_wx_app_id" + ON "public"."wechat_isv_app" ("wx_app_id") + WHERE "deleted" = false; + + +-- ========================= +-- 2. 微信服务商密钥配置 wechat_isv_key_config +-- ========================= +DROP TABLE IF EXISTS "public"."wechat_isv_key_config"; + +CREATE TABLE "public"."wechat_isv_key_config" ( + "id" int8 NOT NULL, + "product" varchar(32), + "wx_mch_id" varchar(32), + "api_key_v3" text, + "public_key" text, + "public_key_id" varchar(64), + "private_key" text, + "private_cert" text, + "cert_serial_no" varchar(128), + "creator" int8, + "create_time" timestamptz(6), + "last_modifier" int8, + "last_modified_time" timestamptz(6), + "version" int4 DEFAULT 0 NOT NULL, + "deleted" bool DEFAULT false NOT NULL +); + +COMMENT ON TABLE "public"."wechat_isv_key_config" IS '微信服务商密钥配置'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."product" IS '产品编码'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."wx_mch_id" IS '微信服务商商户号'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."api_key_v3" IS 'APIv3密钥(加密存储)'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."public_key" IS '支付公钥(加密存储)'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."public_key_id" IS '支付公钥ID'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."private_key" IS 'apiclient_key证书(加密存储)'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."private_cert" IS 'apiclient_cert证书(加密存储)'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."cert_serial_no" IS '证书序列号'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."creator" IS '创建人'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."last_modifier" IS '最后修改人'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."wechat_isv_key_config"."deleted" IS '逻辑删除标志'; + +ALTER TABLE "public"."wechat_isv_key_config" + ADD CONSTRAINT "pk_wechat_isv_key_config" PRIMARY KEY ("id"); + +-- 密钥配置按产品全局唯一(平台为唯一服务商) +CREATE UNIQUE INDEX IF NOT EXISTS "uk_wechat_isv_key_config_product" + ON "public"."wechat_isv_key_config" ("product") + WHERE "deleted" = false; + + +-- ========================= +-- 3. 微信服务商应用授权认证配置 wechat_isv_app_auth_config +-- ========================= +DROP TABLE IF EXISTS "public"."wechat_isv_app_auth_config"; + +CREATE TABLE "public"."wechat_isv_app_auth_config" ( + "id" int8 NOT NULL, + "app_id" int8, + "app_secret" text, + "auth_callback_url" varchar(255), + "creator" int8, + "create_time" timestamptz(6), + "last_modifier" int8, + "last_modified_time" timestamptz(6), + "version" int4 DEFAULT 0 NOT NULL, + "deleted" bool DEFAULT false NOT NULL +); + +COMMENT ON TABLE "public"."wechat_isv_app_auth_config" IS '微信服务商应用授权认证配置'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."app_id" IS '微信服务商应用ID(指向 wechat_isv_app.id)'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."app_secret" IS '应用密钥(加密存储)'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."auth_callback_url" IS '授权回调地址'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."creator" IS '创建人'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."last_modifier" IS '最后修改人'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."wechat_isv_app_auth_config"."deleted" IS '逻辑删除标志'; + +ALTER TABLE "public"."wechat_isv_app_auth_config" + ADD CONSTRAINT "pk_wechat_isv_app_auth_config" PRIMARY KEY ("id"); + +-- 一个应用只有一条授权认证配置 +CREATE UNIQUE INDEX IF NOT EXISTS "uk_wechat_isv_app_auth_config_app_id" + ON "public"."wechat_isv_app_auth_config" ("app_id") + WHERE "deleted" = false; + + +-- ========================= +-- 4. 微信服务商通道商户绑定 mch_wechat_isv_channel_merchant +-- 微信特约商户关联到服务商本身(服务商密钥全局唯一), 不挂靠具体服务商应用 +-- ========================= +DROP TABLE IF EXISTS "public"."mch_wechat_isv_channel_merchant"; + +CREATE TABLE "public"."mch_wechat_isv_channel_merchant" ( + "id" int8 NOT NULL, + "mch_no" varchar(32) NOT NULL, + "channel_mch_no" varchar(64) NOT NULL, + "product" varchar(32) NOT NULL, + "sub_mch_id" varchar(64) NOT NULL, + "creator" int8, + "create_time" timestamptz(6), + "last_modifier" int8, + "last_modified_time" timestamptz(6), + "version" int4 DEFAULT 0 NOT NULL, + "deleted" bool DEFAULT false NOT NULL +); + +COMMENT ON TABLE "public"."mch_wechat_isv_channel_merchant" IS '微信服务商通道商户绑定'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."id" IS '主键'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."mch_no" IS '商户号'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."channel_mch_no" IS '通道商户号(WISV+雪花)'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."product" IS '所属支付产品'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."sub_mch_id" IS '微信特约商户号/二级商户号(V3 sub_mchid)'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."creator" IS '创建人'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."last_modifier" IS '最后修改人'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."mch_wechat_isv_channel_merchant"."deleted" IS '逻辑删除标志'; + +ALTER TABLE "public"."mch_wechat_isv_channel_merchant" + ADD CONSTRAINT "pk_mch_wechat_isv_channel_merchant" PRIMARY KEY ("id"); + +-- 唯一索引: 同一商户下特约商户号不重复(逻辑删除场景排除已删除记录) +CREATE UNIQUE INDEX IF NOT EXISTS "uk_wechat_isv_cm_mchno_submch" + ON "public"."mch_wechat_isv_channel_merchant" ("mch_no", "sub_mch_id") + WHERE "deleted" = false; + +-- 普通索引: 按通道商户号查询 +CREATE INDEX IF NOT EXISTS "idx_wechat_isv_cm_channel_mch_no" + ON "public"."mch_wechat_isv_channel_merchant" ("channel_mch_no"); + +-- 普通索引: 按商户号查询 +CREATE INDEX IF NOT EXISTS "idx_wechat_isv_cm_mch_no" + ON "public"."mch_wechat_isv_channel_merchant" ("mch_no"); + + +-- ========================= +-- 5. 微信直连通道商户绑定 mch_wechat_direct_channel_merchant +-- 一个微信商户号(wxMchId)对应一个 channelMchNo, 商户的多个应用共享此绑定 +-- ========================= +DROP TABLE IF EXISTS "public"."mch_wechat_direct_channel_merchant"; + +CREATE TABLE "public"."mch_wechat_direct_channel_merchant" ( + "id" int8 NOT NULL, + "mch_no" varchar(32) NOT NULL, + "channel_mch_no" varchar(64) NOT NULL, + "product" varchar(32) NOT NULL, + "wx_mch_id" varchar(32) NOT NULL, + "creator" int8, + "create_time" timestamptz(6), + "last_modifier" int8, + "last_modified_time" timestamptz(6), + "version" int4 DEFAULT 0 NOT NULL, + "deleted" bool DEFAULT false NOT NULL +); + +COMMENT ON TABLE "public"."mch_wechat_direct_channel_merchant" IS '微信直连通道商户绑定'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."id" IS '主键'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."mch_no" IS '商户号'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."channel_mch_no" IS '通道商户号(系统生成雪花号)'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."product" IS '所属支付产品'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."wx_mch_id" IS '微信直连商户号'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."creator" IS '创建人'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."last_modifier" IS '最后修改人'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."mch_wechat_direct_channel_merchant"."deleted" IS '逻辑删除标志'; + +ALTER TABLE "public"."mch_wechat_direct_channel_merchant" + ADD CONSTRAINT "pk_mch_wechat_direct_channel_merchant" PRIMARY KEY ("id"); + +-- 唯一索引: 同一商户下微信商户号不重复(逻辑删除场景排除已删除记录) +CREATE UNIQUE INDEX IF NOT EXISTS "uk_wechat_direct_cm_mchno_wxmchid" + ON "public"."mch_wechat_direct_channel_merchant" ("mch_no", "wx_mch_id") + WHERE "deleted" = false; + +-- 普通索引: 按通道商户号查询 +CREATE INDEX IF NOT EXISTS "idx_wechat_direct_cm_channel_mch_no" + ON "public"."mch_wechat_direct_channel_merchant" ("channel_mch_no"); + +-- 普通索引: 按商户号查询 +CREATE INDEX IF NOT EXISTS "idx_wechat_direct_cm_mch_no" + ON "public"."mch_wechat_direct_channel_merchant" ("mch_no"); diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppAuthConfigConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppAuthConfigConvert.java similarity index 95% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppAuthConfigConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppAuthConfigConvert.java index 0f029200c..c3875e108 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppAuthConfigConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppAuthConfigConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.direct; import org.dromara.daxpay.channel.alipay.entity.direct.AlipayDirectAppAuthConfig; import org.dromara.daxpay.channel.alipay.param.direct.AlipayDirectAppAuthConfigParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppConvert.java similarity index 94% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppConvert.java index b6fb27303..f17371b0e 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.direct; import org.dromara.daxpay.channel.alipay.entity.direct.AlipayDirectApp; import org.dromara.daxpay.channel.alipay.param.direct.AlipayDirectAppParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppKeyConfigConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppKeyConfigConvert.java similarity index 95% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppKeyConfigConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppKeyConfigConvert.java index b5c983c21..16291713f 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectAppKeyConfigConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectAppKeyConfigConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.direct; import org.dromara.daxpay.channel.alipay.entity.direct.AlipayDirectAppKeyConfig; import org.dromara.daxpay.channel.alipay.param.direct.AlipayDirectAppKeyConfigParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectChannelMerchantConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectChannelMerchantConvert.java similarity index 90% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectChannelMerchantConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectChannelMerchantConvert.java index bf169240f..e0c4664d1 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayDirectChannelMerchantConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/direct/AlipayDirectChannelMerchantConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.direct; import org.dromara.daxpay.channel.alipay.entity.direct.AlipayDirectChannelMerchant; import org.dromara.daxpay.channel.alipay.result.direct.AlipayDirectChannelMerchantResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppAuthConfigConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppAuthConfigConvert.java similarity index 95% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppAuthConfigConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppAuthConfigConvert.java index c99bc737a..1a6b9a024 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppAuthConfigConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppAuthConfigConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.isv; import org.dromara.daxpay.channel.alipay.entity.isv.AlipayIsvAppAuthConfig; import org.dromara.daxpay.channel.alipay.param.isv.AlipayIsvAppAuthConfigParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppConvert.java similarity index 94% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppConvert.java index 65f5032ce..f811070b4 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.isv; import org.dromara.daxpay.channel.alipay.entity.isv.AlipayIsvApp; import org.dromara.daxpay.channel.alipay.param.isv.AlipayIsvAppParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppKeyConfigConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppKeyConfigConvert.java similarity index 95% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppKeyConfigConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppKeyConfigConvert.java index 65bdfa02a..a141eac7b 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvAppKeyConfigConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvAppKeyConfigConvert.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.isv; import org.dromara.daxpay.channel.alipay.entity.isv.AlipayIsvAppKeyConfig; import org.dromara.daxpay.channel.alipay.param.isv.AlipayIsvAppKeyConfigParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvChannelMerchantConvert.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvChannelMerchantConvert.java similarity index 68% rename from daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvChannelMerchantConvert.java rename to daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvChannelMerchantConvert.java index 3ee1f025e..7e90c9353 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/AlipayIsvChannelMerchantConvert.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/convert/isv/AlipayIsvChannelMerchantConvert.java @@ -1,9 +1,8 @@ -package org.dromara.daxpay.channel.alipay.convert; +package org.dromara.daxpay.channel.alipay.convert.isv; import org.dromara.daxpay.channel.alipay.entity.isv.AlipayIsvChannelMerchant; import org.dromara.daxpay.channel.alipay.result.isv.AlipayIsvChannelMerchantResult; import org.mapstruct.Mapper; -import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; /// # 支付宝服务商通道商户绑定转换 @@ -13,7 +12,5 @@ public interface AlipayIsvChannelMerchantConvert { AlipayIsvChannelMerchantConvert CONVERT = Mappers.getMapper(AlipayIsvChannelMerchantConvert.class); - /// 实体 appId(Long) 映射到结果 isvAppId(Long), 避免与父类 MchTradeBaseResult.appId(String) 冲突 - @Mapping(source = "appId", target = "isvAppId") AlipayIsvChannelMerchantResult toResult(AlipayIsvChannelMerchant entity); } diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/isv/AlipayIsvChannelMerchantManager.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/isv/AlipayIsvChannelMerchantManager.java index bf9c7c176..ae1287a52 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/isv/AlipayIsvChannelMerchantManager.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/dao/isv/AlipayIsvChannelMerchantManager.java @@ -10,9 +10,9 @@ import org.springframework.stereotype.Repository; public class AlipayIsvChannelMerchantManager extends BaseManager { /// 校验同一服务商应用下是否已绑定该子商户 - public boolean existsByAppIdAndAlipayUserId(Long appId, String alipayUserId) { + public boolean existsByIsvAppIdAndAlipayUserId(Long isvAppId, String alipayUserId) { return lambdaQuery() - .eq(AlipayIsvChannelMerchant::getAppId, appId) + .eq(AlipayIsvChannelMerchant::getIsvAppId, isvAppId) .eq(AlipayIsvChannelMerchant::getAlipayUserId, alipayUserId) .exists(); } diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectApp.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectApp.java index 147ef5a11..3aef7e1b1 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectApp.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectApp.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.direct; -import org.dromara.daxpay.channel.alipay.convert.AlipayDirectAppConvert; +import org.dromara.daxpay.channel.alipay.convert.direct.AlipayDirectAppConvert; import org.dromara.daxpay.channel.alipay.result.direct.AlipayDirectAppResult; import org.dromara.daxpay.payment.common.entity.merchant.MchBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppAuthConfig.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppAuthConfig.java index 031d295cf..1cc3838b1 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppAuthConfig.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppAuthConfig.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.direct; -import org.dromara.daxpay.channel.alipay.convert.AlipayDirectAppAuthConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.direct.AlipayDirectAppAuthConfigConvert; import org.dromara.daxpay.channel.alipay.result.direct.AlipayDirectAppAuthConfigResult; import org.dromara.daxpay.payment.common.entity.merchant.MchBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppKeyConfig.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppKeyConfig.java index 2eddfca2a..9bf220245 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppKeyConfig.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectAppKeyConfig.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.direct; -import org.dromara.daxpay.channel.alipay.convert.AlipayDirectAppKeyConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.direct.AlipayDirectAppKeyConfigConvert; import org.dromara.daxpay.channel.alipay.result.direct.AlipayDirectAppKeyConfigResult; import org.dromara.daxpay.payment.common.entity.merchant.MchBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectChannelMerchant.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectChannelMerchant.java index dc72f1dc3..fcae36e2f 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectChannelMerchant.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/direct/AlipayDirectChannelMerchant.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.direct; -import org.dromara.daxpay.channel.alipay.convert.AlipayDirectChannelMerchantConvert; +import org.dromara.daxpay.channel.alipay.convert.direct.AlipayDirectChannelMerchantConvert; import org.dromara.daxpay.channel.alipay.result.direct.AlipayDirectChannelMerchantResult; import org.dromara.daxpay.payment.common.entity.merchant.MchBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvApp.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvApp.java index ee06ae0a1..b3a605edf 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvApp.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvApp.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.isv; -import org.dromara.daxpay.channel.alipay.convert.AlipayIsvAppConvert; +import org.dromara.daxpay.channel.alipay.convert.isv.AlipayIsvAppConvert; import org.dromara.daxpay.channel.alipay.result.isv.AlipayIsvAppResult; import org.dromara.daxpay.platform.common.mybatisplus.base.MpBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppAuthConfig.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppAuthConfig.java index 2a35ff2b7..93005d8c6 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppAuthConfig.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppAuthConfig.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.isv; -import org.dromara.daxpay.channel.alipay.convert.AlipayIsvAppAuthConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.isv.AlipayIsvAppAuthConfigConvert; import org.dromara.daxpay.channel.alipay.result.isv.AlipayIsvAppAuthConfigResult; import org.dromara.daxpay.platform.common.mybatisplus.base.MpBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppKeyConfig.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppKeyConfig.java index 72205cfbb..18fea59af 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppKeyConfig.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvAppKeyConfig.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.isv; -import org.dromara.daxpay.channel.alipay.convert.AlipayIsvAppKeyConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.isv.AlipayIsvAppKeyConfigConvert; import org.dromara.daxpay.channel.alipay.result.isv.AlipayIsvAppKeyConfigResult; import org.dromara.daxpay.platform.common.mybatisplus.base.MpBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvChannelMerchant.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvChannelMerchant.java index b448452b0..c70db66b0 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvChannelMerchant.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/entity/isv/AlipayIsvChannelMerchant.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.entity.isv; -import org.dromara.daxpay.channel.alipay.convert.AlipayIsvChannelMerchantConvert; +import org.dromara.daxpay.channel.alipay.convert.isv.AlipayIsvChannelMerchantConvert; import org.dromara.daxpay.channel.alipay.result.isv.AlipayIsvChannelMerchantResult; import org.dromara.daxpay.payment.common.entity.merchant.MchBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; @@ -28,7 +28,7 @@ public class AlipayIsvChannelMerchant extends MchBaseEntity implements ToResult< private String product; /// 关联服务商应用ID(系统主键, 指向 alipay_isv_app.id) - private Long appId; + private Long isvAppId; /// 子商户支付宝识别码(2088开头的16位数字) private String alipayUserId; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/isv/AlipayIsvChannelMerchantCreateParam.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/isv/AlipayIsvChannelMerchantCreateParam.java index 715c01e0c..d09c607d4 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/isv/AlipayIsvChannelMerchantCreateParam.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/param/isv/AlipayIsvChannelMerchantCreateParam.java @@ -31,7 +31,7 @@ public class AlipayIsvChannelMerchantCreateParam { /// 服务商应用ID(系统主键, 指向 alipay_isv_app.id) @Schema(description = "服务商应用ID") @NotNull(message = "{validation.field.appId.notNull}") - private Long appId; + private Long isvAppId; /// 子商户支付宝用户ID(2088开头) @Schema(description = "子商户支付宝用户ID(2088开头)") diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/isv/AlipayIsvChannelMerchantResult.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/isv/AlipayIsvChannelMerchantResult.java index fbe796d83..2fab2d7a7 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/isv/AlipayIsvChannelMerchantResult.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/result/isv/AlipayIsvChannelMerchantResult.java @@ -22,7 +22,6 @@ public class AlipayIsvChannelMerchantResult extends MchTradeBaseResult { @Schema(description = "所属支付产品") private String product; - /// 注意: 此处用 isvAppId(Long) 而非 appId, 避免与父类 MchTradeBaseResult.appId(String) 字段冲突 @Schema(description = "关联服务商应用ID(系统主键)") private Long isvAppId; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppAuthConfigService.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppAuthConfigService.java index 61ae337be..b56bb78ba 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppAuthConfigService.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppAuthConfigService.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.service.direct; import org.dromara.daxpay.channel.alipay.code.AlipayCode; -import org.dromara.daxpay.channel.alipay.convert.AlipayDirectAppAuthConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.direct.AlipayDirectAppAuthConfigConvert; import org.dromara.daxpay.channel.alipay.dao.direct.AlipayDirectAppManager; import org.dromara.daxpay.channel.alipay.dao.direct.AlipayDirectAppAuthConfigManager; import org.dromara.daxpay.channel.alipay.entity.direct.AlipayDirectApp; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppKeyConfigService.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppKeyConfigService.java index edcb5a8a2..5b9c3c5b8 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppKeyConfigService.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppKeyConfigService.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.service.direct; import org.dromara.daxpay.channel.alipay.code.AlipayCode; -import org.dromara.daxpay.channel.alipay.convert.AlipayDirectAppKeyConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.direct.AlipayDirectAppKeyConfigConvert; import org.dromara.daxpay.channel.alipay.dao.direct.AlipayDirectAppManager; import org.dromara.daxpay.channel.alipay.dao.direct.AlipayDirectAppKeyConfigManager; import org.dromara.daxpay.channel.alipay.entity.direct.AlipayDirectApp; @@ -54,7 +54,7 @@ public class AlipayDirectAppKeyConfigService { if (existing.isPresent()) { AlipayDirectAppKeyConfig config = existing.get(); config.setAuthType(param.getAuthType()); - this.mergeSensitiveFields(config, param); + AlipayDirectAppKeyConfigConvert.CONVERT.copy(param, config); alipayDirectAppKeyConfigManager.updateById(config); return; } @@ -71,28 +71,6 @@ public class AlipayDirectAppKeyConfigService { alipayDirectAppKeyConfigManager.deleteByAppId(appId); } - /// 合并敏感字段,空值表示不更新 - private void mergeSensitiveFields(AlipayDirectAppKeyConfig config, AlipayDirectAppKeyConfigParam param) { - if (StrUtil.isNotBlank(param.getAlipayPublicKey())) { - config.setAlipayPublicKey(param.getAlipayPublicKey()); - } - if (StrUtil.isNotBlank(param.getPrivateKey())) { - config.setPrivateKey(param.getPrivateKey()); - } - if (StrUtil.isNotBlank(param.getAppCert())) { - config.setAppCert(param.getAppCert()); - } - if (StrUtil.isNotBlank(param.getAlipayCert())) { - config.setAlipayCert(param.getAlipayCert()); - } - if (StrUtil.isNotBlank(param.getAlipayRootCert())) { - config.setAlipayRootCert(param.getAlipayRootCert()); - } - if (StrUtil.isNotBlank(param.getSecretKey())) { - config.setSecretKey(param.getSecretKey()); - } - } - /// 新增时的条件校验 private void validateForCreate(AlipayDirectAppKeyConfigParam param) { if (StrUtil.isBlank(param.getPrivateKey())) { diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppService.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppService.java index 0b61ed010..c85321096 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppService.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/direct/AlipayDirectAppService.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.service.direct; -import org.dromara.daxpay.channel.alipay.convert.AlipayDirectAppConvert; +import org.dromara.daxpay.channel.alipay.convert.direct.AlipayDirectAppConvert; import org.dromara.daxpay.channel.alipay.dao.direct.AlipayDirectAppManager; import org.dromara.daxpay.channel.alipay.entity.direct.AlipayDirectApp; import org.dromara.daxpay.channel.alipay.param.direct.AlipayDirectAppParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppAuthConfigService.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppAuthConfigService.java index 1219c51a7..d359ce351 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppAuthConfigService.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppAuthConfigService.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.service.isv; import org.dromara.daxpay.channel.alipay.code.AlipayCode; -import org.dromara.daxpay.channel.alipay.convert.AlipayIsvAppAuthConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.isv.AlipayIsvAppAuthConfigConvert; import org.dromara.daxpay.channel.alipay.dao.isv.AlipayIsvAppManager; import org.dromara.daxpay.channel.alipay.dao.isv.AlipayIsvAppAuthConfigManager; import org.dromara.daxpay.channel.alipay.entity.isv.AlipayIsvAppAuthConfig; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppKeyConfigService.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppKeyConfigService.java index 679268644..4798dd4f4 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppKeyConfigService.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppKeyConfigService.java @@ -1,7 +1,7 @@ package org.dromara.daxpay.channel.alipay.service.isv; import org.dromara.daxpay.channel.alipay.code.AlipayCode; -import org.dromara.daxpay.channel.alipay.convert.AlipayIsvAppKeyConfigConvert; +import org.dromara.daxpay.channel.alipay.convert.isv.AlipayIsvAppKeyConfigConvert; import org.dromara.daxpay.channel.alipay.dao.isv.AlipayIsvAppManager; import org.dromara.daxpay.channel.alipay.dao.isv.AlipayIsvAppKeyConfigManager; import org.dromara.daxpay.channel.alipay.entity.isv.AlipayIsvAppKeyConfig; @@ -48,7 +48,7 @@ public class AlipayIsvAppKeyConfigService { if (existing.isPresent()) { AlipayIsvAppKeyConfig config = existing.get(); config.setAuthType(param.getAuthType()); - this.mergeSensitiveFields(config, param); + AlipayIsvAppKeyConfigConvert.CONVERT.copy(param, config); alipayIsvAppKeyConfigManager.updateById(config); return; } @@ -63,28 +63,6 @@ public class AlipayIsvAppKeyConfigService { alipayIsvAppKeyConfigManager.deleteByAppId(appId); } - /// 合并敏感字段,空值表示不更新 - private void mergeSensitiveFields(AlipayIsvAppKeyConfig config, AlipayIsvAppKeyConfigParam param) { - if (StrUtil.isNotBlank(param.getAlipayPublicKey())) { - config.setAlipayPublicKey(param.getAlipayPublicKey()); - } - if (StrUtil.isNotBlank(param.getPrivateKey())) { - config.setPrivateKey(param.getPrivateKey()); - } - if (StrUtil.isNotBlank(param.getAppCert())) { - config.setAppCert(param.getAppCert()); - } - if (StrUtil.isNotBlank(param.getAlipayCert())) { - config.setAlipayCert(param.getAlipayCert()); - } - if (StrUtil.isNotBlank(param.getAlipayRootCert())) { - config.setAlipayRootCert(param.getAlipayRootCert()); - } - if (StrUtil.isNotBlank(param.getSecretKey())) { - config.setSecretKey(param.getSecretKey()); - } - } - /// 新增时的条件校验 private void validateForCreate(AlipayIsvAppKeyConfigParam param) { if (StrUtil.isBlank(param.getPrivateKey())) { diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppService.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppService.java index ad1e1248c..70b73c746 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppService.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvAppService.java @@ -1,6 +1,6 @@ package org.dromara.daxpay.channel.alipay.service.isv; -import org.dromara.daxpay.channel.alipay.convert.AlipayIsvAppConvert; +import org.dromara.daxpay.channel.alipay.convert.isv.AlipayIsvAppConvert; import org.dromara.daxpay.channel.alipay.dao.isv.AlipayIsvAppManager; import org.dromara.daxpay.channel.alipay.entity.isv.AlipayIsvApp; import org.dromara.daxpay.channel.alipay.param.isv.AlipayIsvAppParam; diff --git a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvChannelMerchantService.java b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvChannelMerchantService.java index c104495b9..543048177 100644 --- a/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvChannelMerchantService.java +++ b/daxpay-channel/daxpay-channel-alipay/src/main/java/org/dromara/daxpay/channel/alipay/service/isv/AlipayIsvChannelMerchantService.java @@ -34,12 +34,12 @@ public class AlipayIsvChannelMerchantService { /// 创建支付宝服务商通道商户 @Transactional(rollbackFor = Exception.class) public void create(AlipayIsvChannelMerchantCreateParam param) { - // 校验服务商应用存在(用 appId 系统主键查询) - AlipayIsvApp isvApp = alipayIsvAppManager.findById(param.getAppId()) + // 校验服务商应用存在(用 isvAppId 系统主键查询) + AlipayIsvApp isvApp = alipayIsvAppManager.findById(param.getIsvAppId()) .orElseThrow(() -> new DataNotExistException("error.channel.alipay.appNotFound")); // 校验同一应用下子商户号不重复 - if (alipayIsvChannelMerchantManager.existsByAppIdAndAlipayUserId( - param.getAppId(), param.getAlipayUserId())) { + if (alipayIsvChannelMerchantManager.existsByIsvAppIdAndAlipayUserId( + param.getIsvAppId(), param.getAlipayUserId())) { throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "error.channel.alipay.subMerchantDuplicate"); } // 生成通道商户号:前缀 AISV + 雪花ID(无分隔符, 符合 TradeNoGenerateUtil 约定) @@ -58,7 +58,7 @@ public class AlipayIsvChannelMerchantService { entity.setMchNo(param.getMchNo()); entity.setChannelMchNo(channelMchNo); entity.setProduct(param.getProduct()); - entity.setAppId(isvApp.getId()); + entity.setIsvAppId(isvApp.getId()); entity.setAlipayUserId(param.getAlipayUserId()); entity.setAppAuthToken(param.getAppAuthToken()); alipayIsvChannelMerchantManager.save(entity); diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAuthTypeEnum.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatAuthTypeEnum.java similarity index 91% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAuthTypeEnum.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatAuthTypeEnum.java index 5e75a0582..95dc2f25e 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatAuthTypeEnum.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatAuthTypeEnum.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.enums; +package org.dromara.daxpay.channel.wechat.code; import org.dromara.daxpay.platform.core.i18n.I18nSupport; import lombok.Getter; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatIsvAppTypeEnum.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatIsvAppTypeEnum.java similarity index 92% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatIsvAppTypeEnum.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatIsvAppTypeEnum.java index 596dc87c2..53c72e910 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/enums/WechatIsvAppTypeEnum.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/code/WechatIsvAppTypeEnum.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.enums; +package org.dromara.daxpay.channel.wechat.code; import org.dromara.daxpay.platform.core.i18n.I18nSupport; import lombok.Getter; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/direct/WechatDirectChannelMerchantController.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/direct/WechatDirectChannelMerchantController.java new file mode 100644 index 000000000..db4e826a0 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/direct/WechatDirectChannelMerchantController.java @@ -0,0 +1,47 @@ +package org.dromara.daxpay.channel.wechat.controller.direct; + +import org.dromara.daxpay.platform.core.annotation.PermCode; +import org.dromara.daxpay.platform.core.rest.Res; +import org.dromara.daxpay.platform.core.rest.result.Result; +import org.dromara.daxpay.channel.wechat.param.direct.WechatDirectChannelMerchantCreateParam; +import org.dromara.daxpay.channel.wechat.result.direct.WechatDirectChannelMerchantResult; +import org.dromara.daxpay.channel.wechat.service.direct.WechatDirectChannelMerchantService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 微信直连通道商户管理 +/// +@PermCode(menuCode = "payment:merchant:channelMerchant") +@Validated +@Tag(name = "微信直连通道商户管理") +@RestController +@RequestMapping("/admin/wechat/direct-channel-merchant") +@RequiredArgsConstructor +public class WechatDirectChannelMerchantController { + + private final WechatDirectChannelMerchantService wechatDirectChannelMerchantService; + + @PermCode(code = "view", nameCn = "商户通道商户查看", nameEn = "Merchant Channel Merchant View") + @Operation(summary = "根据通道商户号查询微信直连通道商户配置") + @GetMapping("/find-by-channel-mch-no") + public Result findByChannelMchNo( + @NotBlank(message = "{validation.field.channelMerchantNo.notBlank}") String channelMchNo) { + return Res.ok(wechatDirectChannelMerchantService.findByChannelMchNo(channelMchNo)); + } + + @PermCode(code = "add", nameCn = "商户通道商户新增", nameEn = "Merchant Channel Merchant Add") + @Operation(summary = "创建微信直连通道商户") + @PostMapping("/create") + public Result create(@RequestBody @Validated WechatDirectChannelMerchantCreateParam param) { + wechatDirectChannelMerchantService.create(param); + return Res.ok(); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/app/WechatIsvAppController.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvAppController.java similarity index 90% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/app/WechatIsvAppController.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvAppController.java index 55298f1a1..71d14a770 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/app/WechatIsvAppController.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvAppController.java @@ -1,16 +1,16 @@ -package org.dromara.daxpay.channel.wechat.controller.app; +package org.dromara.daxpay.channel.wechat.controller.isv; import org.dromara.daxpay.platform.core.annotation.PermCode; import org.dromara.daxpay.platform.core.rest.Res; import org.dromara.daxpay.platform.core.rest.result.Result; import org.dromara.daxpay.platform.core.util.ValidationUtil; import org.dromara.daxpay.platform.core.validation.ValidationGroup; -import org.dromara.daxpay.channel.wechat.param.app.WechatIsvAppParam; -import org.dromara.daxpay.channel.wechat.param.config.WechatIsvAppAuthConfigParam; -import org.dromara.daxpay.channel.wechat.result.app.WechatIsvAppResult; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvAppAuthConfigResult; -import org.dromara.daxpay.channel.wechat.service.app.WechatIsvAppService; -import org.dromara.daxpay.channel.wechat.service.config.WechatIsvAppAuthConfigService; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvAppParam; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvAppAuthConfigParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppResult; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppAuthConfigResult; +import org.dromara.daxpay.channel.wechat.service.isv.WechatIsvAppService; +import org.dromara.daxpay.channel.wechat.service.isv.WechatIsvAppAuthConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvChannelMerchantController.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvChannelMerchantController.java new file mode 100644 index 000000000..c224b9b85 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvChannelMerchantController.java @@ -0,0 +1,47 @@ +package org.dromara.daxpay.channel.wechat.controller.isv; + +import org.dromara.daxpay.platform.core.annotation.PermCode; +import org.dromara.daxpay.platform.core.rest.Res; +import org.dromara.daxpay.platform.core.rest.result.Result; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvChannelMerchantCreateParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvChannelMerchantResult; +import org.dromara.daxpay.channel.wechat.service.isv.WechatIsvChannelMerchantService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 微信服务商通道商户管理 +/// +@PermCode(menuCode = "payment:merchant:channelMerchant") +@Validated +@Tag(name = "微信服务商通道商户管理") +@RestController +@RequestMapping("/admin/wechat/isv-channel-merchant") +@RequiredArgsConstructor +public class WechatIsvChannelMerchantController { + + private final WechatIsvChannelMerchantService wechatIsvChannelMerchantService; + + @PermCode(code = "view", nameCn = "商户通道商户查看", nameEn = "Merchant Channel Merchant View") + @Operation(summary = "根据通道商户号查询微信服务商通道商户配置") + @GetMapping("/find-by-channel-mch-no") + public Result findByChannelMchNo( + @NotBlank(message = "{validation.field.channelMerchantNo.notBlank}") String channelMchNo) { + return Res.ok(wechatIsvChannelMerchantService.findByChannelMchNo(channelMchNo)); + } + + @PermCode(code = "add", nameCn = "商户通道商户新增", nameEn = "Merchant Channel Merchant Add") + @Operation(summary = "创建微信服务商通道商户") + @PostMapping("/create") + public Result create(@RequestBody @Validated WechatIsvChannelMerchantCreateParam param) { + wechatIsvChannelMerchantService.create(param); + return Res.ok(); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/config/WechatIsvKeyConfigController.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvKeyConfigController.java similarity index 83% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/config/WechatIsvKeyConfigController.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvKeyConfigController.java index e1d16347b..1e6ce20be 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/config/WechatIsvKeyConfigController.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/controller/isv/WechatIsvKeyConfigController.java @@ -1,11 +1,11 @@ -package org.dromara.daxpay.channel.wechat.controller.config; +package org.dromara.daxpay.channel.wechat.controller.isv; import org.dromara.daxpay.platform.core.annotation.PermCode; import org.dromara.daxpay.platform.core.rest.Res; import org.dromara.daxpay.platform.core.rest.result.Result; -import org.dromara.daxpay.channel.wechat.param.config.WechatIsvKeyConfigParam; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvKeyConfigResult; -import org.dromara.daxpay.channel.wechat.service.config.WechatIsvKeyConfigService; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvKeyConfigParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvKeyConfigResult; +import org.dromara.daxpay.channel.wechat.service.isv.WechatIsvKeyConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotBlank; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/direct/WechatDirectChannelMerchantConvert.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/direct/WechatDirectChannelMerchantConvert.java new file mode 100644 index 000000000..0652a22f9 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/direct/WechatDirectChannelMerchantConvert.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.channel.wechat.convert.direct; + +import org.dromara.daxpay.channel.wechat.entity.direct.WechatDirectChannelMerchant; +import org.dromara.daxpay.channel.wechat.result.direct.WechatDirectChannelMerchantResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/// # 微信直连通道商户绑定转换 +/// +@Mapper +public interface WechatDirectChannelMerchantConvert { + + WechatDirectChannelMerchantConvert CONVERT = Mappers.getMapper(WechatDirectChannelMerchantConvert.class); + + WechatDirectChannelMerchantResult toResult(WechatDirectChannelMerchant entity); +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvAppAuthConfigConvert.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvAppAuthConfigConvert.java similarity index 74% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvAppAuthConfigConvert.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvAppAuthConfigConvert.java index 278a6bbf7..d068b528a 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvAppAuthConfigConvert.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvAppAuthConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.channel.wechat.convert; +package org.dromara.daxpay.channel.wechat.convert.isv; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvAppAuthConfig; -import org.dromara.daxpay.channel.wechat.param.config.WechatIsvAppAuthConfigParam; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvAppAuthConfigResult; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvAppAuthConfig; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvAppAuthConfigParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppAuthConfigResult; import org.mapstruct.BeanMapping; import org.mapstruct.Mapper; import org.mapstruct.MappingTarget; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvAppConvert.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvAppConvert.java similarity index 69% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvAppConvert.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvAppConvert.java index f400adb98..a9c79b8d9 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvAppConvert.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvAppConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.channel.wechat.convert; +package org.dromara.daxpay.channel.wechat.convert.isv; -import org.dromara.daxpay.channel.wechat.entity.app.WechatIsvApp; -import org.dromara.daxpay.channel.wechat.param.app.WechatIsvAppParam; -import org.dromara.daxpay.channel.wechat.result.app.WechatIsvAppResult; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvApp; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvAppParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppResult; import org.mapstruct.Mapper; import org.mapstruct.MappingTarget; import org.mapstruct.factory.Mappers; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvChannelMerchantConvert.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvChannelMerchantConvert.java new file mode 100644 index 000000000..f4763d5df --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvChannelMerchantConvert.java @@ -0,0 +1,16 @@ +package org.dromara.daxpay.channel.wechat.convert.isv; + +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvChannelMerchant; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvChannelMerchantResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/// # 微信服务商通道商户绑定转换 +/// +@Mapper +public interface WechatIsvChannelMerchantConvert { + + WechatIsvChannelMerchantConvert CONVERT = Mappers.getMapper(WechatIsvChannelMerchantConvert.class); + + WechatIsvChannelMerchantResult toResult(WechatIsvChannelMerchant entity); +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvKeyConfigConvert.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvKeyConfigConvert.java similarity index 74% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvKeyConfigConvert.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvKeyConfigConvert.java index e5c963e06..fa7062225 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/WechatIsvKeyConfigConvert.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/convert/isv/WechatIsvKeyConfigConvert.java @@ -1,8 +1,8 @@ -package org.dromara.daxpay.channel.wechat.convert; +package org.dromara.daxpay.channel.wechat.convert.isv; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvKeyConfig; -import org.dromara.daxpay.channel.wechat.param.config.WechatIsvKeyConfigParam; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvKeyConfigResult; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvKeyConfig; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvKeyConfigParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvKeyConfigResult; import org.mapstruct.BeanMapping; import org.mapstruct.Mapper; import org.mapstruct.MappingTarget; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantManager.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantManager.java new file mode 100644 index 000000000..9fca44b19 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantManager.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.channel.wechat.dao.direct; + +import org.dromara.daxpay.channel.wechat.entity.direct.WechatDirectChannelMerchant; +import org.dromara.daxpay.platform.common.mybatisplus.impl.BaseManager; +import org.springframework.stereotype.Repository; + +/// # 微信直连通道商户绑定 +/// +@Repository +public class WechatDirectChannelMerchantManager extends BaseManager { + + /// 校验同一商户下微信直连商户号不重复 + public boolean existsByMchNoAndWxMchId(String mchNo, String wxMchId) { + return lambdaQuery() + .eq(WechatDirectChannelMerchant::getMchNo, mchNo) + .eq(WechatDirectChannelMerchant::getWxMchId, wxMchId) + .exists(); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantMapper.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantMapper.java new file mode 100644 index 000000000..87535df6e --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/direct/WechatDirectChannelMerchantMapper.java @@ -0,0 +1,13 @@ +package org.dromara.daxpay.channel.wechat.dao.direct; + +import org.dromara.daxpay.channel.wechat.entity.direct.WechatDirectChannelMerchant; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/// # 微信直连通道商户绑定 +/// +/// 微信直连通道商户 MyBatis-Plus Mapper,继承 MPJBaseMapper 支持多表联查。 +/// +@Mapper +public interface WechatDirectChannelMerchantMapper extends MPJBaseMapper { +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvAppAuthConfigManager.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppAuthConfigManager.java similarity index 86% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvAppAuthConfigManager.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppAuthConfigManager.java index 22c0c6fe6..ab3086981 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvAppAuthConfigManager.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppAuthConfigManager.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.channel.wechat.dao.config; +package org.dromara.daxpay.channel.wechat.dao.isv; import org.dromara.daxpay.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvAppAuthConfig; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvAppAuthConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvAppAuthConfigMapper.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppAuthConfigMapper.java similarity index 65% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvAppAuthConfigMapper.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppAuthConfigMapper.java index 0282c5699..cb1b8f68a 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvAppAuthConfigMapper.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppAuthConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.channel.wechat.dao.config; +package org.dromara.daxpay.channel.wechat.dao.isv; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvAppAuthConfig; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvAppAuthConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/app/WechatIsvAppManager.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppManager.java similarity index 91% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/app/WechatIsvAppManager.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppManager.java index 30b40c01e..bb5b8a31c 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/app/WechatIsvAppManager.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppManager.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.channel.wechat.dao.app; +package org.dromara.daxpay.channel.wechat.dao.isv; import org.dromara.daxpay.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.channel.wechat.entity.app.WechatIsvApp; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvApp; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/app/WechatIsvAppMapper.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppMapper.java similarity index 64% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/app/WechatIsvAppMapper.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppMapper.java index add3cf820..9e39d5cfd 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/app/WechatIsvAppMapper.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvAppMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.channel.wechat.dao.app; +package org.dromara.daxpay.channel.wechat.dao.isv; -import org.dromara.daxpay.channel.wechat.entity.app.WechatIsvApp; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvApp; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantManager.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantManager.java new file mode 100644 index 000000000..1559abaf1 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantManager.java @@ -0,0 +1,19 @@ +package org.dromara.daxpay.channel.wechat.dao.isv; + +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvChannelMerchant; +import org.dromara.daxpay.platform.common.mybatisplus.impl.BaseManager; +import org.springframework.stereotype.Repository; + +/// # 微信服务商通道商户绑定 +/// +@Repository +public class WechatIsvChannelMerchantManager extends BaseManager { + + /// 校验同一商户下特约商户号不重复 + public boolean existsByMchNoAndSubMchId(String mchNo, String subMchId) { + return lambdaQuery() + .eq(WechatIsvChannelMerchant::getMchNo, mchNo) + .eq(WechatIsvChannelMerchant::getSubMchId, subMchId) + .exists(); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantMapper.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantMapper.java new file mode 100644 index 000000000..64f9d4539 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvChannelMerchantMapper.java @@ -0,0 +1,13 @@ +package org.dromara.daxpay.channel.wechat.dao.isv; + +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvChannelMerchant; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/// # 微信服务商通道商户绑定 +/// +/// 微信服务商通道商户 MyBatis-Plus Mapper,继承 MPJBaseMapper 支持多表联查。 +/// +@Mapper +public interface WechatIsvChannelMerchantMapper extends MPJBaseMapper { +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvKeyConfigManager.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvKeyConfigManager.java similarity index 84% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvKeyConfigManager.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvKeyConfigManager.java index 9cba4a1a8..ac2fe6456 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvKeyConfigManager.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvKeyConfigManager.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.channel.wechat.dao.config; +package org.dromara.daxpay.channel.wechat.dao.isv; import org.dromara.daxpay.platform.common.mybatisplus.impl.BaseManager; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvKeyConfig; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvKeyConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvKeyConfigMapper.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvKeyConfigMapper.java similarity index 63% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvKeyConfigMapper.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvKeyConfigMapper.java index ac6805f45..dfd83a727 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/config/WechatIsvKeyConfigMapper.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/dao/isv/WechatIsvKeyConfigMapper.java @@ -1,6 +1,6 @@ -package org.dromara.daxpay.channel.wechat.dao.config; +package org.dromara.daxpay.channel.wechat.dao.isv; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvKeyConfig; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvKeyConfig; import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/direct/WechatDirectChannelMerchant.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/direct/WechatDirectChannelMerchant.java new file mode 100644 index 000000000..464434a22 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/direct/WechatDirectChannelMerchant.java @@ -0,0 +1,37 @@ +package org.dromara.daxpay.channel.wechat.entity.direct; + +import org.dromara.daxpay.channel.wechat.convert.direct.WechatDirectChannelMerchantConvert; +import org.dromara.daxpay.channel.wechat.result.direct.WechatDirectChannelMerchantResult; +import org.dromara.daxpay.payment.common.entity.merchant.MchBaseEntity; +import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/// # 微信直连通道商户绑定 +/// +/// 一个微信商户号(wxMchId)对应一个 channelMchNo, 商户的多个应用共享此绑定。 +/// +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName(value = "mch_wechat_direct_channel_merchant", autoResultMap = true) +public class WechatDirectChannelMerchant extends MchBaseEntity implements ToResult { + + /// 通道商户号(系统生成雪花号) + private String channelMchNo; + + /// 所属支付产品 + /// @see org.dromara.daxpay.platform.core.enums.pay.channel.ProductEnum + private String product; + + /// 微信直连商户号 + private String wxMchId; + + /// 转换 + @Override + public WechatDirectChannelMerchantResult toResult() { + return WechatDirectChannelMerchantConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/app/WechatIsvApp.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvApp.java similarity index 84% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/app/WechatIsvApp.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvApp.java index 073fbcf93..c0c3b902c 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/app/WechatIsvApp.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvApp.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.channel.wechat.entity.app; +package org.dromara.daxpay.channel.wechat.entity.isv; -import org.dromara.daxpay.channel.wechat.convert.WechatIsvAppConvert; -import org.dromara.daxpay.channel.wechat.result.app.WechatIsvAppResult; +import org.dromara.daxpay.channel.wechat.convert.isv.WechatIsvAppConvert; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppResult; import org.dromara.daxpay.platform.common.mybatisplus.base.MpBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; import com.baomidou.mybatisplus.annotation.FieldStrategy; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvAppAuthConfig.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvAppAuthConfig.java similarity index 85% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvAppAuthConfig.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvAppAuthConfig.java index 3f1be9112..7f02aeab6 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvAppAuthConfig.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvAppAuthConfig.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.channel.wechat.entity.config; +package org.dromara.daxpay.channel.wechat.entity.isv; -import org.dromara.daxpay.channel.wechat.convert.WechatIsvAppAuthConfigConvert; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvAppAuthConfigResult; +import org.dromara.daxpay.channel.wechat.convert.isv.WechatIsvAppAuthConfigConvert; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppAuthConfigResult; import org.dromara.daxpay.platform.common.mybatisplus.base.MpBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; import org.dromara.daxpay.platform.common.mybatisplus.handler.encrypt.DataEncryptTypeHandler; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvChannelMerchant.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvChannelMerchant.java new file mode 100644 index 000000000..308d5ca7b --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvChannelMerchant.java @@ -0,0 +1,38 @@ +package org.dromara.daxpay.channel.wechat.entity.isv; + +import org.dromara.daxpay.channel.wechat.convert.isv.WechatIsvChannelMerchantConvert; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvChannelMerchantResult; +import org.dromara.daxpay.payment.common.entity.merchant.MchBaseEntity; +import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/// # 微信服务商通道商户绑定 +/// +/// 微信特约商户关联到服务商本身(服务商密钥全局唯一), 不挂靠具体服务商应用, +/// 因此本表不保存应用关联字段。同一商户下特约商户号不重复。 +/// +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName(value = "mch_wechat_isv_channel_merchant", autoResultMap = true) +public class WechatIsvChannelMerchant extends MchBaseEntity implements ToResult { + + /// 通道商户号(WISV+雪花) + private String channelMchNo; + + /// 所属支付产品 + /// @see org.dromara.daxpay.platform.core.enums.pay.channel.ProductEnum + private String product; + + /// 微信特约商户号/二级商户号(V3 服务商支付 sub_mchid) + private String subMchId; + + /// 转换 + @Override + public WechatIsvChannelMerchantResult toResult() { + return WechatIsvChannelMerchantConvert.CONVERT.toResult(this); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvKeyConfig.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvKeyConfig.java similarity index 88% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvKeyConfig.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvKeyConfig.java index de56cdeca..917ac95e2 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/config/WechatIsvKeyConfig.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/entity/isv/WechatIsvKeyConfig.java @@ -1,7 +1,7 @@ -package org.dromara.daxpay.channel.wechat.entity.config; +package org.dromara.daxpay.channel.wechat.entity.isv; -import org.dromara.daxpay.channel.wechat.convert.WechatIsvKeyConfigConvert; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvKeyConfigResult; +import org.dromara.daxpay.channel.wechat.convert.isv.WechatIsvKeyConfigConvert; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvKeyConfigResult; import org.dromara.daxpay.platform.common.mybatisplus.base.MpBaseEntity; import org.dromara.daxpay.platform.common.mybatisplus.function.ToResult; import org.dromara.daxpay.platform.common.mybatisplus.handler.encrypt.DataEncryptTypeHandler; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/direct/WechatDirectChannelMerchantCreateParam.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/direct/WechatDirectChannelMerchantCreateParam.java new file mode 100644 index 000000000..2e0332c8b --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/direct/WechatDirectChannelMerchantCreateParam.java @@ -0,0 +1,34 @@ +package org.dromara.daxpay.channel.wechat.param.direct; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.experimental.Accessors; + +/// # 微信直连通道商户创建参数 +/// +@Data +@Accessors(chain = true) +@Schema(title = "微信直连通道商户创建参数") +public class WechatDirectChannelMerchantCreateParam { + + /// 商户号 + @Schema(description = "商户号") + @NotBlank(message = "{validation.field.mchNo.notBlank}") + private String mchNo; + + /// 通道商户名称 + @Schema(description = "通道商户名称") + @NotBlank(message = "{validation.field.channelMerchantName.notBlank}") + private String channelMerchantName; + + /// 所属支付产品 + @Schema(description = "所属支付产品") + @NotBlank(message = "{validation.field.product.notBlank}") + private String product; + + /// 微信直连商户号 + @Schema(description = "微信直连商户号") + @NotBlank(message = "{validation.field.wxMchId.notBlank}") + private String wxMchId; +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvAppAuthConfigParam.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvAppAuthConfigParam.java similarity index 93% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvAppAuthConfigParam.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvAppAuthConfigParam.java index e3426ab5a..c8a221a9d 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvAppAuthConfigParam.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvAppAuthConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.param.config; +package org.dromara.daxpay.channel.wechat.param.isv; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/app/WechatIsvAppParam.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvAppParam.java similarity index 95% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/app/WechatIsvAppParam.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvAppParam.java index f06cdd3ab..dbe34271f 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/app/WechatIsvAppParam.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvAppParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.param.app; +package org.dromara.daxpay.channel.wechat.param.isv; import org.dromara.daxpay.platform.core.validation.ValidationGroup; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvChannelMerchantCreateParam.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvChannelMerchantCreateParam.java new file mode 100644 index 000000000..c64393421 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvChannelMerchantCreateParam.java @@ -0,0 +1,34 @@ +package org.dromara.daxpay.channel.wechat.param.isv; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.experimental.Accessors; + +/// # 微信服务商通道商户创建参数 +/// +@Data +@Accessors(chain = true) +@Schema(title = "微信服务商通道商户创建参数") +public class WechatIsvChannelMerchantCreateParam { + + /// 商户号 + @Schema(description = "商户号") + @NotBlank(message = "{validation.field.mchNo.notBlank}") + private String mchNo; + + /// 通道商户名称 + @Schema(description = "通道商户名称") + @NotBlank(message = "{validation.field.channelMerchantName.notBlank}") + private String channelMerchantName; + + /// 所属支付产品 + @Schema(description = "所属支付产品") + @NotBlank(message = "{validation.field.product.notBlank}") + private String product; + + /// 微信特约商户号/二级商户号 + @Schema(description = "微信特约商户号/二级商户号") + @NotBlank(message = "{validation.field.subMchId.notBlank}") + private String subMchId; +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvKeyConfigParam.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvKeyConfigParam.java similarity index 95% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvKeyConfigParam.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvKeyConfigParam.java index 6b169b739..a2ad466c5 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/config/WechatIsvKeyConfigParam.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/param/isv/WechatIsvKeyConfigParam.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.param.config; +package org.dromara.daxpay.channel.wechat.param.isv; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/direct/WechatDirectChannelMerchantResult.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/direct/WechatDirectChannelMerchantResult.java new file mode 100644 index 000000000..1309aaf06 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/direct/WechatDirectChannelMerchantResult.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.channel.wechat.result.direct; + +import org.dromara.daxpay.payment.common.result.MchTradeBaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/// # 微信直连通道商户绑定结果 +/// +/// 微信直连通道商户绑定关系的返回结果对象,包含通道商户号、所属产品和微信直连商户号等信息。 +/// +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "微信直连通道商户绑定结果") +public class WechatDirectChannelMerchantResult extends MchTradeBaseResult { + + @Schema(description = "通道商户号") + private String channelMchNo; + + @Schema(description = "所属支付产品") + private String product; + + @Schema(description = "微信直连商户号") + private String wxMchId; +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvAppAuthConfigResult.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvAppAuthConfigResult.java similarity index 94% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvAppAuthConfigResult.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvAppAuthConfigResult.java index 134c7c242..0244c30f5 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvAppAuthConfigResult.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvAppAuthConfigResult.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.result.config; +package org.dromara.daxpay.channel.wechat.result.isv; import org.dromara.daxpay.platform.common.json.sensitive.SensitiveInfo; import org.dromara.daxpay.platform.core.result.BaseResult; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/app/WechatIsvAppResult.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvAppResult.java similarity index 91% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/app/WechatIsvAppResult.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvAppResult.java index 97455573c..d46da463c 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/app/WechatIsvAppResult.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvAppResult.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.result.app; +package org.dromara.daxpay.channel.wechat.result.isv; import org.dromara.daxpay.platform.core.result.BaseResult; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvChannelMerchantResult.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvChannelMerchantResult.java new file mode 100644 index 000000000..f22211ec8 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvChannelMerchantResult.java @@ -0,0 +1,27 @@ +package org.dromara.daxpay.channel.wechat.result.isv; + +import org.dromara.daxpay.payment.common.result.MchTradeBaseResult; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/// # 微信服务商通道商户绑定结果 +/// +/// 微信服务商通道商户绑定关系的返回结果对象,包含通道商户号、所属产品和特约商户号等信息。 +/// +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Schema(title = "微信服务商通道商户绑定结果") +public class WechatIsvChannelMerchantResult extends MchTradeBaseResult { + + @Schema(description = "通道商户号") + private String channelMchNo; + + @Schema(description = "所属支付产品") + private String product; + + @Schema(description = "微信特约商户号/二级商户号") + private String subMchId; +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvKeyConfigResult.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvKeyConfigResult.java similarity index 95% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvKeyConfigResult.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvKeyConfigResult.java index de75b6896..99af05ffc 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/config/WechatIsvKeyConfigResult.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/result/isv/WechatIsvKeyConfigResult.java @@ -1,4 +1,4 @@ -package org.dromara.daxpay.channel.wechat.result.config; +package org.dromara.daxpay.channel.wechat.result.isv; import org.dromara.daxpay.platform.common.json.sensitive.SensitiveInfo; import org.dromara.daxpay.platform.core.result.BaseResult; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/direct/WechatDirectChannelMerchantService.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/direct/WechatDirectChannelMerchantService.java new file mode 100644 index 000000000..da4886dcc --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/direct/WechatDirectChannelMerchantService.java @@ -0,0 +1,67 @@ +package org.dromara.daxpay.channel.wechat.service.direct; + +import org.dromara.daxpay.channel.wechat.dao.direct.WechatDirectChannelMerchantManager; +import org.dromara.daxpay.channel.wechat.entity.direct.WechatDirectChannelMerchant; +import org.dromara.daxpay.channel.wechat.param.direct.WechatDirectChannelMerchantCreateParam; +import org.dromara.daxpay.channel.wechat.result.direct.WechatDirectChannelMerchantResult; +import org.dromara.daxpay.payment.channel.dao.mch.ChannelMerchantManager; +import org.dromara.daxpay.payment.channel.entity.mch.ChannelMerchant; +import org.dromara.daxpay.platform.core.code.CommonErrorCode; +import org.dromara.daxpay.platform.core.enums.channel.ChannelMerchantSourceEnum; +import org.dromara.daxpay.platform.core.exception.BizInfoException; +import org.dromara.daxpay.platform.core.exception.DataNotExistException; +import cn.hutool.core.util.IdUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/// # 微信直连通道商户管理 +/// +/// 一个微信商户号(wxMchId)对应一个 channelMchNo, 商户的多个应用共享此绑定。 +/// +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatDirectChannelMerchantService { + + private final ChannelMerchantManager channelMerchantManager; + private final WechatDirectChannelMerchantManager wechatDirectChannelMerchantManager; + + /// 创建微信直连通道商户 + @Transactional(rollbackFor = Exception.class) + public void create(WechatDirectChannelMerchantCreateParam param) { + // 校验同一商户下微信商户号不重复 + if (wechatDirectChannelMerchantManager.existsByMchNoAndWxMchId( + param.getMchNo(), param.getWxMchId())) { + throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "error.channel.wechat.directMchDuplicate"); + } + // 生成通道商户号(雪花号, 不再使用 wxMchId) + String channelMchNo = String.valueOf(IdUtil.getSnowflakeNextId()); + // 写通用通道商户主表 + ChannelMerchant channelMerchant = new ChannelMerchant(); + channelMerchant.setMchNo(param.getMchNo()); + channelMerchant.setChannelMchNo(channelMchNo); + channelMerchant.setChannelMerchantName(param.getChannelMerchantName()); + channelMerchant.setProduct(param.getProduct()); + channelMerchant.setSource(ChannelMerchantSourceEnum.MANUAL.getCode()); + channelMerchant.setEnable(true); + channelMerchantManager.save(channelMerchant); + // 写直连绑定表(wxMchId 作为业务字段, 不参与关联) + WechatDirectChannelMerchant entity = new WechatDirectChannelMerchant(); + entity.setMchNo(param.getMchNo()); + entity.setChannelMchNo(channelMchNo); + entity.setProduct(param.getProduct()); + entity.setWxMchId(param.getWxMchId()); + wechatDirectChannelMerchantManager.save(entity); + } + + /// 根据通道商户号查询直连通道商户配置 + public WechatDirectChannelMerchantResult findByChannelMchNo(String channelMchNo) { + return wechatDirectChannelMerchantManager.lambdaQuery() + .eq(WechatDirectChannelMerchant::getChannelMchNo, channelMchNo) + .oneOpt() + .map(WechatDirectChannelMerchant::toResult) + .orElseThrow(() -> new DataNotExistException("error.payment.channel.channelMerchantNotExist")); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatIsvAppAuthConfigService.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvAppAuthConfigService.java similarity index 80% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatIsvAppAuthConfigService.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvAppAuthConfigService.java index f651b843b..a378a7cd0 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatIsvAppAuthConfigService.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvAppAuthConfigService.java @@ -1,13 +1,13 @@ -package org.dromara.daxpay.channel.wechat.service.config; +package org.dromara.daxpay.channel.wechat.service.isv; -import org.dromara.daxpay.channel.wechat.convert.WechatIsvAppAuthConfigConvert; -import org.dromara.daxpay.channel.wechat.dao.app.WechatIsvAppManager; -import org.dromara.daxpay.channel.wechat.dao.config.WechatIsvAppAuthConfigManager; -import org.dromara.daxpay.channel.wechat.entity.app.WechatIsvApp; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvAppAuthConfig; -import org.dromara.daxpay.channel.wechat.enums.WechatIsvAppTypeEnum; -import org.dromara.daxpay.channel.wechat.param.config.WechatIsvAppAuthConfigParam; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvAppAuthConfigResult; +import org.dromara.daxpay.channel.wechat.convert.isv.WechatIsvAppAuthConfigConvert; +import org.dromara.daxpay.channel.wechat.dao.isv.WechatIsvAppManager; +import org.dromara.daxpay.channel.wechat.dao.isv.WechatIsvAppAuthConfigManager; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvApp; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvAppAuthConfig; +import org.dromara.daxpay.channel.wechat.code.WechatIsvAppTypeEnum; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvAppAuthConfigParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppAuthConfigResult; import org.dromara.daxpay.platform.core.code.CommonErrorCode; import org.dromara.daxpay.platform.core.exception.BizInfoException; import org.dromara.daxpay.platform.core.exception.DataNotExistException; @@ -50,9 +50,8 @@ public class WechatIsvAppAuthConfigService { Optional existing = wechatIsvAppAuthConfigManager.findByAppId(param.getAppId()); if (existing.isPresent()) { WechatIsvAppAuthConfig config = existing.get(); - if (StrUtil.isNotBlank(param.getAppSecret())) { - config.setAppSecret(param.getAppSecret()); - } else if (StrUtil.isBlank(config.getAppSecret())) { + WechatIsvAppAuthConfigConvert.CONVERT.copy(param, config); + if (StrUtil.isBlank(config.getAppSecret())) { // 所有应用类型均须配置 AppSecret throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "error.channel.wechat.appSecretRequired"); } diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/app/WechatIsvAppService.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvAppService.java similarity index 86% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/app/WechatIsvAppService.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvAppService.java index 44d015ebf..d38b1654d 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/app/WechatIsvAppService.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvAppService.java @@ -1,12 +1,12 @@ -package org.dromara.daxpay.channel.wechat.service.app; +package org.dromara.daxpay.channel.wechat.service.isv; -import org.dromara.daxpay.channel.wechat.convert.WechatIsvAppConvert; -import org.dromara.daxpay.channel.wechat.dao.app.WechatIsvAppManager; -import org.dromara.daxpay.channel.wechat.entity.app.WechatIsvApp; -import org.dromara.daxpay.channel.wechat.enums.WechatIsvAppTypeEnum; -import org.dromara.daxpay.channel.wechat.param.app.WechatIsvAppParam; -import org.dromara.daxpay.channel.wechat.result.app.WechatIsvAppResult; -import org.dromara.daxpay.channel.wechat.service.config.WechatIsvAppAuthConfigService; +import org.dromara.daxpay.channel.wechat.convert.isv.WechatIsvAppConvert; +import org.dromara.daxpay.channel.wechat.dao.isv.WechatIsvAppManager; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvApp; +import org.dromara.daxpay.channel.wechat.code.WechatIsvAppTypeEnum; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvAppParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvAppResult; +import org.dromara.daxpay.channel.wechat.service.isv.WechatIsvAppAuthConfigService; import org.dromara.daxpay.platform.common.mybatisplus.util.MpUtil; import org.dromara.daxpay.platform.core.code.CommonErrorCode; import org.dromara.daxpay.platform.core.exception.BizInfoException; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvChannelMerchantService.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvChannelMerchantService.java new file mode 100644 index 000000000..f16e35e65 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvChannelMerchantService.java @@ -0,0 +1,68 @@ +package org.dromara.daxpay.channel.wechat.service.isv; + +import org.dromara.daxpay.channel.wechat.dao.isv.WechatIsvChannelMerchantManager; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvChannelMerchant; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvChannelMerchantCreateParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvChannelMerchantResult; +import org.dromara.daxpay.payment.channel.dao.mch.ChannelMerchantManager; +import org.dromara.daxpay.payment.channel.entity.mch.ChannelMerchant; +import org.dromara.daxpay.platform.core.code.CommonErrorCode; +import org.dromara.daxpay.platform.core.enums.channel.ChannelMerchantSourceEnum; +import org.dromara.daxpay.platform.core.exception.BizInfoException; +import org.dromara.daxpay.platform.core.exception.DataNotExistException; +import cn.hutool.core.util.IdUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/// # 微信服务商通道商户管理 +/// +/// 微信特约商户关联到服务商本身(服务商密钥全局唯一), 不挂靠具体服务商应用。 +/// 一个商户下同一特约商户号(subMchId)只允许绑定一次。 +/// +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatIsvChannelMerchantService { + + private final ChannelMerchantManager channelMerchantManager; + private final WechatIsvChannelMerchantManager wechatIsvChannelMerchantManager; + + /// 创建微信服务商通道商户 + @Transactional(rollbackFor = Exception.class) + public void create(WechatIsvChannelMerchantCreateParam param) { + // 校验同一商户下特约商户号不重复 + if (wechatIsvChannelMerchantManager.existsByMchNoAndSubMchId( + param.getMchNo(), param.getSubMchId())) { + throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "error.channel.wechat.subMerchantDuplicate"); + } + // 生成通道商户号:前缀 WISV + 雪花ID(无分隔符, 符合 TradeNoGenerateUtil 约定) + String channelMchNo = "WISV" + IdUtil.getSnowflakeNextId(); + // 写通用通道商户主表 + ChannelMerchant channelMerchant = new ChannelMerchant(); + channelMerchant.setMchNo(param.getMchNo()); + channelMerchant.setChannelMchNo(channelMchNo); + channelMerchant.setChannelMerchantName(param.getChannelMerchantName()); + channelMerchant.setProduct(param.getProduct()); + channelMerchant.setSource(ChannelMerchantSourceEnum.MANUAL.getCode()); + channelMerchant.setEnable(true); + channelMerchantManager.save(channelMerchant); + // 写服务商绑定表 + WechatIsvChannelMerchant entity = new WechatIsvChannelMerchant(); + entity.setMchNo(param.getMchNo()); + entity.setChannelMchNo(channelMchNo); + entity.setProduct(param.getProduct()); + entity.setSubMchId(param.getSubMchId()); + wechatIsvChannelMerchantManager.save(entity); + } + + /// 根据通道商户号查询服务商通道商户配置 + public WechatIsvChannelMerchantResult findByChannelMchNo(String channelMchNo) { + return wechatIsvChannelMerchantManager.lambdaQuery() + .eq(WechatIsvChannelMerchant::getChannelMchNo, channelMchNo) + .oneOpt() + .map(WechatIsvChannelMerchant::toResult) + .orElseThrow(() -> new DataNotExistException("error.payment.channel.channelMerchantNotExist")); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatIsvKeyConfigService.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvKeyConfigService.java similarity index 67% rename from daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatIsvKeyConfigService.java rename to daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvKeyConfigService.java index 1a05f9c85..277d475d5 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/config/WechatIsvKeyConfigService.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/org/dromara/daxpay/channel/wechat/service/isv/WechatIsvKeyConfigService.java @@ -1,10 +1,10 @@ -package org.dromara.daxpay.channel.wechat.service.config; +package org.dromara.daxpay.channel.wechat.service.isv; -import org.dromara.daxpay.channel.wechat.convert.WechatIsvKeyConfigConvert; -import org.dromara.daxpay.channel.wechat.dao.config.WechatIsvKeyConfigManager; -import org.dromara.daxpay.channel.wechat.entity.config.WechatIsvKeyConfig; -import org.dromara.daxpay.channel.wechat.param.config.WechatIsvKeyConfigParam; -import org.dromara.daxpay.channel.wechat.result.config.WechatIsvKeyConfigResult; +import org.dromara.daxpay.channel.wechat.convert.isv.WechatIsvKeyConfigConvert; +import org.dromara.daxpay.channel.wechat.dao.isv.WechatIsvKeyConfigManager; +import org.dromara.daxpay.channel.wechat.entity.isv.WechatIsvKeyConfig; +import org.dromara.daxpay.channel.wechat.param.isv.WechatIsvKeyConfigParam; +import org.dromara.daxpay.channel.wechat.result.isv.WechatIsvKeyConfigResult; import org.dromara.daxpay.platform.core.code.CommonErrorCode; import org.dromara.daxpay.platform.core.exception.BizInfoException; import cn.hutool.core.util.StrUtil; @@ -40,24 +40,7 @@ public class WechatIsvKeyConfigService { if (existing.isPresent()) { config = existing.get(); config.setWxMchId(param.getWxMchId()); - if (StrUtil.isNotBlank(param.getApiKeyV3())) { - config.setApiKeyV3(param.getApiKeyV3()); - } - if (StrUtil.isNotBlank(param.getPublicKey())) { - config.setPublicKey(param.getPublicKey()); - } - if (StrUtil.isNotBlank(param.getPublicKeyId())) { - config.setPublicKeyId(param.getPublicKeyId()); - } - if (StrUtil.isNotBlank(param.getPrivateKey())) { - config.setPrivateKey(param.getPrivateKey()); - } - if (StrUtil.isNotBlank(param.getPrivateCert())) { - config.setPrivateCert(param.getPrivateCert()); - } - if (StrUtil.isNotBlank(param.getCertSerialNo())) { - config.setCertSerialNo(param.getCertSerialNo()); - } + WechatIsvKeyConfigConvert.CONVERT.copy(param, config); wechatIsvKeyConfigManager.updateById(config); } else { this.validateForCreate(param); diff --git a/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/config/MerchantCredentialConvert.java b/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/config/MerchantCredentialConvert.java index dd59af35b..8bbbe88f0 100644 --- a/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/config/MerchantCredentialConvert.java +++ b/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/config/MerchantCredentialConvert.java @@ -5,6 +5,8 @@ import org.dromara.daxpay.payment.merchant.param.config.MerchantCredentialParam; import org.dromara.daxpay.payment.merchant.result.config.MerchantCredentialResult; import org.mapstruct.Mapper; import org.mapstruct.MappingTarget; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.BeanMapping; import org.mapstruct.factory.Mappers; /// # 商户API配置转换 @@ -17,5 +19,6 @@ public interface MerchantCredentialConvert { MerchantCredentialResult toResult(MerchantCredential entity); + @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) void copy(MerchantCredentialParam param, @MappingTarget MerchantCredential entity); } diff --git a/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/route/strategy/PayRouteStrategyConvert.java b/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/route/strategy/PayRouteStrategyConvert.java index fa27048e4..8b65ad19b 100644 --- a/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/route/strategy/PayRouteStrategyConvert.java +++ b/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/convert/route/strategy/PayRouteStrategyConvert.java @@ -2,7 +2,13 @@ package org.dromara.daxpay.payment.merchant.convert.route.strategy; import org.dromara.daxpay.payment.merchant.entity.route.strategy.PayRouteStrategy; import org.dromara.daxpay.payment.merchant.result.route.strategy.PayRouteStrategyResult; +import org.dromara.daxpay.payment.merchant.entity.route.strategy.PayRouteStrategy; +import org.dromara.daxpay.payment.merchant.param.route.strategy.PayRouteStrategyParam; +import org.dromara.daxpay.payment.merchant.result.route.strategy.PayRouteStrategyResult; +import org.mapstruct.BeanMapping; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; +import org.mapstruct.NullValuePropertyMappingStrategy; import org.mapstruct.factory.Mappers; /// # 支付通道路由策略转换 @@ -13,4 +19,7 @@ public interface PayRouteStrategyConvert { PayRouteStrategyConvert CONVERT = Mappers.getMapper(PayRouteStrategyConvert.class); PayRouteStrategyResult toResult(PayRouteStrategy entity); + + @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) + void copy(PayRouteStrategyParam param, @MappingTarget PayRouteStrategy entity); } diff --git a/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/service/route/facade/PayRouteConfigService.java b/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/service/route/facade/PayRouteConfigService.java index 5929bf678..f5cb9e9d4 100644 --- a/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/service/route/facade/PayRouteConfigService.java +++ b/daxpay-payment/daxpay-payment-merchant/src/main/java/org/dromara/daxpay/payment/merchant/service/route/facade/PayRouteConfigService.java @@ -1,6 +1,7 @@ package org.dromara.daxpay.payment.merchant.service.route.facade; import org.dromara.daxpay.payment.merchant.dao.appinfo.MchAppInfoManager; +import org.dromara.daxpay.payment.merchant.convert.route.strategy.PayRouteStrategyConvert; import org.dromara.daxpay.payment.merchant.dao.route.strategy.PayRouteStrategyManager; import org.dromara.daxpay.payment.merchant.entity.route.strategy.PayRouteStrategy; import org.dromara.daxpay.payment.merchant.param.route.basic.PayRouteBasicConfigBatchParam; @@ -15,7 +16,6 @@ import org.dromara.daxpay.payment.merchant.service.route.basic.PayRouteBasicConf import org.dromara.daxpay.payment.merchant.service.route.scene.PayRouteSceneConfigService; import org.dromara.daxpay.platform.core.enums.pay.route.PayRouteModeEnum; import org.dromara.daxpay.platform.core.exception.DataNotExistException; -import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -62,18 +62,7 @@ public class PayRouteConfigService { mchAppInfoManager.requireByAppIdNotTenant(param.getAppId()); PayRouteStrategy strategy = strategyManager.findByAppId(param.getAppId()) .orElseThrow(() -> new DataNotExistException("pay.route.error.routeStrategyNotExist")); - if (StrUtil.isNotBlank(param.getMode())) { - strategy.setMode(param.getMode()); - } - if (param.getEnable() != null) { - strategy.setEnable(param.getEnable()); - } - if (StrUtil.isNotBlank(param.getName())) { - strategy.setName(param.getName()); - } - if (StrUtil.isNotBlank(param.getProvider())) { - strategy.setProvider(param.getProvider()); - } + PayRouteStrategyConvert.CONVERT.copy(param, strategy); strategyManager.updateById(strategy); return strategy.toResult(); } diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/error/channel/wechat.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/error/channel/wechat.json index 264f9c571..4f1cda5e0 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/error/channel/wechat.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/error/channel/wechat.json @@ -39,5 +39,7 @@ "appTypeInvalid": "Invalid WeChat application type", "appSecretRequired": "App secret is required", "publicKeyRequired": "Payment public key is required", - "privateCertRequired": "API certificate is required" + "privateCertRequired": "API certificate is required", + "subMerchantDuplicate": "This sub-merchant already exists under the WeChat application", + "directMchDuplicate": "The WeChat merchant already exists under this merchant" } \ No newline at end of file diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/error/channel/wechat.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/error/channel/wechat.json index f781c65fc..91e636a87 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/error/channel/wechat.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/error/channel/wechat.json @@ -39,5 +39,7 @@ "appTypeInvalid": "微信应用类型无效", "appSecretRequired": "应用密钥不可为空", "publicKeyRequired": "支付公钥未配置", - "privateCertRequired": "API证书未配置" + "privateCertRequired": "API证书未配置", + "subMerchantDuplicate": "该微信应用下已存在此特约商户号", + "directMchDuplicate": "同一商户下该微信商户已存在" }