225 lines
6.4 KiB
Go
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
|
|
}
|