plugins/utils/wechat/instance.go

56 lines
1.1 KiB
Go

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
}