package server import ( "context" "github.com/go-pay/gopay" "github.com/go-pay/gopay/alipay" "github.com/shopspring/decimal" "github.com/spf13/viper" "go.uber.org/zap" "go_zh/pkg/utils" "sync" ) type AliPayServer struct { CertFile string //公钥证书地址 PrivateKeyFile string //私钥证书地址 AppId string //appid PrivateKey string //密钥 privateKeyInfo string PublicKeyInfo string } var ( aliPayServerInstance *AliPayServer aliPayServerOnce sync.Once ) // GetAliPayServerInstance 获取单例实例 func GetAliPayServerInstance() *AliPayServer { aliPayServerOnce.Do(func() { aliPayServerInstance = &AliPayServer{ CertFile: viper.GetString("aliPay.certFile"), PrivateKeyFile: viper.GetString("aliPay.privateKeyFile"), AppId: viper.GetString("aliPay.appId"), PrivateKey: viper.GetString("aliPay.privateKey"), } privateKeyStr := utils.LoadPrivateKeyWithPath(aliPayServerInstance.PrivateKeyFile) aliPayServerInstance.privateKeyInfo = privateKeyStr aliPayPublicKeyStr := utils.LoadPublicKeyWithPath(aliPayServerInstance.CertFile) aliPayServerInstance.PublicKeyInfo = aliPayPublicKeyStr }) return aliPayServerInstance } // GetAliWapPay 获取支付宝手机网站支付 func (ali *AliPayServer) GetAliWapPay(orderSn string, payMoney decimal.Decimal, boby string, notifyUrl string, returnUrl string) string { // 初始化支付宝客户端 // appId:应用ID // privateKey:应用私钥,支持PKCS1和PKCS8 // isProd:是否是正式环境 client, err := alipay.NewClient(ali.AppId, ali.privateKeyInfo, true) if err != nil { zap.L().Error("支付宝支付NewClient failed", zap.Error(err)) } // 注意:具体设置哪些参数,根据不同的方法而不同,此处列举出所有设置参数 client.SetLocation(alipay.LocationShanghai). // 设置时区,不设置或出错均为默认服务器时间 SetCharset(alipay.UTF8). // 设置字符编码,不设置默认 utf-8 SetSignType(alipay.RSA2). // 设置签名类型,不设置默认 RSA2 SetReturnUrl(returnUrl). // 设置返回URL SetNotifyUrl(notifyUrl) // 初始化 BodyMap bm := make(gopay.BodyMap) bm.Set("subject", boby). Set("out_trade_no", orderSn). Set("total_amount", payMoney) aliRsp, err := client.TradeWapPay(context.Background(), bm) if err != nil { zap.L().Error("支付宝手机网站支付请求失败:", zap.Error(err)) } return aliRsp }