短信发送方法
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.

92 lines
2.3 KiB

  1. package sms
  2. import (
  3. "encoding/hex"
  4. "errors"
  5. "log"
  6. "net/url"
  7. "time"
  8. "git.tetele.net/tgo/helper"
  9. "github.com/tjfoc/gmsm/sm3"
  10. )
  11. /**
  12. * 企业信息服务平台--一信通短信健帆用
  13. * @spCode 企业编号
  14. * @appKey 登录的用户名
  15. * @secretKey 接口业务--接口申请里的秘钥
  16. * @templateId 短信模板id
  17. * @mobiles 手机号多个用逗号隔开
  18. * @content 短信内容
  19. */
  20. func SendByUms(spCode, appKey, secretKey, mobiles, templateId, content string) (bool, []byte, error) {
  21. if spCode == "" || appKey == "" || secretKey == "" || mobiles == "" || templateId == "" || content == "" {
  22. return false, []byte(""), errors.New("参数不全")
  23. }
  24. api := "https://api.ums86.com/api/sms/send"
  25. timestamp := helper.ToStr(time.Now().UnixNano() / 1e6)
  26. num_rand := helper.GetRandomNumber(7)
  27. serialNumber := timestamp + num_rand
  28. // 短信请求字段
  29. body_data := map[string]string{
  30. "userNumber": mobiles,
  31. "templateId": templateId,
  32. "messageContent": content,
  33. "serialNumber": serialNumber,
  34. }
  35. // 请求头封装
  36. six_rand := helper.GetRandomString(6)
  37. request_id := timestamp + six_rand
  38. headers := map[string]string{
  39. "x-sp-code": spCode,
  40. "x-app-key": appKey,
  41. "x-request-id": request_id,
  42. "X-Forwarded-For": "120.78.230.86",
  43. }
  44. // 签名
  45. sign := UmsSetSign(body_data, headers, secretKey)
  46. headers["x-sign"] = sign
  47. reply, err := PostJsonData(api, body_data, headers)
  48. if err != nil {
  49. log.Println("post err", err)
  50. return false, reply, err
  51. }
  52. var reply_data map[string]interface{}
  53. err = json.Unmarshal(reply, &reply_data)
  54. if err != nil {
  55. log.Println(string(reply), err)
  56. return false, reply, err
  57. }
  58. if helper.ToStr(reply_data["code"]) != "0" {
  59. return false, reply, errors.New("短信发送失败," + helper.ToStr(reply_data["msg"]))
  60. }
  61. return true, reply, nil
  62. }
  63. // ums验签
  64. func UmsSetSign(data, header map[string]string, secretKey string) string {
  65. str := helper.HttpBuildQuery(data)
  66. // url encode
  67. str = url.QueryEscape(str)
  68. str = header["x-sp-code"] + header["x-app-key"] + secretKey + str + header["x-request-id"]
  69. log.Println("加密前数据: ", str)
  70. // ms3加密
  71. hash := sm3.New()
  72. hash.Write([]byte(str))
  73. sign_byte := hash.Sum(nil)
  74. sign := hex.EncodeToString(sign_byte)
  75. log.Println("加密后数据: ", sign)
  76. return sign
  77. }