Пример работы с 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
- Бесплатно по России
Новости:
- 2020-11-23
- ePochta объявляет старт Черной Пятницы: Спеццена на рассылку в WhatsApp
- 2020-11-18
- С 1 декабря 2020 года оператор МТС повышает стоимость СМС
- 2020-05-04
- Вебинар: СМС маркетинг. Что писать в тексте СМС рассылок?
- 2020-04-28
- Операторы повышают цены СМС рассылки по прямому каналу в РФ
- 2019-12-21
- Украинские операторы повышают цену СМС