diff --git a/internal/handler/app/client_wechat.go b/internal/handler/app/client_wechat.go new file mode 100644 index 0000000..8cab416 --- /dev/null +++ b/internal/handler/app/client_wechat.go @@ -0,0 +1,78 @@ +package app + +import ( + "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel" + "github.com/break/junhong_cmp_fiber/internal/model/dto" + wechatConfigSvc "github.com/break/junhong_cmp_fiber/internal/service/wechat_config" + "github.com/break/junhong_cmp_fiber/pkg/errors" + "github.com/break/junhong_cmp_fiber/pkg/logger" + "github.com/break/junhong_cmp_fiber/pkg/response" + "github.com/break/junhong_cmp_fiber/pkg/wechat" + "github.com/go-playground/validator/v10" + "github.com/gofiber/fiber/v2" + "github.com/redis/go-redis/v9" + "go.uber.org/zap" +) + +var clientWechatValidator = validator.New() + +// ClientWechatHandler C 端微信相关处理器 +type ClientWechatHandler struct { + wechatConfigService *wechatConfigSvc.Service + wechatCache kernel.CacheInterface + logger *zap.Logger +} + +// NewClientWechatHandler 创建 C 端微信处理器 +func NewClientWechatHandler( + wechatConfigService *wechatConfigSvc.Service, + rdb *redis.Client, + log *zap.Logger, +) *ClientWechatHandler { + var cache kernel.CacheInterface + if rdb != nil { + cache = wechat.NewRedisCache(rdb) + } + return &ClientWechatHandler{ + wechatConfigService: wechatConfigService, + wechatCache: cache, + logger: log, + } +} + +// GetJSSDKConfig 获取微信 JSSDK 签名配置 +// GET /api/c/v1/wechat/jssdk-config +func (h *ClientWechatHandler) GetJSSDKConfig(c *fiber.Ctx) error { + var req dto.JSSDKConfigRequest + if err := c.QueryParser(&req); err != nil { + return errors.New(errors.CodeInvalidParam) + } + if err := clientWechatValidator.Struct(&req); err != nil { + logger.GetAppLogger().Warn("获取 JSSDK 配置参数校验失败", zap.Error(err)) + return errors.New(errors.CodeInvalidParam) + } + + wechatConfig, err := h.wechatConfigService.GetActiveConfig(c.UserContext()) + if err != nil { + return err + } + + oaApp, err := wechat.NewOfficialAccountAppFromConfig(wechatConfig, h.wechatCache, h.logger) + if err != nil { + h.logger.Error("初始化微信公众号应用失败", zap.Error(err)) + return errors.New(errors.CodeWechatConfigUnavailable) + } + + oaService := wechat.NewOfficialAccountService(oaApp, h.logger) + jssdkConfig, err := oaService.GetJSSDKConfig(c.UserContext(), req.URL) + if err != nil { + return err + } + + return response.Success(c, &dto.JSSDKConfigResponse{ + AppID: jssdkConfig.AppID, + Timestamp: jssdkConfig.Timestamp, + NonceStr: jssdkConfig.NonceStr, + Signature: jssdkConfig.Signature, + }) +}