aliPayServer.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. "go_zh/pkg/utils"
  10. "sync"
  11. )
  12. type AliPayServer struct {
  13. CertFile string //公钥证书地址
  14. PrivateKeyFile string //私钥证书地址
  15. AppId string //appid
  16. PrivateKey string //密钥
  17. privateKeyInfo string
  18. PublicKeyInfo string
  19. }
  20. var (
  21. aliPayServerInstance *AliPayServer
  22. aliPayServerOnce sync.Once
  23. )
  24. // GetAliPayServerInstance 获取单例实例
  25. func GetAliPayServerInstance() *AliPayServer {
  26. aliPayServerOnce.Do(func() {
  27. aliPayServerInstance = &AliPayServer{
  28. CertFile: viper.GetString("aliPay.certFile"),
  29. PrivateKeyFile: viper.GetString("aliPay.privateKeyFile"),
  30. AppId: viper.GetString("aliPay.appId"),
  31. PrivateKey: viper.GetString("aliPay.privateKey"),
  32. }
  33. privateKeyStr := utils.LoadPrivateKeyWithPath(aliPayServerInstance.PrivateKeyFile)
  34. aliPayServerInstance.privateKeyInfo = privateKeyStr
  35. aliPayPublicKeyStr := utils.LoadPublicKeyWithPath(aliPayServerInstance.CertFile)
  36. aliPayServerInstance.PublicKeyInfo = aliPayPublicKeyStr
  37. })
  38. return aliPayServerInstance
  39. }
  40. // GetAliWapPay 获取支付宝手机网站支付
  41. func (ali *AliPayServer) GetAliWapPay(orderSn string, payMoney decimal.Decimal, boby string, notifyUrl string, returnUrl string) string {
  42. // 初始化支付宝客户端
  43. // appId:应用ID
  44. // privateKey:应用私钥,支持PKCS1和PKCS8
  45. // isProd:是否是正式环境
  46. client, err := alipay.NewClient(ali.AppId, ali.privateKeyInfo, true)
  47. if err != nil {
  48. zap.L().Error("支付宝支付NewClient failed", zap.Error(err))
  49. }
  50. // 注意:具体设置哪些参数,根据不同的方法而不同,此处列举出所有设置参数
  51. client.SetLocation(alipay.LocationShanghai). // 设置时区,不设置或出错均为默认服务器时间
  52. SetCharset(alipay.UTF8). // 设置字符编码,不设置默认 utf-8
  53. SetSignType(alipay.RSA2). // 设置签名类型,不设置默认 RSA2
  54. SetReturnUrl(returnUrl). // 设置返回URL
  55. SetNotifyUrl(notifyUrl)
  56. // 初始化 BodyMap
  57. bm := make(gopay.BodyMap)
  58. bm.Set("subject", boby).
  59. Set("out_trade_no", orderSn).
  60. Set("total_amount", payMoney)
  61. aliRsp, err := client.TradeWapPay(context.Background(), bm)
  62. if err != nil {
  63. zap.L().Error("支付宝手机网站支付请求失败:", zap.Error(err))
  64. }
  65. return aliRsp
  66. }