93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
|
package alipaycli
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
"github.com/go-pay/gopay"
|
|||
|
"github.com/go-pay/gopay/alipay"
|
|||
|
"service/bizcommon/util"
|
|||
|
"service/library/configcenter"
|
|||
|
"service/library/logger"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
DefaultOrderTimeoutSeconds = 900 // 默认订单超时时间,单位: s
|
|||
|
)
|
|||
|
|
|||
|
var defaultAlipayClient *AlipayClient
|
|||
|
|
|||
|
func GetDefaultAlipayClient() *AlipayClient {
|
|||
|
return defaultAlipayClient
|
|||
|
}
|
|||
|
|
|||
|
type AlipayClient struct {
|
|||
|
*alipay.Client
|
|||
|
}
|
|||
|
|
|||
|
func Init(cfg *configcenter.AlipayClientConfig) (err error) {
|
|||
|
alipayCli, err := alipay.NewClient(cfg.Appid, cfg.PrivateKey, true)
|
|||
|
if err != nil {
|
|||
|
logger.Error("NewClient fail, cfg: %v, err: %v", util.ToJson(cfg), err)
|
|||
|
return
|
|||
|
}
|
|||
|
alipayCli.SetNotifyUrl(cfg.NotifyUrl)
|
|||
|
|
|||
|
defaultAlipayClient = &AlipayClient{
|
|||
|
alipayCli,
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 支付宝 app支付
|
|||
|
type AppPayParam struct {
|
|||
|
OutTradeNo string // 商家订单id,我们自己的订单id
|
|||
|
Subject string // 主题
|
|||
|
TotalAmount int64 // 金额,单位:分
|
|||
|
TimeOutSeconds int // 订单有效时间,单位:秒
|
|||
|
}
|
|||
|
|
|||
|
func (c *AlipayClient) AppPay(ctx context.Context, param *AppPayParam) (alipayAppParamStr string, err error) {
|
|||
|
if param.TimeOutSeconds <= 0 {
|
|||
|
param.TimeOutSeconds = DefaultOrderTimeoutSeconds
|
|||
|
}
|
|||
|
bm := gopay.BodyMap{
|
|||
|
"out_trade_no": param.OutTradeNo,
|
|||
|
"subject": param.Subject,
|
|||
|
"total_amount": fmt.Sprintf("%.2f", float64(param.TotalAmount)/100.0),
|
|||
|
"time_expire": time.Now().Add(time.Second * time.Duration(param.TimeOutSeconds)).Format("2006-01-02 15:04:05"),
|
|||
|
}
|
|||
|
alipayAppParamStr, err = c.TradeAppPay(ctx, bm)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
logger.Info("alipay TradeAppPay param: %v", alipayAppParamStr)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 支付宝 手机web支付
|
|||
|
type WapPayParam struct {
|
|||
|
OutTradeNo string // 商家订单id,我们自己的订单id
|
|||
|
Subject string // 主题
|
|||
|
TotalAmount int64 // 金额,单位:分
|
|||
|
TimeOutSeconds int // 订单有效时间,单位:秒
|
|||
|
}
|
|||
|
|
|||
|
func (c *AlipayClient) WapPay(ctx context.Context, param *WapPayParam) (alipayWapParamStr string, err error) {
|
|||
|
if param.TimeOutSeconds <= 0 {
|
|||
|
param.TimeOutSeconds = DefaultOrderTimeoutSeconds
|
|||
|
}
|
|||
|
bm := gopay.BodyMap{
|
|||
|
"out_trade_no": param.OutTradeNo,
|
|||
|
"subject": param.Subject,
|
|||
|
"total_amount": fmt.Sprintf("%.2f", float64(param.TotalAmount)/100.0),
|
|||
|
"time_expire": time.Now().Add(time.Second * time.Duration(param.TimeOutSeconds)).Format("2006-01-02 15:04:05"),
|
|||
|
}
|
|||
|
alipayWapParamStr, err = c.TradeWapPay(ctx, bm)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
logger.Info("alipay TradeWapPay param: %v", alipayWapParamStr)
|
|||
|
return
|
|||
|
}
|