feat: 新增 C 端微信 JSSDK 签名配置接口 Handler

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-16 18:38:20 +08:00
parent ed1facc1b8
commit 1125701329

View File

@@ -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,
})
}