You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
6.4 KiB
224 lines
6.4 KiB
package chuanglan |
|
|
|
import ( |
|
"bytes" |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
"net/http" |
|
"net/url" |
|
"strconv" |
|
|
|
"go-common/app/job/main/sms/conf" |
|
"go-common/app/job/main/sms/model" |
|
smsmdl "go-common/app/service/main/sms/model" |
|
"go-common/library/log" |
|
xhttp "go-common/library/net/http/blademaster" |
|
) |
|
|
|
// Client . |
|
type Client struct { |
|
conf conf.Provider |
|
client *xhttp.Client |
|
} |
|
|
|
type response struct { |
|
Code string `json:"code"` |
|
MsgID string `json:"msgId"` |
|
ErrMsg string `json:"errorMsg"` |
|
Time string `json:"time"` |
|
} |
|
|
|
// GetPid get pid |
|
func (v *Client) GetPid() int32 { |
|
return smsmdl.ProviderChuangLan |
|
} |
|
|
|
// NewClient new ChuangLan |
|
func NewClient(c *conf.Config) *Client { |
|
return &Client{ |
|
conf: *c.Provider, |
|
client: xhttp.NewClient(c.HTTPClient), |
|
} |
|
} |
|
|
|
// SendSms send sms |
|
func (v *Client) SendSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) { |
|
msg := model.SmsPrefix + r.Content |
|
params := make(map[string]interface{}) |
|
params["account"] = v.conf.ChuangLanSmsUser |
|
params["password"] = v.conf.ChuangLanSmsPwd |
|
params["phone"] = r.Mobile |
|
params["msg"] = url.QueryEscape(msg) |
|
params["report"] = "true" |
|
uri := v.conf.ChuangLanSmsURL |
|
msgid, err = v.post(ctx, uri, params) |
|
return |
|
} |
|
|
|
// SendActSms send act sms |
|
func (v *Client) SendActSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) { |
|
msg := model.SmsPrefix + r.Content + model.SmsSuffixChuangLan |
|
params := make(map[string]interface{}) |
|
params["account"] = v.conf.ChuangLanActUser |
|
params["password"] = v.conf.ChuangLanActPwd |
|
params["phone"] = r.Mobile |
|
params["msg"] = url.QueryEscape(msg) |
|
params["report"] = "true" |
|
uri := v.conf.ChuangLanActURL |
|
msgid, err = v.post(ctx, uri, params) |
|
return |
|
} |
|
|
|
// SendBatchActSms send batch act sms |
|
func (v *Client) SendBatchActSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) { |
|
msgid, err = v.SendActSms(ctx, r) |
|
return |
|
} |
|
|
|
// SendInternationalSms send international sms |
|
func (v *Client) SendInternationalSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) { |
|
msg := model.SmsPrefix + r.Content |
|
params := make(map[string]interface{}) |
|
params["account"] = v.conf.ChuangLanInternationUser |
|
params["password"] = v.conf.ChuangLanInternationPwd |
|
params["mobile"] = r.Country + r.Mobile |
|
params["msg"] = msg |
|
uri := v.conf.ChuangLanInternationURL |
|
bytesData, err := json.Marshal(params) |
|
if err != nil { |
|
log.Error("ChuangLan send international Marshal error(%v)", err) |
|
return |
|
} |
|
reader := bytes.NewReader(bytesData) |
|
request, err := http.NewRequest(http.MethodPost, uri, reader) |
|
if err != nil { |
|
log.Error("ChuangLan send international NewRequest err(%v)", err) |
|
return |
|
} |
|
request.Header.Set("Content-Type", "application/json;charset=UTF-8") |
|
type internation struct { |
|
Code string `json:"code"` |
|
Msgid string `json:"msgid"` |
|
Error string `json:"error"` |
|
} |
|
res := &internation{} |
|
if err = v.client.Do(ctx, request, res); err != nil { |
|
log.Error("ChuangLan send international client.Do err(%v)", err) |
|
return |
|
} |
|
if res.Code != "0" { |
|
err = fmt.Errorf("ChuangLan send international sms code(%v) err(%v)", res.Code, res.Error) |
|
return |
|
} |
|
msgid = res.Msgid |
|
return |
|
} |
|
|
|
func (v *Client) post(ctx context.Context, uri string, params map[string]interface{}) (msgid string, err error) { |
|
bytesData, err := json.Marshal(params) |
|
if err != nil { |
|
log.Error("ChuangLan Marshal error(%v)", err) |
|
return |
|
} |
|
reader := bytes.NewReader(bytesData) |
|
request, err := http.NewRequest(http.MethodPost, uri, reader) |
|
if err != nil { |
|
log.Error("ChuangLan NewRequest err(%v)", err) |
|
return |
|
} |
|
request.Header.Set("Content-Type", "application/json;charset=UTF-8") |
|
res := &response{} |
|
if err = v.client.Do(ctx, request, res); err != nil { |
|
log.Error("ChuangLan client.Do err(%v)", err) |
|
return |
|
} |
|
if res.Code != "0" { |
|
err = fmt.Errorf("ChuangLan send sms code(%v) err(%v)", res.Code, res.ErrMsg) |
|
return |
|
} |
|
msgid = res.MsgID |
|
log.Info("url(%s) body(%v) resp(%+v)", uri, params, res) |
|
return |
|
} |
|
|
|
// Callback . |
|
type Callback struct { |
|
MsgID string `json:"msgId"` |
|
Mobile string `json:"mobile"` |
|
Status string `json:"status"` |
|
Desc string `json:"statusDesc"` |
|
NotifyTime string `json:"notifyTime"` |
|
ReportTime string `json:"reportTime"` |
|
Length string `json:"length"` |
|
} |
|
|
|
type callbackResponse struct { |
|
Code int `json:"ret"` |
|
Result []*Callback `json:"result"` |
|
} |
|
|
|
// Callback sms callbacks. |
|
func (v *Client) Callback(ctx context.Context, account, pwd, url string, count int) (callbacks []*Callback, err error) { |
|
params := make(map[string]interface{}) |
|
params["account"] = account |
|
params["password"] = pwd |
|
params["count"] = strconv.Itoa(count) |
|
bs, err := json.Marshal(params) |
|
if err != nil { |
|
log.Error("ChuangLan sms callback Marshal error(%v)", err) |
|
return |
|
} |
|
request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(bs)) |
|
if err != nil { |
|
log.Error("ChuangLan sms callback NewRequest err(%v)", err) |
|
return |
|
} |
|
request.Header.Set("Content-Type", "application/json;charset=UTF-8") |
|
res := &callbackResponse{} |
|
if err = v.client.Do(ctx, request, res); err != nil { |
|
log.Error("ChuangLan sms callback client.Do err(%v)", err) |
|
return |
|
} |
|
if res.Code != 0 { |
|
err = fmt.Errorf("ChuangLan sms callback code(%d)", res.Code) |
|
return |
|
} |
|
callbacks = res.Result |
|
return |
|
} |
|
|
|
// CallbackInternational sms callbacks. |
|
func (v *Client) CallbackInternational(ctx context.Context, count int) (callbacks []*Callback, err error) { |
|
params := make(map[string]interface{}) |
|
params["account"] = v.conf.ChuangLanInternationUser |
|
params["password"] = v.conf.ChuangLanInternationPwd |
|
params["count"] = strconv.Itoa(count) |
|
bs, err := json.Marshal(params) |
|
if err != nil { |
|
log.Error("ChuangLan international sms callback Marshal error(%v)", err) |
|
return |
|
} |
|
request, err := http.NewRequest(http.MethodPost, v.conf.ChuangLanInternationalCallbackURL, bytes.NewReader(bs)) |
|
if err != nil { |
|
log.Error("ChuangLan international sms callback NewRequest err(%v)", err) |
|
return |
|
} |
|
request.Header.Set("Content-Type", "application/json;charset=UTF-8") |
|
type intCallbackResponse struct { |
|
Code int `json:"code"` |
|
Error string `json:"error"` |
|
Result []*Callback `json:"result"` |
|
} |
|
res := &intCallbackResponse{} |
|
if err = v.client.Do(ctx, request, res); err != nil { |
|
log.Error("ChuangLan international sms callback client.Do err(%v)", err) |
|
return |
|
} |
|
if res.Code != 0 { |
|
err = fmt.Errorf("ChuangLan international sms callback code(%d)", res.Code) |
|
return |
|
} |
|
callbacks = res.Result |
|
return |
|
}
|
|
|