66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
package pay
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
"chatappgateway/internal/apperr"
|
|
commonpb "gitea.haiyihy.com/hy/chatappcommon/proto"
|
|
)
|
|
|
|
// Client 定义支付服务 gRPC 客户端能力。
|
|
type Client interface {
|
|
Pay(ctx context.Context, request *commonpb.PayRequest) (*commonpb.PayResponse, error)
|
|
}
|
|
|
|
// Request 描述客户端发起支付的请求。
|
|
type Request struct {
|
|
OrderNo string `json:"order_no"`
|
|
UserID string `json:"user_id"`
|
|
Amount string `json:"amount"`
|
|
Currency string `json:"currency"`
|
|
PayMethod string `json:"pay_method"`
|
|
Subject string `json:"subject"`
|
|
}
|
|
|
|
// Service 负责支付请求校验和下游支付调用。
|
|
type Service struct {
|
|
client Client
|
|
}
|
|
|
|
// New 创建支付查询服务。
|
|
func New(client Client) *Service {
|
|
return &Service{client: client}
|
|
}
|
|
|
|
// Pay 校验支付请求并调用支付服务。
|
|
func (s *Service) Pay(ctx context.Context, request Request) (*commonpb.PayResponse, error) {
|
|
normalized := Request{
|
|
OrderNo: strings.TrimSpace(request.OrderNo),
|
|
UserID: strings.TrimSpace(request.UserID),
|
|
Amount: strings.TrimSpace(request.Amount),
|
|
Currency: strings.TrimSpace(request.Currency),
|
|
PayMethod: strings.TrimSpace(request.PayMethod),
|
|
Subject: strings.TrimSpace(request.Subject),
|
|
}
|
|
|
|
if normalized.OrderNo == "" {
|
|
return nil, apperr.New(400, "bad_request", "order_no is required")
|
|
}
|
|
if normalized.UserID == "" {
|
|
return nil, apperr.New(400, "bad_request", "user_id is required")
|
|
}
|
|
if normalized.Amount == "" {
|
|
return nil, apperr.New(400, "bad_request", "amount is required")
|
|
}
|
|
|
|
return s.client.Pay(ctx, &commonpb.PayRequest{
|
|
OrderNo: normalized.OrderNo,
|
|
UserId: normalized.UserID,
|
|
Amount: normalized.Amount,
|
|
Currency: normalized.Currency,
|
|
PayMethod: normalized.PayMethod,
|
|
Subject: normalized.Subject,
|
|
})
|
|
}
|