60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
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))
|
|
}
|