Пример работы с SMS шлюзом на языке Go

Отправка смс
Получения статуса отправленной смс
Получение цены отправки
Получение баланса


Отправка смс:

package main

import (
    "net/url"
    "bytes"
    "fmt"
    "net/http"
    "io/ioutil"
    "encoding/json"
    "encoding/xml"
)

type SmsGateway struct {
    login string
    password string
    xml string
}

type SMS struct {
    Sentdate string `xml:"sentdate,omitempty" json:"sentdate,omitempty"`
    Operations struct {
        Operation string `xml:"operation" json:"operation"`
    } `xml:"operations" json:"operations"`
    Authentification struct {
        Username string `xml:"username" json:"username"`
        Password string `xml:"password" json:"password"`
    } `xml:"authentification" json:"authentification"`
    Message struct { 
        Sender string `xml:"sender" json:"sender"`
        Text string `xml:"text" json:"text"`
    } `xml:"message" json:"message"`
    Numbers  []Number `xml:"numbers>number" json:"numbers"`
    Statistics []Messageid `xml:"statistics>messageid" json:"statistics"`
}

type Number struct {
    Value  int64 `xml:",chardata"`
}

type Messageid struct {
    Value  string `xml:",chardata"`
}

type ResponseJson struct {
    Status int `xml:"status" json:"status"`
    Credits int32 `xml:"credits" json:"credits"`
    Amount int32 `xml:"amount" json:"amount"`
    Currenry string `xml:"currenry" json:"currenry"`
}

func (smsGateway *SmsGateway) sendRequest(smsData SMS) (string, error) {
    
    // json struct to xml
    xmlSms, _ := xml.Marshal(smsData)
    
    // log xml request
    // fmt.Println(string(xmlSms))
    
    form := url.Values{
        "XML": {`<?xml version="1.0" encoding="UTF-8"?>` + string(xmlSms)},
    }
    
    stringData := form.Encode()
    
    client := &http.Client{}
    req, err := http.NewRequest("POST", "http://api.myatompark.com/members/sms/xml.php", bytes.NewBufferString(stringData))
    if err != nil {
        fmt.Println(err)
    }
    
    // you can then set the Header here
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    // now POST it
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()
    if resp.StatusCode == http.StatusOK {
        bodyBytes, err2 := ioutil.ReadAll(resp.Body)
        bodyString := string(bodyBytes)
        
        if err2 != nil {
            fmt.Println(err2)
        }
        
        var responseJson ResponseJson
        xml.Unmarshal([]byte(bodyString), &responseJson)
        jsonDataResp, _ := json.Marshal(responseJson)
        
        /*{
            '-1': { 'status': '-1', 'code' : 'AUTH_FAILED', 'message': 'Неправильний логін та/або пароль' },
            '-2': { 'status': '-2', 'code' : 'XML_ERROR', 'message': 'Неправильний формат XML' },
            '-3': { 'status': '-3', 'code' : 'NOT_ENOUGH_CREDITS', 'message': 'Недостатньо кредитів на акаунті користувача' },
            '-4': { 'status': '-4', 'code' : 'NO_RECIPIENTS', 'message': 'Немає вірних номерів отримувачів' },
            '-7': { 'status': '-7', 'code' : 'BAD_SENDER_NAME', 'message': 'Помилка в імені відправника' },
        }*/
        return string(jsonDataResp), err2;
    }
    return "", err;
}

func (smsGateway *SmsGateway) sendSms(sender string, message string, numbers []int64, sentdate string) {
    
    operation := "SEND"
    
    // xml to json
    xmlData := `<?xml version="1.0" encoding="UTF-8"?>

    
        
    
    
        
        
    
    
        
        
    
    
    
`;
    
    var smsData SMS
    xml.Unmarshal([]byte(xmlData), &smsData)
    smsData.Authentification.Username = smsGateway.login
    smsData.Authentification.Password = smsGateway.password
    smsData.Operations.Operation = operation 
    smsData.Message.Sender = sender
    smsData.Message.Text = message

    if sentdate != "" {
        smsData.Sentdate = sentdate
    }

    for _, value := range numbers {
        smsData.Numbers = append(smsData.Numbers, Number{int64(value)})
    }
    
    res, err := smsGateway.sendRequest(smsData)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res)
    }
}

func (smsGateway *SmsGateway) getPrice(sender string, message string, numbers []int64) {
    
    operation := "GETPRICE"
    
    xmlData := `<?xml version="1.0" encoding="UTF-8"?>
    
        
            
        
        
            
            
        
        
            
            
        
        
        
    `
    
    var smsData SMS
    xml.Unmarshal([]byte(xmlData), &smsData)
            
    smsData.Authentification.Username = smsGateway.login
    smsData.Authentification.Password = smsGateway.password
    smsData.Operations.Operation = operation 
    smsData.Message.Sender = sender
    smsData.Message.Text = message
    
    for _, value := range numbers {
        smsData.Numbers = append(smsData.Numbers, Number{int64(value)})
    }

    res, err := smsGateway.sendRequest(smsData)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res)
    }
}

func (smsGateway *SmsGateway) getStatus(list []string) {
    
    operation := "GETSTATUS"
    
    xmlData := `<?xml version="1.0" encoding="UTF-8"?>
    
        
            
        
        
            
            
        
        
        
    `

    var smsData SMS
    xml.Unmarshal([]byte(xmlData), &smsData)
            
    smsData.Authentification.Username = smsGateway.login
    smsData.Authentification.Password = smsGateway.password
    smsData.Operations.Operation = operation 
    
    for _, value := range list {
        smsData.Statistics = append(smsData.Statistics, Messageid{value})
    }

    res, err := smsGateway.sendRequest(smsData)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res)
    }
}

func (smsGateway *SmsGateway) getBalance() {  
    operation := "BALANCE"
    
    xmlData := `<?xml version="1.0" encoding="UTF-8"?>
    
        
            
        
        
            
            
        
    `

    var smsData SMS
    xml.Unmarshal([]byte(xmlData), &smsData)
            
    smsData.Authentification.Username = smsGateway.login
    smsData.Authentification.Password = smsGateway.password
    smsData.Operations.Operation = operation

    res, err := smsGateway.sendRequest(smsData)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res)
    }
}

func (smsGateway *SmsGateway) getCreditPrice() {
    operation := "CREDITPRICE"
    
    xmlData := `<?xml version="1.0" encoding="UTF-8"?>
    
        
            
        
        
            
            
        
    `

    var smsData SMS
    xml.Unmarshal([]byte(xmlData), &smsData)

    smsData.Authentification.Username = smsGateway.login
    smsData.Authentification.Password = smsGateway.password
    smsData.Operations.Operation = operation 

    res, err := smsGateway.sendRequest(smsData)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res)
    }
}

// config
var username = "your username"
var password = "your password"

// usage example
func main() {
    
    smsGateway := SmsGateway{
        login: username,
        password: password,
    }
            
    smsGateway.sendSms("sender", "text", []int64{380930000000}, "20-07-2018")
    
    smsGateway.getPrice("sender", "text", []int64{380930000000})
    
    smsGateway.getStatus([]string{"msg1"})
    
    smsGateway.getBalance()
    
    smsGateway.getCreditPrice()
} 

По запросу предоставляется необходимое количество дополнительных смс для тестирования сервиса массовых смс-уведомлений ePochta SMS.

Есть вопрос?

  • 8 (800) 555-09-63
  • Бесплатно по России

Александр



skype: alexandr.romanow26
sales@epochta.ru

Алексей



skype: aleksey.klochko1
sales@epochta.ru