作者 唐旭辉

短信服务调整

package sms
import (
"encoding/json"
"errors"
)
type ISmsServe interface {
Send() error //调用远端接口发送短信
TextContent() (string, error) //构建短信文本内容
ValidReturn() (string, error) //返回调用远端接口后的返回内容,可用于记日志
TextContent(v ...interface{}) (string, error) //构建短信文本内容
ValidReturn() (string, error) //检查调用远端接口后的返回内容,可用于记日志等操作
}
type SmsServe struct {
ToPhones []string
Content string
ServeReturn interface{}
ToPhone string
UseTpl string
smsContent string //非导出
serveReturn *YunPainReturn //非导出
}
type YunPainReturn 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 NewSmsServe(toPhone string, useTpl string) *SmsServe {
return &SmsServe{
ToPhone: toPhone,
UseTpl: useTpl,
serveReturn: nil,
}
}
func (s *SmsServe) Send() error {
if len(s.ToPhone) == 0 {
return nil
}
//TODO
//发送短信
//获取并设置返回值
return nil
}
func (s *SmsServe) TextContent() (string, error) {
return "", nil
func (s *SmsServe) TextContent(v ...interface{}) (string, error) {
tpl, err := getSmsTpl(s.UseTpl)
if err != nil {
return "", err
}
t, err := tpl.ParseTpl(v)
if err != nil {
return "", err
}
s.smsContent = t
return t, nil
}
func (s *SmsServe) ValidReturn() (string, error) {
return "", nil
if s.serveReturn == nil {
return "", errors.New("serveReturn is nil")
}
str, _ := json.Marshal(s.serveReturn)
if s.serveReturn.Code != 0 || s.serveReturn.Mobile != s.ToPhone {
return string(str), errors.New("send sms fail")
}
return string(str), nil
}
... ...
... ... @@ -2,19 +2,46 @@ package sms
import (
"errors"
"fmt"
)
var yunPianSmsTpl = map[string]string{
"10001": "【云片网】您的验证码是%s",
var yunPianSmsTpl = map[string]SmsTpl{
"10001": SmsTpl{"【云片网】您的验证码是%s", 1},
}
const (
TplNotExit string = "tpl not exit"
TplFormateErr string = "tpl formate error"
)
func getSmsTpl(code string) (string, error) {
type ISmsTpl interface {
ParseTpl(v ...interface{}) (string, error)
String() string
}
type SmsTpl struct {
Formate string
ParamNum int
}
var (
_ ISmsTpl = SmsTpl{}
)
func (t SmsTpl) ParseTpl(v ...interface{}) (string, error) {
if len(v) < t.ParamNum {
return "", errors.New(TplFormateErr)
}
return fmt.Sprintf(t.String(), v), nil
}
func (t SmsTpl) String() string {
return t.Formate
}
func getSmsTpl(code string) (ISmsTpl, error) {
if tpl, ok := yunPianSmsTpl[code]; ok {
return tpl, nil
}
return "", errors.New(TplNotExit)
return nil, errors.New(TplNotExit)
}
... ...
... ... @@ -3,7 +3,6 @@ package sms
import (
"ability/protocol"
"errors"
"fmt"
"github.com/astaxie/beego"
"github.com/astaxie/beego/httplib"
... ... @@ -47,9 +46,9 @@ func (s *YunPianSmsService) Send(request *protocol.SmsCodeRequest) (err error) {
}
func (s *YunPianSmsService) GetSmsTpl(code string, content ...interface{}) (string, error) {
if data, ok := yunPianSmsTpl[code]; !ok {
return fmt.Sprintf(data, content...), nil
}
// if data, ok := yunPianSmsTpl[code]; !ok {
// return fmt.Sprintf(data, content...), nil
// }
return "", errors.New("GetSmsTpl err,code=" + code)
}
... ...