89 lines
1.8 KiB
Go
89 lines
1.8 KiB
Go
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
|
|
}
|