plugins/utils/alipay/cert.go

78 lines
1.8 KiB
Go

package alipay
import (
"fmt"
"os"
"plugins/utils"
"sync"
)
type CertConfig struct {
MchCertSN string
RootCertSN string
PublicKey string
}
type manager struct {
once sync.Once
mutex sync.RWMutex
CertConfigs map[string]*CertConfig
}
var instance manager
func getCertConfig(appId string) *CertConfig {
c, ok := instance.CertConfigs[appId]
if !ok {
return nil
}
return c
}
func setCertConfig(appId string, certConfig *CertConfig) {
instance.mutex.Lock()
defer instance.mutex.Unlock()
instance.CertConfigs[appId] = certConfig
}
func init() {
instance.CertConfigs = make(map[string]*CertConfig)
}
func GetCert(appId string) (*CertConfig, error) {
c := getCertConfig(appId)
if c != nil {
return c, nil
}
dir, err := os.Getwd()
if err != nil {
return nil, fmt.Errorf("get current dir error: %v", err)
}
filePath := fmt.Sprintf("%s/%s/%s/%s", dir, "cert", "alipay", appId)
if !utils.FileExists(filePath) {
return nil, fmt.Errorf("appId[%s]支付宝密钥文件信息不存在,请联系技术人员处理", appId)
}
mchCertPath := fmt.Sprintf("%s/%s_%s.crt", filePath, "appCertPublicKey", appId)
mchCertSN, err := getMchCertSN(mchCertPath)
if err != nil {
return nil, fmt.Errorf("get mchCertSN error: %v", err)
}
rootCertPath := fmt.Sprintf("%s/%s", filePath, "alipayRootCert.crt")
rootCertSN, err := getRootCertSN(rootCertPath)
if err != nil {
return nil, fmt.Errorf("get rootCertSN error: %v", err)
}
publicKeyPath := fmt.Sprintf("%s/%s", filePath, "alipayCertPublicKey_RSA2.crt")
publicKey, err := getPublicKey(publicKeyPath)
if err != nil {
return nil, fmt.Errorf("get publicKey error: %v", err)
}
c = &CertConfig{
MchCertSN: mchCertSN,
RootCertSN: rootCertSN,
PublicKey: publicKey,
}
setCertConfig(appId, c)
return c, nil
}