Merge branch 'master' of http://gitlab.fjmaimaimai.com/mmm-go/ability
正在显示
3 个修改的文件
包含
171 行增加
和
36 行删除
1 | package sms | 1 | package sms |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | - "ability/protocol" | ||
5 | - | ||
6 | - "github.com/astaxie/beego" | ||
7 | - "github.com/astaxie/beego/httplib" | ||
8 | - "gitlab.fjmaimaimai.com/mmm-go/gocomm/common" | ||
9 | - "gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log" | 4 | + "encoding/json" |
5 | + "errors" | ||
10 | ) | 6 | ) |
11 | 7 | ||
12 | -type ISmsService interface { | ||
13 | - Send(request *protocol.SmsCodeRequest) (err error) | 8 | +type ISmsServe interface { |
9 | + Send() error //调用远端接口发送短信 | ||
10 | + TextContent(v ...interface{}) (string, error) //构建短信文本内容 | ||
11 | + ValidReturn() (string, error) //检查调用远端接口后的返回内容,可用于记日志等操作 | ||
14 | } | 12 | } |
15 | 13 | ||
16 | -type YunPianSmsService struct{} | 14 | +type SmsServe struct { |
15 | + ToPhone string | ||
16 | + UseTpl string | ||
17 | + smsContent string //非导出 | ||
18 | + serveReturn *YunPainReturn //非导出 | ||
19 | +} | ||
17 | 20 | ||
18 | -func assertImplement() { | ||
19 | - var _ ISmsService = (*YunPianSmsService)(nil) | 21 | +type YunPainReturn struct { |
22 | + Code int `json:"code"` //0代表发送成功,其他code代表出错,详细见"返回值说明"页面 | ||
23 | + Msg string `json:"msg"` //例如""发送成功"",或者相应错误信息 | ||
24 | + Count int `json:"count"` //发送成功短信的计费条数(计费条数:70个字一条,超出70个字时按每67字一条计费) | ||
25 | + Mobile string `json:"string"` //发送手机号 | ||
26 | + Fee float64 `json:"fee"` //扣费金额,单位:元,类型:双精度浮点型/double | ||
27 | + Sid int64 `json:"sid"` //短信id,64位整型 | ||
20 | } | 28 | } |
21 | 29 | ||
22 | -//发送 | 30 | +func NewSmsServe(toPhone string, useTpl string) *SmsServe { |
31 | + return &SmsServe{ | ||
32 | + ToPhone: toPhone, | ||
33 | + UseTpl: useTpl, | ||
34 | + serveReturn: nil, | ||
35 | + } | ||
36 | +} | ||
23 | 37 | ||
24 | -func (s *YunPianSmsService) Send(request *protocol.SmsCodeRequest) (err error) { | ||
25 | - var ( | ||
26 | - resp *YunPianResponse | ||
27 | - ) | ||
28 | - log.Debug("[sms] mobile:", request.Phone, " content:", request.Content) | ||
29 | - if beego.BConfig.RunMode != "prod" { | ||
30 | - return | 38 | +//Send 短信服务发送动作 |
39 | +func (s *SmsServe) Send() error { | ||
40 | + if len(s.ToPhone) == 0 { | ||
41 | + return nil | ||
31 | } | 42 | } |
32 | - post := httplib.Post(beego.AppConfig.String("yunpian_sms_sdk_url")) | ||
33 | - post.Param("apikey", beego.AppConfig.String("yunpian_app_key")) | ||
34 | - post.Param("mobile", request.Phone) | ||
35 | - post.Param("text", request.Content) | ||
36 | - if err = post.ToJSON(&resp); err != nil { | ||
37 | - return | 43 | + //TODO |
44 | + //发送短信 | ||
45 | + //获取并设置返回值 | ||
46 | + return nil | ||
47 | +} | ||
48 | + | ||
49 | +// TextContent 短信正文内容设置 | ||
50 | +func (s *SmsServe) TextContent(v ...interface{}) (string, error) { | ||
51 | + tpl, err := getSmsTpl(s.UseTpl) | ||
52 | + if err != nil { | ||
53 | + return "", err | ||
38 | } | 54 | } |
39 | - if resp.Code != 0 || resp.Mobile != request.Phone { | ||
40 | - log.Error("yunpian send sms code:", resp.Code, " error msg:", resp.Msg) | ||
41 | - err = common.NewErrorWithMsg(1, resp.Msg) | 55 | + t, err := tpl.ParseTpl(v) |
56 | + if err != nil { | ||
57 | + return "", err | ||
42 | } | 58 | } |
43 | - return nil | 59 | + s.smsContent = t |
60 | + return t, nil | ||
44 | } | 61 | } |
45 | 62 | ||
46 | -type YunPianResponse struct { | ||
47 | - Code int `json:"code"` //0代表发送成功,其他code代表出错,详细见"返回值说明"页面 | ||
48 | - Msg string `json:"msg"` //例如""发送成功"",或者相应错误信息 | ||
49 | - Count int `json:"count"` //发送成功短信的计费条数(计费条数:70个字一条,超出70个字时按每67字一条计费) | ||
50 | - Mobile string `json:"string"` //发送手机号 | ||
51 | - Fee float64 `json:"fee"` //扣费金额,单位:元,类型:双精度浮点型/double | ||
52 | - Sid int64 `json:"sid"` //短信id,64位整型 | 63 | +//ValidReturn 校验调用远端接口后返回的响应内容 |
64 | +func (s *SmsServe) ValidReturn() (string, error) { | ||
65 | + if s.serveReturn == nil { | ||
66 | + return "", errors.New("serveReturn is nil") | ||
67 | + } | ||
68 | + str, _ := json.Marshal(s.serveReturn) | ||
69 | + if s.serveReturn.Code != 0 || s.serveReturn.Mobile != s.ToPhone { | ||
70 | + return string(str), errors.New("send sms fail") | ||
71 | + } | ||
72 | + return string(str), nil | ||
53 | } | 73 | } |
services/sms/smstpl.go
0 → 100644
1 | +package sms | ||
2 | + | ||
3 | +import ( | ||
4 | + "errors" | ||
5 | + "fmt" | ||
6 | +) | ||
7 | + | ||
8 | +type ISmsTpl interface { | ||
9 | + ParseTpl(v ...interface{}) (string, error) | ||
10 | + String() string | ||
11 | +} | ||
12 | + | ||
13 | +//注册短信模板 | ||
14 | +var smsTpl = map[string]ISmsTpl{ | ||
15 | + "10001": SmsTpl{"【云片网】您的验证码是%s", 1}, | ||
16 | +} | ||
17 | + | ||
18 | +const ( | ||
19 | + TplNotExit string = "tpl not exit" | ||
20 | + TplFormateErr string = "tpl formate error" | ||
21 | +) | ||
22 | + | ||
23 | +type SmsTpl struct { | ||
24 | + Formate string | ||
25 | + ParamNum int | ||
26 | +} | ||
27 | + | ||
28 | +var ( | ||
29 | + _ ISmsTpl = SmsTpl{} | ||
30 | +) | ||
31 | + | ||
32 | +//ParseTpl 根据传参填充模板内容 | ||
33 | +func (t SmsTpl) ParseTpl(v ...interface{}) (string, error) { | ||
34 | + if len(v) < t.ParamNum { | ||
35 | + return "", errors.New(TplFormateErr) | ||
36 | + } | ||
37 | + return fmt.Sprintf(t.String(), v), nil | ||
38 | +} | ||
39 | + | ||
40 | +//String 返回模板字符串 | ||
41 | +func (t SmsTpl) String() string { | ||
42 | + return t.Formate | ||
43 | +} | ||
44 | + | ||
45 | +//getSmsTpl 获取样板 | ||
46 | +//TODO 待优化 | ||
47 | +func getSmsTpl(code string) (ISmsTpl, error) { | ||
48 | + if tpl, ok := smsTpl[code]; ok { | ||
49 | + return tpl, nil | ||
50 | + } | ||
51 | + return nil, errors.New(TplNotExit) | ||
52 | +} |
services/sms/yunPainSms.go
0 → 100644
1 | +package sms | ||
2 | + | ||
3 | +import ( | ||
4 | + "ability/protocol" | ||
5 | + "errors" | ||
6 | + | ||
7 | + "github.com/astaxie/beego" | ||
8 | + "github.com/astaxie/beego/httplib" | ||
9 | + "gitlab.fjmaimaimai.com/mmm-go/gocomm/common" | ||
10 | + "gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log" | ||
11 | +) | ||
12 | + | ||
13 | +type ISmsService interface { | ||
14 | + Send(request *protocol.SmsCodeRequest) (err error) | ||
15 | + GetSmsTpl(code string, content ...interface{}) (string, error) | ||
16 | +} | ||
17 | + | ||
18 | +type YunPianSmsService struct{} | ||
19 | + | ||
20 | +func assertImplement() { | ||
21 | + var _ ISmsService = (*YunPianSmsService)(nil) | ||
22 | +} | ||
23 | + | ||
24 | +//发送 | ||
25 | + | ||
26 | +func (s *YunPianSmsService) Send(request *protocol.SmsCodeRequest) (err error) { | ||
27 | + var ( | ||
28 | + resp *YunPianResponse | ||
29 | + ) | ||
30 | + log.Debug("[sms] mobile:", request.Phone, " content:", request.Content) | ||
31 | + if beego.BConfig.RunMode != "prod" { | ||
32 | + return | ||
33 | + } | ||
34 | + post := httplib.Post(beego.AppConfig.String("yunpian_sms_sdk_url")) | ||
35 | + post.Param("apikey", beego.AppConfig.String("yunpian_app_key")) | ||
36 | + post.Param("mobile", request.Phone) | ||
37 | + post.Param("text", request.Content) | ||
38 | + if err = post.ToJSON(&resp); err != nil { | ||
39 | + return | ||
40 | + } | ||
41 | + if resp.Code != 0 || resp.Mobile != request.Phone { | ||
42 | + log.Error("yunpian send sms code:", resp.Code, " error msg:", resp.Msg) | ||
43 | + err = common.NewErrorWithMsg(1, resp.Msg) | ||
44 | + } | ||
45 | + return nil | ||
46 | +} | ||
47 | + | ||
48 | +func (s *YunPianSmsService) GetSmsTpl(code string, content ...interface{}) (string, error) { | ||
49 | + // if data, ok := yunPianSmsTpl[code]; !ok { | ||
50 | + // return fmt.Sprintf(data, content...), nil | ||
51 | + // } | ||
52 | + | ||
53 | + return "", errors.New("GetSmsTpl err,code=" + code) | ||
54 | +} | ||
55 | + | ||
56 | +type YunPianResponse struct { | ||
57 | + Code int `json:"code"` //0代表发送成功,其他code代表出错,详细见"返回值说明"页面 | ||
58 | + Msg string `json:"msg"` //例如""发送成功"",或者相应错误信息 | ||
59 | + Count int `json:"count"` //发送成功短信的计费条数(计费条数:70个字一条,超出70个字时按每67字一条计费) | ||
60 | + Mobile string `json:"string"` //发送手机号 | ||
61 | + Fee float64 `json:"fee"` //扣费金额,单位:元,类型:双精度浮点型/double | ||
62 | + Sid int64 `json:"sid"` //短信id,64位整型 | ||
63 | +} |
-
请 注册 或 登录 后发表评论