78 lines
1.8 KiB
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
|
|
}
|