diff --git a/server/common/alipay.go b/server/common/alipay.go new file mode 100644 index 0000000..10c9ec5 --- /dev/null +++ b/server/common/alipay.go @@ -0,0 +1,59 @@ +package common + +import ( + "context" + "crm/global" + "net/http" + "strconv" + "time" + + "github.com/go-pay/gopay" + "github.com/go-pay/gopay/alipay" + "github.com/go-pay/gopay/pkg/xlog" +) + +type Alipay struct { +} + +func GetAlipay() *Alipay { + return &Alipay{} +} + +func (a *Alipay) PagePay(tradeNo string, totalAmount float64) (string, error) { + bm := make(gopay.BodyMap) + bm.Set("subject", "服务订阅"). + Set("out_trade_no", tradeNo). + Set("total_amount", totalAmount). + Set("timeout_express", "2m") + + payUrl, err := global.Alipay.TradePagePay(context.Background(), bm) + + if err != nil { + if bizErr, ok := alipay.IsBizError(err); ok { + xlog.Errorf("%+v", bizErr) + return "", err + } + xlog.Errorf("client.TradePay(%+v),err:%+v", bm, err) + return "", err + } + return payUrl, nil +} + +func (a *Alipay) VerifySign(req *http.Request) gopay.BodyMap { + notifyReq, err := alipay.ParseNotifyToBodyMap(req) + if err != nil { + xlog.Error(err) + return nil + } + + // 支付宝异步通知验签(公钥模式) + if _, err = alipay.VerifySign(global.Config.Alipay.AlipayPublicCert, notifyReq); err != nil { + xlog.Error(err) + return nil + } + return notifyReq +} + +func (a *Alipay) GenTradeNo() string { + return time.Now().Format("20060102150405") + strconv.Itoa(RandInt(100000, 999999)) +} diff --git a/server/initialize/alipay.go b/server/initialize/alipay.go index d1985ac..33d55fa 100644 --- a/server/initialize/alipay.go +++ b/server/initialize/alipay.go @@ -4,31 +4,27 @@ import ( "crm/global" "log" - "github.com/smartwalle/alipay/v3" + "github.com/go-pay/gopay" + "github.com/go-pay/gopay/alipay" + "github.com/go-pay/gopay/pkg/xlog" ) func Alipay() { - var err error - appId := global.Config.Alipay.AppId - privateKey := global.Config.Alipay.PrivateKey - global.Alipay, err = alipay.New(appId, privateKey, false); + pay := global.Config.Alipay + client, err := alipay.NewClient(pay.AppId, pay.PrivateKey, false) if err != nil { - log.Println("初始化支付宝支付服务失败", err) + xlog.Error(err) return } - // 加载支付宝证书 - if err = global.Alipay.LoadAppPublicCertFromFile(global.Config.Alipay.AppPublicCert); err != nil { - log.Println("加载证书发生错误", err) - return - } + client.DebugSwitch = gopay.DebugOn - if err = global.Alipay.LoadAliPayRootCertFromFile(global.Config.Alipay.AlipayRootCert); err != nil { - log.Println("加载证书发生错误", err) + // 设置支付宝请求、公钥证书模式 + client.SetReturnUrl(pay.ReturnURL).SetNotifyUrl(pay.NotifyURL) + err = client.SetCertSnByPath(pay.AppPublicCert, pay.AlipayRootCert, pay.AlipayPublicCert) + if err != nil { + log.Printf("init alipay cert error: %s", err) return } - if err = global.Alipay.LoadAliPayPublicCertFromFile(global.Config.Alipay.AlipayPublicCert); err != nil { - log.Println("加载证书发生错误", err) - return - } -} \ No newline at end of file + global.Alipay = client +}