package sms import ( "errors" "fmt" "log" "reflect" ) //短信集成 type Sms struct { SendPlatform string //短信发送平台类型。建议在配置文件中配置平台类型,如腾讯(tencent)\阿里云(aliyun) SignName string //短信签名名称 AppId string //短信平台注册的应用ID AppKey string //短信平台注册的应用安全key TemplateList map[string]interface{} //TencentSertID string //TencentSertKey string } //布控任务结果模板.该模板需要2个参数:数据类型,任务名称 //tencent平台定义:{1}任务{2}发现高度疑似人员,请进入系统查看 //aliyun平台定义:${datatype}任务${taskname}发现高度疑似人员,请进入系统查看 var TemplateCode_SetControl_Task = "setcontrol_task" //设备离线模板.该模板需要3个参数:设备类型名称,设备名称或标识,离线时长 //tencent平台定义:{1}设备{2}超过{3}未上报新数据,疑似发生故障或离线。请尽快核实。 //aliyun平台定义:${devicetype}设备${devicename}超过${timeoutday}未上报新数据,疑似发生故障或离线。请尽快核实。 var TemplateCode_Device_Offline = "device_state" //伴随或碰撞任务结果模板.该模板需要3个参数:数据类型,任务名称,结果数量 //tencent平台定义:{1}任务{2}已分析完成,共{3}条分析结果。请进入系统查看 //aliyun平台定义:${datatype}任务${taskname}已分析完成,共${count}条分析结果。请进入系统查看 var TemplateCode_Follow_Collision_task = "follow_collision_task" //服务器性能监测通知模板.该模板需要3个参数:服务器标识或者名称,监测内容,当前使用情况 //tencent平台定义:您的服务器{1}{2}使用率{3},请尽快处理! //aliyun平台定义:[还未定义] var TemplateCode_Device_Performance = "server_performance" var smsObject *Sms func GetSmsInstance(sendPlatform ...string) *Sms { if smsObject == nil { smsObject = new(Sms) if len(sendPlatform) > 0 { smsObject.init(sendPlatform[0]) } else { smsObject.init() } //注册短信模板.模板ID需要从对应的短信平台上获取 //腾讯短信平台模板定义 smsObject.TemplateList = map[string]interface{}{} tencentTemplate := map[string]string{} tencentTemplate[TemplateCode_SetControl_Task] = "1436225" //布控任务结果模板ID tencentTemplate[TemplateCode_Device_Offline] = "1436272" //设备离线模板ID tencentTemplate[TemplateCode_Follow_Collision_task] = "1436227" //伴随或碰撞任务结果模板ID tencentTemplate[TemplateCode_Device_Performance] = "1454381" //服务器性能监测通知模板ID smsObject.TemplateList["tencent"] = tencentTemplate //阿里云短信平台 aliyunTemplate2 := map[string]string{} aliyunTemplate2[TemplateCode_SetControl_Task] = "SMS_243400632" //布控任务结果模板ID aliyunTemplate2[TemplateCode_Device_Offline] = "SMS_243375637" //设备离线模板ID aliyunTemplate2[TemplateCode_Follow_Collision_task] = "SMS_243450599" //伴随或碰撞任务结果模板ID aliyunTemplate2[TemplateCode_Device_Performance] = "" //服务器性能监测通知模板ID smsObject.TemplateList["aliyun"] = aliyunTemplate2 //其他短信平台的模板定义 } return smsObject } func (t *Sms) init(sendPlatform ...string) { if len(sendPlatform) == 0 { t.SendPlatform = "tencent" } else { t.SendPlatform = sendPlatform[0] } } //发送短信 //datatype:短信数据类型 //dataparams:短信内容参数.tencent平台:与模板参数顺序对应的值数组;aliyun平台:与模板参数顺序和名称匹配的json值串 //phone:接收的手机号 func (t *Sms) Send(datatype string, dataparams, phone []string) (interface{}, error) { if t.SignName == "" { return nil, errors.New("短信签名名称不能为空") } var object reflect.Value if t.SendPlatform == "tencent" { s := new(Tencent) object = reflect.ValueOf(s) } else if t.SendPlatform == "aliyun" { s := new(Aliyun) object = reflect.ValueOf(s) } else { return nil, errors.New("无效的短信平台") } object.Elem().FieldByName("SignName").SetString(t.SignName) object.Elem().FieldByName("AppId").SetString(t.AppId) object.Elem().FieldByName("AppKey").SetString(t.AppKey) templateDefined := t.TemplateList[t.SendPlatform] if templateDefined != nil { templateDefinedMap := templateDefined.(map[string]string) templateid := templateDefinedMap[datatype] if templateid == "" { return nil, errors.New("未定义短信平台" + t.SendPlatform + "的" + datatype + "对应模板") } object.Elem().FieldByName("TemplateId").SetString(templateid) } inparam := []reflect.Value{} //组装参数 inparam = append(inparam, reflect.ValueOf(datatype)) inparam = append(inparam, reflect.ValueOf(dataparams)) inparam = append(inparam, reflect.ValueOf(phone)) method := "Send" mv := object.MethodByName(method) if !mv.IsValid() { return nil, errors.New(fmt.Sprintf("%s对象未实现%s方法!", t.SendPlatform, method)) } result := mv.Call(inparam) if result != nil { if len(result) > 1 && result[1].Interface() != nil { log.Println(result[1]) return nil, result[1].Interface().(error) } } return result, nil }