aliPayServer.go 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package server
  2. import (
  3. "context"
  4. "github.com/go-pay/gopay"
  5. "github.com/go-pay/gopay/alipay"
  6. "github.com/shopspring/decimal"
  7. "github.com/spf13/viper"
  8. "go.uber.org/zap"
  9. "os"
  10. "path/filepath"
  11. "sync"
  12. )
  13. type AliPayServer struct {
  14. CertFile string //公钥证书地址
  15. PrivateKeyFile string //私钥证书地址
  16. AppId string //appid
  17. PrivateKey string //密钥
  18. privateKeyInfo string
  19. PublicKeyInfo string
  20. }
  21. var (
  22. aliPayServerInstance *AliPayServer
  23. aliPayServerOnce sync.Once
  24. aliCtx context.Context
  25. )
  26. // GetAliPayServerInstance 获取单例实例
  27. func GetAliPayServerInstance() *AliPayServer {
  28. aliPayServerOnce.Do(func() {
  29. aliPayServerInstance = &AliPayServer{
  30. CertFile: viper.GetString("aliPay.certFile"),
  31. PrivateKeyFile: viper.GetString("aliPay.privateKeyFile"),
  32. AppId: viper.GetString("aliPay.appId"),
  33. PrivateKey: viper.GetString("aliPay.privateKey"),
  34. }
  35. privateKeyStr := loadPrivateKeyWithPath(aliPayServerInstance.PrivateKeyFile)
  36. aliPayServerInstance.privateKeyInfo = privateKeyStr
  37. aliPayPublicKeyStr := loadPublicKeyWithPath(aliPayServerInstance.CertFile)
  38. aliPayServerInstance.PublicKeyInfo = aliPayPublicKeyStr
  39. })
  40. return aliPayServerInstance
  41. }
  42. // GetAliWapPay 获取支付宝手机网站支付
  43. func (ali *AliPayServer) GetAliWapPay(orderSn string, payMoney decimal.Decimal, boby string, notifyUrl string, returnUrl string) string {
  44. // 初始化支付宝客户端
  45. // appId:应用ID
  46. // privateKey:应用私钥,支持PKCS1和PKCS8
  47. // isProd:是否是正式环境
  48. client, err := alipay.NewClient(ali.AppId, ali.privateKeyInfo, true)
  49. if err != nil {
  50. zap.L().Error("支付宝支付NewClient failed", zap.Error(err))
  51. }
  52. // 注意:具体设置哪些参数,根据不同的方法而不同,此处列举出所有设置参数
  53. client.SetLocation(alipay.LocationShanghai). // 设置时区,不设置或出错均为默认服务器时间
  54. SetCharset(alipay.UTF8). // 设置字符编码,不设置默认 utf-8
  55. SetSignType(alipay.RSA2). // 设置签名类型,不设置默认 RSA2
  56. SetReturnUrl(returnUrl). // 设置返回URL
  57. SetNotifyUrl(notifyUrl)
  58. // 初始化 BodyMap
  59. bm := make(gopay.BodyMap)
  60. bm.Set("subject", boby).
  61. Set("out_trade_no", orderSn).
  62. Set("total_amount", payMoney)
  63. aliRsp, err := client.TradeWapPay(aliCtx, bm)
  64. if err != nil {
  65. zap.L().Error("支付宝手机网站支付请求失败:", zap.Error(err))
  66. }
  67. return aliRsp
  68. }
  69. // loadPrivateKeyWithPath 通过私钥的文件路径内容加载私钥
  70. func loadPrivateKeyWithPath(path string) (privateKey string) {
  71. absPath, _ := filepath.Abs(path)
  72. privateKeyBytes, err := os.ReadFile(absPath)
  73. if err != nil {
  74. return ""
  75. }
  76. return string(privateKeyBytes)
  77. }
  78. // loadPublicKeyWithPath 通过公钥的文件路径加载公钥
  79. func loadPublicKeyWithPath(path string) (publicKey string) {
  80. absPath, _ := filepath.Abs(path)
  81. publicKeyBytes, err := os.ReadFile(absPath)
  82. if err != nil {
  83. return ""
  84. }
  85. return string(publicKeyBytes)
  86. }