Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 3m55s
新增收款商户、商户池轮询、微信授权配置独立管理;三类新支付 (C端套餐购买、C端资产钱包充值、代理在线预存款充值)无条件 经商户池选择并冻结路由,无旧综合配置回退。merchant_id 为空 历史支付继续按 payment_config_id 双读。凭证版本化加载与 ID+版本缓存保证轮换一致性。删除商户池新支付创建开关及全部 引用。
97 lines
2.8 KiB
Go
97 lines
2.8 KiB
Go
package app
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"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.GetAuthorizationConfig(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,
|
|
})
|
|
}
|
|
|
|
// GetAppID 获取当前生效的公众号 AppID
|
|
// GET /api/c/v1/wechat/appid
|
|
func (h *ClientWechatHandler) GetAppID(c *fiber.Ctx) error {
|
|
wechatConfig, err := h.wechatConfigService.GetAuthorizationConfig(c.UserContext())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if wechatConfig == nil || strings.TrimSpace(wechatConfig.OaAppID) == "" {
|
|
return errors.New(errors.CodeWechatConfigUnavailable)
|
|
}
|
|
|
|
return response.Success(c, &dto.WechatAppIDResponse{
|
|
AppID: wechatConfig.OaAppID,
|
|
})
|
|
}
|