package biz import ( "bkb-payment/third_party/alipay" "bkb-payment/third_party/paypal" "context" "github.com/go-kratos/kratos/v2/errors" ) type PaypalBot struct { Token string } func newPaypalBot(token string) *PaypalBot { return &PaypalBot{Token: token} } type AlipayGBot struct { } func newAlipayGBot() *AlipayGBot { return &AlipayGBot{} } func (b *PaypalBot) Consult(ctx context.Context, info *ConsultPay) ([]PayMethod, error) { return nil, nil } func (b *AlipayGBot) Consult(ctx context.Context, info *ConsultPay) ([]PayMethod, error) { var ( err error params alipay.ConsultPay result = make([]PayMethod, 0) ) params.ProductCode = info.ProductCode params.PaymentAmount.Currency = info.Currency params.PaymentAmount.Value = info.Amount if info.UserRegion != "" { params.AllowedPaymentMethodRegions = []string{info.UserRegion} } params.Env.TerminalType = info.TerminalType params.Env.OsType = info.OsType params.PaymentFactor.PresentmentMode = "TILE" err, detail := alipay.Consult(¶ms) if err != nil { return result, err } for _, option := range detail.PaymentOptions { result = append(result, PayMethod{LogoName: option.Logo.LogoName, LogoUrl: option.Logo.LogoUrl, Type: option.PaymentMethodType, Category: option.PaymentMethodCategory, Enabled: option.Enabled}) } return result, err } func (b *PaypalBot) CreateOrder(ctx context.Context, info *CreateOrder) (PayResp, error) { var ( params paypal.CreateOrderRequest result PayResp ) params.PurchaseUnits = []paypal.PurchaseUnit{{ Amount: paypal.PurchaseAmount{ Amount: paypal.Amount{ CurrencyCode: info.Currency, Value: info.Amount, }}}} // 每个appid一套 params.ApplicationContext.ReturnURL = info.ReturnUrl params.ApplicationContext.CancelURL = info.CancelUrl err, detail := paypal.CreateOrder(b.Token, ¶ms) if err != nil { return result, err } result.ID = detail.ID result.Status = detail.Status for _, link := range detail.Links { if link.Rel == "approve" { result.Link = link.Href result.Method = link.Method } } return result, err } func (b *AlipayGBot) CreateOrder(ctx context.Context, info *CreateOrder) (PayResp, error) { var ( err error params alipay.CreatePay result PayResp ) params.ProductCode = "CASHIER_PAYMENT" params.PaymentRequestID = info.TransactionId // params.Order.OrderAmount.Currency = info.Currency params.Order.OrderAmount.Value = info.Amount params.Order.ReferenceOrderID = info.TransactionId params.Order.OrderDescription = info.Description params.PaymentAmount.Currency = info.Currency params.PaymentAmount.Value = info.Amount params.PaymentMethod.PaymentMethodType = info.PaymentMethodType params.PaymentRedirectURL = info.ReturnUrl params.PaymentNotifyURL = info.NotifyUrl params.Env.TerminalType = info.TerminalType params.Env.OsType = info.OsType //params.SettlementStrategy.SettlementCurrency = "USD" err, detail := alipay.CreateOrder(¶ms) if err != nil { return result, err } result.ID = detail.PaymentID //if info.TerminalType == "WEB" { //} result.Method = detail.RedirectActionForm.Method result.Link = detail.RedirectActionForm.RedirectUrl switch detail.Result.ResultStatus { case "F": result.Status = "FAIL" default: result.Status = "SUCCESS" } return result, err } func (b *PaypalBot) CaptureOrder(ctx context.Context, order *Order) (bool, string, string) { var ( err error params paypal.PaymentSourceRequest detail paypal.OrderDetail captureId string ) err, detail = paypal.CapturePaymentOrder(b.Token, order.OrderId, ¶ms) if err != nil { return false, "", err.Error() } if detail.Status != "COMPLETED" { // 支付未完成 return false, "", "payment not completed" } if len(detail.PurchaseUnits) != 0 && len(detail.PurchaseUnits[0].Payments.Captures) != 0 { captureId = detail.PurchaseUnits[0].Payments.Captures[0].ID } return true, captureId, "ok" } func (b *AlipayGBot) CaptureOrder(ctx context.Context, order *Order) (bool, string, string) { var ( err error params alipay.CapturePay captureId string detail alipay.CaptureDetail ) params.CaptureRequestID = order.OrderId params.PaymentID = order.PayId params.CaptureAmount.Currency = order.Currency params.CaptureAmount.Value = order.Value err, detail = alipay.CaptureOrder(¶ms) if err != nil { return false, "", err.Error() } if detail.Result.ResultStatus != "S" { return false, "", "payment not completed" } captureId = detail.CaptureID return true, captureId, "ok" } func (b *PaypalBot) Payouts(ctx context.Context, info *CreatePayout) (PayResp, error) { var ( err error params paypal.PayoutRequest result PayResp ) params.Items = []paypal.PayoutItem{{ RecipientType: "EMAIL", Note: "打款", Receiver: info.PayerName, Amount: paypal.PayoutAmount{ Currency: info.Currency, Value: info.Amount, }, }} params.SenderBatchHeader.SenderBatchId = info.SenderBatchId err, detail := paypal.CreateBatchPayouts(b.Token, ¶ms) if err != nil { return result, err } result.ID = detail.BatchHeader.PayoutBatchId result.Status = detail.BatchHeader.BatchStatus //for _, link := range detail.Links { // if link.Rel == "self" { // result.Link = link.Href // result.Method = link.Method // } //} if len(detail.Links) != 0 { result.Link = detail.Links[0].Href result.Method = detail.Links[0].Method } return result, nil } func (b *AlipayGBot) Payouts(ctx context.Context, info *CreatePayout) (PayResp, error) { var ( err error result PayResp ) return result, err } func (b *PaypalBot) ShowPayoutsDetail(ctx context.Context, info *Payouts) (bool, string) { var ( err error detail paypal.PayoutResponse ) err, detail = paypal.ShowPayoutsDetail(b.Token, info.PayoutBatchId) if err != nil { return false, err.Error() } if detail.BatchHeader.BatchStatus != "SUCCESS" { return false, "payout not completed" } return true, "ok" } func (b *AlipayGBot) ShowPayoutsDetail(ctx context.Context, info *Payouts) (bool, string) { var ( //err error ) return true, "ok" } func (b *PaypalBot) CancelOrder(ctx context.Context, payId string) (bool, error) { return true, nil } func (b *AlipayGBot) CancelOrder(ctx context.Context, payId string) (bool, error) { var ( err error ) err, detail := alipay.Cancel(payId) if err != nil { return false, err } if detail.Result.ResultStatus != "S" { return false, errors.New(400, "", "cancel failed") } return true, err } func (b *PaypalBot) RefundOrder(ctx context.Context, info *Refund) (RefundResp, error) { return RefundResp{}, nil } func (b *AlipayGBot) RefundOrder(ctx context.Context, info *Refund) (RefundResp, error) { var ( err error params alipay.RefundRequest result RefundResp ) params.RefundRequestId = info.TransactionId params.PaymentId = info.PayId params.ReferenceRefundId = "R-" + info.TransactionId params.RefundAmount.Currency = info.Currency params.RefundAmount.Value = info.Amount params.RefundReason = info.Reason params.RefundNotifyUrl = info.NotifyUrl err, detail := alipay.Refund(¶ms) if err != nil { return result, err } if detail.Result.ResultStatus == "S" { result.Status = "SUCCESS" } else if detail.Result.ResultStatus == "F" { result.Status = "FAIL" } else { result.Status = "UNKNOWN" } result.RefundId = detail.RefundId return result, err }