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,
})
}