sms.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package sms
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "reflect"
  7. )
  8. //短信集成
  9. type Sms struct {
  10. SendPlatform string //短信发送平台类型。建议在配置文件中配置平台类型,如腾讯(tencent)\阿里云(aliyun)
  11. SignName string //短信签名名称
  12. AppId string //短信平台注册的应用ID
  13. AppKey string //短信平台注册的应用安全key
  14. TemplateList map[string]interface{}
  15. //TencentSertID string
  16. //TencentSertKey string
  17. }
  18. //布控任务结果模板.该模板需要2个参数:数据类型,任务名称
  19. //tencent平台定义:{1}任务{2}发现高度疑似人员,请进入系统查看
  20. //aliyun平台定义:${datatype}任务${taskname}发现高度疑似人员,请进入系统查看
  21. var TemplateCode_SetControl_Task = "setcontrol_task"
  22. //设备离线模板.该模板需要3个参数:设备类型名称,设备名称或标识,离线时长
  23. //tencent平台定义:{1}设备{2}超过{3}未上报新数据,疑似发生故障或离线。请尽快核实。
  24. //aliyun平台定义:${devicetype}设备${devicename}超过${timeoutday}未上报新数据,疑似发生故障或离线。请尽快核实。
  25. var TemplateCode_Device_Offline = "device_state"
  26. //伴随或碰撞任务结果模板.该模板需要3个参数:数据类型,任务名称,结果数量
  27. //tencent平台定义:{1}任务{2}已分析完成,共{3}条分析结果。请进入系统查看
  28. //aliyun平台定义:${datatype}任务${taskname}已分析完成,共${count}条分析结果。请进入系统查看
  29. var TemplateCode_Follow_Collision_task = "follow_collision_task"
  30. //服务器性能监测通知模板.该模板需要3个参数:服务器标识或者名称,监测内容,当前使用情况
  31. //tencent平台定义:您的服务器{1}{2}使用率{3},请尽快处理!
  32. //aliyun平台定义:[还未定义]
  33. var TemplateCode_Device_Performance = "server_performance"
  34. var smsObject *Sms
  35. func GetSmsInstance(sendPlatform ...string) *Sms {
  36. if smsObject == nil {
  37. smsObject = new(Sms)
  38. if len(sendPlatform) > 0 {
  39. smsObject.init(sendPlatform[0])
  40. } else {
  41. smsObject.init()
  42. }
  43. //注册短信模板.模板ID需要从对应的短信平台上获取
  44. //腾讯短信平台模板定义
  45. smsObject.TemplateList = map[string]interface{}{}
  46. tencentTemplate := map[string]string{}
  47. tencentTemplate[TemplateCode_SetControl_Task] = "1436225" //布控任务结果模板ID
  48. tencentTemplate[TemplateCode_Device_Offline] = "1436272" //设备离线模板ID
  49. tencentTemplate[TemplateCode_Follow_Collision_task] = "1436227" //伴随或碰撞任务结果模板ID
  50. tencentTemplate[TemplateCode_Device_Performance] = "1454381" //服务器性能监测通知模板ID
  51. smsObject.TemplateList["tencent"] = tencentTemplate
  52. //阿里云短信平台
  53. aliyunTemplate2 := map[string]string{}
  54. aliyunTemplate2[TemplateCode_SetControl_Task] = "SMS_243400632" //布控任务结果模板ID
  55. aliyunTemplate2[TemplateCode_Device_Offline] = "SMS_243375637" //设备离线模板ID
  56. aliyunTemplate2[TemplateCode_Follow_Collision_task] = "SMS_243450599" //伴随或碰撞任务结果模板ID
  57. aliyunTemplate2[TemplateCode_Device_Performance] = "" //服务器性能监测通知模板ID
  58. smsObject.TemplateList["aliyun"] = aliyunTemplate2
  59. //其他短信平台的模板定义
  60. }
  61. return smsObject
  62. }
  63. func (t *Sms) init(sendPlatform ...string) {
  64. if len(sendPlatform) == 0 {
  65. t.SendPlatform = "tencent"
  66. } else {
  67. t.SendPlatform = sendPlatform[0]
  68. }
  69. }
  70. //发送短信
  71. //datatype:短信数据类型
  72. //dataparams:短信内容参数.tencent平台:与模板参数顺序对应的值数组;aliyun平台:与模板参数顺序和名称匹配的json值串
  73. //phone:接收的手机号
  74. func (t *Sms) Send(datatype string, dataparams, phone []string) (interface{}, error) {
  75. if t.SignName == "" {
  76. return nil, errors.New("短信签名名称不能为空")
  77. }
  78. var object reflect.Value
  79. if t.SendPlatform == "tencent" {
  80. s := new(Tencent)
  81. object = reflect.ValueOf(s)
  82. } else if t.SendPlatform == "aliyun" {
  83. s := new(Aliyun)
  84. object = reflect.ValueOf(s)
  85. } else {
  86. return nil, errors.New("无效的短信平台")
  87. }
  88. object.Elem().FieldByName("SignName").SetString(t.SignName)
  89. object.Elem().FieldByName("AppId").SetString(t.AppId)
  90. object.Elem().FieldByName("AppKey").SetString(t.AppKey)
  91. templateDefined := t.TemplateList[t.SendPlatform]
  92. if templateDefined != nil {
  93. templateDefinedMap := templateDefined.(map[string]string)
  94. templateid := templateDefinedMap[datatype]
  95. if templateid == "" {
  96. return nil, errors.New("未定义短信平台" + t.SendPlatform + "的" + datatype + "对应模板")
  97. }
  98. object.Elem().FieldByName("TemplateId").SetString(templateid)
  99. }
  100. inparam := []reflect.Value{}
  101. //组装参数
  102. inparam = append(inparam, reflect.ValueOf(datatype))
  103. inparam = append(inparam, reflect.ValueOf(dataparams))
  104. inparam = append(inparam, reflect.ValueOf(phone))
  105. method := "Send"
  106. mv := object.MethodByName(method)
  107. if !mv.IsValid() {
  108. return nil, errors.New(fmt.Sprintf("%s对象未实现%s方法!", t.SendPlatform, method))
  109. }
  110. result := mv.Call(inparam)
  111. if result != nil {
  112. if len(result) > 1 && result[1].Interface() != nil {
  113. log.Println(result[1])
  114. return nil, result[1].Interface().(error)
  115. }
  116. }
  117. return result, nil
  118. }