56 lines
1.1 KiB
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
|
|
}
|