mirror of
https://gitee.com/dgiiot/dgiot.git
synced 2024-12-03 12:48:30 +08:00
feat: 短信告警
This commit is contained in:
parent
5f62485c93
commit
1abf585f99
@ -116,6 +116,24 @@ handle_message({rule, #{clientid := _DevAddr, disconnected_at := _DisconnectedAt
|
|||||||
%% SELECT payload.electricity as electricity FROM "$dg/user/alarm/94656917ab/157d0ff60f/#" where electricity > 20
|
%% SELECT payload.electricity as electricity FROM "$dg/user/alarm/94656917ab/157d0ff60f/#" where electricity > 20
|
||||||
handle_message({rule, #{metadata := #{rule_id := <<"rule:Notification_", Ruleid/binary>>}, clientid := DeviceId, payload := _Payload, topic := _Topic} = _Msg, Context}, State) ->
|
handle_message({rule, #{metadata := #{rule_id := <<"rule:Notification_", Ruleid/binary>>}, clientid := DeviceId, payload := _Payload, topic := _Topic} = _Msg, Context}, State) ->
|
||||||
dgiot_umeng:add_notification(Ruleid, DeviceId, Context),
|
dgiot_umeng:add_notification(Ruleid, DeviceId, Context),
|
||||||
|
case dgiot_parse:get_object(<<"_Role">>, application:get_env(dgiot_http, tencent_sms_sign,"ae746ee803")) of
|
||||||
|
{ok,#{<<"objectId">> := RolesId}} ->
|
||||||
|
%循环得到部门下所有的手机号
|
||||||
|
Users =dgiot_parse_auth:get_UserIds(unicode:characters_to_binary(RolesId)),
|
||||||
|
UsersQuery = #{<<"where">> => #{<<"objectId">> => #{<<"$in">> => Users}}},
|
||||||
|
{ok, #{<<"results">> := Row}}=dgiot_parse:query_object(<<"_User">>, UsersQuery),
|
||||||
|
Params= lists:foldl(fun(X,Acc)->
|
||||||
|
Acc++[X++":"++DeviceId]
|
||||||
|
end,[],application:get_env(dgiot_http, tencent_sms_params,["aaa","bbb","ccc","ddd","eee","fff"])),
|
||||||
|
lists:foldl(fun(X,Acc)->
|
||||||
|
Phone=unicode:characters_to_binary(dgiot_utils:to_list(maps:get(<<"phone">>,X))),
|
||||||
|
dgiot_notification:send_sms(Phone,Params),
|
||||||
|
Acc ++ [unicode:characters_to_binary(dgiot_utils:to_list(maps:get(<<"phone">>,X)))]
|
||||||
|
end,[],Row);
|
||||||
|
% 模板格式:时间:{1} {2}(发起人:{3})(单据编号{4})(车间:{5})产生异常,警告等级为:{6}。
|
||||||
|
_ ->
|
||||||
|
pass
|
||||||
|
end,
|
||||||
{ok, State};
|
{ok, State};
|
||||||
|
|
||||||
handle_message({sync_parse, Pid, 'after', get, _Token, <<"Notification">>, #{<<"results">> := _Results} = ResBody}, State) ->
|
handle_message({sync_parse, Pid, 'after', get, _Token, <<"Notification">>, #{<<"results">> := _Results} = ResBody}, State) ->
|
||||||
|
@ -13,7 +13,7 @@ aliyun.uploadCallbackUrl= http://127.0.0.1:8081
|
|||||||
aliyun.uploadHost= http://dgiotpump.oss-cn-shanghai.aliyuncs.com
|
aliyun.uploadHost= http://dgiotpump.oss-cn-shanghai.aliyuncs.com
|
||||||
|
|
||||||
#百度地图
|
#百度地图
|
||||||
baidumap.appkey = S7pehghn5BdQeSGZAcpEk4bLQSQ8czvi
|
baidumap.appkey = WpeAb6pL4tsX2ZVd56GHbO9Ut6c4HZhG
|
||||||
#百度地图纠偏值
|
#百度地图纠偏值
|
||||||
baidumap.lngoffset = 0.00000
|
baidumap.lngoffset = 0.00000
|
||||||
baidumap.latoffset = 0.00000
|
baidumap.latoffset = 0.00000
|
||||||
@ -28,10 +28,10 @@ wechat.appid = wxb37f3990d2424ea0
|
|||||||
wechat.secret = 0c8b9e229ebe48c6878727a9d2e0263d
|
wechat.secret = 0c8b9e229ebe48c6878727a9d2e0263d
|
||||||
|
|
||||||
#腾讯云短信
|
#腾讯云短信
|
||||||
tencent_sms.appid = 1400214975
|
tencent_sms.appid = 1400635630
|
||||||
tencent_sms.appkey = 25c8c3a4d17367a8232931ff54d114a2
|
tencent_sms.appkey = 40d9609b9e6212cbff051b4f1d4cabfc
|
||||||
tencent_sms.tmplid = 340847
|
tencent_sms.notification.templateId = 1473069
|
||||||
tencent_sms.sign = dgiot
|
tencent_sms.sign = ae746ee803
|
||||||
|
|
||||||
# jwt
|
# jwt
|
||||||
jwt.algorithm = rs256
|
jwt.algorithm = rs256
|
||||||
|
@ -28,27 +28,25 @@
|
|||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
{mapping, "tencent_sms.appid", "dgiot_http.tencent_sms_appid", [
|
{mapping, "tencent_sms.appid", "dgiot_http.tencent_sms_appid", [
|
||||||
{default, "1400214975"},
|
{default, "1400635630"},
|
||||||
{datatype, string}
|
{datatype, string}
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
{mapping, "tencent_sms.appkey", "dgiot_http.tencent_sms_appkey", [
|
{mapping, "tencent_sms.appkey", "dgiot_http.tencent_sms_appkey", [
|
||||||
{default, "25c8c3a4d17367a8232931ff54d114a2"},
|
{default, "40d9609b9e6212cbff051b4f1d4cabfc"},
|
||||||
{datatype, string}
|
{datatype, string}
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
{mapping, "tencent_sms.tmplid", "dgiot_http.tencent_sms_tmplid", [
|
{mapping, "tencent_sms.notification.templateId", "dgiot_http.tencent_sms_notification_templateId", [
|
||||||
{default, "340847"},
|
{default, "1473069"},
|
||||||
{datatype, string}
|
{datatype, string}
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
{mapping, "tencent_sms.sign", "dgiot_http.tencent_sms_sign", [
|
{mapping, "tencent_sms.sign", "dgiot_http.tencent_sms_sign", [
|
||||||
{default, "dgiot"},
|
{default, "ae746ee803"},
|
||||||
{datatype, string}
|
{datatype, string}
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% 百度地图配置
|
%% 百度地图配置
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
@ -8,6 +8,166 @@
|
|||||||
"definitions": {
|
"definitions": {
|
||||||
},
|
},
|
||||||
"paths": {
|
"paths": {
|
||||||
|
"/handlewarnsendsms": {
|
||||||
|
"post": {
|
||||||
|
"security": [],
|
||||||
|
"summary": "短信配置发送",
|
||||||
|
"description": "短信配置发送",
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"in": "body",
|
||||||
|
"name": "user",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"appId": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "1400635630"
|
||||||
|
},
|
||||||
|
"appKey": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "40d9609b9e6212cbff051b4f1d4cabfc"
|
||||||
|
},
|
||||||
|
"tplId": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "1473069"
|
||||||
|
},
|
||||||
|
"sign": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "ae746ee803"
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"required": true,
|
||||||
|
"type": "object",
|
||||||
|
"example": ["测试1","测试2","测试3","测试4","测试5","测试6"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Returns success"
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"description": "Bad Request"
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Forbidden",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/Error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"description": "Server Internal error",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/Error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"Notification"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/warnsendsms": {
|
||||||
|
"post": {
|
||||||
|
"security": [],
|
||||||
|
"summary": "短信告警发送",
|
||||||
|
"description": "短信告警发送",
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"in": "body",
|
||||||
|
"name": "user",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"objectId": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "dasssd54"
|
||||||
|
},
|
||||||
|
"branchId": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "9256b5cf2e"
|
||||||
|
},
|
||||||
|
"docnumber": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "MO000015"
|
||||||
|
},
|
||||||
|
"datetimes": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "2022-12-15,14:20"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "张三"
|
||||||
|
},
|
||||||
|
"workshop": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "车间1-1"
|
||||||
|
},
|
||||||
|
"level": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "1"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "desc"
|
||||||
|
},
|
||||||
|
"file": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"example": "img"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Returns success"
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"description": "Bad Request"
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Forbidden",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/Error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"description": "Server Internal error",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/Error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"Notification"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"/wechat": {
|
"/wechat": {
|
||||||
"get": {
|
"get": {
|
||||||
"security": [],
|
"security": [],
|
||||||
@ -40,6 +200,7 @@
|
|||||||
"Notification"
|
"Notification"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
"post": {
|
"post": {
|
||||||
"security": [],
|
"security": [],
|
||||||
"summary": "wechat绑定",
|
"summary": "wechat绑定",
|
||||||
|
@ -74,6 +74,100 @@ do_request(get_file_signature, Args, _Context, _Req) ->
|
|||||||
_ -> {404, #{<<"code">> => 1001, <<"error">> => <<"not support this type">>}}
|
_ -> {404, #{<<"code">> => 1001, <<"error">> => <<"not support this type">>}}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
%dgiot通用告警
|
||||||
|
do_request(post_handlewarnsendsms, #{<<"appId">> := AppId, <<"appKey">> := AppKey, <<"tplId">> := TplId, <<"sign">> := Sign, <<"params">> := Params}, _Context, _Req) ->
|
||||||
|
%通用
|
||||||
|
application:set_env(dgiot_http, tencent_sms_appid, AppId),
|
||||||
|
application:set_env(dgiot_http, tencent_sms_appkey, AppKey),
|
||||||
|
application:set_env(dgiot_http, tencent_sms_notification_templateId, TplId),
|
||||||
|
%测试告警通知的部门,默认为数蛙部门
|
||||||
|
application:set_env(dgiot_http, tencent_sms_sign, Sign),
|
||||||
|
application:set_env(dgiot_http, tencent_sms_params, Params),
|
||||||
|
|
||||||
|
case dgiot_parse:get_object(<<"_Role">>, Sign) of
|
||||||
|
{ok, #{<<"objectId">> := RolesId}} ->
|
||||||
|
%循环得到部门下所有的手机号
|
||||||
|
Users = dgiot_parse_auth:get_UserIds(unicode:characters_to_binary(RolesId)),
|
||||||
|
UsersQuery = #{<<"where">> => #{<<"objectId">> => #{<<"$in">> => Users}}},
|
||||||
|
{ok, #{<<"results">> := Row}} = dgiot_parse:query_object(<<"_User">>, UsersQuery),
|
||||||
|
PhoneList = lists:foldl(fun(X, Acc) ->
|
||||||
|
Phone = unicode:characters_to_binary(dgiot_utils:to_list(maps:get(<<"phone">>, X))),
|
||||||
|
dgiot_notification:send_sms(Phone, application:get_env(dgiot_http, tencent_sms_params, Params)),
|
||||||
|
Acc ++ [unicode:characters_to_binary(dgiot_utils:to_list(maps:get(<<"phone">>, X)))]
|
||||||
|
end, [], Row),
|
||||||
|
% 模板格式:时间:{1} {2}(发起人:{3})(单据编号{4})(车间:{5})产生异常,警告等级为:{6}。
|
||||||
|
Json = #{<<"phones">> => PhoneList},
|
||||||
|
{ok, #{
|
||||||
|
<<"status">> => 200,
|
||||||
|
<<"msg">> => <<"success">>,
|
||||||
|
<<"data">> => Json
|
||||||
|
}};
|
||||||
|
_ ->
|
||||||
|
{error, #{<<"status">> => 404, <<"msg">> => <<"部门ID错误"/utf8>>, <<"result">> => <<"_Role info null">>}}
|
||||||
|
end;
|
||||||
|
|
||||||
|
%数字工厂告警
|
||||||
|
do_request(post_warnsendsms, #{<<"objectId">> := DeviceId, <<"branchId">> := BranchId, <<"datetimes">> := DateTimes, <<"docnumber">> := Docnumber, <<"username">> := UserName, <<"workshop">> := Workshop, <<"level">> := Level, <<"desc">> := Desc, <<"file">> := FileInfo}, _Context, _Req) ->
|
||||||
|
|
||||||
|
case Level of
|
||||||
|
<<"1">> ->
|
||||||
|
Warn = <<"待首检"/utf8>>,
|
||||||
|
dgiot_parse:update_object(<<"Device">>, DeviceId, #{<<"realstatus">> => 3});
|
||||||
|
<<"2">> ->
|
||||||
|
Warn = <<"待尾检"/utf8>>,
|
||||||
|
dgiot_parse:update_object(<<"Device">>, DeviceId, #{<<"realstatus">> => 5});
|
||||||
|
_ ->
|
||||||
|
Warn = <<"告警"/utf8>>,
|
||||||
|
{error, #{code => 1, error => ("level错误")}}
|
||||||
|
end,
|
||||||
|
Warns = Warn,
|
||||||
|
case dgiot_parse:get_object(<<"_Role">>, BranchId) of
|
||||||
|
{ok, #{<<"objectId">> := RolesId, <<"ACL">> := Acl}} ->
|
||||||
|
|
||||||
|
Map = #{
|
||||||
|
<<"type">> => DeviceId,
|
||||||
|
<<"name">> => <<"Manual alarm">>,
|
||||||
|
<<"status">> => 0,
|
||||||
|
<<"content">> => #{
|
||||||
|
<<"alarm">> => #{
|
||||||
|
<<"deviceId"/utf8>> => DeviceId,
|
||||||
|
<<"docnumber"/utf8>> => Docnumber,
|
||||||
|
<<"datetimes"/utf8>> => DateTimes,
|
||||||
|
<<"username"/utf8>> => UserName,
|
||||||
|
<<"workshop"/utf8>> => Workshop,
|
||||||
|
<<"level"/utf8>> => Level,
|
||||||
|
<<"desc"/utf8>> => Desc,
|
||||||
|
<<"imgurl"/utf8>> => FileInfo
|
||||||
|
},
|
||||||
|
<<"alertstatus">> => 1
|
||||||
|
},
|
||||||
|
<<"ACL">> => Acl
|
||||||
|
},
|
||||||
|
#{<<"objectId">> := ObjectId} = dgiot_parse_id:get_objectid(<<"Notification">>, Map),
|
||||||
|
NewMap = Map#{
|
||||||
|
<<"objectId">> => ObjectId
|
||||||
|
},
|
||||||
|
dgiot_parse:create_object(<<"Notification">>, NewMap),
|
||||||
|
%循环得到部门下所有的手机号
|
||||||
|
Users = dgiot_parse_auth:get_UserIds(unicode:characters_to_binary(RolesId)),
|
||||||
|
UsersQuery = #{<<"where">> => #{<<"objectId">> => #{<<"$in">> => Users}}},
|
||||||
|
{ok, #{<<"results">> := Row}} = dgiot_parse:query_object(<<"_User">>, UsersQuery),
|
||||||
|
PhoneList = lists:foldl(fun(X, Acc) ->
|
||||||
|
Phone = unicode:characters_to_binary(dgiot_utils:to_list(maps:get(<<"phone">>, X))),
|
||||||
|
dgiot_notification:send_sms(Phone, [DateTimes, <<"-">>, UserName, Docnumber, Workshop, Warns]),
|
||||||
|
Acc ++ [unicode:characters_to_binary(dgiot_utils:to_list(maps:get(<<"phone">>, X)))]
|
||||||
|
end, [], Row),
|
||||||
|
% 模板格式:时间:{1} {2}(发起人:{3})(单据编号{4})(车间:{5})产生异常,警告等级为:{6}。
|
||||||
|
Json = #{<<"phones">> => PhoneList},
|
||||||
|
{ok, #{
|
||||||
|
<<"status">> => 200,
|
||||||
|
<<"msg">> => <<"success">>,
|
||||||
|
<<"data">> => Json
|
||||||
|
}};
|
||||||
|
_ ->
|
||||||
|
{error, #{<<"status">> => 404, <<"msg">> => <<"部门ID错误"/utf8>>, <<"result">> => <<"_Role info null">>}}
|
||||||
|
end;
|
||||||
|
|
||||||
%% iot_hub 概要: 查询平台api资源 描述:jwt回调
|
%% iot_hub 概要: 查询平台api资源 描述:jwt回调
|
||||||
%% OperationId:get_jwtlogin
|
%% OperationId:get_jwtlogin
|
||||||
%% 请求:POST /iotapi/get_jwtlogin
|
%% 请求:POST /iotapi/get_jwtlogin
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
-dgiot_data("ets").
|
-dgiot_data("ets").
|
||||||
-export([init_ets/0]).
|
-export([init_ets/0]).
|
||||||
%% API
|
%% API
|
||||||
-export([send_sms/3, send_sms/4, send_sms/5]).
|
-export([send_sms/2, send_sms/3, send_sms/5, send_sms/6, send_sms/7]).
|
||||||
|
|
||||||
-export([send_email/1, test_email/0]).
|
-export([send_email/1, test_email/0]).
|
||||||
|
|
||||||
@ -41,8 +41,7 @@ send_verification_code(NationCode, Key) ->
|
|||||||
rand:seed(exs1024),
|
rand:seed(exs1024),
|
||||||
Rand = 10000 + erlang:round(rand:uniform() * 10000),
|
Rand = 10000 + erlang:round(rand:uniform() * 10000),
|
||||||
TTL = 3,
|
TTL = 3,
|
||||||
Tpml = dgiot:get_env(dgiot_http, tencent_sms_tmplid,""),
|
case dgiot_notification:send_sms(NationCode, Key, [Rand, TTL]) of
|
||||||
case dgiot_notification:send_sms(NationCode, Key, Tpml, [Rand, TTL]) of
|
|
||||||
{ok, _Ext} ->
|
{ok, _Ext} ->
|
||||||
dgiot_cache:set(Key, Rand, TTL * 60),
|
dgiot_cache:set(Key, Rand, TTL * 60),
|
||||||
{ok, #{<<"expire">> => TTL * 60}};
|
{ok, #{<<"expire">> => TTL * 60}};
|
||||||
@ -62,46 +61,99 @@ check_verification_code(Key, Code) ->
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
send_sms(Mobile, TplId, Params) ->
|
send_sms(Mobile, Params) ->
|
||||||
send_sms("+86", Mobile, TplId, Params).
|
send_sms("+86", Mobile, Params).
|
||||||
send_sms(NationCode, Mobile, TplId, Params) ->
|
send_sms(NationCode, Mobile, Params) ->
|
||||||
send_sms(NationCode, Mobile, TplId, Params, <<>>).
|
TplId = dgiot_utils:to_list(application:get_env(dgiot_http, tencent_sms_notification_templateId, <<"">>)),
|
||||||
send_sms(NationCode, Mobile, TplId, Params, Ext) ->
|
AppId = dgiot_utils:to_list(application:get_env(dgiot_http, tencent_sms_appid, <<"">>)),
|
||||||
Random = integer_to_list(1000 + rand:uniform(1000)),
|
AppKey = dgiot_utils:to_list(application:get_env(dgiot_http, tencent_sms_appkey, <<"">>)),
|
||||||
AppId = dgiot:get_env(dgiot_http, tencent_sms_appid,""),
|
send_sms(NationCode, Mobile, Params, AppId, AppKey, TplId).
|
||||||
AppKey = dgiot:get_env(dgiot_http, tencent_sms_appkey,""),
|
send_sms(Mobile, Params, AppId, AppKey, TplId) ->
|
||||||
BaseUrl = "https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=~s&random=~s",
|
send_sms("+86", Mobile, Params, AppId, AppKey, TplId, <<>>).
|
||||||
Url = io_lib:format(BaseUrl, [AppId, Random]),
|
send_sms(NationCode, Mobile, Params, AppId, AppKey, TplId) ->
|
||||||
Now = dgiot_datetime:nowstamp(),
|
send_sms(NationCode, Mobile, Params, AppId, AppKey, TplId, <<>>).
|
||||||
case re:run(NationCode, <<"\\+(\\d{1,3})">>, [{capture, all, binary}]) of
|
send_sms(NationCode, Mobile, Params, AppId, AppKey, TplId, Ext) ->
|
||||||
|
AppId_b =
|
||||||
|
case is_binary(AppId) of
|
||||||
|
true ->
|
||||||
|
binary_to_list(AppId);
|
||||||
|
_ ->
|
||||||
|
AppId
|
||||||
|
end,
|
||||||
|
Random = dgiot_utils:to_list(1000 + rand:uniform(1000)),
|
||||||
|
Url =
|
||||||
|
case is_list(Mobile) of
|
||||||
|
true ->
|
||||||
|
"https://yun.tim.qq.com/v5/tlssmssvr/sendmultisms2?sdkappid=" ++ AppId_b ++ "&random=" ++ Random;
|
||||||
|
false ->
|
||||||
|
"https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=" ++ AppId_b ++ "&random=" ++ Random
|
||||||
|
end,
|
||||||
|
case re:run(NationCode, <<"\\+(\\d{1,3})">>, [{capture, all, binary}]) of % "+86" 自动转换二进制
|
||||||
{match, [_, NationCode1]} ->
|
{match, [_, NationCode1]} ->
|
||||||
|
|
||||||
|
{MobileStr, Tel_b} =
|
||||||
|
case is_list(Mobile) of
|
||||||
|
true -> %%短信多发
|
||||||
|
ListMobile = lists:foldl(fun(#{<<"mobile">> := Num}, Acc) -> Acc ++ [binary_to_list(Num)]
|
||||||
|
end, [], Mobile),
|
||||||
|
{string:join(ListMobile, ","), Mobile};
|
||||||
|
_ -> %%短信单发
|
||||||
|
case is_binary(Mobile) of
|
||||||
|
true ->
|
||||||
|
{Mobile, #{<<"mobile">> => Mobile, <<"nationcode">> => NationCode1}};
|
||||||
|
_ ->
|
||||||
|
{Mobile, #{<<"mobile">> => unicode:characters_to_binary(Mobile), <<"nationcode">> => NationCode1}}
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
Now = dgiot_datetime:nowstamp(),
|
||||||
|
AppKey_b =
|
||||||
|
case is_binary(AppKey) of
|
||||||
|
true ->
|
||||||
|
binary_to_list(AppKey);
|
||||||
|
_ ->
|
||||||
|
AppKey
|
||||||
|
end,
|
||||||
|
SigStr = io_lib:format("appkey=~s&random=~s&time=~s&mobile=~s", [AppKey_b, Random, integer_to_list(Now), MobileStr]),
|
||||||
|
Sig_b = dgiot_utils:to_binary(string:to_lower(binary_to_list(<<<<Y>> || <<X:4>> <= crypto:hash(sha256, SigStr), Y <- integer_to_list(X, 16)>>))),
|
||||||
|
FunParams =
|
||||||
|
fun(X, Acc) ->
|
||||||
|
case is_binary(X) of
|
||||||
|
true ->
|
||||||
|
Acc ++ [X];
|
||||||
|
_ ->
|
||||||
|
Acc ++ [unicode:characters_to_binary(X)]
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
Params_b = lists:foldl(FunParams, [], Params),
|
||||||
|
case is_binary(TplId) of
|
||||||
|
true ->
|
||||||
|
TplId_b = TplId;
|
||||||
|
_ ->
|
||||||
|
TplId_b = unicode:characters_to_binary(TplId)
|
||||||
|
end,
|
||||||
Data = #{
|
Data = #{
|
||||||
<<"tpl_id">> => dgiot_utils:to_binary(TplId),
|
<<"tpl_id">> => TplId_b,
|
||||||
<<"ext">> => Ext,
|
<<"ext">> => Ext,
|
||||||
<<"extend">> => <<>>,
|
<<"extend">> => <<>>,
|
||||||
<<"params">> => Params,
|
<<"params">> => Params_b,
|
||||||
<<"sign">> => dgiot_utils:to_binary(dgiot:get_env(dgiot_http, tencent_sms_sign,"")),
|
<<"sign">> => <<"dgiot"/utf8>>,
|
||||||
<<"tel">> => #{
|
<<"tel">> => Tel_b,
|
||||||
<<"mobile">> => case is_binary(Mobile) of true -> Mobile; false -> list_to_binary(Mobile) end,
|
<<"time">> => Now,
|
||||||
<<"nationcode">> => NationCode1
|
<<"sig">> => Sig_b
|
||||||
},
|
|
||||||
<<"time">> => Now
|
|
||||||
},
|
},
|
||||||
SigStr = io_lib:format("appkey=~s&random=~s&time=~s&mobile=~s", [AppKey, Random, integer_to_list(Now), Mobile]),
|
Request = {Url, [], "application/json", jsx:encode(Data)},
|
||||||
Sig = string:to_lower(binary_to_list(<<<<Y>> || <<X:4>> <= crypto:hash(sha256, SigStr), Y <- integer_to_list(X, 16)>>)),
|
|
||||||
Body = Data#{<<"sig">> => list_to_binary(Sig)},
|
|
||||||
Request = {Url, [], "application/json", jsx:encode(Body)},
|
|
||||||
case catch httpc:request(post, Request, [], [{body_format, binary}]) of
|
case catch httpc:request(post, Request, [], [{body_format, binary}]) of
|
||||||
{ok, {{_HTTPVersion, 200, "OK"}, _Header, ResBody}} ->
|
{ok, {{_HTTPVersion, 200, "OK"}, _Header, ResBody}} ->
|
||||||
case jsx:decode(ResBody, [{labels, binary}, return_maps]) of
|
case jsx:decode(ResBody, [{labels, binary}, return_maps]) of
|
||||||
#{<<"result">> := 0, <<"ext">> := Ext} ->
|
#{<<"result">> := 0, <<"ext">> := Ext} ->
|
||||||
{ok, Ext};
|
{ok, Ext};
|
||||||
#{<<"errmsg">> := ErrMsg, <<"result">> := Code} ->
|
#{<<"errmsg">> := ErrMsg, <<"result">> := Code} ->
|
||||||
?LOG(error, "Send SMS ERROR: ~p->~ts, Request:~p~n", [list_to_binary(Url), unicode:characters_to_binary(ErrMsg), Body]),
|
?LOG(error, "Send SMS ERROR: ~p->~ts, Request:~p~n", [list_to_binary(Url), unicode:characters_to_binary(ErrMsg), Data]),
|
||||||
{error, #{code => Code, error => ErrMsg}}
|
{error, #{code => Code, error => ErrMsg}}
|
||||||
end;
|
end;
|
||||||
{Err, Reason} when Err == error; Err == 'EXIT' ->
|
{Err, Reason} when Err == error; Err == 'EXIT' ->
|
||||||
?LOG(error, "Send SMS ERROR: ~p, ~p, ~p~n", [Url, Body, Reason]),
|
?LOG(error, "Send SMS ERROR: ~p, ~p, ~p~n", [Url, Data, Reason]),
|
||||||
{error, #{code => 1, error => list_to_binary(io_lib:format("~p", [Reason]))}}
|
{error, #{code => 1, error => list_to_binary(io_lib:format("~p", [Reason]))}}
|
||||||
end;
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
|
@ -33,7 +33,7 @@ init(_) ->
|
|||||||
{ok, #{}}.
|
{ok, #{}}.
|
||||||
|
|
||||||
handle_info(connection_ready, #dclient{child = ChildState} = Dclient) ->
|
handle_info(connection_ready, #dclient{child = ChildState} = Dclient) ->
|
||||||
io:format("~s ~p ChildState = ~p.~n", [?FILE, ?LINE, ChildState]),
|
%% io:format("~s ~p ChildState = ~p.~n", [?FILE, ?LINE, ChildState]),
|
||||||
rand:seed(exs1024),
|
rand:seed(exs1024),
|
||||||
Time = erlang:round(rand:uniform() * 1 + 1) * 1000,
|
Time = erlang:round(rand:uniform() * 1 + 1) * 1000,
|
||||||
erlang:send_after(Time, self(), read),
|
erlang:send_after(Time, self(), read),
|
||||||
|
Loading…
Reference in New Issue
Block a user