From e313c49f2edae0e54eb5c2e08b5ee9fe244487da Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Sun, 5 Jul 2026 23:54:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(channel):=20=E9=80=9A=E9=81=93=E5=85=83?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E5=85=B8=E5=85=A8=E9=87=8F=E5=88=B7?= =?UTF-8?q?=E6=96=B0+=E8=8F=9C=E5=8D=95=E6=B2=BB=E7=90=86+=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=9B=9E=E8=B0=83=E9=AA=8C=E7=AD=BE=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=BA=95=E5=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 pay_md 通道元数据字典全量(能力/通道/产品映射)与增量刷新脚本 - iam_perm_menu 菜单全量快照: 标题/i18n_key 归一, 新增移动端应用管理/微信服务商子商户 - update-tables 新增拉卡拉(2表)+银联商务(2表)建表, 均含 COMMENT ON - ProductEnum 新增10个第三方聚合通道枚举(汇付/斗拱/海科/富友/盛付通/银盛/快钱/杉德/易宝/jeepay) - i18n product/validation 中英文同步 - 微信回调验签解析能力: 主应用通过声明式HTTP客户端转发子应用验签(支付/退款回调) --- _config/sql/iam_perm_menu.sql | 30 +- _config/sql/pay_md.sql | 564 ++++++++++++++++++ _config/sql/pay_md_upgrade.sql | 264 ++++++++ _config/sql/update-tables.sql | 149 +++++ .../wechat/client/WechatChannelClient.java | 10 + .../client/req/WechatCallbackParseReq.java | 31 + .../client/resp/WechatCallbackParseResp.java | 46 ++ .../open/channel/wechat/code/WechatCode.java | 38 ++ .../callback/WechatCallbackController.java | 46 ++ .../callback/WechatPayCallbackService.java | 98 +++ .../callback/WechatRefundCallbackService.java | 72 +++ .../resources/i18n/en-US/enum/product.json | 12 +- .../main/resources/i18n/en-US/validation.json | 18 + .../resources/i18n/zh-CN/enum/product.json | 12 +- .../main/resources/i18n/zh-CN/validation.json | 18 + .../core/enums/pay/channel/ProductEnum.java | 33 + 16 files changed, 1425 insertions(+), 16 deletions(-) create mode 100644 _config/sql/pay_md.sql create mode 100644 _config/sql/pay_md_upgrade.sql create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/req/WechatCallbackParseReq.java create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/resp/WechatCallbackParseResp.java create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/controller/callback/WechatCallbackController.java create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatPayCallbackService.java create mode 100644 daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatRefundCallbackService.java diff --git a/_config/sql/iam_perm_menu.sql b/_config/sql/iam_perm_menu.sql index 69225452e..d4bec18ce 100644 --- a/_config/sql/iam_perm_menu.sql +++ b/_config/sql/iam_perm_menu.sql @@ -12,7 +12,7 @@ Target Server Version : 160014 (160014) File Encoding : 65001 - Date: 05/07/2026 10:35:00 + Date: 05/07/2026 22:43:00 */ @@ -105,7 +105,6 @@ INSERT INTO "public"."iam_perm_menu" VALUES (30402, 304, 'system:platform_config INSERT INTO "public"."iam_perm_menu" VALUES (2, NULL, NULL, 'admin', 'Demos', '演示', 'Demos', 'menu.demos', 'lucide:blocks', 'f', 'f', NULL, '/demos', NULL, 1000, 'f', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-06-25 02:00:30.27727+00'); INSERT INTO "public"."iam_perm_menu" VALUES (1, NULL, NULL, 'admin', 'Dashboard', '仪表板', 'Dashboard', 'menu.dashboard', 'lucide:layout-dashboard', 'f', 'f', NULL, '/dashboard', '/workspace', -1, 'f', 'f', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-06-27 13:46:52.151771+00'); INSERT INTO "public"."iam_perm_menu" VALUES (30202, 302, 'system:log:operate', 'admin', 'SystemOperateLog', '操作日志', 'Operate Log', 'menu.system.log.operate', 'lucide:activity', 'f', 'f', '/system/log/operate/OperateLogList', '/system/log/operate', NULL, 2, 'f', 't', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-03-30 15:24:57.076166+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (40401, 404, 'merchant:info', 'admin', 'MerchantInfo', '商户信息', 'Merchant Info', 'menu.merchant.info', 'lucide:shopping-bag', 'f', 'f', '/payment/merchant/info/MerchantList', '/payment/merchant/info', NULL, 1, 'f', 't', 'f', 1, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-04-13 16:00:00+00', '2026-06-25 02:00:30.290399+00'); INSERT INTO "public"."iam_perm_menu" VALUES (30601, 307, 'system:file:platform', 'admin', 'StorageFile', '存储文件', 'Storage File', 'menu.system.monitor.file', 'lucide:files', 'f', 'f', '/system/monitor/file/PlatformFileList', '/system/monitor/file', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-09 16:00:00+00', '2026-06-25 02:43:43.71511+00'); INSERT INTO "public"."iam_perm_menu" VALUES (4, NULL, 'payment', 'admin', 'PaymentSystem', '平台管理', 'Platform Management', 'menu.platform', 'lucide:credit-card', 'f', 'f', NULL, '/payment', NULL, 3, 'f', 't', 'f', 0, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-05 16:00:00+00', '2026-06-13 00:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (30201, 302, 'system:log:login', 'admin', 'SystemLoginLog', '登录日志', 'Login Log', 'menu.system.log.login', 'lucide:log-in', 'f', 'f', '/system/log/login/LoginLogList', '/system/log/login', NULL, 1, 'f', 't', 'f', 0, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-03-20 03:11:13.134079+00', '2026-03-30 15:25:09.855555+00'); @@ -114,24 +113,25 @@ INSERT INTO "public"."iam_perm_menu" VALUES (101, 1, 'dashboard:analytics', 'adm INSERT INTO "public"."iam_perm_menu" VALUES (30103, 305, 'iam:role', 'admin', 'SystemRole', '角色管理', 'Role Management', 'menu.system.perm.role', 'lucide:shield-user', 'f', 'f', '/iam/perm/role/RoleList', '/iam/perm/role', NULL, 3, 'f', 't', 'f', 0, 1, 2, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-20 03:11:13.134079+00', '2026-06-25 02:00:30.246504+00'); INSERT INTO "public"."iam_perm_menu" VALUES (30501, 305, 'iam:user:manager', 'admin', 'UserList', '用户管理', 'User Management', 'menu.system.perm.user', 'lucide:users-round', 'f', 'f', 'views/iam/user/UserList', '/iam/user', NULL, 10, 'f', 't', 'f', 1, 1, 4, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-31 00:23:04.37507+00', '2026-06-25 02:00:30.279649+00'); INSERT INTO "public"."iam_perm_menu" VALUES (30102, 301, 'iam:perm:menu', 'admin', 'SystemMenu', '菜单管理', 'Menu Management', 'menu.system.perm.menu', 'lucide:panel-top', 'f', 'f', '/iam/perm/menu/MenuList', '/system/basic/menu', NULL, 0, 'f', 't', 'f', 0, 1, 3, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-03-20 03:11:13.134079+00', '2026-06-27 10:29:51.371435+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (40401, 404, 'merchant:info', 'admin', 'MerchantInfo', '商户列表', 'Merchant List', 'menu.payment.merchant.list', 'lucide:shopping-bag', 'f', 'f', '/payment/merchant/info/MerchantList', '/payment/merchant/info', NULL, 1, 'f', 't', 'f', 1, 1, 1, 'f', 'menu', NULL, NULL, NULL, NULL, '', '', '2026-04-13 16:00:00+00', '2026-06-25 02:00:30.290399+00'); INSERT INTO "public"."iam_perm_menu" VALUES (40104, 401, 'payment:platform:capability', 'admin', 'PayCapabilityList', '支付能力', 'Payment Capability', 'menu.payment.platform.capability', 'lucide:zap', 'f', 'f', '/payment/masterdata/capability/PayCapabilityList', '/payment/platform/pay-capability', NULL, 3, 'f', 't', 'f', 1, 1, 4, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-26 16:00:00+00', '2026-05-28 06:43:27.505831+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040111, 40401, 'merchant:app:route', 'admin', 'PayRouteConfig', '通道路由', 'Channel Routing', 'menu.payment.merchant.app.payRoute', NULL, 't', 'f', '/payment/merchant/route/PayRouteConfig', '/payment/merchant/route', NULL, 2, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 22:23:46.483985+00', '2026-05-26 20:03:06.445803+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040114, 40401, 'channel:alipay:app', 'admin', 'AlipayMchAppManage', '支付宝应用', 'Alipay App', 'menu.payment.merchant.channelMerchant.alipayApp', NULL, 't', 'f', '/payment/channel/alipay/manage/mch/app/AlipayMchAppManage', '/payment/merchant/channel-merchant/alipay-app-manage', NULL, 12, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-11 22:28:11.274785+00', '2026-06-11 22:28:11.274785+00'); INSERT INTO "public"."iam_perm_menu" VALUES (40102, 401, 'payment:platform:provider', 'admin', 'PayProviderList', '支付方式', 'Payment Method', 'menu.payment.platform.provider', 'lucide:list-tree', 'f', 'f', '/payment/masterdata/provider/PayMethodList', '/payment/platform/pay-method', NULL, 1, 'f', 't', 'f', 1, 1, 5, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-27 20:18:01.383008+00', '2026-05-30 08:21:19.464024+00'); INSERT INTO "public"."iam_perm_menu" VALUES (404, NULL, 'merchant', 'admin', 'PaymentMerchant', '商户管理', 'Merchant Management', 'menu.merchant', 'lucide:store', 'f', 'f', NULL, '/payment/merchant', NULL, 4, 't', 't', 'f', 0, NULL, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-05 16:00:00+00', '2026-06-13 00:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (40103, 401, 'payment:platform:pay_channel', 'admin', 'PayChannelList', '支付通道', 'Payment Channel', 'menu.payment.platform.channel', 'lucide:radio-tower', 'f', 'f', '/payment/masterdata/channel/PayChannelList', '/payment/platform/pay-channel', NULL, 0, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-28 16:00:00+00', '2026-06-27 13:01:24.315365+00'); INSERT INTO "public"."iam_perm_menu" VALUES (601, 6, 'payment:order', 'admin', 'NormalOrderList', '支付订单', 'Payment Orders', 'menu.trade.normalPay', 'lucide:receipt', 'f', 'f', '/payment/order/NormalOrderList', '/trade/normal-pay', NULL, 1, 'f', 'f', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 16:00:00+00', '2026-07-01 15:04:14.721955+00'); INSERT INTO "public"."iam_perm_menu" VALUES (40101, 401, 'payment:platform:product', 'admin', 'ProductList', '支付产品', 'Payment Product', 'menu.payment.platform.product', 'lucide:package', 'f', 'f', '/payment/masterdata/product/PayProductList', '/payment/platform/product', NULL, 2, 'f', 't', 'f', 1, 1, 3, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-23 16:00:00+00', '2026-05-28 06:25:42.892396+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040101, 40401, 'merchant:workbench', 'admin', 'MerchantManage', '商户管理', 'Merchant Management', 'menu.payment.merchant.manage', '', 't', 'f', '/payment/merchant/manage/workbench/MerchantManage', '/payment/merchant/manage', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-13 16:00:00+00', '2026-05-02 06:57:49.052168+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040102, 40401, 'merchant:credential', 'admin', 'MerchantCredentialConfig', '对接配置', 'Credential Config', 'menu.payment.merchant.manage.credentialConfig', NULL, 't', 'f', '/payment/merchant/manage/credential/MerchantCredentialConfig', '/payment/merchant/manage/credential', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-01 16:00:00+00', '2026-05-01 16:00:00+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040101, 40401, 'merchant:workbench', 'admin', 'MerchantManage', '商户工作台', 'Merchant Workbench', 'menu.payment.merchant.workbench', '', 't', 'f', '/payment/merchant/manage/workbench/MerchantManage', '/payment/merchant/manage', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-04-13 16:00:00+00', '2026-05-02 06:57:49.052168+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040102, 40401, 'merchant:credential', 'admin', 'MerchantCredentialConfig', '对接配置', 'Credential Config', 'menu.payment.merchant.credential', NULL, 't', 'f', '/payment/merchant/manage/credential/MerchantCredentialConfig', '/payment/merchant/manage/credential', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-01 16:00:00+00', '2026-05-01 16:00:00+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040111, 40401, 'merchant:app:route', 'admin', 'PayRouteConfig', '通道路由', 'Channel Routing', 'menu.payment.merchant.payRoute', NULL, 't', 'f', '/payment/merchant/route/PayRouteConfig', '/payment/merchant/route', NULL, 2, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 22:23:46.483985+00', '2026-05-26 20:03:06.445803+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040112, 40401, 'channel:merchant:detail', 'admin', 'ChannelMerchantDetailDispatch', '通道商户管理', 'Channel Merchant Management', 'menu.payment.merchant.channelMerchant.detail', NULL, 't', 'f', '/payment/merchant/channel-merchant/detail/ChannelMerchantDetailDispatch', '/payment/merchant/channel-merchant/detail', NULL, 10, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-07 19:48:34.936565+00', '2026-06-07 19:48:34.936565+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040113, 40401, 'channel:wechat:app', 'admin', 'WechatMchAppManage', '微信应用', 'WeChat App', 'menu.payment.merchant.channelMerchant.wechatApp', NULL, 't', 'f', '/payment/channel/wechat/manage/mch/app/WechatMchAppManage', '/payment/merchant/channel-merchant/wechat-app-manage', NULL, 11, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-07 23:57:13.620205+00', '2026-06-07 23:57:13.620205+00'); INSERT INTO "public"."iam_perm_menu" VALUES (4040108, 40401, 'merchant:user', 'admin', 'MerchantUser', '商户用户', 'Merchant User', 'menu.payment.merchant.user', '', 't', 'f', '/payment/merchant/user/MerchantUserList', '/payment/merchant/user', NULL, 8, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-04 16:00:00+00', '2026-05-04 16:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (4040110, 40401, 'merchant:app', 'admin', 'MchAppInfoList', '应用管理', 'App Management', 'menu.payment.merchant.app', NULL, 't', 'f', '/payment/merchant/app/MchAppInfoList', '/payment/merchant/app', NULL, 10, 'f', 't', 'f', 1, 1, 1, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-24 16:00:00+00', '2026-05-24 19:54:00.095239+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040112, 40401, 'channel:merchant:detail', 'admin', 'ChannelMerchantDetailDispatch', '通道商户详情', 'Channel Merchant Detail', 'menu.payment.merchant.channelMerchant.detail', NULL, 't', 'f', '/payment/merchant/channel-merchant/detail/ChannelMerchantDetailDispatch', '/payment/merchant/channel-merchant/detail', NULL, 10, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-07 19:48:34.936565+00', '2026-06-07 19:48:34.936565+00'); INSERT INTO "public"."iam_perm_menu" VALUES (4040109, 40401, 'channel:merchant:create', 'admin', 'ChannelMerchantCreate', '创建通道商户', 'Create Channel Merchant', 'menu.payment.merchant.channelMerchant.create', NULL, 't', 'f', '/payment/merchant/channel-merchant/ChannelMerchantCreate', '/payment/merchant/channel-merchant/create', NULL, 9, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-05 16:00:00+00', '2026-05-05 16:00:00+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040114, 40401, 'channel:alipay:app', 'admin', 'AlipayMchAppManage', '支付宝通道商户应用', 'Alipay Channel Merchant App', 'menu.payment.merchant.channelMerchant.alipayApp', NULL, 't', 'f', '/payment/channel/alipay/manage/mch/app/AlipayMchAppManage', '/payment/merchant/channel-merchant/alipay-app-manage', NULL, 12, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-11 22:28:11.274785+00', '2026-06-11 22:28:11.274785+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040113, 40401, 'channel:wechat:app', 'admin', 'WechatMchAppManage', '微信通道商户应用', 'WeChat Channel Merchant App', 'menu.payment.merchant.channelMerchant.wechatApp', NULL, 't', 'f', '/payment/channel/wechat/manage/mch/app/WechatMchAppManage', '/payment/merchant/channel-merchant/wechat-app-manage', NULL, 11, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-07 23:57:13.620205+00', '2026-06-07 23:57:13.620205+00'); INSERT INTO "public"."iam_perm_menu" VALUES (405, 4, 'payment:config', 'admin', 'PaymentConfig', '支付配置', 'Payment Config', 'menu.payment.config', 'lucide:settings-2', 'f', 'f', NULL, '/payment/config', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-14 00:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (90201, 9, 'device:vendor_config', 'admin', 'VendorManage', '设备厂商管理', 'Device Vendor Management', 'menu.device.vendor', 'lucide:building-2', 'f', 'f', '/payment/device/vendor/VendorManage', '/device/vendor', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-25 01:21:34.646017+00', '2026-06-27 13:01:24.320315+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (40502, 40105, 'payment:alipay:isv', 'admin', 'AlipayIsvAppManage', '支付宝服务商应用', 'Alipay ISV Application', 'menu.payment.alipay.isvApp', NULL, 't', 'f', '/payment/channel/alipay/manage/app/AlipayIsvAppManage', '/payment/config/product/app-manage', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-14 00:00:00+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (40503, 40105, 'payment:wechat:isv', 'admin', 'WechatIsvAppManage', '微信服务商应用', 'WeChat ISV Application', 'menu.payment.config.wechatApp', NULL, 't', 'f', '/payment/channel/wechat/manage/app/WechatIsvAppManage', '/payment/config/product/wechat-app-manage', NULL, 4, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-14 00:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (90202, 9, 'device:speaker', 'admin', 'DeviceSpeakerList', '云音箱管理', 'Speaker Management', 'menu.device.speaker', 'lucide:speaker', 'f', 'f', '/payment/device/speaker/DeviceSpeakerList', '/device/speaker', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-25 01:21:34.647632+00', '2026-06-25 12:51:25.245363+00'); INSERT INTO "public"."iam_perm_menu" VALUES (8, NULL, 'develop', 'admin', 'Develop', '开发调试', 'Develop', 'menu.develop', 'lucide:wrench', 'f', 'f', NULL, '/develop', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-23 16:00:00+00', '2026-06-23 16:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (901, 9, 'device:qrcode', 'admin', 'DeviceQrCode', '码牌管理', 'QR Code Management', 'menu.device.qrcode', 'lucide:qr-code', 't', 'f', '/_core/fallback/coming-soon', '/device/qrcode', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-25 01:21:34.634639+00', '2026-06-25 12:51:25.24304+00'); @@ -139,13 +139,12 @@ INSERT INTO "public"."iam_perm_menu" VALUES (204, 2, 'demos:artemis', 'admin', ' INSERT INTO "public"."iam_perm_menu" VALUES (900001, 304, 'iam:social:config', 'admin', 'SocialConfig', '三方平台登录', 'Third-party Platform Login', 'menu.system.config.social', 'lucide:share-2', 'f', 'f', 'views/iam/social/social-config', '/system/config/social', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); INSERT INTO "public"."iam_perm_menu" VALUES (30403, 304, 'system:protocol', 'admin', 'UserProtocol', '用户协议', 'User Protocol', 'menu.system.config.protocol', 'lucide:file-text', 'f', 'f', '/system/protocol/UserProtocolList', '/system/config/protocol', NULL, 10, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-24 10:32:13.183371+00', '2026-06-24 10:32:13.183371+00'); INSERT INTO "public"."iam_perm_menu" VALUES (4040106, 40401, 'channel:merchant', 'admin', 'ChannelMerchant', '通道商户', 'Channel Merchant', 'menu.payment.merchant.channelMerchant', NULL, 't', 'f', '/payment/merchant/channel-merchant/ChannelMerchantList', '/payment/merchant/channel-merchant', NULL, 6, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-05-03 16:00:00+00', '2026-05-03 16:00:00+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (40501, 40105, 'payment:config:product_detail', 'admin', 'ProductDetailDispatch', '支付产品详情', 'Payment Product Detail', 'menu.payment.config.productDetail', NULL, 't', 'f', '/payment/config/product/detail/ProductDetailDispatch', '/payment/product-detail', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-27 13:01:24.321883+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040103, 40401, 'merchant:mchInfo', 'admin', 'MchInfoManage', '商户信息', 'Merchant Basic Info', 'menu.payment.merchant.manage.mchInfo', NULL, 't', 'f', '/payment/merchant/manage/info/MchInfoManage', '/payment/merchant/manage/info', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO "public"."iam_perm_menu" VALUES (40502, 40105, 'payment:alipay:isv', 'admin', 'AlipayIsvAppManage', '支付宝服务商应用', 'Alipay ISV Application', 'menu.payment.config.alipayApp', NULL, 't', 'f', '/payment/channel/alipay/manage/app/AlipayIsvAppManage', '/payment/config/product/app-manage', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-14 00:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (801, 8, 'develop:trade', 'admin', 'DevelopTrade', '支付调试', 'Payment Develop', 'menu.develop.trade', 'lucide:credit-card', 'f', 'f', '/payment/develop/trade/DevelopTrade', '/develop/trade', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-23 16:00:00+00', '2026-06-23 16:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (802, 8, 'develop:sign', 'admin', 'DevelopSign', '签名调试', 'Sign Develop', 'menu.develop.sign', 'lucide:file-signature', 'f', 'f', '/payment/develop/sign/DevelopSign', '/develop/sign', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-23 16:00:00+00', '2026-06-23 16:00:00+00'); INSERT INTO "public"."iam_perm_menu" VALUES (4040117, 40401, 'merchant:store', 'admin', 'MchStoreInfoList', '门店管理', 'Store Management', 'menu.payment.merchant.store', NULL, 't', 'f', '/payment/merchant/store/MchStoreInfoList', '/payment/merchant/store', NULL, 15, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-24 16:00:00+00', '2026-06-24 16:00:00+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (40503, 40105, 'payment:wechat:isv', 'admin', 'WechatIsvAppManage', '微信服务商应用', 'WeChat ISV Application', 'menu.payment.wechat.isvApp', NULL, 't', 'f', '/payment/channel/wechat/manage/app/WechatIsvAppManage', '/payment/config/product/wechat-app-manage', NULL, 4, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-14 00:00:00+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040115, 40401, 'channel:douyin:app', 'admin', 'DouyinMchAppManage', '抖音通道商户应用', 'Douyin Channel Merchant App', 'menu.payment.merchant.channelMerchant.douyinApp', NULL, 't', 'f', '/payment/channel/douyin/manage/app/DouyinMchAppManage', '/payment/merchant/channel-merchant/douyin-app-manage', NULL, 13, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-15 16:00:00+00', '2026-06-15 16:00:00+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040103, 40401, 'merchant:mchInfo', 'admin', 'MchInfoManage', '商户资料', 'Merchant Profile', 'menu.payment.merchant.profile', NULL, 't', 'f', '/payment/merchant/manage/info/MchInfoManage', '/payment/merchant/manage/info', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO "public"."iam_perm_menu" VALUES (4040119, 40401, 'channel:wechat:app', 'admin', 'WechatIsvMchAppManage', '微信服务商子商户应用', 'WeChat ISV Sub-merchant App', 'menu.payment.merchant.channelMerchant.wechatIsvApp', NULL, 't', 'f', '/payment/channel/wechat/manage/mch/isv-app/WechatIsvMchAppManage', '/payment/merchant/channel-merchant/wechat-isv-mch-app-manage', NULL, 14, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 01:49:32.557374+00', '2026-07-05 01:49:32.557374+00'); INSERT INTO "public"."iam_perm_menu" VALUES (904, 9, 'device:assistant', 'admin', 'DeviceAssistant', '辅助支付终端', 'Payment Assistant Terminal', 'menu.device.assistant', 'lucide:monitor-smartphone', 'f', 'f', '/_core/fallback/coming-soon', '/device/assistant', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-25 12:51:25.252086+00', '2026-06-25 12:51:25.252086+00'); INSERT INTO "public"."iam_perm_menu" VALUES (602, 6, 'payment:trade', 'admin', 'PayTradeList', '资金交易', 'Fund Trades', 'menu.trade.payTrade', 'lucide:arrow-left-right', 'f', 'f', '/payment/order/PayTradeList', '/trade/pay-trade', NULL, 2, 'f', 't', 'f', NULL, NULL, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-01 15:09:04.769906+00', '2026-07-01 15:09:04.769906+00'); INSERT INTO "public"."iam_perm_menu" VALUES (9, NULL, 'device', 'admin', 'DeviceManagement', '设备管理', 'Device Management', 'menu.device', 'lucide:monitor-speaker', 'f', 'f', NULL, '/device', NULL, 4.2, 'f', 't', 'f', 1, 1, 1, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-25 01:21:34.631155+00', '2026-06-25 12:51:25.231569+00'); @@ -155,7 +154,10 @@ INSERT INTO "public"."iam_perm_menu" VALUES (4040116, 401, 'payment:platform:pro INSERT INTO "public"."iam_perm_menu" VALUES (309, 308, 'system:notify:notice', 'admin', 'SystemNotify', '通知公告', 'Notification', 'menu.system.notify.notice', 'lucide:megaphone', 'f', 'f', '/system/notify/notice/NoticeList', '/system/notify/notice', NULL, 20, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, '2026-06-24 16:00:00+00', '2026-06-24 16:00:00+00', NULL); INSERT INTO "public"."iam_perm_menu" VALUES (308, 3, 'system:notify', 'admin', 'SystemNotice', '通知中心', 'Notification Center', 'menu.system.notify', 'lucide:bell', 'f', 'f', NULL, '/system/notify', '/system/notify/notice', 20, 'f', 't', 'f', 1, 1, 0, 'f', 'catalog', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-01 07:16:30.927645+00', '2026-07-01 07:16:30.927645+00'); INSERT INTO "public"."iam_perm_menu" VALUES (603, 6, 'payment:refund', 'admin', 'RefundOrderList', '退款订单', 'Refund Orders', 'menu.trade.refundOrder', 'lucide:rotate-ccw', 'f', 'f', '/payment/order/RefundOrderList', '/trade/refund-order', NULL, 3, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-03 16:00:00+00', '2026-07-03 16:00:00+00'); -INSERT INTO "public"."iam_perm_menu" VALUES (4040119, 40401, 'channel:wechat:app', 'admin', 'WechatIsvMchAppManage', '微信服务商通道商户应用', 'WeChat ISV Channel Merchant App', 'menu.payment.merchant.channelMerchant.wechatIsvMchApp', NULL, 't', 'f', '/payment/channel/wechat/manage/mch/isv-app/WechatIsvMchAppManage', '/payment/merchant/channel-merchant/wechat-isv-mch-app-manage', NULL, 14, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 01:49:32.557374+00', '2026-07-05 01:49:32.557374+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (4040115, 40401, 'channel:douyin:app', 'admin', 'DouyinMchAppManage', '抖音应用', 'Douyin App', 'menu.payment.merchant.channelMerchant.douyinApp', NULL, 't', 'f', '/payment/channel/douyin/manage/app/DouyinMchAppManage', '/payment/merchant/channel-merchant/douyin-app-manage', NULL, 13, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-15 16:00:00+00', '2026-06-15 16:00:00+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (40501, 40105, 'payment:config:product_detail', 'admin', 'ProductDetailDispatch', '产品配置详情', 'Product Config Detail', 'menu.payment.config.detail', NULL, 't', 'f', '/payment/config/product/detail/ProductDetailDispatch', '/payment/product-detail', NULL, 2, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-06-14 00:00:00+00', '2026-06-27 13:01:24.321883+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (40504, 405, 'payment:config:mobile_app', 'admin', 'MobileAppConfig', '移动端应用管理', 'Mobile App Management', 'menu.payment.config.mobileApp', 'lucide:smartphone', 'f', 'f', '/payment/config/mobileApp/MobileAppConfig', '/payment/config/mobile-app', NULL, 5, 'f', 't', 'f', 1, 1, 0, 'f', 'menu', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-05 00:00:00+00'); +INSERT INTO "public"."iam_perm_menu" VALUES (40505, 40504, 'payment:config:mobile_app_detail', 'admin', 'MobileAppDetail', '移动端应用详情', 'Mobile App Detail', 'menu.payment.config.mobileAppDetail', NULL, 't', 'f', '/payment/config/mobileApp/detail/MobileAppDetail', '/payment/config/mobile-app/detail/:appType', NULL, 1, 'f', 't', 'f', 1, 1, 0, 'f', 'subpage', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-05 00:00:00+00', '2026-07-05 00:00:00+00'); -- ---------------------------- -- Primary Key structure for table iam_perm_menu diff --git a/_config/sql/pay_md.sql b/_config/sql/pay_md.sql new file mode 100644 index 000000000..baffa44bc --- /dev/null +++ b/_config/sql/pay_md.sql @@ -0,0 +1,564 @@ +/* + Navicat Premium Data Transfer + + Source Server : 229本地服务 + Source Server Type : PostgreSQL + Source Server Version : 160014 (160014) + Source Host : 192.168.1.229:5432 + Source Catalog : daxpay-dev + Source Schema : public + + Target Server Type : PostgreSQL + Target Server Version : 160014 (160014) + File Encoding : 65001 + + Date: 05/07/2026 22:55:57 +*/ + + +-- ---------------------------- +-- Table structure for pay_md_capability +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_capability"; +CREATE TABLE "public"."pay_md_capability" ( + "id" int8 NOT NULL, + "code" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "sort_no" int4 NOT NULL DEFAULT 0, + "enabled" bool NOT NULL DEFAULT true, + "description" varchar(512) COLLATE "pg_catalog"."default", + "deleted" bool NOT NULL DEFAULT false, + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL DEFAULT 0, + "creator" int8, + "create_time" timestamp(6) +) +; +COMMENT ON COLUMN "public"."pay_md_capability"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_md_capability"."code" IS '支付能力编码(PayCapabilityEnum.code)'; +COMMENT ON COLUMN "public"."pay_md_capability"."sort_no" IS '全局排序'; +COMMENT ON COLUMN "public"."pay_md_capability"."enabled" IS '是否启用'; +COMMENT ON COLUMN "public"."pay_md_capability"."description" IS '说明'; +COMMENT ON COLUMN "public"."pay_md_capability"."deleted" IS '逻辑删除'; +COMMENT ON COLUMN "public"."pay_md_capability"."last_modifier" IS '最后修改者ID'; +COMMENT ON COLUMN "public"."pay_md_capability"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_md_capability"."version" IS '版本号(乐观锁)'; +COMMENT ON COLUMN "public"."pay_md_capability"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_md_capability"."create_time" IS '创建时间'; +COMMENT ON TABLE "public"."pay_md_capability" IS '支付能力主数据'; + +-- ---------------------------- +-- Records of pay_md_capability +-- ---------------------------- +INSERT INTO "public"."pay_md_capability" VALUES (5001, 'aggregate_pay_qrcode', 0, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5002, 'aggregate_pay_barcode', 1, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5003, 'wechat_cashier', 2, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5004, 'wechat_jsapi', 3, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5005, 'wechat_app', 4, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5006, 'wechat_h5', 5, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5007, 'wechat_qr', 6, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5008, 'wechat_mini', 7, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5009, 'wechat_barcode', 8, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5010, 'alipay_barcode', 9, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5011, 'alipay_order_qr', 10, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5012, 'alipay_app', 11, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5013, 'alipay_h5', 12, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5014, 'alipay_pc', 13, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5015, 'alipay_jsapi', 14, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5016, 'union_pay_qr', 15, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5017, 'union_pay_barcode', 16, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5018, 'union_pay_h5', 17, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5019, 'union_pay_jsapi', 18, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5020, 'visa_card_gateway', 19, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5021, 'visa_card_present', 20, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5022, 'mastercard_card_gateway', 21, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (5023, 'mastercard_card_present', 22, 't', NULL, 'f', 1, '2026-05-29 04:18:20.415995', 0, 1, '2026-05-29 04:18:20.415995'); +INSERT INTO "public"."pay_md_capability" VALUES (7001, 'douyin_qr', 1, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_capability" VALUES (7002, 'douyin_jsapi', 2, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_capability" VALUES (7003, 'douyin_h5', 3, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_capability" VALUES (7004, 'douyin_app', 4, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); + +-- ---------------------------- +-- Table structure for pay_md_channel +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_channel"; +CREATE TABLE "public"."pay_md_channel" ( + "id" int8 NOT NULL, + "code" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, + "sort_no" int4 DEFAULT 0, + "description" varchar(500) COLLATE "pg_catalog"."default", + "icon" varchar(200) COLLATE "pg_catalog"."default", + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 DEFAULT 0, + "deleted" bool DEFAULT false +) +; +COMMENT ON COLUMN "public"."pay_md_channel"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_md_channel"."code" IS '通道编码'; +COMMENT ON COLUMN "public"."pay_md_channel"."sort_no" IS '排序'; +COMMENT ON COLUMN "public"."pay_md_channel"."description" IS '通道介绍'; +COMMENT ON COLUMN "public"."pay_md_channel"."icon" IS '图标'; +COMMENT ON COLUMN "public"."pay_md_channel"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_md_channel"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_md_channel"."last_modifier" IS '最后修改ID'; +COMMENT ON COLUMN "public"."pay_md_channel"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_md_channel"."version" IS '版本号'; +COMMENT ON COLUMN "public"."pay_md_channel"."deleted" IS '删除标志'; +COMMENT ON TABLE "public"."pay_md_channel" IS '支付通道'; + +-- ---------------------------- +-- Records of pay_md_channel +-- ---------------------------- +INSERT INTO "public"."pay_md_channel" VALUES (1, 'alipay', 1, NULL, NULL, 1, '2026-05-29 00:00:00', 1, '2026-05-29 00:00:00', 0, 'f'); +INSERT INTO "public"."pay_md_channel" VALUES (3, 'wechat', 3, NULL, NULL, 1, '2026-05-29 00:00:00', 1, '2026-05-29 00:00:00', 0, 'f'); +INSERT INTO "public"."pay_md_channel" VALUES (6, 'leshua_pay', 6, NULL, NULL, 1, '2026-05-29 00:00:00', 1, '2026-05-29 00:00:00', 0, 'f'); +INSERT INTO "public"."pay_md_channel" VALUES (7, 'vbill_pay', 7, NULL, NULL, 1, '2026-05-29 00:00:00', 1, '2026-05-29 00:00:00', 0, 'f'); +INSERT INTO "public"."pay_md_channel" VALUES (8, 'lakala_pay', 8, NULL, NULL, 1, '2026-05-29 00:00:00', 1, '2026-05-29 00:00:00', 0, 'f'); +INSERT INTO "public"."pay_md_channel" VALUES (5, 'ums_pay', 5, NULL, NULL, 1, '2026-05-29 00:00:00', 1, '2026-05-29 00:00:00', 0, 'f'); +INSERT INTO "public"."pay_md_channel" VALUES (9, 'douyin_pay', 60, '抖音支付通道', 'douyinPay', 1, '2026-06-15 00:00:00', 1, '2026-06-15 00:00:00', 0, 'f'); + +-- ---------------------------- +-- Table structure for pay_md_method +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_method"; +CREATE TABLE "public"."pay_md_method" ( + "id" int8 NOT NULL, + "code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "sort_no" int4 NOT NULL DEFAULT 0, + "description" varchar(512) COLLATE "pg_catalog"."default", + "deleted" bool NOT NULL DEFAULT false, + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL DEFAULT 0, + "creator" int8, + "create_time" timestamp(6) +) +; +COMMENT ON COLUMN "public"."pay_md_method"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_md_method"."code" IS '支付方式编码(全局唯一)'; +COMMENT ON COLUMN "public"."pay_md_method"."sort_no" IS '全局排序'; +COMMENT ON COLUMN "public"."pay_md_method"."description" IS '说明'; +COMMENT ON COLUMN "public"."pay_md_method"."deleted" IS '逻辑删除'; +COMMENT ON COLUMN "public"."pay_md_method"."last_modifier" IS '最后修改者ID'; +COMMENT ON COLUMN "public"."pay_md_method"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_md_method"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."pay_md_method"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_md_method"."create_time" IS '创建时间'; +COMMENT ON TABLE "public"."pay_md_method" IS '支付方式'; + +-- ---------------------------- +-- Records of pay_md_method +-- ---------------------------- +INSERT INTO "public"."pay_md_method" VALUES (502003001, 'aggregate_pay_qrcode', 1, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003002, 'aggregate_pay_barcode', 2, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003003, 'wechat_cashier', 3, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003004, 'wechat_qr', 4, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003005, 'wechat_jsapi', 5, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003006, 'wechat_mini', 6, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003007, 'wechat_h5', 7, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003008, 'wechat_app', 8, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003009, 'wechat_barcode', 9, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003010, 'alipay_qr', 10, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003012, 'alipay_jsapi', 12, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003013, 'alipay_mini', 13, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003014, 'alipay_pc', 14, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003015, 'alipay_h5', 15, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003016, 'alipay_app', 16, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003017, 'alipay_barcode', 17, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003018, 'union_qr', 18, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003019, 'union_jsapi', 19, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003020, 'union_h5', 20, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003021, 'union_pay_barcode', 21, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003022, 'visa_card_gateway', 22, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003023, 'visa_card_present', 23, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003024, 'mastercard_card_gateway', 24, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003025, 'mastercard_card_present', 25, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003026, 'other', 26, NULL, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003011, 'alipay_order_qr', 12, '支付宝订单码', 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977'); +INSERT INTO "public"."pay_md_method" VALUES (502003027, 'douyin_qr', 1, NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_method" VALUES (502003028, 'douyin_jsapi', 2, NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_method" VALUES (502003029, 'douyin_h5', 3, NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_method" VALUES (502003030, 'douyin_app', 4, NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); + +-- ---------------------------- +-- Table structure for pay_md_product +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_product"; +CREATE TABLE "public"."pay_md_product" ( + "id" int8 NOT NULL, + "code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "channel" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "description" text COLLATE "pg_catalog"."default", + "icon" varchar(256) COLLATE "pg_catalog"."default", + "settle_periods" jsonb, + "sort_no" int4 DEFAULT 0, + "creator" int8, + "create_time" timestamp(6), + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 DEFAULT 0, + "deleted" bool DEFAULT false, + "sandbox" bool DEFAULT false, + "enabled" bool NOT NULL DEFAULT true +) +; +COMMENT ON COLUMN "public"."pay_md_product"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_md_product"."code" IS '产品编码'; +COMMENT ON COLUMN "public"."pay_md_product"."name" IS '产品名称'; +COMMENT ON COLUMN "public"."pay_md_product"."channel" IS '关联通道编码'; +COMMENT ON COLUMN "public"."pay_md_product"."description" IS '产品介绍'; +COMMENT ON COLUMN "public"."pay_md_product"."icon" IS '图标'; +COMMENT ON COLUMN "public"."pay_md_product"."settle_periods" IS '支持的结算周期列表'; +COMMENT ON COLUMN "public"."pay_md_product"."sort_no" IS '排序'; +COMMENT ON COLUMN "public"."pay_md_product"."creator" IS '创建者'; +COMMENT ON COLUMN "public"."pay_md_product"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_md_product"."last_modifier" IS '最后修改者'; +COMMENT ON COLUMN "public"."pay_md_product"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_md_product"."version" IS '版本号'; +COMMENT ON COLUMN "public"."pay_md_product"."deleted" IS '逻辑删除'; +COMMENT ON COLUMN "public"."pay_md_product"."sandbox" IS '是否支持沙箱环境'; +COMMENT ON TABLE "public"."pay_md_product" IS '支付产品'; + +-- ---------------------------- +-- Records of pay_md_product +-- ---------------------------- +INSERT INTO "public"."pay_md_product" VALUES (1001, 'alipay_isv', '支付宝(服务商)', 'alipay', '支付宝服务商模式,支持多种支付方式、进件申请和分账', 'alipay', '["T+1", "D+1", "T+0", "D+0"]', 20, NULL, NULL, NULL, NULL, 0, 'f', 'f', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10009, 'wechat_pay', '微信支付(直连)', 'wechat', '微信支付直连商户模式', NULL, '["T0", "T1"]', 30, NULL, NULL, NULL, NULL, 0, 'f', 'f', 't'); +INSERT INTO "public"."pay_md_product" VALUES (1003, 'wechat_isv', '微信支付(服务商)', 'wechat', '微信支付服务商模式,支持多种支付方式、进件申请和分账', 'wechat', '["T+1", "D+1", "T+0", "D+0"]', 40, NULL, NULL, NULL, NULL, 0, 'f', 'f', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10001, 'ums_qrcode', '银联商务(C扫B)', 'ums_pay', '银联商务C扫B支付(主扫)', NULL, '["T0", "T1"]', 100, NULL, NULL, NULL, NULL, 0, 'f', 't', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10002, 'ums_jsapi', '银联商务(公众号)', 'ums_pay', '银联商务公众号支付', NULL, '["T0", "T1"]', 110, NULL, NULL, NULL, NULL, 0, 'f', 't', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10003, 'ums_app', '银联商务(APP)', 'ums_pay', '银联商务APP支付', NULL, '["T0", "T1"]', 120, NULL, NULL, NULL, NULL, 0, 'f', 't', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10004, 'ums_mini', '银联商务(小程序)', 'ums_pay', '银联商务小程序支付', NULL, '["T0", "T1"]', 130, NULL, NULL, NULL, NULL, 0, 'f', 't', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10005, 'ums_h5', '银联商务(H5)', 'ums_pay', '银联商务H5支付', NULL, '["T0", "T1"]', 140, NULL, NULL, NULL, NULL, 0, 'f', 't', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10006, 'ums_barcode', '银联商务(B扫C)', 'ums_pay', '银联商务B扫C支付(被扫)', NULL, '["T0", "T1"]', 150, NULL, NULL, NULL, NULL, 0, 'f', 't', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10007, 'lakala_pay', '拉卡拉支付', 'lakala_pay', '拉卡拉支付', NULL, '["T0", "T1"]', 200, NULL, NULL, NULL, NULL, 0, 'f', 't', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10010, 'douyin_pay', '抖音支付(直连)', 'douyin_pay', '抖音支付直连商户模式', 'douyinPay', '["T0", "T1"]', 50, NULL, NULL, NULL, NULL, 0, 'f', 'f', 't'); +INSERT INTO "public"."pay_md_product" VALUES (10008, 'alipay', '支付宝(直连)', 'alipay', '支付宝直连商户模式', NULL, '["T0", "T1"]', 10, NULL, NULL, 1, '2026-06-17 09:53:02.203443', 4, 'f', 't', 't'); + +-- ---------------------------- +-- Table structure for pay_md_product_capability +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_product_capability"; +CREATE TABLE "public"."pay_md_product_capability" ( + "id" int8 NOT NULL, + "product_code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "capability_code" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, + "sort_no" int4 NOT NULL DEFAULT 0, + "enabled" bool NOT NULL DEFAULT true, + "remark" varchar(512) COLLATE "pg_catalog"."default", + "deleted" bool NOT NULL DEFAULT false, + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL DEFAULT 0, + "creator" int8, + "create_time" timestamp(6) +) +; +COMMENT ON COLUMN "public"."pay_md_product_capability"."product_code" IS '支付产品编码'; +COMMENT ON COLUMN "public"."pay_md_product_capability"."capability_code" IS '支付能力编码'; +COMMENT ON COLUMN "public"."pay_md_product_capability"."sort_no" IS '排序'; +COMMENT ON COLUMN "public"."pay_md_product_capability"."enabled" IS '是否启用'; +COMMENT ON COLUMN "public"."pay_md_product_capability"."remark" IS '备注'; +COMMENT ON TABLE "public"."pay_md_product_capability" IS '支付产品与支付能力关联'; + +-- ---------------------------- +-- Records of pay_md_product_capability +-- ---------------------------- +INSERT INTO "public"."pay_md_product_capability" VALUES (6001, 'alipay_isv', 'alipay_barcode', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6002, 'alipay_isv', 'alipay_order_qr', 1, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6003, 'alipay_isv', 'alipay_jsapi', 2, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6004, 'alipay_isv', 'alipay_pc', 3, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6005, 'alipay_isv', 'alipay_h5', 4, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6006, 'alipay_isv', 'alipay_app', 5, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6010, 'wechat_isv', 'wechat_qr', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6011, 'wechat_isv', 'wechat_app', 1, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6012, 'wechat_isv', 'wechat_h5', 2, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6013, 'wechat_isv', 'wechat_barcode', 3, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6014, 'wechat_isv', 'wechat_jsapi', 4, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6015, 'wechat_isv', 'wechat_mini', 5, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6020, 'ums_qrcode', 'aggregate_pay_qrcode', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6021, 'ums_qrcode', 'union_pay_qr', 1, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6022, 'ums_qrcode', 'alipay_order_qr', 2, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6023, 'ums_qrcode', 'wechat_qr', 3, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6030, 'ums_jsapi', 'wechat_jsapi', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6031, 'ums_jsapi', 'alipay_jsapi', 1, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6040, 'ums_app', 'wechat_app', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6041, 'ums_app', 'alipay_app', 1, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6050, 'ums_mini', 'wechat_mini', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6060, 'ums_h5', 'wechat_h5', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6061, 'ums_h5', 'alipay_h5', 1, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6062, 'ums_h5', 'union_pay_h5', 2, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6070, 'ums_barcode', 'union_pay_barcode', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6080, 'lakala_pay', 'wechat_barcode', 0, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6081, 'lakala_pay', 'alipay_barcode', 1, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6082, 'lakala_pay', 'union_pay_barcode', 2, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6083, 'lakala_pay', 'wechat_jsapi', 3, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6084, 'lakala_pay', 'wechat_app', 4, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6085, 'lakala_pay', 'wechat_mini', 5, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6086, 'lakala_pay', 'alipay_order_qr', 6, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6087, 'lakala_pay', 'alipay_jsapi', 7, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6088, 'lakala_pay', 'union_pay_qr', 8, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (6089, 'lakala_pay', 'union_pay_jsapi', 9, 't', NULL, 'f', 1, '2026-05-29 07:03:18.274881', 0, 1, '2026-05-29 07:03:18.274881'); +INSERT INTO "public"."pay_md_product_capability" VALUES (20081, 'alipay', 'alipay_barcode', 1, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20082, 'alipay', 'alipay_order_qr', 2, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20083, 'alipay', 'alipay_jsapi', 3, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20084, 'alipay', 'alipay_mini', 4, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20085, 'alipay', 'alipay_pc', 5, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20086, 'alipay', 'alipay_h5', 6, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20087, 'alipay', 'alipay_app', 7, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20091, 'wechat_pay', 'wechat_qr', 1, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20092, 'wechat_pay', 'wechat_app', 2, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20093, 'wechat_pay', 'wechat_h5', 3, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20094, 'wechat_pay', 'wechat_barcode', 4, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20095, 'wechat_pay', 'wechat_jsapi', 5, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20096, 'wechat_pay', 'wechat_mini', 6, 't', NULL, 'f', NULL, NULL, 0, NULL, NULL); +INSERT INTO "public"."pay_md_product_capability" VALUES (20101, 'douyin_pay', 'douyin_qr', 1, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_product_capability" VALUES (20102, 'douyin_pay', 'douyin_jsapi', 2, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_product_capability" VALUES (20103, 'douyin_pay', 'douyin_h5', 3, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); +INSERT INTO "public"."pay_md_product_capability" VALUES (20104, 'douyin_pay', 'douyin_app', 4, 't', NULL, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00'); + +-- ---------------------------- +-- Table structure for pay_md_product_config +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_product_config"; +CREATE TABLE "public"."pay_md_product_config" ( + "id" int8 NOT NULL, + "product" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "channel" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "active_env" varchar(32) COLLATE "pg_catalog"."default" DEFAULT 'prod'::character varying, + "configured" bool DEFAULT false, + "remark" varchar(255) COLLATE "pg_catalog"."default", + "creator" int8, + "create_time" timestamptz(6), + "last_modifier" int8, + "last_modified_time" timestamptz(6), + "version" int4 DEFAULT 0, + "deleted" bool NOT NULL DEFAULT false +) +; +COMMENT ON COLUMN "public"."pay_md_product_config"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_md_product_config"."product" IS '产品编码'; +COMMENT ON COLUMN "public"."pay_md_product_config"."channel" IS '通道编码'; +COMMENT ON COLUMN "public"."pay_md_product_config"."active_env" IS '生效环境: prod/sandbox'; +COMMENT ON COLUMN "public"."pay_md_product_config"."configured" IS '是否已配置参数'; +COMMENT ON COLUMN "public"."pay_md_product_config"."remark" IS '备注'; +COMMENT ON COLUMN "public"."pay_md_product_config"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_md_product_config"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_md_product_config"."last_modifier" IS '最后修改ID'; +COMMENT ON COLUMN "public"."pay_md_product_config"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_md_product_config"."version" IS '版本号'; +COMMENT ON COLUMN "public"."pay_md_product_config"."deleted" IS '删除标志'; +COMMENT ON TABLE "public"."pay_md_product_config" IS '支付产品配置'; + +-- ---------------------------- +-- Records of pay_md_product_config +-- ---------------------------- +INSERT INTO "public"."pay_md_product_config" VALUES (2067122110487265280, 'wechat_isv', 'wechat', 'prod', 'f', NULL, 1, '2026-06-17 05:48:11.072172+00', 1, '2026-06-17 05:48:11.109699+00', 1, 'f'); +INSERT INTO "public"."pay_md_product_config" VALUES (2067122132809351168, 'douyin_pay', 'douyin_pay', 'prod', 'f', NULL, 1, '2026-06-17 05:48:16.390739+00', 1, '2026-06-17 05:48:16.412758+00', 1, 'f'); +INSERT INTO "public"."pay_md_product_config" VALUES (2067122508711264256, 'alipay_isv', 'alipay', 'prod', 'f', NULL, 1, '2026-06-17 05:49:46.012172+00', 1, '2026-06-17 05:49:46.028695+00', 1, 'f'); +INSERT INTO "public"."pay_md_product_config" VALUES (2066401294799822848, 'alipay', 'alipay', 'sandbox', 'f', NULL, 1, '2026-06-15 06:03:55.216328+00', 1, '2026-07-04 07:28:11.745135+00', 13, 'f'); + +-- ---------------------------- +-- Table structure for pay_md_provider +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_provider"; +CREATE TABLE "public"."pay_md_provider" ( + "id" int8 NOT NULL, + "code" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "icon" varchar(255) COLLATE "pg_catalog"."default", + "sort_no" int4 NOT NULL DEFAULT 0, + "deleted" bool NOT NULL DEFAULT false, + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL DEFAULT 0, + "creator" int8, + "create_time" timestamp(6), + "enabled" bool NOT NULL DEFAULT true, + "description" varchar(500) COLLATE "pg_catalog"."default" +) +; +COMMENT ON COLUMN "public"."pay_md_provider"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_md_provider"."code" IS '支付渠道编码(PayProviderEnum.code:aggregate_pay/wechat/alipay/union_pay/visa/mastercard)'; +COMMENT ON COLUMN "public"."pay_md_provider"."icon" IS '图标(可选,覆盖前端默认展示)'; +COMMENT ON COLUMN "public"."pay_md_provider"."sort_no" IS '排序(管理端 Tab/列表顺序)'; +COMMENT ON COLUMN "public"."pay_md_provider"."deleted" IS '删除标志(逻辑删除)'; +COMMENT ON COLUMN "public"."pay_md_provider"."last_modifier" IS '最后修改者ID'; +COMMENT ON COLUMN "public"."pay_md_provider"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_md_provider"."version" IS '版本号(乐观锁)'; +COMMENT ON COLUMN "public"."pay_md_provider"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_md_provider"."create_time" IS '创建时间'; +COMMENT ON TABLE "public"."pay_md_provider" IS '支付渠道'; + +-- ---------------------------- +-- Records of pay_md_provider +-- ---------------------------- +INSERT INTO "public"."pay_md_provider" VALUES (502001000, 'aggregate_pay', NULL, 0, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:55.128441', 't', NULL); +INSERT INTO "public"."pay_md_provider" VALUES (502001001, 'wechat', NULL, 1, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:55.128441', 't', NULL); +INSERT INTO "public"."pay_md_provider" VALUES (502001002, 'alipay', NULL, 2, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:55.128441', 't', NULL); +INSERT INTO "public"."pay_md_provider" VALUES (502001003, 'union_pay', NULL, 3, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:55.128441', 't', NULL); +INSERT INTO "public"."pay_md_provider" VALUES (502001004, 'visa', NULL, 4, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:55.128441', 't', NULL); +INSERT INTO "public"."pay_md_provider" VALUES (502001005, 'mastercard', NULL, 5, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:55.128441', 't', NULL); +INSERT INTO "public"."pay_md_provider" VALUES (502001006, 'douyin', 'douyinPay', 60, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00', 't', NULL); + +-- ---------------------------- +-- Table structure for pay_md_provider_method +-- ---------------------------- +DROP TABLE IF EXISTS "public"."pay_md_provider_method"; +CREATE TABLE "public"."pay_md_provider_method" ( + "id" int8 NOT NULL, + "provider" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "method" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, + "sort_no" int4 NOT NULL DEFAULT 0, + "deleted" bool NOT NULL DEFAULT false, + "last_modifier" int8, + "last_modified_time" timestamp(6), + "version" int4 NOT NULL DEFAULT 0, + "creator" int8, + "create_time" timestamp(6), + "description" varchar(500) COLLATE "pg_catalog"."default" +) +; +COMMENT ON COLUMN "public"."pay_md_provider_method"."id" IS '主键'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."provider" IS '支付渠道编码(对应 PayProviderMethod.provider / PayProviderEnum.code)'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."method" IS '支付方式编码(PayMethodEnum.code)'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."sort_no" IS '渠道内排序'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."deleted" IS '删除标志(逻辑删除)'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."last_modifier" IS '最后修改者ID'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."last_modified_time" IS '最后修改时间'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."version" IS '版本号(乐观锁)'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."creator" IS '创建者ID'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."create_time" IS '创建时间'; +COMMENT ON COLUMN "public"."pay_md_provider_method"."description" IS '目录项说明'; +COMMENT ON TABLE "public"."pay_md_provider_method" IS '支付渠道和方式关联'; + +-- ---------------------------- +-- Records of pay_md_provider_method +-- ---------------------------- +INSERT INTO "public"."pay_md_provider_method" VALUES (502001901, 'aggregate_pay', 'aggregate_pay_qrcode', 1, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502001902, 'aggregate_pay', 'aggregate_pay_barcode', 2, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002001, 'wechat', 'wechat_jsapi', 1, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002002, 'wechat', 'wechat_app', 2, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002003, 'wechat', 'wechat_h5', 3, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002004, 'wechat', 'wechat_qr', 4, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002005, 'wechat', 'wechat_mini', 5, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002006, 'wechat', 'wechat_barcode', 6, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002007, 'wechat', 'wechat_cashier', 7, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002008, 'alipay', 'alipay_barcode', 1, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002010, 'alipay', 'alipay_app', 3, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002011, 'alipay', 'alipay_h5', 4, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002012, 'alipay', 'alipay_pc', 5, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002013, 'alipay', 'alipay_jsapi', 6, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002014, 'union_pay', 'union_qr', 1, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002015, 'union_pay', 'union_pay_barcode', 2, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002016, 'union_pay', 'union_h5', 3, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002017, 'union_pay', 'union_jsapi', 4, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002018, 'visa', 'visa_card_gateway', 1, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002019, 'visa', 'visa_card_present', 2, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002020, 'mastercard', 'mastercard_card_gateway', 1, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002021, 'mastercard', 'mastercard_card_present', 2, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002009, 'alipay', 'alipay_order_qr', 2, 'f', NULL, NULL, 0, NULL, '2026-05-28 15:26:06.620977', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002022, 'douyin', 'douyin_qr', 1, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002023, 'douyin', 'douyin_jsapi', 2, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002024, 'douyin', 'douyin_h5', 3, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00', NULL); +INSERT INTO "public"."pay_md_provider_method" VALUES (502002025, 'douyin', 'douyin_app', 4, 'f', NULL, NULL, 0, NULL, '2026-06-15 00:00:00', NULL); + +-- ---------------------------- +-- Indexes structure for table pay_md_capability +-- ---------------------------- +CREATE UNIQUE INDEX "uk_pay_md_capability_code" ON "public"."pay_md_capability" USING btree ( + "code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +) WHERE deleted = false; +COMMENT ON INDEX "public"."uk_pay_md_capability_code" IS '支付能力编码唯一(未删除)'; + +-- ---------------------------- +-- Primary Key structure for table pay_md_capability +-- ---------------------------- +ALTER TABLE "public"."pay_md_capability" ADD CONSTRAINT "pay_md_capability_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Primary Key structure for table pay_md_channel +-- ---------------------------- +ALTER TABLE "public"."pay_md_channel" ADD CONSTRAINT "pay_md_channel_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table pay_md_method +-- ---------------------------- +CREATE UNIQUE INDEX "uk_pay_md_method_code" ON "public"."pay_md_method" USING btree ( + "code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +) WHERE deleted = false; +COMMENT ON INDEX "public"."uk_pay_md_method_code" IS '支付方式编码唯一(未删除)'; + +-- ---------------------------- +-- Primary Key structure for table pay_md_method +-- ---------------------------- +ALTER TABLE "public"."pay_md_method" ADD CONSTRAINT "pay_md_method_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table pay_md_product +-- ---------------------------- +CREATE UNIQUE INDEX "idx_pay_md_product_code" ON "public"."pay_md_product" USING btree ( + "code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +) WHERE deleted = false; +COMMENT ON INDEX "public"."idx_pay_md_product_code" IS '产品编码唯一索引'; + +-- ---------------------------- +-- Primary Key structure for table pay_md_product +-- ---------------------------- +ALTER TABLE "public"."pay_md_product" ADD CONSTRAINT "pay_md_product_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table pay_md_product_capability +-- ---------------------------- +CREATE UNIQUE INDEX "uk_pay_md_product_capability_pair" ON "public"."pay_md_product_capability" USING btree ( + "product_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "capability_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +) WHERE deleted = false; +COMMENT ON INDEX "public"."uk_pay_md_product_capability_pair" IS '产品+能力唯一(未删除)'; + +-- ---------------------------- +-- Primary Key structure for table pay_md_product_capability +-- ---------------------------- +ALTER TABLE "public"."pay_md_product_capability" ADD CONSTRAINT "pay_md_product_capability_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table pay_md_product_config +-- ---------------------------- +CREATE UNIQUE INDEX "idx_ppc_md_product" ON "public"."pay_md_product_config" USING btree ( + "product" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +) WHERE deleted = false; + +-- ---------------------------- +-- Primary Key structure for table pay_md_product_config +-- ---------------------------- +ALTER TABLE "public"."pay_md_product_config" ADD CONSTRAINT "pk_pay_md_product_config" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table pay_md_provider +-- ---------------------------- +CREATE UNIQUE INDEX "uk_pay_md_provider_code" ON "public"."pay_md_provider" USING btree ( + "code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +) WHERE deleted = false; +COMMENT ON INDEX "public"."uk_pay_md_provider_code" IS '支付渠道编码唯一(未删除)'; + +-- ---------------------------- +-- Primary Key structure for table pay_md_provider +-- ---------------------------- +ALTER TABLE "public"."pay_md_provider" ADD CONSTRAINT "pay_md_provider_pkey" PRIMARY KEY ("id"); + +-- ---------------------------- +-- Indexes structure for table pay_md_provider_method +-- ---------------------------- +CREATE UNIQUE INDEX "uk_pay_md_provider_method_pair" ON "public"."pay_md_provider_method" USING btree ( + "provider" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST, + "method" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST +) WHERE deleted = false; +COMMENT ON INDEX "public"."uk_pay_md_provider_method_pair" IS '支付渠道+支付方式唯一(未删除)'; + +-- ---------------------------- +-- Primary Key structure for table pay_md_provider_method +-- ---------------------------- +ALTER TABLE "public"."pay_md_provider_method" ADD CONSTRAINT "pay_md_provider_method_pkey" PRIMARY KEY ("id"); diff --git a/_config/sql/pay_md_upgrade.sql b/_config/sql/pay_md_upgrade.sql new file mode 100644 index 000000000..4d018fc99 --- /dev/null +++ b/_config/sql/pay_md_upgrade.sql @@ -0,0 +1,264 @@ +-- ============================================================ +-- 支付主数据升级:补全第三方聚合通道 + 统一重排 sort_no +-- 依据:开源版 ChannelEnum 19 项、商业版各通道 RATE_PRODUCT_MAP / 策略类 +-- 说明:union_pay(云闪付直连通道) 不实例化主数据,保留 provider/能力层 +-- 幂等:ON CONFLICT (id) DO NOTHING + UPDATE 可重复执行 +-- ============================================================ + +SET TIME ZONE 'Asia/Shanghai'; + +-- ------------------------------------------------------------ +-- 1. 新增支付通道 pay_md_channel(10 条,不含 union_pay 直连) +-- ------------------------------------------------------------ +INSERT INTO "public"."pay_md_channel" + (id, code, sort_no, description, icon, creator, create_time, last_modifier, last_modified_time, version, deleted) +VALUES + (12, 'dougong_pay', 8, NULL, NULL, 1, now(), 1, now(), 0, false), + (13, 'hkrt_pay', 9, NULL, NULL, 1, now(), 1, now(), 0, false), + (19, 'yee_pay', 10, NULL, NULL, 1, now(), 1, now(), 0, false), + (11, 'ada_pay', 11, NULL, NULL, 1, now(), 1, now(), 0, false), + (18, 'sand_pay', 12, NULL, NULL, 1, now(), 1, now(), 0, false), + (14, 'fuyou_pay', 13, NULL, NULL, 1, now(), 1, now(), 0, false), + (15, 'sheng_pay', 14, NULL, NULL, 1, now(), 1, now(), 0, false), + (16, 'ysep_pay', 15, NULL, NULL, 1, now(), 1, now(), 0, false), + (17, 'quick_pay', 16, NULL, NULL, 1, now(), 1, now(), 0, false), + (20, 'jee_pay', 17, NULL, NULL, 1, now(), 1, now(), 0, false) +ON CONFLICT (id) DO NOTHING; + +-- ------------------------------------------------------------ +-- 2. 新增支付产品 pay_md_product(10 条,一通道一产品,settle_periods=[T0,T1]) +-- ------------------------------------------------------------ +INSERT INTO "public"."pay_md_product" + (id, code, name, channel, description, icon, settle_periods, sort_no, creator, create_time, last_modifier, last_modified_time, version, deleted, sandbox, enabled) +VALUES + (10013, 'dougong_pay', 'dougong_pay', 'dougong_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 80, 1, now(), 1, now(), 0, false, false, true), + (10014, 'hkrt_pay', 'hkrt_pay', 'hkrt_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 90, 1, now(), 1, now(), 0, false, false, true), + (10020, 'yee_pay', 'yee_pay', 'yee_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 100, 1, now(), 1, now(), 0, false, false, true), + (10012, 'ada_pay', 'ada_pay', 'ada_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 110, 1, now(), 1, now(), 0, false, false, true), + (10019, 'sand_pay', 'sand_pay', 'sand_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 120, 1, now(), 1, now(), 0, false, false, true), + (10015, 'fuyou_pay', 'fuyou_pay', 'fuyou_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 130, 1, now(), 1, now(), 0, false, false, true), + (10016, 'sheng_pay', 'sheng_pay', 'sheng_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 140, 1, now(), 1, now(), 0, false, false, true), + (10017, 'ysep_pay', 'ysep_pay', 'ysep_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 150, 1, now(), 1, now(), 0, false, false, true), + (10018, 'quick_pay', 'quick_pay', 'quick_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 160, 1, now(), 1, now(), 0, false, false, true), + (10021, 'jee_pay', 'jee_pay', 'jee_pay', NULL, NULL, '["T0", "T1"]'::jsonb, 170, 1, now(), 1, now(), 0, false, false, true) +ON CONFLICT (id) DO NOTHING; + +-- ------------------------------------------------------------ +-- 3. 产品能力映射 pay_md_product_capability(156 条) +-- - 三件套通道(9个):微信6 + 支付宝6 + 银联4 = 16 项 +-- - jeepay:微信5 + 支付宝5 + 银联2 = 12 项(无被扫 barcode) +-- ------------------------------------------------------------ +INSERT INTO "public"."pay_md_product_capability" + (id, product_code, capability_code, sort_no, enabled, remark, deleted, last_modifier, last_modified_time, version, creator, create_time) +VALUES + (21001, 'dougong_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21002, 'dougong_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21003, 'dougong_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21004, 'dougong_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21005, 'dougong_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21006, 'dougong_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21007, 'dougong_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21008, 'dougong_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21009, 'dougong_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21010, 'dougong_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21011, 'dougong_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21012, 'dougong_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21013, 'dougong_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21014, 'dougong_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21015, 'dougong_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21016, 'dougong_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21017, 'hkrt_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21018, 'hkrt_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21019, 'hkrt_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21020, 'hkrt_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21021, 'hkrt_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21022, 'hkrt_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21023, 'hkrt_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21024, 'hkrt_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21025, 'hkrt_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21026, 'hkrt_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21027, 'hkrt_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21028, 'hkrt_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21029, 'hkrt_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21030, 'hkrt_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21031, 'hkrt_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21032, 'hkrt_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21033, 'yee_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21034, 'yee_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21035, 'yee_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21036, 'yee_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21037, 'yee_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21038, 'yee_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21039, 'yee_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21040, 'yee_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21041, 'yee_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21042, 'yee_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21043, 'yee_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21044, 'yee_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21045, 'yee_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21046, 'yee_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21047, 'yee_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21048, 'yee_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21049, 'ada_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21050, 'ada_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21051, 'ada_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21052, 'ada_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21053, 'ada_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21054, 'ada_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21055, 'ada_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21056, 'ada_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21057, 'ada_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21058, 'ada_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21059, 'ada_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21060, 'ada_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21061, 'ada_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21062, 'ada_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21063, 'ada_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21064, 'ada_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21065, 'sand_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21066, 'sand_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21067, 'sand_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21068, 'sand_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21069, 'sand_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21070, 'sand_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21071, 'sand_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21072, 'sand_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21073, 'sand_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21074, 'sand_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21075, 'sand_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21076, 'sand_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21077, 'sand_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21078, 'sand_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21079, 'sand_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21080, 'sand_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21081, 'fuyou_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21082, 'fuyou_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21083, 'fuyou_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21084, 'fuyou_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21085, 'fuyou_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21086, 'fuyou_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21087, 'fuyou_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21088, 'fuyou_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21089, 'fuyou_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21090, 'fuyou_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21091, 'fuyou_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21092, 'fuyou_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21093, 'fuyou_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21094, 'fuyou_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21095, 'fuyou_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21096, 'fuyou_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21097, 'sheng_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21098, 'sheng_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21099, 'sheng_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21100, 'sheng_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21101, 'sheng_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21102, 'sheng_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21103, 'sheng_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21104, 'sheng_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21105, 'sheng_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21106, 'sheng_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21107, 'sheng_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21108, 'sheng_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21109, 'sheng_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21110, 'sheng_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21111, 'sheng_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21112, 'sheng_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21113, 'ysep_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21114, 'ysep_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21115, 'ysep_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21116, 'ysep_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21117, 'ysep_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21118, 'ysep_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21119, 'ysep_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21120, 'ysep_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21121, 'ysep_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21122, 'ysep_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21123, 'ysep_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21124, 'ysep_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21125, 'ysep_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21126, 'ysep_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21127, 'ysep_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21128, 'ysep_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21129, 'quick_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21130, 'quick_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21131, 'quick_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21132, 'quick_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21133, 'quick_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21134, 'quick_pay', 'wechat_barcode', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21135, 'quick_pay', 'alipay_order_qr', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21136, 'quick_pay', 'alipay_jsapi', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21137, 'quick_pay', 'alipay_app', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21138, 'quick_pay', 'alipay_h5', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21139, 'quick_pay', 'alipay_pc', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21140, 'quick_pay', 'alipay_barcode', 11, true, NULL, false, 1, now(), 0, 1, now()), + (21141, 'quick_pay', 'union_pay_qr', 12, true, NULL, false, 1, now(), 0, 1, now()), + (21142, 'quick_pay', 'union_pay_jsapi', 13, true, NULL, false, 1, now(), 0, 1, now()), + (21143, 'quick_pay', 'union_pay_h5', 14, true, NULL, false, 1, now(), 0, 1, now()), + (21144, 'quick_pay', 'union_pay_barcode', 15, true, NULL, false, 1, now(), 0, 1, now()), + (21145, 'jee_pay', 'wechat_qr', 0, true, NULL, false, 1, now(), 0, 1, now()), + (21146, 'jee_pay', 'wechat_jsapi', 1, true, NULL, false, 1, now(), 0, 1, now()), + (21147, 'jee_pay', 'wechat_app', 2, true, NULL, false, 1, now(), 0, 1, now()), + (21148, 'jee_pay', 'wechat_h5', 3, true, NULL, false, 1, now(), 0, 1, now()), + (21149, 'jee_pay', 'wechat_mini', 4, true, NULL, false, 1, now(), 0, 1, now()), + (21150, 'jee_pay', 'alipay_order_qr', 5, true, NULL, false, 1, now(), 0, 1, now()), + (21151, 'jee_pay', 'alipay_jsapi', 6, true, NULL, false, 1, now(), 0, 1, now()), + (21152, 'jee_pay', 'alipay_app', 7, true, NULL, false, 1, now(), 0, 1, now()), + (21153, 'jee_pay', 'alipay_h5', 8, true, NULL, false, 1, now(), 0, 1, now()), + (21154, 'jee_pay', 'alipay_pc', 9, true, NULL, false, 1, now(), 0, 1, now()), + (21155, 'jee_pay', 'union_pay_qr', 10, true, NULL, false, 1, now(), 0, 1, now()), + (21156, 'jee_pay', 'union_pay_jsapi', 11, true, NULL, false, 1, now(), 0, 1, now()) +ON CONFLICT (id) DO NOTHING; + +-- ------------------------------------------------------------ +-- 4. 统一重排通道 sort_no(覆盖全量 17 通道) +-- 顺序:支付宝/微信/抖音/银联商务/拉卡拉/乐刷/随行付/斗拱/海科/易宝/汇付/杉德/富友/盛付通/银盛/快钱/jeepay +-- ------------------------------------------------------------ +UPDATE "public"."pay_md_channel" SET sort_no = CASE code + WHEN 'alipay' THEN 1 + WHEN 'wechat' THEN 2 + WHEN 'douyin_pay' THEN 3 + WHEN 'ums_pay' THEN 4 + WHEN 'lakala_pay' THEN 5 + WHEN 'leshua_pay' THEN 6 + WHEN 'vbill_pay' THEN 7 + WHEN 'dougong_pay' THEN 8 + WHEN 'hkrt_pay' THEN 9 + WHEN 'yee_pay' THEN 10 + WHEN 'ada_pay' THEN 11 + WHEN 'sand_pay' THEN 12 + WHEN 'fuyou_pay' THEN 13 + WHEN 'sheng_pay' THEN 14 + WHEN 'ysep_pay' THEN 15 + WHEN 'quick_pay' THEN 16 + WHEN 'jee_pay' THEN 17 +END +WHERE code IN ('alipay', 'wechat', 'douyin_pay', 'ums_pay', 'lakala_pay', 'leshua_pay', 'vbill_pay', 'dougong_pay', 'hkrt_pay', 'yee_pay', 'ada_pay', 'sand_pay', 'fuyou_pay', 'sheng_pay', 'ysep_pay', 'quick_pay', 'jee_pay'); + +-- ------------------------------------------------------------ +-- 5. 统一重排产品 sort_no(覆盖全量 22 产品,同通道聚集) +-- ------------------------------------------------------------ +UPDATE "public"."pay_md_product" SET sort_no = CASE code + WHEN 'alipay' THEN 10 + WHEN 'alipay_isv' THEN 11 + WHEN 'wechat_pay' THEN 20 + WHEN 'wechat_isv' THEN 21 + WHEN 'douyin_pay' THEN 30 + WHEN 'ums_qrcode' THEN 40 + WHEN 'ums_jsapi' THEN 41 + WHEN 'ums_app' THEN 42 + WHEN 'ums_mini' THEN 43 + WHEN 'ums_h5' THEN 44 + WHEN 'ums_barcode' THEN 45 + WHEN 'lakala_pay' THEN 50 + WHEN 'dougong_pay' THEN 80 + WHEN 'hkrt_pay' THEN 90 + WHEN 'yee_pay' THEN 100 + WHEN 'ada_pay' THEN 110 + WHEN 'sand_pay' THEN 120 + WHEN 'fuyou_pay' THEN 130 + WHEN 'sheng_pay' THEN 140 + WHEN 'ysep_pay' THEN 150 + WHEN 'quick_pay' THEN 160 + WHEN 'jee_pay' THEN 170 +END +WHERE code IN ('alipay', 'alipay_isv', 'wechat_pay', 'wechat_isv', 'douyin_pay', 'ums_qrcode', 'ums_jsapi', 'ums_app', 'ums_mini', 'ums_h5', 'ums_barcode', 'lakala_pay', 'dougong_pay', 'hkrt_pay', 'yee_pay', 'ada_pay', 'sand_pay', 'fuyou_pay', 'sheng_pay', 'ysep_pay', 'quick_pay', 'jee_pay'); diff --git a/_config/sql/update-tables.sql b/_config/sql/update-tables.sql index 0de7b9869..664f3ab51 100644 --- a/_config/sql/update-tables.sql +++ b/_config/sql/update-tables.sql @@ -321,3 +321,152 @@ COMMENT ON COLUMN "public"."douyin_direct_app_auth_config"."last_modifier" IS ' COMMENT ON COLUMN "public"."douyin_direct_app_auth_config"."last_modified_time" IS '最后修改时间(UTC)'; COMMENT ON COLUMN "public"."douyin_direct_app_auth_config"."version" IS '乐观锁版本号'; COMMENT ON COLUMN "public"."douyin_direct_app_auth_config"."deleted" IS '逻辑删除标志'; + +-- ============================================================ +-- 拉卡拉服务商配置(聚合通道: 微信/支付宝/银联) +-- ============================================================ + +-- 拉卡拉服务商密钥配置(全局唯一, 按 product 查询) +CREATE TABLE IF NOT EXISTS "public"."lakala_isv_key_config" ( + "id" bigint NOT NULL PRIMARY KEY, + "product" varchar(32) NOT NULL, + "lkl_app_id" varchar(64) NOT NULL, + "mch_serial_no" varchar(128), + "private_key" text, + "public_key" text, + "sm4_key" varchar(128), + "sandbox" boolean NOT NULL DEFAULT false, + "creator" bigint, + "create_time" timestamptz(6), + "last_modifier" bigint, + "last_modified_time" timestamptz(6), + "version" integer NOT NULL DEFAULT 0, + "deleted" boolean NOT NULL DEFAULT false +); +COMMENT ON TABLE "public"."lakala_isv_key_config" IS '拉卡拉服务商密钥配置(全局唯一)'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."product" IS '产品编码 @see ProductEnum'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."lkl_app_id" IS '拉卡拉应用编号'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."mch_serial_no" IS '商户证书序列号'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."private_key" IS '商户RSA私钥PEM(加密存储)'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."public_key" IS '拉卡拉RSA公钥PEM(加密存储)'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."sm4_key" IS 'SM4对称密钥(加密存储, 进件敏感字段加密用)'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."sandbox" IS '是否沙箱环境'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."creator" IS '创建人ID'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."create_time" IS '创建时间(UTC)'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."last_modifier" IS '最后修改人ID'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."last_modified_time" IS '最后修改时间(UTC)'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."lakala_isv_key_config"."deleted" IS '逻辑删除标志'; + +-- 产品编码唯一(逻辑删除时不重复) +CREATE UNIQUE INDEX IF NOT EXISTS "uk_lakala_isv_key_product" + ON "public"."lakala_isv_key_config" ("product") + WHERE "deleted" = false; + +-- 拉卡拉通道商户绑定(每个子商户一条, 仅存商户号merchantNo + 终端号termNo) +CREATE TABLE IF NOT EXISTS "public"."lakala_isv_channel_merchant" ( + "id" bigint NOT NULL PRIMARY KEY, + "mch_no" varchar(32) NOT NULL, + "channel_mch_no" varchar(64) NOT NULL, + "product" varchar(32) NOT NULL, + "lakala_mch_no" varchar(64) NOT NULL, + "term_no" varchar(64), + "creator" bigint, + "create_time" timestamptz(6), + "last_modifier" bigint, + "last_modified_time" timestamptz(6), + "version" integer NOT NULL DEFAULT 0, + "deleted" boolean NOT NULL DEFAULT false +); +COMMENT ON TABLE "public"."lakala_isv_channel_merchant" IS '拉卡拉通道商户绑定'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."mch_no" IS '平台商户号'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."channel_mch_no" IS '通道商户号(LAKALA+雪花)'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."product" IS '所属支付产品'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."lakala_mch_no" IS '拉卡拉商户编号(merchantNo)'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."term_no" IS '终端号'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."creator" IS '创建人ID'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."create_time" IS '创建时间(UTC)'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."last_modifier" IS '最后修改人ID'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."last_modified_time" IS '最后修改时间(UTC)'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."lakala_isv_channel_merchant"."deleted" IS '逻辑删除标志'; + +-- 通道商户号全局唯一 +CREATE UNIQUE INDEX IF NOT EXISTS "uk_lakala_isv_channel_mch_no" + ON "public"."lakala_isv_channel_merchant" ("channel_mch_no") + WHERE "deleted" = false; + +-- 同一商户下拉卡拉商户号不重复 +CREATE UNIQUE INDEX IF NOT EXISTS "uk_lakala_isv_mch_lakala_no" + ON "public"."lakala_isv_channel_merchant" ("mch_no", "lakala_mch_no") + WHERE "deleted" = false; + +-- ===== 银联商务(UMS) ===== + +-- 银联商务直连通道商户绑定 +CREATE TABLE IF NOT EXISTS "public"."ums_direct_channel_merchant" ( + "id" bigint NOT NULL PRIMARY KEY, + "mch_no" varchar(32) NOT NULL, + "channel_mch_no" varchar(64) NOT NULL, + "product" varchar(32) NOT NULL, + "merchant_no" varchar(64) NOT NULL, + "terminal_no" varchar(64), + "order_prefix" varchar(16), + "sandbox" boolean NOT NULL DEFAULT false, + "creator" bigint, + "create_time" timestamptz(6), + "last_modifier" bigint, + "last_modified_time" timestamptz(6), + "version" integer NOT NULL DEFAULT 0, + "deleted" boolean NOT NULL DEFAULT false +); +COMMENT ON TABLE "public"."ums_direct_channel_merchant" IS '银联商务直连通道商户绑定'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."mch_no" IS '商户号'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."channel_mch_no" IS '通道商户号(系统生成雪花号)'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."product" IS '所属支付产品(如 ums_qrcode)'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."merchant_no" IS '银联商务商户号(mid)'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."terminal_no" IS '终端号(tid)'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."order_prefix" IS '订单号前缀(生成关联订单号)'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."sandbox" IS '是否沙箱环境'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."creator" IS '创建人ID'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."create_time" IS '创建时间(UTC)'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."last_modifier" IS '最后修改人ID'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."last_modified_time" IS '最后修改时间(UTC)'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."ums_direct_channel_merchant"."deleted" IS '逻辑删除标志'; +-- 同一商户下银联商务商户号不重复 +CREATE UNIQUE INDEX IF NOT EXISTS "uk_ums_direct_mch_merchant_no" + ON "public"."ums_direct_channel_merchant" ("mch_no", "merchant_no") + WHERE "deleted" = false; + +-- 银联商务直连密钥配置(商户维度, 敏感字段加密存储) +CREATE TABLE IF NOT EXISTS "public"."ums_direct_key_config" ( + "id" bigint NOT NULL PRIMARY KEY, + "mch_no" varchar(32) NOT NULL, + "channel_mch_no" varchar(64) NOT NULL, + "ums_app_id" varchar(128), + "app_key" text, + "secret_key" text, + "creator" bigint, + "create_time" timestamptz(6), + "last_modifier" bigint, + "last_modified_time" timestamptz(6), + "version" integer NOT NULL DEFAULT 0, + "deleted" boolean NOT NULL DEFAULT false +); +COMMENT ON TABLE "public"."ums_direct_key_config" IS '银联商务直连密钥配置'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."mch_no" IS '商户号'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."channel_mch_no" IS '通道商户号(唯一关联)'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."ums_app_id" IS '银联商务应用 AppId'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."app_key" IS '应用密钥(HmacSHA256 签名密钥, 加密存储)'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."secret_key" IS '通讯密钥(回调验签 MD5/SHA256 拼接密钥, 加密存储)'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."creator" IS '创建人ID'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."create_time" IS '创建时间(UTC)'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."last_modifier" IS '最后修改人ID'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."last_modified_time" IS '最后修改时间(UTC)'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."version" IS '乐观锁版本号'; +COMMENT ON COLUMN "public"."ums_direct_key_config"."deleted" IS '逻辑删除标志'; +-- 一个通道商户号唯一一份密钥配置 +CREATE UNIQUE INDEX IF NOT EXISTS "uk_ums_direct_key_cmchno" + ON "public"."ums_direct_key_config" ("channel_mch_no") + WHERE "deleted" = false; diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/WechatChannelClient.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/WechatChannelClient.java index 2bc796a61..28e86a11d 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/WechatChannelClient.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/WechatChannelClient.java @@ -1,10 +1,12 @@ package cn.daxpay.open.channel.wechat.client; +import cn.daxpay.open.channel.wechat.client.req.WechatCallbackParseReq; import cn.daxpay.open.channel.wechat.client.req.WechatCloseReq; import cn.daxpay.open.channel.wechat.client.req.WechatPayReq; import cn.daxpay.open.channel.wechat.client.req.WechatRefundReq; import cn.daxpay.open.channel.wechat.client.req.WechatRefundSyncReq; import cn.daxpay.open.channel.wechat.client.req.WechatSyncReq; +import cn.daxpay.open.channel.wechat.client.resp.WechatCallbackParseResp; import cn.daxpay.open.channel.wechat.client.resp.WechatCloseResp; import cn.daxpay.open.channel.wechat.client.resp.WechatPayResp; import cn.daxpay.open.channel.wechat.client.resp.WechatRefundResp; @@ -63,4 +65,12 @@ public interface WechatChannelClient { /// 服务商退款同步(查询退款状态) @PostExchange("/channel/wechat/isv/refund-sync") DaxResult isvRefundSync(@RequestBody WechatRefundSyncReq req); + + /// 支付回调验签解析(转发到子应用验签) + @PostExchange("/channel/wechat/callback/parse-pay") + DaxResult parsePayCallback(@RequestBody WechatCallbackParseReq req); + + /// 退款回调验签解析(转发到子应用验签) + @PostExchange("/channel/wechat/callback/parse-refund") + DaxResult parseRefundCallback(@RequestBody WechatCallbackParseReq req); } diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/req/WechatCallbackParseReq.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/req/WechatCallbackParseReq.java new file mode 100644 index 000000000..7cd4e0932 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/req/WechatCallbackParseReq.java @@ -0,0 +1,31 @@ +package cn.daxpay.open.channel.wechat.client.req; + +import cn.daxpay.open.channel.wechat.client.credential.WechatSdkCredential; +import lombok.Data; + +/// # 微信回调验签解析请求 +/// +/// 主应用接收到微信异步通知后, 将原始 header + body 连同通道凭证转发到子应用, +/// 由子应用使用微信 SDK [NotificationParser] 完成验签与 AES 解密, +/// 返回结构化的回调业务数据 [cn.daxpay.open.channel.wechat.client.resp.WechatCallbackParseResp]。 +@Data +public class WechatCallbackParseReq { + + /// 通道调用凭证 + private WechatSdkCredential credential; + + /// 回调原始 body(微信 POST 的 JSON 密文) + private String body; + + /// 回调头: Wechatpay-Serial(平台证书序列号 / 支付公钥ID) + private String serial; + + /// 回调头: Wechatpay-Nonce(随机串) + private String nonce; + + /// 回调头: Wechatpay-Signature(签名) + private String signature; + + /// 回调头: Wechatpay-Timestamp(时间戳) + private String timestamp; +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/resp/WechatCallbackParseResp.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/resp/WechatCallbackParseResp.java new file mode 100644 index 000000000..7e033a565 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/client/resp/WechatCallbackParseResp.java @@ -0,0 +1,46 @@ +package cn.daxpay.open.channel.wechat.client.resp; + +import lombok.Data; +import lombok.experimental.Accessors; + +/// # 微信回调验签解析响应 +/// +/// 子应用使用微信 SDK 验签并解密回调后, 返回结构化业务数据。 +/// 兼容支付与退款两种回调: 通过 tradeType 区分。 +@Data +@Accessors(chain = true) +public class WechatCallbackParseResp { + + /// 回调类型(PAY 支付回调 / REFUND 退款回调) + private String tradeType; + + /// 商户订单号(主应用支付交易号) + private String outTradeNo; + + /// 微信交易号(transactionId, 支付回调) + private String transactionId; + + /// 退款单号(主应用退款单号, 退款回调) + private String outRefundNo; + + /// 微信退款单号(refundId, 退款回调) + private String refundId; + + /// 交易状态(支付回调: SUCCESS/REFUND/NOTPAY/CLOSED/REVOKED/USERPAYING/PAYERROR) + private String tradeState; + + /// 退款状态(退款回调: SUCCESS/PROCESSING/CLOSED/ABNORMAL) + private String refundStatus; + + /// 金额(单位: 分) + private Long amount; + + /// 成功时间(RFC3339) + private String successTime; + + /// 买家 openid + private String openid; + + /// 验签是否通过 + private boolean verified; +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/code/WechatCode.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/code/WechatCode.java index 374ca5056..7c73351e8 100644 --- a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/code/WechatCode.java +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/code/WechatCode.java @@ -6,6 +6,44 @@ package cn.daxpay.open.channel.wechat.code; /// public interface WechatCode { + /// 回调签名 header: 平台证书序列号 / 支付公钥ID + String HEADER_SERIAL = "Wechatpay-Serial"; + /// 回调签名 header: 随机串 + String HEADER_NONCE = "Wechatpay-Nonce"; + /// 回调签名 header: 签名 + String HEADER_SIGNATURE = "Wechatpay-Signature"; + /// 回调签名 header: 时间戳 + String HEADER_TIMESTAMP = "Wechatpay-Timestamp"; + + /// 回调成功应答(微信要求 JSON 格式) + String NOTIFY_SUCCESS = "{\"code\":\"SUCCESS\",\"message\":\"成功\"}"; + /// 回调失败应答 + String NOTIFY_FAIL = "{\"code\":\"FAIL\",\"message\":\"失败\"}"; + + /// 交易状态-支付成功 + String TRADE_STATE_SUCCESS = "SUCCESS"; + /// 交易状态-转入退款 + String TRADE_STATE_REFUND = "REFUND"; + /// 交易状态-未支付 + String TRADE_STATE_NOTPAY = "NOTPAY"; + /// 交易状态-已关闭 + String TRADE_STATE_CLOSED = "CLOSED"; + /// 交易状态-已撤销 + String TRADE_STATE_REVOKED = "REVOKED"; + /// 交易状态-用户支付中 + String TRADE_STATE_USERPAYING = "USERPAYING"; + /// 交易状态-支付失败 + String TRADE_STATE_PAYERROR = "PAYERROR"; + + /// 退款状态-成功 + String REFUND_STATUS_SUCCESS = "SUCCESS"; + /// 退款状态-退款异常 + String REFUND_STATUS_ABNORMAL = "ABNORMAL"; + /// 退款状态-退款关闭 + String REFUND_STATUS_CLOSED = "CLOSED"; + /// 退款状态-退款中 + String REFUND_STATUS_PROCESSING = "PROCESSING"; + /// # 认证方式 /// interface AuthType { diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/controller/callback/WechatCallbackController.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/controller/callback/WechatCallbackController.java new file mode 100644 index 000000000..2179b985d --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/controller/callback/WechatCallbackController.java @@ -0,0 +1,46 @@ +package cn.daxpay.open.channel.wechat.controller.callback; + +import cn.daxpay.open.channel.wechat.service.callback.WechatPayCallbackService; +import cn.daxpay.open.channel.wechat.service.callback.WechatRefundCallbackService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/// # 微信支付回调通知控制器 +/// +/// 微信异步通知入口(支付/退款), 不走 Sa-Token 认证(由安全配置放行 `/unipay/callback/**`)。 +/// URL 中的 channelMchNo 用于回调时组装凭证验签(微信 body 加密, 验签前无法解析)。 +@Tag(name = "微信支付回调通知控制器") +@RestController +@RequiredArgsConstructor +@RequestMapping("/unipay/callback/{mchNo}/{appId}/wechat/{channelMchNo}") +public class WechatCallbackController { + + private final WechatPayCallbackService wechatPayCallbackService; + private final WechatRefundCallbackService wechatRefundCallbackService; + + /// 微信支付回调 + @Operation(summary = "微信支付回调") + @PostMapping("/pay") + public String payNotify(@PathVariable("mchNo") String mchNo, + @PathVariable("appId") String appId, + @PathVariable("channelMchNo") String channelMchNo, + HttpServletRequest request) { + return wechatPayCallbackService.payHandle(mchNo, channelMchNo, request); + } + + /// 微信退款回调 + @Operation(summary = "微信退款回调") + @PostMapping("/refund") + public String refundNotify(@PathVariable("mchNo") String mchNo, + @PathVariable("appId") String appId, + @PathVariable("channelMchNo") String channelMchNo, + HttpServletRequest request) { + return wechatRefundCallbackService.refundHandle(mchNo, channelMchNo, request); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatPayCallbackService.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatPayCallbackService.java new file mode 100644 index 000000000..793b3e881 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatPayCallbackService.java @@ -0,0 +1,98 @@ +package cn.daxpay.open.channel.wechat.service.callback; + +import cn.daxpay.open.channel.wechat.client.WechatChannelClient; +import cn.daxpay.open.channel.wechat.client.credential.WechatSdkCredential; +import cn.daxpay.open.channel.wechat.client.req.WechatCallbackParseReq; +import cn.daxpay.open.channel.wechat.client.resp.WechatCallbackParseResp; +import cn.daxpay.open.channel.wechat.code.WechatCode; +import cn.daxpay.open.channel.wechat.service.direct.WechatDirectConfigAssembler; +import cn.daxpay.open.payment.common.callback.CallbackData; +import cn.daxpay.open.payment.common.result.DaxResult; +import cn.daxpay.open.payment.core.trade.service.PayCallbackService; +import cn.daxpay.open.platform.core.enums.pay.notice.CallbackStatusEnum; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.OffsetDateTime; +import java.util.Map; +import java.util.Objects; + +/// # 微信支付回调处理服务 +/// +/// 微信异步通知 → 主应用接收原始 header + body → 按 channelMchNo 组装凭证 → +/// 转发到子应用用 NotificationParser 验签解密 → +/// 构建 [CallbackData] 交由 [PayCallbackService] 更新订单状态。 +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatPayCallbackService { + + private final WechatChannelClient wechatChannelClient; + private final WechatDirectConfigAssembler wechatDirectConfigAssembler; + private final PayCallbackService payCallbackService; + + /// 支付回调处理 + public String payHandle(String mchNo, String channelMchNo, HttpServletRequest request) { + // 1. 提取回调原始数据 + String body = JakartaServletUtil.getBody(request); + Map headerMap = JakartaServletUtil.getHeaderMap(request); + + // 2. 组装凭证 + WechatSdkCredential credential = wechatDirectConfigAssembler.buildConfig(mchNo, channelMchNo, null); + + // 3. 转发到子应用验签 + WechatCallbackParseReq req = new WechatCallbackParseReq(); + req.setCredential(credential); + req.setBody(body); + req.setSerial(this.getHeader(headerMap, WechatCode.HEADER_SERIAL)); + req.setNonce(this.getHeader(headerMap, WechatCode.HEADER_NONCE)); + req.setSignature(this.getHeader(headerMap, WechatCode.HEADER_SIGNATURE)); + req.setTimestamp(this.getHeader(headerMap, WechatCode.HEADER_TIMESTAMP)); + + DaxResult result = wechatChannelClient.parsePayCallback(req); + if (result.getCode() != 0 || result.getData() == null || !result.getData().isVerified()) { + log.error("微信支付回调验签失败: channelMchNo={}", channelMchNo); + return WechatCode.NOTIFY_FAIL; + } + + // 4. 构建回调数据交由框架处理 + WechatCallbackParseResp resp = result.getData(); + CallbackData callbackData = this.buildCallbackData(resp); + try { + payCallbackService.payCallback(callbackData); + } catch (Exception e) { + log.error("微信支付回调业务处理失败: tradeNo={}", callbackData.getTradeNo(), e); + return WechatCode.NOTIFY_FAIL; + } + return WechatCode.NOTIFY_SUCCESS; + } + + /// 构建框架回调数据 + private CallbackData buildCallbackData(WechatCallbackParseResp resp) { + CallbackData data = new CallbackData(); + data.setTradeNo(resp.getOutTradeNo()); + data.setOutTradeNo(resp.getTransactionId()); + if (StrUtil.isNotBlank(resp.getSuccessTime())) { + data.setFinishTime(OffsetDateTime.parse(resp.getSuccessTime())); + } + // 交易状态映射 + if (Objects.equals(WechatCode.TRADE_STATE_SUCCESS, resp.getTradeState()) + || Objects.equals(WechatCode.TRADE_STATE_REFUND, resp.getTradeState())) { + data.setTradeStatus(CallbackStatusEnum.SUCCESS.getCode()); + } else { + data.setTradeStatus(resp.getTradeState()); + data.setCallbackErrorMsg("微信回调状态非成功: " + resp.getTradeState()); + } + return data; + } + + /// 获取 header(大小写兼容) + private String getHeader(Map headerMap, String name) { + String value = headerMap.get(name); + return value != null ? value : headerMap.get(name.toLowerCase()); + } +} diff --git a/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatRefundCallbackService.java b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatRefundCallbackService.java new file mode 100644 index 000000000..e3fe64480 --- /dev/null +++ b/daxpay-channel/daxpay-channel-wechat/src/main/java/cn/daxpay/open/channel/wechat/service/callback/WechatRefundCallbackService.java @@ -0,0 +1,72 @@ +package cn.daxpay.open.channel.wechat.service.callback; + +import cn.daxpay.open.channel.wechat.client.WechatChannelClient; +import cn.daxpay.open.channel.wechat.client.credential.WechatSdkCredential; +import cn.daxpay.open.channel.wechat.client.req.WechatCallbackParseReq; +import cn.daxpay.open.channel.wechat.client.resp.WechatCallbackParseResp; +import cn.daxpay.open.channel.wechat.code.WechatCode; +import cn.daxpay.open.channel.wechat.service.direct.WechatDirectConfigAssembler; +import cn.daxpay.open.payment.common.result.DaxResult; +import cn.hutool.extra.servlet.JakartaServletUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Map; +import java.util.Objects; + +/// # 微信退款回调处理服务 +/// +/// 微信退款异步通知 → 主应用接收 → 组装凭证 → 转发子应用验签 → 日志记录退款结果。 +/// +/// TODO 退款单状态更新待接入退款回调框架(平台目前无独立 RefundCallbackService)。 +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatRefundCallbackService { + + private final WechatChannelClient wechatChannelClient; + private final WechatDirectConfigAssembler wechatDirectConfigAssembler; + + /// 退款回调处理 + public String refundHandle(String mchNo, String channelMchNo, HttpServletRequest request) { + // 1. 提取回调原始数据 + String body = JakartaServletUtil.getBody(request); + Map headerMap = JakartaServletUtil.getHeaderMap(request); + + // 2. 组装凭证 + WechatSdkCredential credential = wechatDirectConfigAssembler.buildConfig(mchNo, channelMchNo, null); + + // 3. 转发到子应用验签 + WechatCallbackParseReq req = new WechatCallbackParseReq(); + req.setCredential(credential); + req.setBody(body); + req.setSerial(this.getHeader(headerMap, WechatCode.HEADER_SERIAL)); + req.setNonce(this.getHeader(headerMap, WechatCode.HEADER_NONCE)); + req.setSignature(this.getHeader(headerMap, WechatCode.HEADER_SIGNATURE)); + req.setTimestamp(this.getHeader(headerMap, WechatCode.HEADER_TIMESTAMP)); + + DaxResult result = wechatChannelClient.parseRefundCallback(req); + if (result.getCode() != 0 || result.getData() == null || !result.getData().isVerified()) { + log.error("微信退款回调验签失败: channelMchNo={}", channelMchNo); + return WechatCode.NOTIFY_FAIL; + } + + // 4. 记录退款回调结果, TODO 接入退款单状态更新框架 + WechatCallbackParseResp resp = result.getData(); + log.info("微信退款回调: outRefundNo={}, refundId={}, refundStatus={}, amount={}", + resp.getOutRefundNo(), resp.getRefundId(), resp.getRefundStatus(), resp.getAmount()); + if (Objects.equals(WechatCode.REFUND_STATUS_SUCCESS, resp.getRefundStatus())) { + // TODO 退款成功, 更新退款单状态(待接入退款回调框架) + log.info("微信退款成功: outRefundNo={}", resp.getOutRefundNo()); + } + return WechatCode.NOTIFY_SUCCESS; + } + + /// 获取 header(大小写兼容) + private String getHeader(Map headerMap, String name) { + String value = headerMap.get(name); + return value != null ? value : headerMap.get(name.toLowerCase()); + } +} diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/enum/product.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/enum/product.json index 2cbba7cf2..c82c4bc65 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/enum/product.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/enum/product.json @@ -10,5 +10,15 @@ "ums_mini": "UMS (Mini Program)", "ums_h5": "UMS (H5)", "ums_barcode": "UMS (B Scan C)", - "lakala_pay": "Lakala Pay" + "lakala_pay": "Lakala Pay", + "ada_pay": "Ada Pay", + "dougong_pay": "Dougong Pay", + "hkrt_pay": "HKRT Pay", + "fuyou_pay": "Fuyou Pay", + "sheng_pay": "Sheng Pay", + "ysep_pay": "YSEP Pay", + "quick_pay": "Quick Pay", + "sand_pay": "Sand Pay", + "yee_pay": "Yee Pay", + "jee_pay": "Jeepay" } diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/validation.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/validation.json index bc9b9e5dd..4c7e08407 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/validation.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/en-US/validation.json @@ -127,6 +127,15 @@ "channelMerchantName": { "notBlank": "Merchant name cannot be blank" }, + "umsAppId": { + "notBlank": "UMS App ID cannot be blank" + }, + "appKey": { + "notBlank": "App Key cannot be blank" + }, + "secretKey": { + "notBlank": "Secret Key cannot be blank" + }, "tradeIdentity": { "notBlank": "Merchant trade identity cannot be blank" }, @@ -543,6 +552,15 @@ }, "remark": { "size": "Remark cannot exceed 255 characters" + }, + "lklAppId": { + "notBlank": "Lakala application ID cannot be blank" + }, + "lakalaMchNo": { + "notBlank": "Lakala merchant number cannot be blank" + }, + "termNo": { + "size": "Terminal number cannot exceed 64 characters" } } } diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/enum/product.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/enum/product.json index 85c7368fc..9d3d5f340 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/enum/product.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/enum/product.json @@ -10,5 +10,15 @@ "ums_mini": "银联商务(小程序)", "ums_h5": "银联商务(H5)", "ums_barcode": "银联商务(B扫C)", - "lakala_pay": "拉卡拉支付" + "lakala_pay": "拉卡拉支付", + "ada_pay": "汇付天下", + "dougong_pay": "斗拱支付", + "hkrt_pay": "海科融通", + "fuyou_pay": "富友支付", + "sheng_pay": "盛付通", + "ysep_pay": "银盛支付", + "quick_pay": "快钱支付", + "sand_pay": "杉德支付", + "yee_pay": "易宝支付", + "jee_pay": "Jeepay" } diff --git a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/validation.json b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/validation.json index 38121e7f7..00f35c138 100644 --- a/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/validation.json +++ b/daxpay-platform/daxpay-platform-common/common-i18n/src/main/resources/i18n/zh-CN/validation.json @@ -127,6 +127,15 @@ "channelMerchantName": { "notBlank": "商户名称不可为空" }, + "umsAppId": { + "notBlank": "银联商务应用ID不可为空" + }, + "appKey": { + "notBlank": "应用密钥不可为空" + }, + "secretKey": { + "notBlank": "通讯密钥不可为空" + }, "tradeIdentity": { "notBlank": "商户交易标识不可为空" }, @@ -546,6 +555,15 @@ }, "remark": { "size": "备注不可超过255位" + }, + "lklAppId": { + "notBlank": "拉卡拉应用编号不可为空" + }, + "lakalaMchNo": { + "notBlank": "拉卡拉商户号不可为空" + }, + "termNo": { + "size": "终端号不可超过64位" } } } diff --git a/daxpay-platform/daxpay-platform-core/src/main/java/cn/daxpay/open/platform/core/enums/pay/channel/ProductEnum.java b/daxpay-platform/daxpay-platform-core/src/main/java/cn/daxpay/open/platform/core/enums/pay/channel/ProductEnum.java index ebf04166e..497bc4316 100644 --- a/daxpay-platform/daxpay-platform-core/src/main/java/cn/daxpay/open/platform/core/enums/pay/channel/ProductEnum.java +++ b/daxpay-platform/daxpay-platform-core/src/main/java/cn/daxpay/open/platform/core/enums/pay/channel/ProductEnum.java @@ -47,6 +47,28 @@ public enum ProductEnum implements I18nSupport { // ===== 拉卡拉 ===== /// 拉卡拉支付 LAKALA_PAY("lakala_pay"), + + // ===== 第三方聚合通道(一通道一产品)===== + /// 汇付天下 + ADA_PAY("ada_pay"), + /// 斗拱 + DOUGONG_PAY("dougong_pay"), + /// 海科融通 + HKRT_PAY("hkrt_pay"), + /// 富友 + FUYOU_PAY("fuyou_pay"), + /// 盛付通 + SHENG_PAY("sheng_pay"), + /// 银盛 + YSEP_PAY("ysep_pay"), + /// 快钱 + QUICK_PAY("quick_pay"), + /// 杉德 + SAND_PAY("sand_pay"), + /// 易宝 + YEE_PAY("yee_pay"), + /// jeepay + JEE_PAY("jee_pay"), ; private final String code; @@ -68,6 +90,17 @@ public enum ProductEnum implements I18nSupport { case LAKALA_PAY -> ChannelEnum.LAKALA_PAY.getCode(); // 抖音支付 case DOUYIN_PAY -> ChannelEnum.DOUYIN_PAY.getCode(); + // 第三方聚合通道(产品 code 与通道 code 一致) + case ADA_PAY -> ChannelEnum.ADA_PAY.getCode(); + case DOUGONG_PAY -> ChannelEnum.DOUGONG_PAY.getCode(); + case HKRT_PAY -> ChannelEnum.HKRT_PAY.getCode(); + case FUYOU_PAY -> ChannelEnum.FUYOU_PAY.getCode(); + case SHENG_PAY -> ChannelEnum.SHENG_PAY.getCode(); + case YSEP_PAY -> ChannelEnum.YSEP_PAY.getCode(); + case QUICK_PAY -> ChannelEnum.QUICK_PAY.getCode(); + case SAND_PAY -> ChannelEnum.SAND_PAY.getCode(); + case YEE_PAY -> ChannelEnum.YEE_PAY.getCode(); + case JEE_PAY -> ChannelEnum.JEE_PAY.getCode(); }; }