123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- 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
- }
|