package messenger import ( "context" "encoding/json" "fmt" "io" "net/http" "net/url" "time" ) func (s *Service) SendSMS(ctx context.Context, receiverPhone, message string) error { return s.SendAfroMessageSMSLatest(ctx, receiverPhone, message, nil) } func (s *Service) SendAfroMessageSMSLatest( ctx context.Context, receiverPhone string, message string, callbackURL *string, // optional ) error { baseURL := s.config.AFROSMSConfig.AfroSMSBaseURL // Build query parameters explicitly params := url.Values{} params.Set("to", receiverPhone) params.Set("message", message) params.Set("sender", s.config.AFROSMSConfig.AfroSMSSenderName) // Optional parameters if s.config.AFROSMSConfig.AfroSMSIdentifierID != "" { params.Set("from", s.config.AFROSMSConfig.AfroSMSIdentifierID) } if callbackURL != nil { params.Set("callback", *callbackURL) } // Construct full URL reqURL := fmt.Sprintf("%s/api/send?%s", baseURL, params.Encode()) req, err := http.NewRequestWithContext(ctx, http.MethodGet, reqURL, nil) if err != nil { return err } // AfroMessage authentication (API key) req.Header.Set("Authorization", "Bearer "+s.config.AFROSMSConfig.AfroSMSAPIKey) req.Header.Set("Accept", "application/json") client := &http.Client{ Timeout: 10 * time.Second, } resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return err } if resp.StatusCode != http.StatusOK { return fmt.Errorf( "afromessage sms failed: status=%d response=%s", resp.StatusCode, string(body), ) } // Parse response var result map[string]interface{} if err := json.Unmarshal(body, &result); err != nil { return err } ack, ok := result["acknowledge"].(string) if !ok || ack != "success" { return fmt.Errorf("sms delivery failed: %v", result) } return nil }