diff --git a/internal/services/arifpay/service.go b/internal/services/arifpay/service.go index 5799eec..b953877 100644 --- a/internal/services/arifpay/service.go +++ b/internal/services/arifpay/service.go @@ -8,6 +8,8 @@ import ( "fmt" "io" "net/http" + "net/url" + "path" "strings" "time" @@ -167,7 +169,7 @@ func (s *ArifpayService) InitiateSubscriptionPayment(ctx context.Context, userID } sessionID := fmt.Sprintf("%v", data["sessionId"]) - paymentURL := fmt.Sprintf("%v", data["paymentUrl"]) + paymentURL := normalizeExternalURL(fmt.Sprintf("%v", data["paymentUrl"])) // Update payment with session info if err := s.paymentStore.UpdatePaymentSessionID(ctx, payment.ID, sessionID, paymentURL); err != nil { @@ -184,6 +186,22 @@ func (s *ArifpayService) InitiateSubscriptionPayment(ctx context.Context, userID }, nil } +func normalizeExternalURL(raw string) string { + u, err := url.Parse(raw) + if err != nil { + return raw + } + if u.Path == "" { + return raw + } + cleaned := path.Clean(u.Path) + if strings.HasSuffix(u.Path, "/") && !strings.HasSuffix(cleaned, "/") { + cleaned += "/" + } + u.Path = cleaned + return u.String() +} + // ProcessPaymentWebhook handles the webhook callback from ArifPay func (s *ArifpayService) ProcessPaymentWebhook(ctx context.Context, req domain.WebhookRequest) error { // ArifPay verify/webhook payloads are inconsistent: some responses include nonce, others only sessionId.