|
@@ -1,83 +1,128 @@
|
1
|
1
|
package notice
|
2
|
2
|
|
3
|
3
|
import (
|
4
|
|
- "encoding/xml"
|
|
4
|
+ "bytes"
|
|
5
|
+ "encoding/json"
|
|
6
|
+ "errors"
|
5
|
7
|
"fmt"
|
6
|
8
|
"io/ioutil"
|
7
|
9
|
"net/http"
|
8
|
10
|
"net/url"
|
9
|
|
- "strings"
|
10
|
11
|
)
|
11
|
12
|
|
12
|
|
-func SendChineseSMS(host, user, pass, mobile, content string) error {
|
13
|
|
- client := &http.Client{}
|
14
|
|
- req, err := http.NewRequest("POST", host, strings.NewReader("account="+user+"&password="+pass+"&mobile="+mobile+"&content="+content))
|
|
13
|
+// SendChineseSMS 发送国内手机验证码
|
|
14
|
+func SendChineseSMS(user, pass, mobile, content string) error {
|
|
15
|
+ params := make(map[string]interface{})
|
|
16
|
+ params["account"] = user
|
|
17
|
+ params["password"] = pass
|
|
18
|
+ params["phone"] = mobile
|
|
19
|
+ params["msg"] = url.QueryEscape(content)
|
|
20
|
+ params["report"] = true
|
|
21
|
+
|
|
22
|
+ bytesData, err := json.Marshal(params)
|
|
23
|
+ if err != nil {
|
|
24
|
+ return err
|
|
25
|
+ }
|
|
26
|
+
|
|
27
|
+ reader := bytes.NewReader(bytesData)
|
|
28
|
+ url := "http://smssh1.253.com/msg/send/json"
|
|
29
|
+ request, err := http.NewRequest("POST", url, reader)
|
15
|
30
|
if err != nil {
|
16
|
31
|
return err
|
17
|
32
|
}
|
18
|
33
|
|
19
|
|
- req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
34
|
+ request.Header.Set("Content-Type", "application/json;charset=UTF-8")
|
20
|
35
|
|
21
|
|
- resp, err := client.Do(req)
|
|
36
|
+ client := http.Client{}
|
|
37
|
+ resp, err := client.Do(request)
|
22
|
38
|
if err != nil {
|
23
|
39
|
return err
|
24
|
40
|
}
|
25
|
41
|
|
26
|
42
|
defer resp.Body.Close()
|
27
|
43
|
|
28
|
|
- body, err := ioutil.ReadAll(resp.Body)
|
|
44
|
+ respBytes, err := ioutil.ReadAll(resp.Body)
|
29
|
45
|
if err != nil {
|
30
|
46
|
return err
|
31
|
47
|
}
|
32
|
48
|
|
33
|
49
|
result := struct {
|
34
|
|
- Code int `xml:"code"`
|
35
|
|
- Msg string `xml:"msg"`
|
|
50
|
+ Code string `json:"code"`
|
|
51
|
+ MsgID string `json:"msgId"`
|
|
52
|
+ Time string `json:"time"`
|
|
53
|
+ ErrorMsg string `json:"errorMsg"`
|
36
|
54
|
}{}
|
37
|
55
|
|
38
|
|
- err = xml.Unmarshal(body, &result)
|
|
56
|
+ err = json.Unmarshal(respBytes, &result)
|
39
|
57
|
if err != nil {
|
40
|
58
|
return err
|
41
|
59
|
}
|
42
|
60
|
|
43
|
|
- if result.Code != 2 {
|
|
61
|
+ if result.Code != "0" {
|
44
|
62
|
switch result.Code {
|
45
|
|
- case 406, 4030:
|
46
|
|
- return fmt.Errorf("phone number format is not correct")
|
47
|
|
- case 4072:
|
48
|
|
- return fmt.Errorf("your message must match the templat")
|
49
|
|
- case 4081:
|
|
63
|
+ case "103":
|
50
|
64
|
return fmt.Errorf("one verification code per minute per phone")
|
51
|
|
- case 4085:
|
|
65
|
+ case "107":
|
|
66
|
+ return fmt.Errorf("phone number format is not correct")
|
|
67
|
+ case "135":
|
52
|
68
|
return fmt.Errorf("up to 5 verification codes a day")
|
53
|
69
|
default:
|
54
|
|
- return fmt.Errorf("send sms faild")
|
|
70
|
+ return fmt.Errorf(result.ErrorMsg)
|
55
|
71
|
}
|
56
|
72
|
}
|
57
|
73
|
|
58
|
74
|
return nil
|
59
|
75
|
}
|
60
|
76
|
|
|
77
|
+// SendForeignSMS 发送国外手机验证码
|
61
|
78
|
func SendForeignSMS(user, pass, mobile, content string) error {
|
62
|
|
- content = url.QueryEscape(content)
|
63
|
|
- url := "http://222.73.117.140:8044/mt?dc=15&tf=3&rf=1&un=" + user + "&pw=" + pass + "&da=" + mobile + "&sm=" + content
|
|
79
|
+ params := make(map[string]interface{})
|
|
80
|
+ params["account"] = user
|
|
81
|
+ params["password"] = pass
|
|
82
|
+ params["mobile"] = mobile
|
|
83
|
+ params["msg"] = url.QueryEscape(content)
|
|
84
|
+ params["report"] = true
|
|
85
|
+
|
|
86
|
+ bytesData, err := json.Marshal(params)
|
|
87
|
+ if err != nil {
|
|
88
|
+ return err
|
|
89
|
+ }
|
64
|
90
|
|
65
|
|
- resp, err := http.Get(url)
|
|
91
|
+ reader := bytes.NewReader(bytesData)
|
|
92
|
+ url := "http://intapi.253.com/send/json"
|
|
93
|
+ request, err := http.NewRequest("POST", url, reader)
|
|
94
|
+ if err != nil {
|
|
95
|
+ return err
|
|
96
|
+ }
|
|
97
|
+
|
|
98
|
+ request.Header.Set("Content-Type", "application/json;charset=UTF-8")
|
|
99
|
+
|
|
100
|
+ client := http.Client{}
|
|
101
|
+ resp, err := client.Do(request)
|
66
|
102
|
if err != nil {
|
67
|
103
|
return err
|
68
|
104
|
}
|
69
|
105
|
|
70
|
106
|
defer resp.Body.Close()
|
71
|
107
|
|
72
|
|
- body, err := ioutil.ReadAll(resp.Body)
|
|
108
|
+ respBytes, err := ioutil.ReadAll(resp.Body)
|
73
|
109
|
if err != nil {
|
74
|
110
|
return err
|
75
|
111
|
}
|
76
|
112
|
|
77
|
|
- result := string(body)
|
|
113
|
+ result := struct {
|
|
114
|
+ Code string `json:"code"`
|
|
115
|
+ Error string `json:"error"`
|
|
116
|
+ MsgID string `json:"msgid"`
|
|
117
|
+ }{}
|
|
118
|
+
|
|
119
|
+ err = json.Unmarshal(respBytes, &result)
|
|
120
|
+ if err != nil {
|
|
121
|
+ return err
|
|
122
|
+ }
|
78
|
123
|
|
79
|
|
- if !strings.Contains(result, "id") {
|
80
|
|
- return fmt.Errorf("phone number format is not correct")
|
|
124
|
+ if result.Code != "0" {
|
|
125
|
+ return errors.New(result.Error)
|
81
|
126
|
}
|
82
|
127
|
|
83
|
128
|
return nil
|