| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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"
- "os"
- "path/filepath"
- "sync"
- )
- type AliPayServer struct {
- CertFile string //公钥证书地址
- PrivateKeyFile string //私钥证书地址
- AppId string //appid
- PrivateKey string //密钥
- privateKeyInfo string
- PublicKeyInfo string
- }
- var (
- aliPayServerInstance *AliPayServer
- aliPayServerOnce sync.Once
- aliCtx context.Context
- )
- // 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 := loadPrivateKeyWithPath(aliPayServerInstance.PrivateKeyFile)
- aliPayServerInstance.privateKeyInfo = privateKeyStr
- aliPayPublicKeyStr := 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(aliCtx, bm)
- if err != nil {
- zap.L().Error("支付宝手机网站支付请求失败:", zap.Error(err))
- }
- return aliRsp
- }
- // loadPrivateKeyWithPath 通过私钥的文件路径内容加载私钥
- func loadPrivateKeyWithPath(path string) (privateKey string) {
- absPath, _ := filepath.Abs(path)
- privateKeyBytes, err := os.ReadFile(absPath)
- if err != nil {
- return ""
- }
- return string(privateKeyBytes)
- }
- // loadPublicKeyWithPath 通过公钥的文件路径加载公钥
- func loadPublicKeyWithPath(path string) (publicKey string) {
- absPath, _ := filepath.Abs(path)
- publicKeyBytes, err := os.ReadFile(absPath)
- if err != nil {
- return ""
- }
- return string(publicKeyBytes)
- }
|