plugins/utils/wechat/client.go

70 lines
2.1 KiB
Go

package wechat
import (
"context"
"crypto/x509"
"fmt"
"gitea.cdlsxd.cn/sdk/plugin/proto"
"github.com/go-playground/validator/v10"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/utils"
"os"
putils "plugins/utils/helper"
)
type Server struct {
MchID string `validate:"required" json:"mch_id"`
MchCertificateSerialNumber string `validate:"required" json:"mch_certificate_serial_number"`
}
func (c *Server) Validate() error {
err := validator.New().Struct(c)
if err != nil {
for _, err = range err.(validator.ValidationErrors) {
return proto.ErrorConfigFail("配置有误:" + err.Error())
}
}
return nil
}
func newClient(ctx context.Context, c *Server) (*core.Client, error) {
dir, err := os.Getwd()
if err != nil {
return nil, proto.ErrorConfigFail(fmt.Sprintf("MchID[%s] get current dir error:%v", c.MchID, err))
}
filePath := fmt.Sprintf("%s/%s/%s/%s", dir, "cert", "wechat", c.MchID)
if !putils.FileExists(filePath) {
return nil, proto.ErrorConfigFail(fmt.Sprintf("MchID[%s]微信密钥证书信息不存在,请联系技术人员处理", c.MchID))
}
// 商户相关配置,商户API私钥
mchPrivateKey, err := utils.LoadPrivateKeyWithPath(fmt.Sprintf("%s/%s", filePath, "wechat_private_key.pem"))
if err != nil {
return nil, proto.ErrorConfigFail(fmt.Sprintf("MchID[%s] load merchant private key error:%v", c.MchID, err))
}
var client *core.Client
// 微信支付平台配置
wechatPayCertificate, err := utils.LoadCertificateWithPath(fmt.Sprintf("%s/%s", filePath, "wechat_cert.pem"))
if err != nil {
return nil, proto.ErrorConfigFail(fmt.Sprintf("平台证书有误:%v", err))
}
client, err = core.NewClient(
ctx,
option.WithMerchantCredential(
c.MchID,
c.MchCertificateSerialNumber,
mchPrivateKey,
),
option.WithWechatPayCertificate([]*x509.Certificate{wechatPayCertificate}),
)
if err != nil {
return nil, proto.ErrorConfigFail(fmt.Sprintf("创建 Client 失败:%v", err))
}
return client, nil
}