50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
package payment
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
OrderStatusPending = "pending"
|
|
OrderStatusSuccess = "success"
|
|
OrderStatusFailed = "failed"
|
|
OrderStatusClosed = "closed"
|
|
)
|
|
|
|
type PaymentRequest struct {
|
|
OrderID string
|
|
Amount int // 美元分
|
|
Currency string // USD / CNY
|
|
Description string
|
|
ReturnURL string
|
|
NotifyURL string
|
|
ClientIP string
|
|
Metadata map[string]string
|
|
TradeType string // NATIVE / H5 / JSAPI (wxpay)
|
|
OpenID string // JSAPI 必填 (wxpay)
|
|
}
|
|
|
|
type PaymentResponse struct {
|
|
ProviderOrderID string
|
|
PaymentURL string // H5/WAP 跳转链接
|
|
QRCode string // Native 扫码链接
|
|
RawResponse string
|
|
}
|
|
|
|
type OrderStatus struct {
|
|
ProviderOrderID string
|
|
Status string // pending / success / failed / closed
|
|
Amount int
|
|
Currency string
|
|
PaidAt *time.Time
|
|
}
|
|
|
|
type Provider interface {
|
|
Name() string
|
|
CreatePayment(ctx context.Context, req *PaymentRequest) (*PaymentResponse, error)
|
|
QueryOrder(ctx context.Context, providerOrderID string) (*OrderStatus, error)
|
|
VerifyNotification(ctx context.Context, body []byte, headers map[string]string) (*OrderStatus, error)
|
|
Refund(ctx context.Context, providerOrderID string, amount int) error
|
|
}
|