yunpian_sms.go
2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package yunpian
import (
"bytes"
"fmt"
"github.com/astaxie/beego/httplib"
"gitlab.fjmaimaimai.com/mmm-go/gocomm/common"
"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
"net/url"
"openapi/pkg/constant"
"openapi/pkg/infrastructure/sms"
"strconv"
)
type (
YPSmsService struct{}
YPSmsResponse struct {
Code int `json:"code"` //0代表发送成功,其他code代表出错,详细见"返回值说明"页面
Msg string `json:"msg"` //例如""发送成功"",或者相应错误信息
Count int `json:"count"` //发送成功短信的计费条数(计费条数:70个字一条,超出70个字时按每67字一条计费)
Mobile string `json:"string"` //发送手机号
Fee float64 `json:"fee"` //扣费金额,单位:元,类型:双精度浮点型/double
Sid int64 `json:"sid"` //短信id,64位整型
}
)
func (svr *YPSmsService) Send(option *sms.Options) error {
var err error
if option.SendType == sms.SendSingle {
_, err = sendSingle(option)
} else if option.SendType == sms.SendSingleByTpl {
_, err = sendSingleByTpl(option)
}
return err
}
func sendSingle(option *sms.Options) (map[string]interface{}, error) {
var (
resp *YPSmsResponse
err error
url = constant.YunPianSDKHost + constant.SmsSendSingle
)
post := httplib.Post(url)
post.Param("apikey", constant.YunPianAppKey)
post.Param("mobile", option.Phone)
post.Param("text", option.Content)
if err = post.ToJSON(&resp); err != nil {
return nil, err
}
err = resolveResponse(resp, err)
return nil, err
}
func sendSingleByTpl(option *sms.Options) (map[string]interface{}, error) {
var (
resp *YPSmsResponse
err error
url = constant.YunPianSDKHost + constant.SmsSendSingleByTpl
)
post := httplib.Post(url)
post.Param("apikey", constant.YunPianAppKey)
post.Param("mobile", option.Phone)
post.Param("tpl_id", strconv.Itoa(option.TplId))
if len(option.TplValues) > 0 {
post.Param("tpl_value", tplValue(option.TplValues))
log.Debug(tplValue(option.TplValues))
}
if err = post.ToJSON(&resp); err != nil {
return nil, err
}
err = resolveResponse(resp, err)
return nil, err
}
func resolveResponse(resp *YPSmsResponse, err error) error {
if resp.Code != 0 {
log.Error("【sms】 send sms code:", resp.Code, " error msg:", resp.Msg)
err = common.NewErrorWithMsg(1, resp.Msg)
return err
}
return err
}
func tplValue(tplValues map[string]interface{}) string {
var value bytes.Buffer
for k, v := range tplValues {
value.WriteString(url.PathEscape(fmt.Sprintf("#%v#=%v&", k, v)))
}
return string(value.Bytes()[:value.Len()-1])
}