From 1125701329fcdc2a975f8381ba73bc3e74ea2f12 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 16 Apr 2026 18:38:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20C=20=E7=AB=AF?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=20JSSDK=20=E7=AD=BE=E5=90=8D=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=8E=A5=E5=8F=A3=20Handler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sisyphus --- internal/handler/app/client_wechat.go | 78 +++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 internal/handler/app/client_wechat.go 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, + }) +}