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