package wechat import ( "context" "gitea.cdlsxd.cn/sdk/plugin/proto" "github.com/wechatpay-apiv3/wechatpay-go/core" "github.com/wechatpay-apiv3/wechatpay-go/core/auth" "github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers" "sync" ) type manager struct { once sync.Once mutex sync.RWMutex clients map[string]*core.Client } var instance manager func init() { instance = manager{ clients: make(map[string]*core.Client), } } func GetClient(ctx context.Context, c *Server) (*core.Client, error) { instance.mutex.Lock() defer instance.mutex.Unlock() if instance.clients[c.MchID] != nil { return instance.clients[c.MchID], nil } var err error instance.once.Do(func() { instance.clients[c.MchID], err = newClient(ctx, c) }) if err != nil { return nil, err } return instance.clients[c.MchID], nil } func (s *Server) Verify(ctx context.Context, message, signature string) error { var verifier auth.Verifier verifier = verifiers.NewSHA256WithRSAVerifier(nil) if err := verifier.Verify(ctx, s.MchCertificateSerialNumber, message, signature); err != nil { return proto.ErrorSignFail(err.Error()) } return nil }