refactor(channel): 移除通道应用认证配置中的授权回调地址字段

OAuth 回调由平台网关统一生成,不再由微信/支付宝/抖音应用级配置。
This commit is contained in:
DaxPay Dev
2026-07-10 17:05:39 +08:00
parent 36af846a36
commit a1f8979edb
27 changed files with 17 additions and 100 deletions

View File

@@ -58,7 +58,7 @@ COMMENT ON COLUMN wechat_isv_channel_merchant.auth_app_type IS '认证应用类
-- ------------------------------------------------------------
-- 微信服务商通道商户应用授权认证配置表
-- 配置服务商通道商户应用(子商户应用)的应用密钥和授权回调地址, 用于微信OAuth授权流程中的身份验证与回调跳转
-- 配置服务商通道商户应用(子商户应用)的应用密钥, 用于微信OAuth授权流程中的身份验证
-- 一个应用对应一份授权配置(由唯一约束 channel_mch_no + wechat_isv_mch_app_id 保证)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS wechat_isv_mch_app_auth_config (
@@ -66,7 +66,6 @@ CREATE TABLE IF NOT EXISTS wechat_isv_mch_app_auth_config (
channel_mch_no varchar(32) NOT NULL,
wechat_isv_mch_app_id int8 NOT NULL,
app_secret varchar(255),
auth_callback_url varchar(255),
mch_no varchar(32),
creator int8,
create_time timestamptz(6),
@@ -82,7 +81,6 @@ COMMENT ON COLUMN wechat_isv_mch_app_auth_config.id IS '主键';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.channel_mch_no IS '通道商户号(服务商特约商户)';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.wechat_isv_mch_app_id IS '关联服务商通道商户应用ID';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.app_secret IS '应用密钥(加密存储)';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.auth_callback_url IS '授权回调地址';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.mch_no IS '商户号';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.creator IS '创建者ID';
COMMENT ON COLUMN wechat_isv_mch_app_auth_config.create_time IS '创建时间';

View File

@@ -13,7 +13,7 @@ import lombok.experimental.Accessors;
/// # 支付宝直连商户应用授权认证配置
///
/// 配置直连商户应用的用户标识类型和授权回调地址,用于支付宝用户授权流程中的身份识别与回调跳转
/// 配置直连商户应用的用户标识类型,用于支付宝用户授权流程中的身份识别。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -32,9 +32,6 @@ public class AlipayDirectAppAuthConfig extends MchBaseEntity implements ToResult
/// 用户标识类型
private String userIdType;
/// 授权回调地址
private String authCallbackUrl;
/// 转换
@Override
public AlipayDirectAppAuthConfigResult toResult() {

View File

@@ -13,7 +13,7 @@ import lombok.experimental.Accessors;
/// # 支付宝服务商应用授权认证配置
///
/// 配置服务商应用的用户标识类型和授权回调地址,用于支付宝用户授权流程中的身份识别与回调跳转
/// 配置服务商应用的用户标识类型,用于支付宝用户授权流程中的身份识别。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -28,9 +28,6 @@ public class AlipayIsvAppAuthConfig extends MpBaseEntity implements ToResult<Ali
/// 用户标识类型
private String userIdType;
/// 授权回调地址
private String authCallbackUrl;
/// 转换
@Override
public AlipayIsvAppAuthConfigResult toResult() {

View File

@@ -3,13 +3,12 @@ package cn.daxpay.open.channel.alipay.param.direct;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.experimental.Accessors;
/// # 支付宝直连商户应用授权认证配置保存参数
///
/// 保存/更新支付宝直连商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、用户标识类型和授权回调地址
/// 保存/更新支付宝直连商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、用户标识类型。
///
@Data
@Accessors(chain = true)
@@ -31,9 +30,4 @@ public class AlipayDirectAppAuthConfigParam {
@NotBlank(message = "{validation.field.userIdType.notBlank}")
@Schema(description = "用户标识类型")
private String userIdType;
@NotBlank(message = "{validation.field.authCallbackUrl.notBlank}")
@Size(max = 512, message = "{validation.field.authCallbackUrl.size}")
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -3,13 +3,12 @@ package cn.daxpay.open.channel.alipay.param.isv;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.experimental.Accessors;
/// # 支付宝服务商应用授权认证配置保存参数
///
/// 保存/更新支付宝服务商应用授权认证配置时接收的请求参数含应用ID、用户标识类型和授权回调地址
/// 保存/更新支付宝服务商应用授权认证配置时接收的请求参数含应用ID、用户标识类型。
///
@Data
@Accessors(chain = true)
@@ -23,9 +22,4 @@ public class AlipayIsvAppAuthConfigParam {
@NotBlank(message = "{validation.field.userIdType.notBlank}")
@Schema(description = "用户标识类型")
private String userIdType;
@NotBlank(message = "{validation.field.authCallbackUrl.notBlank}")
@Size(max = 512, message = "{validation.field.authCallbackUrl.size}")
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -8,7 +8,7 @@ import lombok.experimental.Accessors;
/// # 支付宝直连商户应用授权认证配置
///
/// 支付宝直连商户应用授权认证配置的返回结果对象,含商户号、通道商户号,以及用户标识类型和授权回调地址
/// 支付宝直连商户应用授权认证配置的返回结果对象,含商户号、通道商户号,以及用户标识类型。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -27,7 +27,4 @@ public class AlipayDirectAppAuthConfigResult extends BaseResult {
@Schema(description = "用户标识类型")
private String userIdType;
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -8,7 +8,7 @@ import lombok.experimental.Accessors;
/// # 支付宝服务商应用授权认证配置
///
/// 支付宝服务商应用授权认证配置的返回结果对象,包含用户标识类型和授权回调地址
/// 支付宝服务商应用授权认证配置的返回结果对象,包含用户标识类型。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -23,8 +23,4 @@ public class AlipayIsvAppAuthConfigResult extends BaseResult {
/// 用户标识类型
@Schema(description = "用户标识类型")
private String userIdType;
/// 授权回调地址
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -67,7 +67,6 @@ public class AlipayDirectAppAuthConfigService {
this.validateUserIdType(param.getUserIdType());
var config = this.findByAlipayDirectAppId(param.getAlipayDirectAppId());
config.setUserIdType(param.getUserIdType());
config.setAuthCallbackUrl(param.getAuthCallbackUrl());
alipayDirectAppAuthConfigManager.updateById(config);
}

View File

@@ -58,7 +58,6 @@ public class AlipayIsvAppAuthConfigService {
this.validateUserIdType(param.getUserIdType());
var config = this.findByAlipayIsvAppId(param.getAlipayIsvAppId());
config.setUserIdType(param.getUserIdType());
config.setAuthCallbackUrl(param.getAuthCallbackUrl());
alipayIsvAppAuthConfigManager.updateById(config);
}

View File

@@ -14,7 +14,7 @@ import lombok.experimental.Accessors;
/// # 抖音直连商户应用授权认证配置
///
/// 配置直连商户应用的应用密钥和授权回调地址,用于抖音用户授权流程中的身份验证与回调跳转
/// 配置直连商户应用的应用密钥,用于抖音用户授权流程中的身份验证。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -34,9 +34,6 @@ public class DouyinDirectAppAuthConfig extends MchBaseEntity implements ToResult
@TableField(typeHandler = DataEncryptTypeHandler.class)
private String appSecret;
/// 授权回调地址
private String authCallbackUrl;
/// 转换
@Override
public DouyinDirectAppAuthConfigResult toResult() {

View File

@@ -9,7 +9,7 @@ import lombok.experimental.Accessors;
/// # 抖音直连商户应用授权认证配置保存参数
///
/// 保存/更新抖音直连商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、应用密钥和授权回调地址
/// 保存/更新抖音直连商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、应用密钥。
///
@Data
@Accessors(chain = true)
@@ -31,8 +31,4 @@ public class DouyinDirectAppAuthConfigParam {
@Size(max = 512, message = "{validation.field.appSecret.size}")
@Schema(description = "应用密钥")
private String appSecret;
@Size(max = 512, message = "{validation.field.authCallbackUrl.size}")
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -24,7 +24,4 @@ public class DouyinDirectAppAuthConfigResult extends MchBaseResult {
@SensitiveInfo
@Schema(description = "应用密钥 (已脱敏)")
private String appSecret;
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -54,7 +54,6 @@ public class DouyinDirectAppAuthConfigService {
throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "error.channel.douyin.mchAppNotFound");
}
var config = this.findByDouyinDirectAppId(param.getDouyinDirectAppId());
config.setAuthCallbackUrl(param.getAuthCallbackUrl());
// Convert copy(IGNORE) 自动处理 appSecretnull 不覆盖,非 null 设置新值
DouyinDirectAppAuthConfigConvert.CONVERT.copy(param, config);
douyinDirectAppAuthConfigManager.updateById(config);

View File

@@ -14,7 +14,7 @@ import lombok.experimental.Accessors;
/// # 微信直连商户应用授权认证配置
///
/// 配置直连商户应用的应用密钥和授权回调地址用于微信OAuth授权流程中的身份验证与回调跳转
/// 配置直连商户应用的应用密钥用于微信OAuth授权流程中的身份验证。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -34,9 +34,6 @@ public class WechatDirectAppAuthConfig extends MchBaseEntity implements ToResult
@TableField(typeHandler = DataEncryptTypeHandler.class)
private String appSecret;
/// 授权回调地址
private String authCallbackUrl;
/// 转换
@Override
public WechatDirectAppAuthConfigResult toResult() {

View File

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
/// # 微信服务商应用授权认证配置
///
/// 服务商应用(WechatIsvApp)本身为平台级全局配置, 不挂商户维度,
/// 其授权认证配置(appSecret/回调地址)同样为全局配置。
/// 其授权认证配置(appSecret)同样为全局配置。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -31,9 +31,6 @@ public class WechatIsvAppAuthConfig extends MpBaseEntity implements ToResult<Wec
@TableField(typeHandler = DataEncryptTypeHandler.class)
private String appSecret;
/// 授权回调地址
private String authCallbackUrl;
/// 转换
@Override
public WechatIsvAppAuthConfigResult toResult() {

View File

@@ -14,7 +14,7 @@ import lombok.experimental.Accessors;
/// # 微信服务商通道商户应用授权认证配置
///
/// 配置服务商通道商户应用(子商户应用)的应用密钥和授权回调地址,用于微信OAuth授权流程中的身份验证与回调跳转
/// 配置服务商通道商户应用(子商户应用)的应用密钥,用于微信OAuth授权流程中的身份验证。
/// 一个应用对应一份授权配置(由唯一约束 channel_mch_no + wechat_isv_mch_app_id 保证)。
///
@EqualsAndHashCode(callSuper = true)
@@ -35,9 +35,6 @@ public class WechatIsvMchAppAuthConfig extends MchBaseEntity implements ToResult
@TableField(typeHandler = DataEncryptTypeHandler.class)
private String appSecret;
/// 授权回调地址
private String authCallbackUrl;
/// 转换
@Override
public WechatIsvMchAppAuthConfigResult toResult() {

View File

@@ -3,13 +3,12 @@ package cn.daxpay.open.channel.wechat.param.direct;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.experimental.Accessors;
/// # 微信直连商户应用授权认证配置保存参数
///
/// 保存/更新微信直连商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、应用密钥和授权回调地址
/// 保存/更新微信直连商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、应用密钥。
///
@Data
@Accessors(chain = true)
@@ -30,8 +29,4 @@ public class WechatDirectAppAuthConfigParam {
@Schema(description = "应用密钥")
private String appSecret;
@Size(max = 512, message = "{validation.field.authCallbackUrl.size}")
@Schema(description = "授权回调地址(仅公众号,非必填)")
private String authCallbackUrl;
}

View File

@@ -2,7 +2,6 @@ package cn.daxpay.open.channel.wechat.param.isv;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -19,8 +18,4 @@ public class WechatIsvAppAuthConfigParam {
@Schema(description = "应用密钥(加密存储),所有应用类型首次保存时必填")
private String appSecret;
@Size(max = 512, message = "{validation.field.authCallbackUrl.size}")
@Schema(description = "授权回调地址(仅公众号应用需要)")
private String authCallbackUrl;
}

View File

@@ -3,13 +3,12 @@ package cn.daxpay.open.channel.wechat.param.isv;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.experimental.Accessors;
/// # 微信服务商通道商户应用授权认证配置保存参数
///
/// 保存/更新微信服务商通道商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、应用密钥和授权回调地址
/// 保存/更新微信服务商通道商户应用授权认证配置时接收的请求参数,含商户号、通道商户号、应用密钥。
///
@Data
@Accessors(chain = true)
@@ -30,8 +29,4 @@ public class WechatIsvMchAppAuthConfigParam {
@Schema(description = "应用密钥")
private String appSecret;
@Size(max = 512, message = "{validation.field.authCallbackUrl.size}")
@Schema(description = "授权回调地址(仅公众号,非必填)")
private String authCallbackUrl;
}

View File

@@ -9,7 +9,7 @@ import lombok.experimental.Accessors;
/// # 微信直连商户应用授权认证配置
///
/// 微信直连商户应用授权认证配置的返回结果对象,含商户号、通道商户号、应用密钥(脱敏)和授权回调地址
/// 微信直连商户应用授权认证配置的返回结果对象,含商户号、通道商户号、应用密钥(脱敏)。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -30,7 +30,4 @@ public class WechatDirectAppAuthConfigResult extends BaseResult {
@SensitiveInfo
@Schema(description = "应用密钥(已脱敏)")
private String appSecret;
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -21,7 +21,4 @@ public class WechatIsvAppAuthConfigResult extends BaseResult {
@SensitiveInfo(front = 12, end = 12)
@Schema(description = "应用密钥(已脱敏)")
private String appSecret;
@Schema(description = "授权回调地址(仅公众号)")
private String authCallbackUrl;
}

View File

@@ -9,7 +9,7 @@ import lombok.experimental.Accessors;
/// # 微信服务商通道商户应用授权认证配置
///
/// 微信服务商通道商户应用授权认证配置的返回结果对象,含商户号、通道商户号、应用密钥(脱敏)和授权回调地址
/// 微信服务商通道商户应用授权认证配置的返回结果对象,含商户号、通道商户号、应用密钥(脱敏)。
///
@EqualsAndHashCode(callSuper = true)
@Data
@@ -30,7 +30,4 @@ public class WechatIsvMchAppAuthConfigResult extends BaseResult {
@SensitiveInfo
@Schema(description = "应用密钥(已脱敏)")
private String appSecret;
@Schema(description = "授权回调地址")
private String authCallbackUrl;
}

View File

@@ -55,7 +55,6 @@ public class WechatDirectAppAuthConfigService {
throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR, "error.channel.wechat.mchAppNotFound");
}
var config = this.findByWechatDirectAppId(param.getWechatDirectAppId());
config.setAuthCallbackUrl(param.getAuthCallbackUrl());
WechatDirectAppAuthConfigConvert.CONVERT.copy(param, config);
wechatDirectAppAuthConfigManager.updateById(config);
}

View File

@@ -43,7 +43,6 @@ public class WechatIsvAppAuthConfigService {
public void save(WechatIsvAppAuthConfigParam param) {
var config = this.findByWechatIsvAppId(param.getWechatIsvAppId());
config.setAppSecret(param.getAppSecret());
config.setAuthCallbackUrl(param.getAuthCallbackUrl());
wechatIsvAppAuthConfigManager.updateById(config);
}

View File

@@ -10,7 +10,7 @@ import cn.daxpay.open.payment.unipay.result.assist.AuthUrlResult;
/// # 通道抽象认证策略
///
/// 负责获取支付所需的用户标识(微信 openId / 支付宝 userId)。按支付产品([cn.daxpay.open.platform.core.enums.pay.channel.ProductEnum])
/// 注册, 与支付策略粒度一致。策略复用支付的商户配置体系定位通道应用(appId/appSecret/authCallbackUrl)。
/// 注册, 与支付策略粒度一致。策略复用支付的商户配置体系定位通道应用(appId/appSecret)。
public abstract class AbsChannelAuthStrategy implements PaymentStrategy {
/// 获取授权链接

View File

@@ -48,10 +48,6 @@
"userIdType": {
"notBlank": "User ID type cannot be blank"
},
"authCallbackUrl": {
"notBlank": "Authorization callback URL cannot be blank",
"size": "Authorization callback URL cannot exceed 512 characters"
},
"product": {
"notBlank": "Product code cannot be blank",
"size": "Product code cannot exceed 32 characters",

View File

@@ -48,10 +48,6 @@
"userIdType": {
"notBlank": "用户标识类型不可为空"
},
"authCallbackUrl": {
"notBlank": "授权回调地址不可为空",
"size": "授权回调地址不可超过512位"
},
"product": {
"notBlank": "产品编码不可为空",
"size": "支付产品不可超过32位",