client.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package mengwang
  2. import (
  3. "bytes"
  4. "context"
  5. "crypto/md5"
  6. "encoding/hex"
  7. "encoding/json"
  8. "fmt"
  9. "net/http"
  10. "net/url"
  11. "strconv"
  12. "time"
  13. "go-common/app/job/main/sms/conf"
  14. "go-common/app/job/main/sms/model"
  15. smsmdl "go-common/app/service/main/sms/model"
  16. "go-common/library/log"
  17. bm "go-common/library/net/http/blademaster"
  18. )
  19. // Client .
  20. type Client struct {
  21. c conf.Provider
  22. client *bm.Client
  23. }
  24. type response struct {
  25. Result int `json:"result"`
  26. MsgID int64 `json:"msgid"`
  27. }
  28. // GetPid gets MengWang type ID.
  29. func (v *Client) GetPid() int32 {
  30. return smsmdl.ProviderMengWang
  31. }
  32. // NewClient new MengWang.
  33. func NewClient(c *conf.Config) *Client {
  34. return &Client{
  35. c: *c.Provider,
  36. client: bm.NewClient(c.HTTPClient),
  37. }
  38. }
  39. func (v *Client) post(ctx context.Context, url string, params interface{}, res *response) (err error) {
  40. var bs []byte
  41. if bs, err = json.Marshal(params); err != nil {
  42. log.Error("json.Marshal param(%v) error(%v)", params, err)
  43. return
  44. }
  45. req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer([]byte(bs)))
  46. if err != nil {
  47. log.Error("http.NewRequest(%s) param(%v) error(%v)", url, params, err)
  48. return
  49. }
  50. req.Header.Set("Content-Type", "application/json")
  51. if err = v.client.Do(ctx, req, &res); err != nil {
  52. log.Error("client.Do(%s,%v) error(%v)", url, params, err)
  53. return
  54. }
  55. log.Info("url(%s) body(%v) resp(%+v)", url, params, res)
  56. return
  57. }
  58. // SendSms sends MengWang sms.
  59. func (v *Client) SendSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) {
  60. params := make(map[string]string)
  61. pwd, ts := genPwd(v.c.MengWangSmsUser, v.c.MengWangSmsPwd)
  62. params["userid"] = v.c.MengWangSmsUser
  63. params["pwd"] = pwd
  64. params["timestamp"] = ts
  65. params["mobile"] = r.Mobile
  66. params["content"] = url.QueryEscape(r.Content)
  67. res := new(response)
  68. if err = v.post(ctx, v.c.MengWangSmsURL, params, res); err != nil {
  69. log.Error("mengwang SendSms param(%v) error(%v)", params, err)
  70. return
  71. }
  72. if res.Result != 0 {
  73. err = fmt.Errorf("mengwang SendSms param(%v) error(%v)", params, res.Result)
  74. return
  75. }
  76. msgid = strconv.FormatInt(res.MsgID, 10)
  77. return
  78. }
  79. // SendActSms sends MengWang act sms.
  80. func (v *Client) SendActSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) {
  81. params := make(map[string]string)
  82. pwd, ts := genPwd(v.c.MengWangActUser, v.c.MengWangActPwd)
  83. r.Content = r.Content + model.SmsSuffix
  84. params["userid"] = v.c.MengWangActUser
  85. params["pwd"] = pwd
  86. params["timestamp"] = ts
  87. params["mobile"] = r.Mobile
  88. params["content"] = url.QueryEscape(r.Content)
  89. res := new(response)
  90. if err = v.post(ctx, v.c.MengWangActURL, params, res); err != nil {
  91. log.Error("mengwang SendActSms param(%v) error(%v)", params, err)
  92. return
  93. }
  94. if res.Result != 0 {
  95. err = fmt.Errorf("mengwang SendActSms param(%v) error(%v)", params, res.Result)
  96. return
  97. }
  98. msgid = strconv.FormatInt(res.MsgID, 10)
  99. return
  100. }
  101. // SendBatchActSms sends multi MengWang act sms.
  102. func (v *Client) SendBatchActSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) {
  103. params := make(map[string]string)
  104. pwd, ts := genPwd(v.c.MengWangActUser, v.c.MengWangActPwd)
  105. params["userid"] = v.c.MengWangActUser
  106. params["pwd"] = pwd
  107. params["timestamp"] = ts
  108. params["mobile"] = r.Mobile
  109. params["content"] = url.QueryEscape(r.Content + model.SmsSuffix)
  110. res := new(response)
  111. if err = v.post(ctx, v.c.MengWangBatchURL, params, res); err != nil {
  112. log.Error("mengwang SendBatchActSms param(%v) error(%v)", params, err)
  113. return
  114. }
  115. if res.Result != 0 {
  116. err = fmt.Errorf("mengwang SendBatchActSms param(%v) error(%v)", params, res.Result)
  117. return
  118. }
  119. msgid = strconv.FormatInt(res.MsgID, 10)
  120. return
  121. }
  122. // SendInternationalSms sends MengWang international sms.
  123. func (v *Client) SendInternationalSms(ctx context.Context, r *smsmdl.ModelSend) (msgid string, err error) {
  124. params := make(map[string]string)
  125. pwd, ts := genPwd(v.c.MengWangInternationUser, v.c.MengWangInternationPwd)
  126. params["userid"] = v.c.MengWangInternationUser
  127. params["pwd"] = pwd
  128. params["timestamp"] = ts
  129. params["mobile"] = "00" + r.Country + r.Mobile
  130. params["content"] = url.QueryEscape(r.Content)
  131. res := new(response)
  132. if err = v.post(ctx, v.c.MengWangInternationURL, params, res); err != nil {
  133. log.Error("mengwang SendInternationalSms param(%v) error(%v)", params, err)
  134. return
  135. }
  136. if res.Result != 0 {
  137. err = fmt.Errorf("mengwang SendInternationalSms param(%v) error(%v)", params, res.Result)
  138. return
  139. }
  140. msgid = strconv.FormatInt(res.MsgID, 10)
  141. return
  142. }
  143. // Callback .
  144. type Callback struct {
  145. MsgID int64 `json:"msgid"`
  146. Num int `json:"pknum"`
  147. Total int `json:"pktotal"`
  148. Mobile string `json:"mobile"`
  149. SendTime string `json:"stime"`
  150. ReportTime string `json:"rtime"`
  151. Status string `json:"errcode"`
  152. Desc string `json:"errdesc"`
  153. }
  154. type callbackResponse struct {
  155. Result int `json:"result"`
  156. Callbacks []*Callback `json:"rpts"`
  157. }
  158. // Callback .
  159. func (v *Client) Callback(ctx context.Context, user, pwd, url string, count int) (callbacks []*Callback, err error) {
  160. pwd, ts := genPwd(user, pwd)
  161. params := make(map[string]string)
  162. params["userid"] = user
  163. params["pwd"] = pwd
  164. params["timestamp"] = ts
  165. params["retsize"] = strconv.Itoa(count)
  166. bs, err := json.Marshal(params)
  167. if err != nil {
  168. log.Error("json.Marshal param(%v) error(%v)", params, err)
  169. return
  170. }
  171. req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer([]byte(bs)))
  172. if err != nil {
  173. log.Error("http.NewRequest(%s) param(%v) error(%v)", url, params, err)
  174. return
  175. }
  176. req.Header.Set("Content-Type", "application/json")
  177. res := new(callbackResponse)
  178. if err = v.client.Do(ctx, req, &res); err != nil {
  179. log.Error("client.Do(%s,%v) error(%v)", url, params, err)
  180. return
  181. }
  182. if res.Result != 0 {
  183. err = fmt.Errorf("mengwang callback param(%v) res(%+v)", params, res)
  184. return
  185. }
  186. callbacks = res.Callbacks
  187. return
  188. }
  189. func genPwd(user, pwd string) (spwd, ts string) {
  190. ft := time.Now().Format("0102150405")
  191. str := fmt.Sprintf("%s%s%s%s", user, "00000000", pwd, ft)
  192. mh := md5.Sum([]byte(str))
  193. return hex.EncodeToString(mh[:]), ft
  194. }