go-common/app/job/main/sms/dao/chuanglan/client.go
2019-04-22 18:49:16 +08:00

225 lines
6.4 KiB
Go

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
}