zhoufan 7 年 前
コミット
e19e0817c0

+ 31 - 0
SmsPlatform.sln

@@ -0,0 +1,31 @@
1
+
2
+Microsoft Visual Studio Solution File, Format Version 12.00
3
+# Visual Studio 15
4
+VisualStudioVersion = 15.0.27703.1
5
+MinimumVisualStudioVersion = 10.0.40219.1
6
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SmsPlatform", "SmsPlatform\SmsPlatform.csproj", "{80EDAD10-4D5F-484A-B574-EA07558713AC}"
7
+EndProject
8
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmsReceive", "SmsReceive\SmsReceive.csproj", "{3F808FDF-9D2F-4F4C-91C5-55441C13E21E}"
9
+EndProject
10
+Global
11
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
12
+		Debug|Any CPU = Debug|Any CPU
13
+		Release|Any CPU = Release|Any CPU
14
+	EndGlobalSection
15
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
16
+		{80EDAD10-4D5F-484A-B574-EA07558713AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17
+		{80EDAD10-4D5F-484A-B574-EA07558713AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
18
+		{80EDAD10-4D5F-484A-B574-EA07558713AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
19
+		{80EDAD10-4D5F-484A-B574-EA07558713AC}.Release|Any CPU.Build.0 = Release|Any CPU
20
+		{3F808FDF-9D2F-4F4C-91C5-55441C13E21E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21
+		{3F808FDF-9D2F-4F4C-91C5-55441C13E21E}.Debug|Any CPU.Build.0 = Debug|Any CPU
22
+		{3F808FDF-9D2F-4F4C-91C5-55441C13E21E}.Release|Any CPU.ActiveCfg = Release|Any CPU
23
+		{3F808FDF-9D2F-4F4C-91C5-55441C13E21E}.Release|Any CPU.Build.0 = Release|Any CPU
24
+	EndGlobalSection
25
+	GlobalSection(SolutionProperties) = preSolution
26
+		HideSolutionNode = FALSE
27
+	EndGlobalSection
28
+	GlobalSection(ExtensibilityGlobals) = postSolution
29
+		SolutionGuid = {5C1F0480-6673-48F7-9C4C-DE041583C23F}
30
+	EndGlobalSection
31
+EndGlobal

+ 87 - 0
SmsPlatform/Common/AjaxResult.cs

@@ -0,0 +1,87 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Threading.Tasks;
5
+
6
+namespace SmsPlatform.Common
7
+{
8
+    public class AjaxResult
9
+    {
10
+        /// <summary>
11
+        /// 操作结果类型
12
+        /// </summary>
13
+        public object state { get; set; }
14
+        /// <summary>
15
+        /// 获取 消息内容
16
+        /// </summary>
17
+        public string message { get; set; }
18
+        /// <summary>
19
+        /// 获取 返回数据
20
+        /// </summary>
21
+        public object data { get; set; }
22
+    }
23
+    /// <summary>
24
+    /// 表示 ajax 操作结果类型的枚举
25
+    /// </summary>
26
+    public enum ResultTypes
27
+    {
28
+        /// <summary>
29
+        /// 成功结果类型
30
+        /// </summary>
31
+        success = 200, //请求(或处理)成功,
32
+
33
+        /// <summary>
34
+        /// 成功结果类型
35
+        /// </summary>
36
+        redirect = 302, //跳转,
37
+
38
+        /// <summary>
39
+        /// 警告结果类型
40
+        /// </summary>
41
+        warning = 402,//警告
42
+
43
+        /// <summary>
44
+        /// 未授权
45
+        /// </summary>
46
+        unauthorized = 401,
47
+
48
+
49
+        /// <summary>
50
+        /// 请求参数不完整或不正确
51
+        /// </summary>
52
+        parameterError = 400,
53
+
54
+        /// <summary>
55
+        /// 请求TOKEN失效
56
+        /// </summary>
57
+        tokenInvalid = 403,
58
+
59
+        /// <summary>
60
+        /// HTTP请求类型不合法
61
+        /// </summary>
62
+        httpMehtodError = 405,
63
+
64
+
65
+        /// <summary>
66
+        /// HTTP请求类型不合法
67
+        /// </summary>
68
+        httpRequestError = 406,
69
+
70
+
71
+        /// <summary>
72
+        /// 该URL已经失效
73
+        /// </summary>
74
+        yrlExpireError = 407,
75
+
76
+        /// <summary>
77
+        /// 未登录或登录已过期
78
+        /// </summary>
79
+        notoken = 499,
80
+
81
+        /// <summary>
82
+        /// 异常结果类型
83
+        /// </summary>
84
+        error = 500
85
+
86
+    }
87
+}

+ 78 - 0
SmsPlatform/Common/BaseController.cs

@@ -0,0 +1,78 @@
1
+using Microsoft.AspNetCore.Mvc;
2
+using System;
3
+using System.Collections.Generic;
4
+using System.Linq;
5
+using System.Threading.Tasks;
6
+
7
+namespace SmsPlatform.Common
8
+{
9
+    public class BaseController : Controller
10
+    {
11
+        /// <summary>
12
+        /// 成功的消息格式化
13
+        /// </summary>
14
+        /// <param name="message"></param>
15
+        /// <returns></returns>
16
+        protected virtual IActionResult Success(string message)
17
+        {
18
+            var jsonMsg = new AjaxResult { state = ResultTypes.success.ToString(), message = message }.ToJson();
19
+            return Content(jsonMsg);
20
+        }
21
+
22
+        /// <summary>
23
+        /// 成功的消息格式化
24
+        /// </summary>
25
+        /// <param name="message"></param>
26
+        /// <param name="data"></param>
27
+        /// <returns></returns>
28
+        protected virtual IActionResult Success(string message, object data)
29
+        {
30
+            var jsonMsg = new AjaxResult { state = ResultTypes.success.ToString(), message = message, data = data }.ToJson();
31
+            return Content(jsonMsg);
32
+        }
33
+
34
+        /// <summary>
35
+        /// 跳转的消息格式化
36
+        /// </summary>
37
+        /// <param name="message"></param>
38
+        /// <param name="data"></param>
39
+        /// <returns></returns>
40
+        protected virtual IActionResult Redirect(string message, object data)
41
+        {
42
+            return Content(new AjaxResult { state = ResultTypes.redirect.ToString(), message = message, data = data }.ToJson());
43
+        }
44
+
45
+        /// <summary>
46
+        /// 错误的消息格式化
47
+        /// </summary>
48
+        /// <param name="message"></param>
49
+        /// <returns></returns>
50
+        protected virtual IActionResult Error(string message)
51
+        {
52
+            var jsonMsg = new AjaxResult { state = ResultTypes.error.ToString(), message = message }.ToJson();
53
+            return Content(jsonMsg);
54
+        }
55
+
56
+        /// <summary>
57
+        /// 未登录或者登录已过期
58
+        /// </summary>
59
+        /// <param name="message"></param>
60
+        /// <returns></returns>
61
+        protected virtual IActionResult NoToken(string message)
62
+        {
63
+            var jsonMsg = new AjaxResult { state = ResultTypes.notoken.ToString(), message = message }.ToJson();
64
+            return Content(jsonMsg);
65
+        }
66
+
67
+        /// <summary>
68
+        /// 未授权
69
+        /// </summary>
70
+        /// <param name="message"></param>
71
+        /// <returns></returns>
72
+        protected virtual IActionResult UnAuthorized(string message)
73
+        {
74
+            var jsonMsg = new AjaxResult { state = ResultTypes.unauthorized.ToString(), message = message }.ToJson();
75
+            return Content(jsonMsg);
76
+        }
77
+    }
78
+}

+ 45 - 0
SmsPlatform/Common/JsonHelper.cs

@@ -0,0 +1,45 @@
1
+using Newtonsoft.Json;
2
+using Newtonsoft.Json.Converters;
3
+using Newtonsoft.Json.Linq;
4
+using System;
5
+using System.Collections.Generic;
6
+using System.Data;
7
+using System.Linq;
8
+using System.Threading.Tasks;
9
+
10
+namespace SmsPlatform.Common
11
+{
12
+    public static class JsonHelper
13
+    {
14
+        public static object ToJson(this string Json)
15
+        {
16
+            return Json == null ? null : JsonConvert.DeserializeObject(Json);
17
+        }
18
+        public static string ToJson(this object obj)
19
+        {
20
+            var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
21
+            return JsonConvert.SerializeObject(obj, timeConverter);
22
+        }
23
+        public static string ToJson(this object obj, string datetimeformats)
24
+        {
25
+            var timeConverter = new IsoDateTimeConverter { DateTimeFormat = datetimeformats };
26
+            return JsonConvert.SerializeObject(obj, timeConverter);
27
+        }
28
+        public static T ToObject<T>(this string Json)
29
+        {
30
+            return Json == null ? default(T) : JsonConvert.DeserializeObject<T>(Json);
31
+        }
32
+        public static List<T> ToList<T>(this string Json)
33
+        {
34
+            return Json == null ? null : JsonConvert.DeserializeObject<List<T>>(Json);
35
+        }
36
+        public static DataTable ToTable(this string Json)
37
+        {
38
+            return Json == null ? null : JsonConvert.DeserializeObject<DataTable>(Json);
39
+        }
40
+        public static JObject ToJObject(this string Json)
41
+        {
42
+            return Json == null ? JObject.Parse("{}") : JObject.Parse(Json.Replace("&nbsp;", ""));
43
+        }
44
+    }
45
+}

+ 61 - 0
SmsPlatform/Common/SecureHelper.cs

@@ -0,0 +1,61 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Security.Cryptography;
5
+using System.Text;
6
+using System.Threading.Tasks;
7
+
8
+namespace SmsPlatform.Common
9
+{
10
+    public static class SecureHelper
11
+    {
12
+        private static Encoding _encoding { get => Encoding.UTF8; }
13
+
14
+        private static string BsToStr(byte[] bs) => string.Join(string.Empty, bs.Select(x => x.ToString("x2"))).Replace("-", string.Empty);
15
+
16
+        /// <summary>
17
+        /// 获取MD5
18
+        /// </summary>
19
+        /// <param name="str"></param>
20
+        /// <returns></returns>
21
+        public static string GetMD5(string str)
22
+        {
23
+            using (var md5 = new MD5CryptoServiceProvider())
24
+            {
25
+                var bs = _encoding.GetBytes(str);
26
+                bs = md5.ComputeHash(bs);
27
+                return BsToStr(bs);
28
+            }
29
+        }
30
+
31
+        /// <summary>
32
+        /// 获取sha1
33
+        /// </summary>
34
+        /// <param name="str"></param>
35
+        /// <returns></returns>
36
+        public static string GetSHA1(string str)
37
+        {
38
+            using (var sha1 = new SHA1CryptoServiceProvider())
39
+            {
40
+                var bs = _encoding.GetBytes(str);
41
+                bs = sha1.ComputeHash(bs);
42
+                return BsToStr(bs);
43
+            }
44
+        }
45
+
46
+        /// <summary>
47
+        /// SHA256函数
48
+        /// </summary>
49
+        /// /// <param name="str">原始字符串</param>
50
+        /// <returns>SHA256结果</returns>
51
+        public static string GetSHA256(string str)
52
+        {
53
+            using (var Sha256 = new SHA256CryptoServiceProvider())
54
+            {
55
+                var bs = _encoding.GetBytes(str);
56
+                bs = Sha256.ComputeHash(bs);
57
+                return BsToStr(bs);
58
+            }
59
+        }
60
+    }
61
+}

+ 176 - 0
SmsPlatform/Common/SmsHelper.cs

@@ -0,0 +1,176 @@
1
+using Aliyun.Acs.Core;
2
+using Aliyun.Acs.Core.Exceptions;
3
+using Aliyun.Acs.Core.Profile;
4
+using Aliyun.Acs.Dysmsapi.Model.V20170525;
5
+using Microsoft.Extensions.Configuration;
6
+using Microsoft.Extensions.Logging;
7
+using NLog;
8
+using System;
9
+using System.Collections.Generic;
10
+using System.Linq;
11
+using System.Threading.Tasks;
12
+
13
+namespace SmsPlatform.Common
14
+{
15
+    public class SmsHelper
16
+    {
17
+        //产品名称:云通信短信API产品,开发者无需替换
18
+        private string product = "";
19
+        //产品域名,开发者无需替换
20
+        private string domain = "";
21
+
22
+        // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
23
+        private string accesskeyid = "";
24
+        private string accesskeysecret = "";
25
+
26
+        private Logger _logger;
27
+
28
+        public SmsHelper(IConfiguration configuration)
29
+        {
30
+            product = configuration["Dysms:product"];
31
+            domain = configuration["Dysms:domain"];
32
+            accesskeyid = configuration["Dysms:accesskeyid"];
33
+            accesskeysecret = configuration["Dysms:accesskeysecret"];
34
+
35
+            _logger = LogManager.GetCurrentClassLogger();
36
+        }
37
+
38
+        public SendSmsResponse SendSms(string signname, string templatecode, string phonenumber, string keys, string values)
39
+        {
40
+            //string json = "{\"name\":\"张三\",\"code\":\"ZS-123456\"}";
41
+            string result = string.Empty;
42
+            string json = string.Empty;
43
+            
44
+            if (!string.IsNullOrEmpty(keys))
45
+            {
46
+                json = "{";
47
+
48
+                string[] keyary = keys.Split(',');
49
+                string[] valueary = values.Split(',');
50
+
51
+                for (int i = 0; i < keyary.Count(); i++)
52
+                {
53
+                    json += "\"" + keyary[i] + "\":\"" + valueary[i] + "\",";
54
+                }
55
+                json = json.Substring(0, json.Length - 1);
56
+                json += "}";
57
+            }
58
+            //string date = DateTime.Now.ToString("yyyyMMdd");
59
+            SendSmsResponse reponse = SendSms(signname, templatecode, phonenumber, json);
60
+            //if (reponse.Code != "OK")
61
+            //{
62
+            //    result = reponse.Message;
63
+            //}
64
+
65
+            return reponse;
66
+        }
67
+
68
+        /// <summary>
69
+        /// 单号码发送短信
70
+        /// </summary>
71
+        /// <returns></returns>
72
+        public SendSmsResponse SendSms(string signname, string templatecode, string phonenumber, string json)
73
+        {
74
+            IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accesskeyid, accesskeysecret);
75
+            DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
76
+            IAcsClient acsClient = new DefaultAcsClient(profile);
77
+            SendSmsRequest request = new SendSmsRequest();
78
+            SendSmsResponse response = null;
79
+            try
80
+            {
81
+
82
+                //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
83
+                request.PhoneNumbers = phonenumber;
84
+                //必填:短信签名-可在短信控制台中找到
85
+                request.SignName = signname;
86
+                //必填:短信模板-可在短信控制台中找到
87
+                request.TemplateCode = templatecode;
88
+                //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
89
+                request.TemplateParam = json;
90
+                //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
91
+                //request.OutId = "yourOutId";
92
+                //请求失败这里会抛ClientException异常
93
+                response = acsClient.GetAcsResponse(request);
94
+
95
+            }
96
+            catch (ServerException e)
97
+            {
98
+                _logger.Error(signname+"|||"+ templatecode + "|||" + phonenumber + "|||" + json + "|||" + e.ToString());
99
+            }
100
+            catch (ClientException e)
101
+            {
102
+                _logger.Error(signname + "|||" + templatecode + "|||" + phonenumber + "|||" + json + "|||" + e.ToString());
103
+            }
104
+            return response;
105
+
106
+        }
107
+
108
+        /// <summary>
109
+        /// 查询发送详情
110
+        /// </summary>
111
+        /// <param name="bizId"></param>
112
+        /// <returns></returns>
113
+        public QuerySendDetailsResponse QuerySendDetails(string bizId, string phonenumber, string senddate, long? pagesize = 10, long? currentpage = 1)
114
+        {
115
+            //初始化acsClient,暂不支持region化
116
+            IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accesskeyid, accesskeysecret);
117
+            DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
118
+            IAcsClient acsClient = new DefaultAcsClient(profile);
119
+            //组装请求对象
120
+            QuerySendDetailsRequest request = new QuerySendDetailsRequest();
121
+            //必填-号码
122
+            request.PhoneNumber = phonenumber;
123
+            //可选-流水号
124
+            request.BizId = bizId;
125
+            if (string.IsNullOrEmpty(senddate))
126
+            {
127
+                senddate = DateTime.Now.ToString("yyyyMMdd");
128
+            }
129
+            //必填-发送日期 支持30天内记录查询,格式yyyyMMdd       
130
+            request.SendDate = senddate;
131
+            //必填-页大小
132
+            request.PageSize = pagesize;
133
+            //必填-当前页码从1开始计数
134
+            request.CurrentPage = currentpage;
135
+
136
+            QuerySendDetailsResponse querySendDetailsResponse = null;
137
+            try
138
+            {
139
+                querySendDetailsResponse = acsClient.GetAcsResponse(request);
140
+            }
141
+            catch (ServerException e)
142
+            {
143
+                _logger.Error(e.ToString());
144
+            }
145
+            catch (ClientException e)
146
+            {
147
+                _logger.Error(e.ToString());
148
+            }
149
+            return querySendDetailsResponse;
150
+        }
151
+
152
+        /// <summary>
153
+        /// 查询发送详情
154
+        /// </summary>
155
+        /// <param name="bizId"></param>
156
+        /// <returns></returns>
157
+        public QuerySendDetailsResponse.QuerySendDetails_SmsSendDetailDTO Query(string bizId, string phonenumber, string senddate)
158
+        {
159
+            QuerySendDetailsResponse.QuerySendDetails_SmsSendDetailDTO result = new QuerySendDetailsResponse.QuerySendDetails_SmsSendDetailDTO();
160
+            var qr = QuerySendDetails(bizId, phonenumber, senddate);
161
+            if (qr.Code == "OK")
162
+            {
163
+                if (qr.SmsSendDetailDTOs.Count > 0)
164
+                {
165
+                    var ssdd = qr.SmsSendDetailDTOs[0];
166
+                    if (ssdd.SendStatus == 1)
167
+                    {
168
+                        System.Threading.Thread.Sleep(1000);
169
+                        result = Query(bizId, phonenumber, senddate);
170
+                    }
171
+                }
172
+            }
173
+            return result;
174
+        }
175
+    }
176
+}

+ 305 - 0
SmsPlatform/Controllers/SmsController.cs

@@ -0,0 +1,305 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Threading.Tasks;
5
+using System.Transactions;
6
+using Microsoft.AspNetCore.Mvc;
7
+using Microsoft.Extensions.Caching.Distributed;
8
+using Microsoft.Extensions.Configuration;
9
+using Microsoft.Extensions.Logging;
10
+using SmsPlatform.Common;
11
+using SmsPlatform.Model;
12
+
13
+namespace SmsPlatform.Controllers
14
+{
15
+    /// <summary>
16
+    /// 短信模块
17
+    /// </summary>
18
+    [Produces("application/json")]
19
+    [Route("api/[controller]")]
20
+    public class SmsController : BaseController
21
+    {
22
+        private readonly ILogger<SmsController> _logger;
23
+        private readonly IDistributedCache _cache;
24
+        private readonly IConfiguration _configuration;
25
+        public SmsController(IDistributedCache cache, IConfiguration configuration, ILogger<SmsController> logger)
26
+        {
27
+            _cache = cache;
28
+            _logger = logger;
29
+            _configuration = configuration;
30
+        }
31
+
32
+        /// <summary>
33
+        /// 获取用户余额
34
+        /// </summary>
35
+        /// <returns></returns>
36
+        [HttpGet("getbalance")]
37
+        public async Task<IActionResult> GetBalance(string usercode, string password, string signcode)
38
+        {
39
+            var liststr = await _cache.GetStringAsync("T_User_Account");
40
+            var list = new List<T_User_Account>();
41
+            if (!string.IsNullOrEmpty(liststr))
42
+            {
43
+                list = liststr.ToList<T_User_Account>();
44
+            }
45
+
46
+            var model = list.Where(p => p.UserCode == usercode && p.Password == password).SingleOrDefault();
47
+            if (model != null)
48
+            {
49
+                string outsigncode = SecureHelper.GetMD5(usercode + "+" + password + "+" + model.Sign + "+" + DateTime.Now.ToString("yyyyMMdd"));
50
+                if (outsigncode.ToUpper() == signcode.ToUpper())
51
+                {
52
+                    return Success("成功", model.Balance);
53
+                }
54
+                else
55
+                {
56
+                    return Error("签名错误");
57
+                }
58
+            }
59
+            else
60
+            {
61
+                return Error("账号或者密码错误");
62
+            }
63
+        }
64
+
65
+        /// <summary>
66
+        /// 更新余额
67
+        /// </summary>
68
+        /// <returns></returns>
69
+        [HttpPost("updatebalance")]
70
+        public async Task<IActionResult> UpdateBalance(string usercode, string password, decimal amount, string remark, string signcode)
71
+        {
72
+            var userliststr = await _cache.GetStringAsync("T_User_Account");
73
+            var userlist = new List<T_User_Account>();
74
+            if (!string.IsNullOrEmpty(userliststr))
75
+            {
76
+                userlist = userliststr.ToList<T_User_Account>();
77
+            }
78
+
79
+            var model = userlist.Where(p => p.UserCode == usercode && p.Password == password).SingleOrDefault();
80
+            if (model != null)
81
+            {
82
+                string outsigncode = SecureHelper.GetMD5(usercode + "+" + password + "+" + model.Sign + "+" + DateTime.Now.ToString("yyyyMMdd"));
83
+                if (outsigncode.ToUpper() == signcode.ToUpper())
84
+                {
85
+                    model.Balance = model.Balance + amount;
86
+                    await _cache.SetStringAsync("T_User_Account", userlist.ToJson());
87
+
88
+
89
+                    var amtliststr = await _cache.GetStringAsync("T_User_Amount");
90
+                    var amtlist = new List<T_User_Amount>();
91
+                    if (!string.IsNullOrEmpty(amtliststr))
92
+                    {
93
+                        amtlist = amtliststr.ToList<T_User_Amount>();
94
+                    }
95
+
96
+                    var amt = new T_User_Amount();
97
+                    amt.Id = amtlist.Count > 0 ? amtlist.Max(p => p.Id) + 1 : 1;
98
+                    amt.UserCode = usercode;
99
+                    amt.Amount = amount;
100
+                    amt.Balance = model.Balance;
101
+                    amt.Remark = remark;
102
+                    amt.CreateTime = DateTime.Now;
103
+
104
+                    amtlist.Add(amt);
105
+                    await _cache.SetStringAsync("T_User_Amount", amtlist.ToJson());
106
+
107
+                    return Success("成功", model.Balance);
108
+                }
109
+                else
110
+                {
111
+                    return Error("签名错误");
112
+                }
113
+            }
114
+            else
115
+            {
116
+                return Error("账号或者密码错误");
117
+            }
118
+        }
119
+
120
+        /// <summary>
121
+        /// 扣款
122
+        /// </summary>
123
+        /// <returns></returns>
124
+        [HttpPost("deductamount")]
125
+        [ApiExplorerSettings(IgnoreApi = true)]
126
+        public async Task<IActionResult> DeductAmount(string usercode, string password, string phonenumber, string signcode)
127
+        {
128
+            var userliststr = await _cache.GetStringAsync("T_User_Account");
129
+            var userlist = new List<T_User_Account>();
130
+            if (!string.IsNullOrEmpty(userliststr))
131
+            {
132
+                userlist = userliststr.ToList<T_User_Account>();
133
+            }
134
+
135
+            var model = userlist.Where(p => p.UserCode == usercode && p.Password == password).SingleOrDefault();
136
+            if (model != null)
137
+            {
138
+                var amount = decimal.Parse(_configuration["amount"]);
139
+                string outsigncode = SecureHelper.GetMD5(usercode + "+" + password + "+" + model.Sign + "+" + DateTime.Now.ToString("yyyyMMdd"));
140
+                if (outsigncode.ToUpper() == signcode.ToUpper())
141
+                {
142
+                    model.Balance = model.Balance - amount;
143
+                    await _cache.SetStringAsync("T_User_Account", userlist.ToJson());
144
+
145
+
146
+                    var amtliststr = await _cache.GetStringAsync("T_User_Amount");
147
+                    var amtlist = new List<T_User_Amount>();
148
+                    if (!string.IsNullOrEmpty(amtliststr))
149
+                    {
150
+                        amtlist = amtliststr.ToList<T_User_Amount>();
151
+                    }
152
+
153
+                    var amt = new T_User_Amount();
154
+                    amt.Id = amtlist.Count > 0 ? amtlist.Max(p => p.Id) + 1 : 1;
155
+                    amt.UserCode = usercode;
156
+                    amt.Amount = amount;
157
+                    amt.Balance = model.Balance;
158
+                    amt.Remark = phonenumber + "发送短信";
159
+                    amt.CreateTime = DateTime.Now;
160
+
161
+                    amtlist.Add(amt);
162
+                    await _cache.SetStringAsync("T_User_Amount", amtlist.ToJson());
163
+
164
+                    return Success("成功", model.Balance);
165
+                }
166
+                else
167
+                {
168
+                    return Error("签名错误");
169
+                }
170
+            }
171
+            else
172
+            {
173
+                return Error("账号或者密码错误");
174
+            }
175
+        }
176
+
177
+        /// <summary>
178
+        /// 发送短信
179
+        /// </summary>
180
+        /// <returns></returns>
181
+        [HttpPost("sendsms")]
182
+        [ApiExplorerSettings(IgnoreApi = true)]
183
+        public async Task<IActionResult> SendSms(string usercode, string password, string signcode, string content,
184
+            string signname, string templatecode, string phonenumber, string paramname, string param)
185
+        {
186
+            //_logger.LogError(signname + "|||" + templatecode + "|||" + phonenumber + "|||" + paramname + "|||" + param );
187
+
188
+            var userliststr = await _cache.GetStringAsync("T_User_Account");
189
+            var userlist = new List<T_User_Account>();
190
+            if (!string.IsNullOrEmpty(userliststr))
191
+            {
192
+                userlist = userliststr.ToList<T_User_Account>();
193
+            }
194
+
195
+            var model = userlist.Where(p => p.UserCode == usercode && p.Password == password).SingleOrDefault();
196
+            if (model != null)
197
+            {
198
+                var amount = decimal.Parse(_configuration["amount"]);
199
+                string outsigncode = SecureHelper.GetMD5(usercode + "+" + password + "+" + model.Sign + "+" + DateTime.Now.ToString("yyyyMMdd"));
200
+                if (outsigncode.ToUpper() == signcode.ToUpper())
201
+                {
202
+                    var tcount = content.Length + signname.Length + 2;
203
+                    if (tcount > 70)
204
+                    {
205
+                        amount = (tcount / 67 + 1) * amount;
206
+                    }
207
+
208
+                    SmsHelper sh = new SmsHelper(_configuration);
209
+
210
+                    string date = DateTime.Now.ToString("yyyyMMdd");
211
+                    var result = sh.SendSms(signname, templatecode, phonenumber, paramname, param);
212
+                    if (result.Code == "OK")
213
+                    {
214
+                        //var sd = sh.Query(result.BizId, phonenumber, date);
215
+                        //if (sd.SendStatus == 2)
216
+                        //{
217
+                        //    var send = GetSend(result.BizId);
218
+
219
+                        //    _logger.LogError(phonenumber + " 发送短信失败,原因:" + send.ErrMsg);
220
+                        //    return Error(send.ErrMsg);
221
+                        //}
222
+                        model.Balance = model.Balance - amount;
223
+                        await _cache.SetStringAsync("T_User_Account", userlist.ToJson());
224
+
225
+                        //var amtliststr = await _cache.GetStringAsync("T_User_Amount");
226
+                        //var amtlist = new List<T_User_Amount>();
227
+                        //if (!string.IsNullOrEmpty(amtliststr))
228
+                        //{
229
+                        //    amtlist = amtliststr.ToList<T_User_Amount>();
230
+                        //}
231
+
232
+                        //var amt = new T_User_Amount();
233
+                        //amt.Id = amtlist.Count > 0 ? amtlist.Max(p => p.Id) + 1 : 1;
234
+                        //amt.UserCode = usercode;
235
+                        //amt.Amount = amount;
236
+                        //amt.Balance = model.Balance;
237
+                        //amt.Remark = phonenumber + " 发送短信";
238
+                        //amt.CreateTime = DateTime.Now;
239
+
240
+                        //amtlist.Add(amt);
241
+                        //await _cache.SetStringAsync("T_User_Amount", amtlist.ToJson());
242
+
243
+                        //var sendliststr = await _cache.GetStringAsync("T_Sms_Send");
244
+                        //var sendlist = new List<T_Sms_Send>();
245
+                        //if (!string.IsNullOrEmpty(sendliststr))
246
+                        //{
247
+                        //    sendlist = sendliststr.ToList<T_Sms_Send>();
248
+                        //}
249
+                        //var send = new T_Sms_Send();
250
+                        //send.Id = sendlist.Count > 0 ? sendlist.Max(p => p.Id) + 1 : 1;
251
+                        //send.BizId = result.BizId;
252
+                        //send.PhoneNumber = phonenumber;
253
+                        //send.SendTime = DateTime.Now;
254
+                        //send.State = 1;
255
+                        //sendlist.Add(send);
256
+                        //await _cache.SetStringAsync("T_Sms_Send", sendlist.ToJson());
257
+
258
+                        _logger.LogError(phonenumber + ":" + signname + "|||" + templatecode + "|||" + paramname + "|||" + param);
259
+
260
+                        return Success("成功", model.Balance);
261
+                    }
262
+                    else
263
+                    {
264
+                        _logger.LogError(phonenumber + " 发送短信失败,原因:" + result.Message);
265
+                        return Error(result.Message);
266
+                    }
267
+                }
268
+                else
269
+                {
270
+                    return Error("签名错误");
271
+                }
272
+            }
273
+            else
274
+            {
275
+                return Error("账号或者密码错误");
276
+            }
277
+
278
+        }
279
+
280
+        /// <summary>
281
+        /// 获取错误信息
282
+        /// </summary>
283
+        /// <param name="BizId"></param>
284
+        /// <returns></returns>
285
+        [ApiExplorerSettings(IgnoreApi = true)]
286
+        public T_Sms_Send GetSend(string BizId)
287
+        {
288
+            var sendliststr = _cache.GetString("T_Sms_Send");
289
+            var sendlist = new List<T_Sms_Send>();
290
+            if (!string.IsNullOrEmpty(sendliststr))
291
+            {
292
+                sendlist = sendliststr.ToList<T_Sms_Send>();
293
+            }
294
+            var send = sendlist.Where(p => p.BizId == BizId).FirstOrDefault();
295
+            if (send == null)
296
+            {
297
+                System.Threading.Thread.Sleep(1000);
298
+                send = GetSend(BizId);
299
+            }
300
+            string str = send.ToJson();
301
+            sendlist.Remove(send);
302
+            return str.ToObject<T_Sms_Send>();
303
+        }
304
+    }
305
+}

+ 150 - 0
SmsPlatform/Controllers/UserAccountController.cs

@@ -0,0 +1,150 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.Linq;
4
+using System.Threading.Tasks;
5
+using Microsoft.AspNetCore.Mvc;
6
+using Microsoft.Extensions.Caching.Distributed;
7
+using Microsoft.Extensions.Logging;
8
+using SmsPlatform.Common;
9
+using SmsPlatform.Model;
10
+
11
+namespace SmsPlatform.Controllers
12
+{
13
+    /// <summary>
14
+    /// 用户模块
15
+    /// </summary>
16
+    [Produces("application/json")]
17
+    [Route("api/[controller]")]
18
+    public class UserAccountController : BaseController
19
+    {
20
+        private readonly ILogger<UserAccountController> _logger;
21
+        private readonly IDistributedCache _cache;
22
+        public UserAccountController(IDistributedCache cache, ILogger<UserAccountController> logger)
23
+        {
24
+            _cache = cache;
25
+            _logger = logger;
26
+        }
27
+
28
+        /// <summary>
29
+        /// 获取用户列表
30
+        /// </summary>
31
+        /// <returns></returns>
32
+        [HttpGet("getlist")]
33
+        public async Task<IActionResult> GetList()
34
+        {
35
+            var liststr = await _cache.GetStringAsync("T_User_Account");
36
+            var list = new List<T_User_Account>();
37
+            if (!string.IsNullOrEmpty(liststr))
38
+            {
39
+                list = liststr.ToList<T_User_Account>();
40
+            }
41
+            return Success("成功", list);
42
+        }
43
+
44
+        /// <summary>
45
+        /// 获取用户详情 by id
46
+        /// </summary>
47
+        /// <param name="id">id</param>
48
+        /// <returns></returns>
49
+        [HttpGet("getsingle")]
50
+        public async Task<IActionResult> GetDetailsAsync(int id)
51
+        {
52
+            var liststr = await _cache.GetStringAsync("T_User_Account");
53
+            var list = new List<T_User_Account>();
54
+            if (!string.IsNullOrEmpty(liststr))
55
+            {
56
+                list = liststr.ToList<T_User_Account>();
57
+            }
58
+
59
+            var amtliststr = await _cache.GetStringAsync("T_User_Amount");
60
+            var amtlist = new List<T_User_Amount>();
61
+            if (!string.IsNullOrEmpty(amtliststr))
62
+            {
63
+                amtlist = amtliststr.ToList<T_User_Amount>();
64
+            }
65
+
66
+            var model = list.Where(p => p.Id == id).SingleOrDefault();
67
+            var amountlist = amtlist.Where(p => p.UserCode == model.UserCode).ToList();
68
+            var obj = new { model , amountlist };
69
+            return Success("成功", obj);
70
+        }
71
+
72
+        /// <summary>
73
+        /// 添加修改用户信息
74
+        /// </summary>
75
+        /// <param name="input">用户信息参数</param>
76
+        /// <returns></returns>
77
+        [HttpPost("addupdate")]
78
+        [ApiExplorerSettings(IgnoreApi = true)]
79
+        public async Task<IActionResult> AddUpdate(T_User_Account input)
80
+        {
81
+            #region 验证判断
82
+            if (string.IsNullOrEmpty(input.UserCode))
83
+                return Error("账号不能为空");
84
+            if (string.IsNullOrEmpty(input.Password))
85
+                return Error("密码不能为空");
86
+            if (string.IsNullOrEmpty(input.Sign))
87
+                return Error("签名不能为空");
88
+            #endregion
89
+
90
+            var liststr = await _cache.GetStringAsync("T_User_Account");
91
+            var list = new List<T_User_Account>();
92
+            if (!string.IsNullOrEmpty(liststr))
93
+            {
94
+                list = liststr.ToList<T_User_Account>();
95
+            }
96
+
97
+            var model = new T_User_Account();
98
+            if (input.Id != 0)
99
+            {
100
+                model = list.Where(p => p.Id == input.Id).SingleOrDefault();
101
+                if (model != null)
102
+                {
103
+                    model.UserCode = input.UserCode;
104
+                    model.Password = input.Password;
105
+                    model.UserName = input.UserName;
106
+                    model.Sign = input.Sign;
107
+                    model.Balance = input.Balance;
108
+                    await _cache.SetStringAsync("T_User_Account", list.ToJson());
109
+                    return Success("修改成功", model);
110
+                }
111
+            }
112
+            else
113
+            {
114
+                model.Id = list.Count > 0 ? list.Max(p => p.Id) + 1 : 1;
115
+                model.UserCode = input.UserCode;
116
+                model.Password = input.Password;
117
+                model.UserName = input.UserName;
118
+                model.Sign = input.Sign;
119
+                model.Balance = input.Balance;
120
+                model.CreateTime = DateTime.Now;
121
+                list.Add(model);
122
+                await _cache.SetStringAsync("T_User_Account", list.ToJson());
123
+                return Success("新增成功", model);
124
+            }
125
+
126
+            return Error("保存失败");
127
+        }
128
+
129
+        /// <summary>
130
+        /// 删除用户
131
+        /// </summary>
132
+        /// <param name="id"></param>
133
+        /// <returns></returns>
134
+        [HttpPost("delete")]
135
+        [ApiExplorerSettings(IgnoreApi = true)]
136
+        public async Task<IActionResult> Delete(int id)
137
+        {
138
+            var liststr = await _cache.GetStringAsync("T_User_Account");
139
+            var list = new List<T_User_Account>();
140
+            if (!string.IsNullOrEmpty(liststr))
141
+            {
142
+                list = liststr.ToList<T_User_Account>();
143
+            }
144
+            var model = list.Where(p => p.Id == id).SingleOrDefault();
145
+            list.Remove(model);
146
+            await _cache.SetStringAsync("T_User_Account", list.ToJson());
147
+            return Success("删除成功");
148
+        }
149
+    }
150
+}

+ 98 - 0
SmsPlatform/Model/T_Sms_Send.cs

@@ -0,0 +1,98 @@
1
+using System;
2
+namespace SmsPlatform.Model
3
+{
4
+    /// <summary>
5
+    /// T_Sms_Template:实体类(属性说明自动提取数据库字段的描述信息)
6
+    /// </summary>
7
+    [Serializable]
8
+    public partial class T_Sms_Send
9
+    {
10
+        public T_Sms_Send()
11
+        { }
12
+        #region Model
13
+        private int _id;
14
+        private string _phonenumber;
15
+        private string _bizid;
16
+        private DateTime? _sendtime;
17
+        private DateTime? _reporttime;
18
+        private int _state;
19
+        private string _errcode;
20
+        private string _errmsg;
21
+        private int _smssize;
22
+        /// <summary>
23
+        /// 自增id
24
+        /// </summary>
25
+        public int Id
26
+        {
27
+            set { _id = value; }
28
+            get { return _id; }
29
+        }
30
+        /// <summary>
31
+        /// 手机号码
32
+        /// </summary>
33
+        public string PhoneNumber
34
+        {
35
+            set { _phonenumber = value; }
36
+            get { return _phonenumber; }
37
+        }
38
+        /// <summary>
39
+        /// 发送回执ID
40
+        /// </summary>
41
+        public string BizId
42
+        {
43
+            set { _bizid = value; }
44
+            get { return _bizid; }
45
+        }
46
+        /// <summary>
47
+        /// 发送时间
48
+        /// </summary>
49
+        public DateTime? SendTime
50
+        {
51
+            set { _sendtime = value; }
52
+            get { return _sendtime; }
53
+        }
54
+        /// <summary>
55
+        /// 回执时间
56
+        /// </summary>
57
+        public DateTime? ReportTime
58
+        {
59
+            set { _reporttime = value; }
60
+            get { return _reporttime; }
61
+        }
62
+        /// <summary>
63
+        /// 发送状态 1:等待回执,2:发送失败,3:发送成功
64
+        /// </summary>
65
+        public int State
66
+        {
67
+            set { _state = value; }
68
+            get { return _state; }
69
+        }
70
+        /// <summary>
71
+        /// 错误码
72
+        /// </summary>
73
+        public string ErrCode
74
+        {
75
+            set { _errcode = value; }
76
+            get { return _errcode; }
77
+        }
78
+        /// <summary>
79
+        /// 错误信息
80
+        /// </summary>
81
+        public string ErrMsg
82
+        {
83
+            set { _errmsg = value; }
84
+            get { return _errmsg; }
85
+        }
86
+        /// <summary>
87
+        /// 	短信大小--140字节算一条短信,短信长度超过140字节时会拆分成多条短信发送
88
+        /// </summary>
89
+        public int SmsSize
90
+        {
91
+            set { _smssize = value; }
92
+            get { return _smssize; }
93
+        }
94
+        #endregion Model
95
+
96
+    }
97
+}
98
+

+ 71 - 0
SmsPlatform/Model/T_Sms_Template.cs

@@ -0,0 +1,71 @@
1
+using System;
2
+namespace SmsPlatform.Model
3
+{
4
+    /// <summary>
5
+    /// T_Sms_Template:实体类(属性说明自动提取数据库字段的描述信息)
6
+    /// </summary>
7
+    [Serializable]
8
+    public partial class T_Sms_Template
9
+    {
10
+        public T_Sms_Template()
11
+        { }
12
+        #region Model
13
+        private int _id;
14
+        private string _name;
15
+        private string _script;
16
+        private string _code;
17
+        private string _paramname;
18
+        private DateTime? _createtime;
19
+        /// <summary>
20
+        /// 自增id
21
+        /// </summary>
22
+        public int Id
23
+        {
24
+            set { _id = value; }
25
+            get { return _id; }
26
+        }
27
+        /// <summary>
28
+        /// 模板名称
29
+        /// </summary>
30
+        public string Name
31
+        {
32
+            set { _name = value; }
33
+            get { return _name; }
34
+        }
35
+        /// <summary>
36
+        /// 模板脚本
37
+        /// </summary>
38
+        public string Script
39
+        {
40
+            set { _script = value; }
41
+            get { return _script; }
42
+        }
43
+        /// <summary>
44
+        /// 模板Code
45
+        /// </summary>
46
+        public string Code
47
+        {
48
+            set { _code = value; }
49
+            get { return _code; }
50
+        }
51
+        /// <summary>
52
+        /// 模板参数名
53
+        /// </summary>
54
+        public string ParamName
55
+        {
56
+            set { _paramname = value; }
57
+            get { return _paramname; }
58
+        }
59
+        /// <summary>
60
+        /// 创建时间
61
+        /// </summary>
62
+        public DateTime? CreateTime
63
+        {
64
+            set { _createtime = value; }
65
+            get { return _createtime; }
66
+        }
67
+        #endregion Model
68
+
69
+    }
70
+}
71
+

+ 80 - 0
SmsPlatform/Model/T_User_Account.cs

@@ -0,0 +1,80 @@
1
+using System;
2
+namespace SmsPlatform.Model
3
+{
4
+    /// <summary>
5
+    /// T_User_Account:实体类(属性说明自动提取数据库字段的描述信息)
6
+    /// </summary>
7
+    [Serializable]
8
+    public partial class T_User_Account
9
+    {
10
+        public T_User_Account()
11
+        { }
12
+        #region Model
13
+        private int _id;
14
+        private string _usercode;
15
+        private string _password;
16
+        private string _username;
17
+        private decimal? _balance;
18
+        private string _sign;
19
+        private DateTime? _createtime;
20
+        /// <summary>
21
+        /// 自增id
22
+        /// </summary>
23
+        public int Id
24
+        {
25
+            set { _id = value; }
26
+            get { return _id; }
27
+        }
28
+        /// <summary>
29
+        /// 用户账号
30
+        /// </summary>
31
+        public string UserCode
32
+        {
33
+            set { _usercode = value; }
34
+            get { return _usercode; }
35
+        }
36
+        /// <summary>
37
+        /// 密码
38
+        /// </summary>
39
+        public string Password
40
+        {
41
+            set { _password = value; }
42
+            get { return _password; }
43
+        }
44
+        /// <summary>
45
+        /// 昵称
46
+        /// </summary>
47
+        public string UserName
48
+        {
49
+            set { _username = value; }
50
+            get { return _username; }
51
+        }
52
+        /// <summary>
53
+        /// 余额
54
+        /// </summary>
55
+        public decimal? Balance
56
+        {
57
+            set { _balance = value; }
58
+            get { return _balance; }
59
+        }
60
+        /// <summary>
61
+        /// 签名
62
+        /// </summary>
63
+        public string Sign
64
+        {
65
+            set { _sign = value; }
66
+            get { return _sign; }
67
+        }
68
+        /// <summary>
69
+        /// 创建时间
70
+        /// </summary>
71
+        public DateTime? CreateTime
72
+        {
73
+            set { _createtime = value; }
74
+            get { return _createtime; }
75
+        }
76
+        #endregion Model
77
+
78
+    }
79
+}
80
+

+ 71 - 0
SmsPlatform/Model/T_User_Amount.cs

@@ -0,0 +1,71 @@
1
+using System;
2
+namespace SmsPlatform.Model
3
+{
4
+    /// <summary>
5
+    /// T_User_Amount:实体类(属性说明自动提取数据库字段的描述信息)
6
+    /// </summary>
7
+    [Serializable]
8
+    public partial class T_User_Amount
9
+    {
10
+        public T_User_Amount()
11
+        { }
12
+        #region Model
13
+        private int _id;
14
+        private string _usercode;
15
+        private decimal? _amount;
16
+        private decimal? _balance;
17
+        private string _remark;
18
+        private DateTime? _createtime;
19
+        /// <summary>
20
+        /// 自增id
21
+        /// </summary>
22
+        public int Id
23
+        {
24
+            set { _id = value; }
25
+            get { return _id; }
26
+        }
27
+        /// <summary>
28
+        /// 用户账号
29
+        /// </summary>
30
+        public string UserCode
31
+        {
32
+            set { _usercode = value; }
33
+            get { return _usercode; }
34
+        }
35
+        /// <summary>
36
+        /// 金额变动
37
+        /// </summary>
38
+        public decimal? Amount
39
+        {
40
+            set { _amount = value; }
41
+            get { return _amount; }
42
+        }
43
+        /// <summary>
44
+        /// 余额
45
+        /// </summary>
46
+        public decimal? Balance
47
+        {
48
+            set { _balance = value; }
49
+            get { return _balance; }
50
+        }
51
+        /// <summary>
52
+        /// 备注
53
+        /// </summary>
54
+        public string Remark
55
+        {
56
+            set { _remark = value; }
57
+            get { return _remark; }
58
+        }
59
+        /// <summary>
60
+        /// 创建时间
61
+        /// </summary>
62
+        public DateTime? CreateTime
63
+        {
64
+            set { _createtime = value; }
65
+            get { return _createtime; }
66
+        }
67
+        #endregion Model
68
+
69
+    }
70
+}
71
+

+ 25 - 0
SmsPlatform/Program.cs

@@ -0,0 +1,25 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.IO;
4
+using System.Linq;
5
+using System.Threading.Tasks;
6
+using Microsoft.AspNetCore;
7
+using Microsoft.AspNetCore.Hosting;
8
+using Microsoft.Extensions.Configuration;
9
+using Microsoft.Extensions.Logging;
10
+
11
+namespace SmsPlatform
12
+{
13
+    public class Program
14
+    {
15
+        public static void Main(string[] args)
16
+        {
17
+            BuildWebHost(args).Run();
18
+        }
19
+
20
+        public static IWebHost BuildWebHost(string[] args) =>
21
+            WebHost.CreateDefaultBuilder(args)
22
+                .UseStartup<Startup>()
23
+                .Build();
24
+    }
25
+}

+ 29 - 0
SmsPlatform/Properties/launchSettings.json

@@ -0,0 +1,29 @@
1
+{
2
+  "iisSettings": {
3
+    "windowsAuthentication": false,
4
+    "anonymousAuthentication": true,
5
+    "iisExpress": {
6
+      "applicationUrl": "http://localhost:64157/",
7
+      "sslPort": 0
8
+    }
9
+  },
10
+  "profiles": {
11
+    "IIS Express": {
12
+      "commandName": "IISExpress",
13
+      "launchBrowser": true,
14
+      "launchUrl": "swagger",
15
+      "environmentVariables": {
16
+        "ASPNETCORE_ENVIRONMENT": "Development"
17
+      }
18
+    },
19
+    "SmsPlatform": {
20
+      "commandName": "Project",
21
+      "launchBrowser": true,
22
+      "launchUrl": "api/values",
23
+      "environmentVariables": {
24
+        "ASPNETCORE_ENVIRONMENT": "Development"
25
+      },
26
+      "applicationUrl": "http://localhost:64158/"
27
+    }
28
+  }
29
+}

+ 35 - 0
SmsPlatform/SmsPlatform.csproj

@@ -0,0 +1,35 @@
1
+<Project Sdk="Microsoft.NET.Sdk.Web">
2
+
3
+  <PropertyGroup>
4
+    <TargetFramework>netcoreapp2.0</TargetFramework>
5
+  </PropertyGroup>
6
+
7
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
8
+    <DocumentationFile>bin\Debug\netcoreapp2.0\SmsPlatform.xml</DocumentationFile>
9
+  </PropertyGroup>
10
+
11
+  <ItemGroup>
12
+    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
13
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.3" />
14
+    <PackageReference Include="NLog.Web.AspNetCore" Version="4.4.1" />
15
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
16
+  </ItemGroup>
17
+
18
+  <ItemGroup>
19
+    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.4" />
20
+  </ItemGroup>
21
+
22
+  <ItemGroup>
23
+    <Folder Include="Model\" />
24
+  </ItemGroup>
25
+
26
+  <ItemGroup>
27
+    <Reference Include="aliyun-net-sdk-core">
28
+      <HintPath>dll\aliyun-net-sdk-core.dll</HintPath>
29
+    </Reference>
30
+    <Reference Include="aliyun-net-sdk-dysmsapi">
31
+      <HintPath>dll\aliyun-net-sdk-dysmsapi.dll</HintPath>
32
+    </Reference>
33
+  </ItemGroup>
34
+
35
+</Project>

+ 112 - 0
SmsPlatform/Startup.cs

@@ -0,0 +1,112 @@
1
+using System;
2
+using System.Collections.Generic;
3
+using System.IO;
4
+using System.Linq;
5
+using System.Reflection;
6
+using System.Threading.Tasks;
7
+using Microsoft.AspNetCore.Builder;
8
+using Microsoft.AspNetCore.Hosting;
9
+using Microsoft.EntityFrameworkCore;
10
+using Microsoft.Extensions.Configuration;
11
+using Microsoft.Extensions.DependencyInjection;
12
+using Microsoft.Extensions.Logging;
13
+using Microsoft.Extensions.Options;
14
+using NLog.Extensions.Logging;
15
+using NLog.Web;
16
+using Swashbuckle.AspNetCore.Swagger;
17
+
18
+namespace SmsPlatform
19
+{
20
+    public class Startup
21
+    {
22
+        public Startup(IHostingEnvironment env)
23
+        {
24
+            Configuration = new ConfigurationBuilder()
25
+                            .SetBasePath(env.ContentRootPath)
26
+                            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
27
+                            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
28
+                            .AddEnvironmentVariables()
29
+                            .Build();
30
+        }
31
+
32
+        public IConfiguration Configuration { get; }
33
+
34
+        // This method gets called by the runtime. Use this method to add services to the container.
35
+        public void ConfigureServices(IServiceCollection services)
36
+        {
37
+            #region Cors 配置
38
+            //生产环境 的cors
39
+            services.AddCors(options =>
40
+            {
41
+                options.AddPolicy("CorsProd",
42
+                 builder => builder.AllowAnyOrigin()
43
+                //builder => builder.WithOrigins(Configuration["Cors"].Split(','))
44
+                .AllowAnyMethod()
45
+                .AllowAnyHeader()
46
+                .AllowCredentials().SetPreflightMaxAge(TimeSpan.FromMinutes(30)));
47
+            });
48
+            //开发环境的cors
49
+            services.AddCors(options =>
50
+            {
51
+                options.AddPolicy("CorsDev",
52
+                builder => builder.AllowAnyOrigin()
53
+                .AllowAnyMethod()
54
+                .AllowAnyHeader()
55
+                .AllowCredentials().SetPreflightMaxAge(TimeSpan.FromMinutes(30)));
56
+            });
57
+            #endregion
58
+
59
+            #region redis配置
60
+            services.AddDistributedRedisCache(options =>
61
+            {
62
+                options.InstanceName = Configuration["Redis:InstanceName"].ToString();
63
+                options.Configuration = $"{Configuration["Redis:HostName"].ToString()}:{Configuration["Redis:Port"].ToString()},allowAdmin=true,password={Configuration["Redis:Password"].ToString()},defaultdatabase={Configuration["Redis:Defaultdatabase"].ToString()}";
64
+            });
65
+            #endregion
66
+
67
+            //注册Swagger生成器,定义一个和多个Swagger 文档
68
+            services.AddSwaggerGen(c =>
69
+            {
70
+                c.SwaggerDoc("v1", new Info { Title = "SmsPlatform", Version = "v1" });
71
+                // 设置SWAGER JSON和UI的注释路径。
72
+                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
73
+                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
74
+                c.IncludeXmlComments(xmlPath);
75
+            });
76
+
77
+            services.AddMvc();
78
+        }
79
+
80
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
81
+        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
82
+        {
83
+            if (env.IsProduction())
84
+            {
85
+                app.UseCors("CorsProd");
86
+            }
87
+            else
88
+            {
89
+                app.UseCors("CorsDev");
90
+                app.UseDeveloperExceptionPage();
91
+                app.UseDatabaseErrorPage();
92
+                app.UseBrowserLink();
93
+            }
94
+
95
+            app.UseMvc();
96
+
97
+            loggerFactory.AddNLog();//添加NLog
98
+            env.ConfigureNLog("nlog.config");//读取Nlog配置文件
99
+            app.AddNLogWeb();
100
+
101
+            //启用中间件服务生成Swagger作为JSON终结点
102
+            app.UseSwagger();
103
+            //启用中间件服务对swagger-ui,指定Swagger JSON终结点
104
+            app.UseSwaggerUI(c =>
105
+            {
106
+                c.SwaggerEndpoint("/swagger/v1/swagger.json", "SmsPlatform V1");
107
+                // 要在应用程序的根处提供Swagger UI ,请将该RoutePrefix属性设置为空字符串
108
+                c.RoutePrefix = string.Empty;
109
+            });
110
+        }
111
+    }
112
+}

+ 24 - 0
SmsPlatform/appsettings.Development.json

@@ -0,0 +1,24 @@
1
+{
2
+  "Logging": {
3
+    "IncludeScopes": false,
4
+    "LogLevel": {
5
+      "Default": "Debug",
6
+      "System": "Information",
7
+      "Microsoft": "Information"
8
+    }
9
+  },
10
+  "Redis": {
11
+    "HostName": "139.224.236.21",
12
+    "Port": "4000",
13
+    "Password": "sms+800100",
14
+    "Defaultdatabase": "15",
15
+    "InstanceName": "sms"
16
+  },
17
+  "amount": 0.08,
18
+  "Dysms": {
19
+    "product": "Dysmsapi",
20
+    "domain": "dysmsapi.aliyuncs.com",
21
+    "accesskeyid": "LTAID8jj0g51ZsYv",
22
+    "accesskeysecret": "EH0S0XbUQihHSGA7FMutP0J8kzXqPk"
23
+  }
24
+}

+ 24 - 0
SmsPlatform/appsettings.Production.json

@@ -0,0 +1,24 @@
1
+{
2
+  "Logging": {
3
+    "IncludeScopes": false,
4
+    "LogLevel": {
5
+      "Default": "Info",
6
+      "System": "Info",
7
+      "Microsoft": "Info"
8
+    }
9
+  },
10
+  "Redis": {
11
+    "HostName": "139.224.236.21",
12
+    "Port": "4000",
13
+    "Password": "sms+800100",
14
+    "Defaultdatabase": "15",
15
+    "InstanceName": "sms"
16
+  },
17
+  "amount": 0.08,
18
+  "Dysms": {
19
+    "product": "Dysmsapi",
20
+    "domain": "dysmsapi.aliyuncs.com",
21
+    "accesskeyid": "LTAIICc6dV9MdBHK",
22
+    "accesskeysecret": "Ed5qMOJIp4QMMERpmMr48Zpu0BTcTN"
23
+  }
24
+}

+ 15 - 0
SmsPlatform/appsettings.json

@@ -0,0 +1,15 @@
1
+{
2
+  "Logging": {
3
+    "IncludeScopes": false,
4
+    "Debug": {
5
+      "LogLevel": {
6
+        "Default": "Warning"
7
+      }
8
+    },
9
+    "Console": {
10
+      "LogLevel": {
11
+        "Default": "Warning"
12
+      }
13
+    }
14
+  }
15
+}

BIN
SmsPlatform/dll/aliyun-net-sdk-core.dll


BIN
SmsPlatform/dll/aliyun-net-sdk-dysmsapi.dll


+ 71 - 0
SmsPlatform/nlog.config

@@ -0,0 +1,71 @@
1
+<?xml version="1.0" encoding="utf-8" ?>
2
+<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
3
+      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+      autoReload="true"
5
+      internalLogLevel="Error"
6
+      internalLogFile="nlogtemp\internal-nlog.txt">
7
+
8
+ <!-- 加载ASP.NET Core插件 -->
9
+  <extensions>
10
+    <add assembly="NLog.Web.AspNetCore"/>
11
+  </extensions>
12
+
13
+  <!-- 输出目的地 -->
14
+  <targets>
15
+    <!-- 输出到文件,这个文件记录所有日志 -->
16
+    <!--<target xsi:type="File" name="allfile" fileName="\nlogtemp\${shortdate}\nlog-all-${shortdate}.log"
17
+                layout="记录时间:${longdate}|控制器:${logger}|消息:${message} 异常:${exception}" />-->
18
+
19
+    <!-- 另外一个日志记录文件,户口也跳过Microsoft开头相关日志信息 -->
20
+    <!--archiveFileName表示滚动日志存放路径,log.{#####}.txt是滚动日志文件名-->
21
+    <!--archiveAboveSize每个日志文件大小的最大值(单位:字节)20(mb)=20971520(b),主日志文件超过大小超过该值时会将文件内容写入滚动日志并清空主日志文件内容-->
22
+    <!--maxArchiveFiles滚动日志文件上限数,滚动日志文件数达到上限新的文件内容会覆盖旧文件内容 -->
23
+
24
+    <target xsi:type="File" name="own_file" fileName="log/${shortdate}/own_${shortdate}.log"
25
+            archiveFileName="log/${shortdate}/own_${shortdate}.{#####}.log"
26
+            archiveAboveSize="20971520" archiveNumbering="Rolling" concurrentWrites="true" maxArchiveFiles="-1" keepFileOpen="false" 
27
+            layout="${level}|记录时间:${longdate}|${event-properties:item=EventId.Id}|控制器:${logger}|action: ${aspnet-mvc-action}|${newline}消息:${message}|${newline}异常:${exception}|${newline}url: ${aspnet-request-url}|${newline}" />
28
+    <!--layout="记录时间:${longdate}|控制器:${logger}|  action: ${aspnet-mvc-action}|  消息:${message} 异常:${exception}" />-->
29
+    <!--错误提示-->
30
+    
31
+
32
+    <target name="error_file" xsi:type="File" fileName="log/${shortdate}/error-${shortdate}.log"
33
+            archiveFileName="log/${shortdate}/own-${shortdate}.{#####}.log"
34
+            archiveAboveSize="20971520" archiveNumbering="Rolling" concurrentWrites="true" maxArchiveFiles="-1" keepFileOpen="false" 
35
+            layout="${level}|记录时间:${longdate}|控制器:${logger}|action: ${aspnet-mvc-action}|${newline}消息:${message}|${newline}异常:${onexception:${exception:format=tostring} ${newline} ${stacktrace}|${newline}" />
36
+    <target name="debugger_file" xsi:type="File" fileName="log/${shortdate}/debugger-${shortdate}.log"
37
+            archiveFileName="log/${shortdate}/debugger-${shortdate}.{#####}.log"
38
+            archiveAboveSize="20971520" archiveNumbering="Rolling" concurrentWrites="true" maxArchiveFiles="-1" keepFileOpen="false"
39
+            layout="${level}|记录时间:${date:format=HH/:mm/:ss}|控制器:${logger}|action: ${aspnet-mvc-action}|消息:${message}|${newline}" />
40
+     <target name="warn_file" xsi:type="File" fileName="log/${shortdate}/warn-${shortdate}.log"
41
+            archiveFileName="log/${shortdate}/warn-${shortdate}.{#####}.log"
42
+            archiveAboveSize="20971520" archiveNumbering="Rolling" concurrentWrites="true" maxArchiveFiles="-1" keepFileOpen="false" 
43
+            layout="${level}|记录时间:${date:format=HH/:mm/:ss}|控制器:${logger}|action: ${aspnet-mvc-action}|消息:${message}|${newline}" />
44
+    <!-- write to the void aka just remove -->
45
+    <target xsi:type="Null" name="blackhole" />
46
+  </targets>
47
+
48
+  <!-- 写入目的地的规则 -->
49
+  <rules>
50
+    <!--全部记录,包括Microsoft开头的相关日志信息-->
51
+    <!--<logger name="*" minlevel="Trace" writeTo="allfile" />-->
52
+
53
+    <!--name - 记录者的名字 (允许使用通配符*)
54
+        minlevel - 匹配日志范围的最低级别
55
+        maxlevel - 匹配日志范围的最高级别
56
+        level - 匹配的单一日志级别 :::::NLog 用于输出日志的级别包括:Trace,Debug,Info,Warn,Error,Fatal
57
+        levels - 匹配的一系列日志级别,由逗号分隔。
58
+        writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。-->
59
+
60
+    <!--跳过Microsoft开头的相关日志信息-->
61
+    <!--<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />-->
62
+
63
+    <!--错误提示-->
64
+    <logger name="*" minlevel="Trace" writeTo="own_file" />
65
+    <logger name="*" level="Debug" writeTo="debugger_file" />
66
+    <logger name="*" minlevel="Error" writeTo="error_file" />
67
+    <logger name="*" level="Warn" writeTo="warn_file" />
68
+ 
69
+
70
+  </rules>
71
+</nlog>

+ 122 - 0
SmsReceive/Program.cs

@@ -0,0 +1,122 @@
1
+using Aliyun.Acs.Core;
2
+using Aliyun.Acs.Core.Profile;
3
+using Microsoft.Extensions.Caching.Redis;
4
+using Microsoft.Extensions.Caching.Distributed;
5
+using Microsoft.Extensions.Configuration;
6
+using System;
7
+using System.Threading;
8
+
9
+namespace SmsReceive
10
+{
11
+    class Program
12
+    {
13
+        private static int maxThread = 2;
14
+        static IAcsClient acsClient = null;
15
+        private static RedisCache redisCache = null;
16
+        static void Main(string[] args)
17
+        {
18
+            var config = new ConfigurationBuilder().AddJsonFile("config.json", optional: true, reloadOnChange: true).Build();
19
+
20
+            redisCache = new RedisCache(new RedisCacheOptions()
21
+            {
22
+                InstanceName = config["Redis:InstanceName"].ToString(),
23
+                Configuration = $"{config["Redis:HostName"].ToString()}:{config["Redis:Port"].ToString()},allowAdmin=true,password={config["Redis:Password"].ToString()},defaultdatabase={config["Redis:Defaultdatabase"].ToString()}"
24
+            });
25
+
26
+            ////redisCache.Remove("T_Sms_Send");
27
+            //var userliststr = redisCache.GetStringAsync("T_Sms_Send").Result.ToString();
28
+            //Console.WriteLine(userliststr);
29
+
30
+            string product = config["Dysms:product"].ToString();
31
+            string domain = config["Dysms:domain"].ToString();
32
+            string accesskeyid = config["Dysms:accesskeyid"].ToString();
33
+            string accesskeysecret = config["Dysms:accesskeysecret"].ToString();
34
+            string messagetype = config["Dysms:messagetype"].ToString();
35
+            string queuename = config["Dysms:queuename"].ToString();
36
+            string regionid = config["Dysms:regionid"].ToString();
37
+            string mnsaccountendpoint = config["Dysms:mnsaccountendpoint"].ToString();
38
+
39
+            IClientProfile profile = DefaultProfile.GetProfile(regionid, accesskeyid, accesskeysecret);
40
+            DefaultProfile.AddEndpoint(regionid, regionid, product, domain);
41
+            acsClient = new DefaultAcsClient(profile);
42
+
43
+            //for (int i = 0; i < maxThread; i++)
44
+            //{
45
+            //    ReceiveTask testTask = new ReceiveTask("PullMessageTask-thread-" + i, messagetype, queuename, mnsaccountendpoint, acsClient, redisCache);
46
+            //    Thread t = new Thread(new ThreadStart(testTask.Handle));
47
+            //    //启动线程
48
+            //    t.Start();
49
+            //}
50
+
51
+            ReceiveTask testTask = new ReceiveTask("PullMessageTask-thread", messagetype, queuename, mnsaccountendpoint, acsClient, redisCache);
52
+            Thread t = new Thread(new ThreadStart(testTask.Handle));
53
+            //启动线程
54
+            t.Start();
55
+
56
+            Console.ReadKey();
57
+        }
58
+
59
+        public partial class T_User_Amount
60
+        {
61
+            public T_User_Amount()
62
+            { }
63
+            #region Model
64
+            private int _id;
65
+            private string _usercode;
66
+            private decimal? _amount;
67
+            private decimal? _balance;
68
+            private string _remark;
69
+            private DateTime? _createtime;
70
+            /// <summary>
71
+            /// 自增id
72
+            /// </summary>
73
+            public int Id
74
+            {
75
+                set { _id = value; }
76
+                get { return _id; }
77
+            }
78
+            /// <summary>
79
+            /// 用户账号
80
+            /// </summary>
81
+            public string UserCode
82
+            {
83
+                set { _usercode = value; }
84
+                get { return _usercode; }
85
+            }
86
+            /// <summary>
87
+            /// 金额变动
88
+            /// </summary>
89
+            public decimal? Amount
90
+            {
91
+                set { _amount = value; }
92
+                get { return _amount; }
93
+            }
94
+            /// <summary>
95
+            /// 余额
96
+            /// </summary>
97
+            public decimal? Balance
98
+            {
99
+                set { _balance = value; }
100
+                get { return _balance; }
101
+            }
102
+            /// <summary>
103
+            /// 备注
104
+            /// </summary>
105
+            public string Remark
106
+            {
107
+                set { _remark = value; }
108
+                get { return _remark; }
109
+            }
110
+            /// <summary>
111
+            /// 创建时间
112
+            /// </summary>
113
+            public DateTime? CreateTime
114
+            {
115
+                set { _createtime = value; }
116
+                get { return _createtime; }
117
+            }
118
+            #endregion Model
119
+
120
+        }
121
+    }
122
+}

+ 247 - 0
SmsReceive/ReceiveTask.cs

@@ -0,0 +1,247 @@
1
+using Aliyun.Acs.Core;
2
+using Aliyun.Acs.Dybaseapi.Model.V20170525;
3
+using Aliyun.MNS;
4
+using Aliyun.MNS.Model;
5
+using Microsoft.Extensions.Caching.Redis;
6
+using Microsoft.Extensions.Caching.Distributed;
7
+using System;
8
+using System.Collections.Generic;
9
+using System.Text;
10
+using System.Threading;
11
+using Newtonsoft.Json.Linq;
12
+using Newtonsoft.Json;
13
+using System.Linq;
14
+using Newtonsoft.Json.Converters;
15
+
16
+namespace SmsReceive
17
+{
18
+    public class ReceiveTask
19
+    {
20
+        private object o = new object();
21
+        private int sleepTime = 50;
22
+        public String name { get; private set; }
23
+        public String messageType { get; private set; }
24
+        public String queueName { get; private set; }
25
+        public String mnsAccountEndpoint { get; private set; }
26
+        public int TaskID { get; private set; }
27
+        public IAcsClient acsClient { get; private set; }
28
+        public RedisCache redisCache = null;
29
+
30
+        public ReceiveTask(String name, String messageType, String queueName, String mnsAccountEndpoint, IAcsClient acsClient, RedisCache redisCache)
31
+        {
32
+            this.name = name;
33
+            this.messageType = messageType;
34
+            this.queueName = queueName;
35
+            this.mnsAccountEndpoint = mnsAccountEndpoint;
36
+            this.acsClient = acsClient;
37
+            this.redisCache = redisCache;
38
+        }
39
+        long bufferTime = 60 * 2;//过期时间小于2分钟则重新获取,防止服务器时间误差
40
+
41
+        Dictionary<string, QueryTokenForMnsQueueResponse.QueryTokenForMnsQueue_MessageTokenDTO> tokenMap = new Dictionary<string, QueryTokenForMnsQueueResponse.QueryTokenForMnsQueue_MessageTokenDTO>();
42
+        Dictionary<string, Queue> queueMap = new Dictionary<string, Queue>();
43
+
44
+        /// 处理消息
45
+        public void Handle()
46
+        {
47
+            while (true)
48
+            {
49
+                try
50
+                {
51
+                    QueryTokenForMnsQueueResponse.QueryTokenForMnsQueue_MessageTokenDTO token = null;
52
+                    Queue queue = null;
53
+                    lock (o)
54
+                    {
55
+                        if (tokenMap.ContainsKey(messageType))
56
+                        {
57
+                            token = tokenMap[messageType];
58
+                        }
59
+                        if (queueMap.ContainsKey(queueName))
60
+                        {
61
+                            queue = queueMap[queueName];
62
+                        }
63
+                        TimeSpan ts = new TimeSpan(0);
64
+                        if (token != null)
65
+                        {
66
+                            DateTime b = Convert.ToDateTime(token.ExpireTime);
67
+                            DateTime c = Convert.ToDateTime(DateTime.Now);
68
+                            ts = b - c;
69
+                        }
70
+                        if (token == null || ts.TotalSeconds < bufferTime || queue == null)
71
+                        {
72
+                            token = GetTokenByMessageType(acsClient, messageType);
73
+                            IMNS client = new Aliyun.MNS.MNSClient(token.AccessKeyId, token.AccessKeySecret, mnsAccountEndpoint, token.SecurityToken);
74
+                            queue = client.GetNativeQueue(queueName);
75
+                            if (tokenMap.ContainsKey(messageType))
76
+                            {
77
+                                tokenMap.Remove(messageType);
78
+                            }
79
+                            if (queueMap.ContainsKey(queueName))
80
+                            {
81
+                                queueMap.Remove(queueName);
82
+                            }
83
+                            tokenMap.Add(messageType, token);
84
+                            queueMap.Add(queueName, queue);
85
+                        }
86
+                    }
87
+                    BatchReceiveMessageResponse batchReceiveMessageResponse = queue.BatchReceiveMessage(16);
88
+                    if (batchReceiveMessageResponse != null)
89
+                    {
90
+                        List<Message> messages = batchReceiveMessageResponse.Messages;
91
+                        foreach (var msg in messages)
92
+                        {
93
+                            try
94
+                            {
95
+                                byte[] outputb = Convert.FromBase64String(msg.Body);
96
+                                string orgStr = Encoding.UTF8.GetString(outputb);
97
+                                System.Console.WriteLine(orgStr);
98
+                                ////TODO 具体消费逻辑,待客户自己实现.
99
+
100
+                                //var orgmodel = JObject.Parse(orgStr.Replace("&nbsp;", ""));
101
+                                //if (orgmodel["success"].ToString().ToLower() != "true")
102
+                                //{
103
+                                //    var sendliststr = redisCache.GetString("T_Sms_Send");
104
+                                //    var sendlist = new List<T_Sms_Send>();
105
+                                //    if (!string.IsNullOrEmpty(sendliststr))
106
+                                //    {
107
+                                //        sendlist = JsonConvert.DeserializeObject<List<T_Sms_Send>>(sendliststr);
108
+                                //    }
109
+                                //    var send = new T_Sms_Send();
110
+                                //    send.Id = sendlist.Count > 0 ? sendlist.Max(p => p.Id) + 1 : 1;
111
+                                //    send.BizId = orgmodel["biz_id"].ToString();
112
+                                //    send.PhoneNumber = orgmodel["phone_number"].ToString();
113
+                                //    send.SendTime = DateTime.Now;
114
+                                //    send.ReportTime = DateTime.Parse(orgmodel["report_time"].ToString());
115
+                                //    send.SendTime= DateTime.Parse(orgmodel["send_time"].ToString());
116
+                                //    send.SmsSize = Int32.Parse(orgmodel["sms_size"].ToString());
117
+                                //    send.State = 2;
118
+                                //    send.ErrCode= orgmodel["err_code"].ToString();
119
+                                //    send.ErrMsg = orgmodel["err_msg"].ToString();
120
+                                //    sendlist.Add(send);
121
+
122
+                                //    var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
123
+                                //    redisCache.SetString("T_Sms_Send", JsonConvert.SerializeObject(sendlist, timeConverter));
124
+                                //}
125
+
126
+                                //消费成功的前提下删除消息
127
+                                queue.DeleteMessage(msg.ReceiptHandle);
128
+                            }
129
+                            catch (Exception e)
130
+                            {
131
+                                System.Console.WriteLine("exception:" + e.Message.ToString());
132
+                            }
133
+                        }
134
+                    }
135
+                }
136
+                catch (Exception e)
137
+                {
138
+                    System.Console.WriteLine("Handle exception:" + e.Message.ToString());
139
+                }
140
+                Thread.Sleep(sleepTime);
141
+            }
142
+        }
143
+
144
+        public QueryTokenForMnsQueueResponse.QueryTokenForMnsQueue_MessageTokenDTO GetTokenByMessageType(IAcsClient acsClient, String messageType)
145
+        {
146
+            QueryTokenForMnsQueueRequest request = new QueryTokenForMnsQueueRequest();
147
+            request.MessageType = messageType;
148
+            QueryTokenForMnsQueueResponse queryTokenForMnsQueueResponse = acsClient.GetAcsResponse(request);
149
+            QueryTokenForMnsQueueResponse.QueryTokenForMnsQueue_MessageTokenDTO token = queryTokenForMnsQueueResponse.MessageTokenDTO;
150
+            return token;
151
+        }
152
+
153
+
154
+        /// <summary>
155
+        /// 消息类
156
+        /// </summary>
157
+        public partial class T_Sms_Send
158
+        {
159
+            public T_Sms_Send()
160
+            { }
161
+            #region Model
162
+            private int _id;
163
+            private string _phonenumber;
164
+            private string _bizid;
165
+            private DateTime? _sendtime;
166
+            private DateTime? _reporttime;
167
+            private int _state;
168
+            private string _errcode;
169
+            private string _errmsg;
170
+            private int _smssize;
171
+            /// <summary>
172
+            /// 自增id
173
+            /// </summary>
174
+            public int Id
175
+            {
176
+                set { _id = value; }
177
+                get { return _id; }
178
+            }
179
+            /// <summary>
180
+            /// 手机号码
181
+            /// </summary>
182
+            public string PhoneNumber
183
+            {
184
+                set { _phonenumber = value; }
185
+                get { return _phonenumber; }
186
+            }
187
+            /// <summary>
188
+            /// 发送回执ID
189
+            /// </summary>
190
+            public string BizId
191
+            {
192
+                set { _bizid = value; }
193
+                get { return _bizid; }
194
+            }
195
+            /// <summary>
196
+            /// 发送时间
197
+            /// </summary>
198
+            public DateTime? SendTime
199
+            {
200
+                set { _sendtime = value; }
201
+                get { return _sendtime; }
202
+            }
203
+            /// <summary>
204
+            /// 回执时间
205
+            /// </summary>
206
+            public DateTime? ReportTime
207
+            {
208
+                set { _reporttime = value; }
209
+                get { return _reporttime; }
210
+            }
211
+            /// <summary>
212
+            /// 发送状态 1:等待回执,2:发送失败,3:发送成功
213
+            /// </summary>
214
+            public int State
215
+            {
216
+                set { _state = value; }
217
+                get { return _state; }
218
+            }
219
+            /// <summary>
220
+            /// 错误码
221
+            /// </summary>
222
+            public string ErrCode
223
+            {
224
+                set { _errcode = value; }
225
+                get { return _errcode; }
226
+            }
227
+            /// <summary>
228
+            /// 错误信息
229
+            /// </summary>
230
+            public string ErrMsg
231
+            {
232
+                set { _errmsg = value; }
233
+                get { return _errmsg; }
234
+            }
235
+            /// <summary>
236
+            /// 	短信大小--140字节算一条短信,短信长度超过140字节时会拆分成多条短信发送
237
+            /// </summary>
238
+            public int SmsSize
239
+            {
240
+                set { _smssize = value; }
241
+                get { return _smssize; }
242
+            }
243
+            #endregion Model
244
+
245
+        }
246
+    }
247
+}

+ 35 - 0
SmsReceive/SmsReceive.csproj

@@ -0,0 +1,35 @@
1
+<Project Sdk="Microsoft.NET.Sdk">
2
+
3
+  <PropertyGroup>
4
+    <OutputType>Exe</OutputType>
5
+    <TargetFramework>netcoreapp2.1</TargetFramework>
6
+  </PropertyGroup>
7
+
8
+  <ItemGroup>
9
+    <PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
10
+    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
11
+    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
12
+  </ItemGroup>
13
+
14
+  <ItemGroup>
15
+    <Reference Include="aliyun-net-sdk-core">
16
+      <HintPath>dll\aliyun-net-sdk-core.dll</HintPath>
17
+    </Reference>
18
+    <Reference Include="aliyun-net-sdk-dybaseapi">
19
+      <HintPath>dll\aliyun-net-sdk-dybaseapi.dll</HintPath>
20
+    </Reference>
21
+    <Reference Include="aliyun-net-sdk-dysmsapi">
22
+      <HintPath>dll\aliyun-net-sdk-dysmsapi.dll</HintPath>
23
+    </Reference>
24
+    <Reference Include="Aliyun.MNS">
25
+      <HintPath>dll\Aliyun.MNS.dll</HintPath>
26
+    </Reference>
27
+  </ItemGroup>
28
+
29
+  <ItemGroup>
30
+    <None Update="config.json">
31
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
32
+    </None>
33
+  </ItemGroup>
34
+
35
+</Project>

+ 30 - 0
SmsReceive/config.json

@@ -0,0 +1,30 @@
1
+{
2
+  "Logging": {
3
+    "IncludeScopes": false,
4
+    "LogLevel": {
5
+      "Default": "Debug",
6
+      "System": "Error",
7
+      "Microsoft": "Error",
8
+      "Steeltoe": "Error"
9
+    }
10
+  },
11
+  "Redis": {
12
+    "HostName": "139.224.236.21",
13
+    "Port": "4000",
14
+    "Password": "sms+800100",
15
+    "Defaultdatabase": "15",
16
+    "InstanceName": "sms"
17
+  },
18
+  "amount": 0.08,
19
+  "Dysms": {
20
+    "product": "Dybaseapi",
21
+    "domain": "dybaseapi.aliyuncs.com",
22
+    "accesskeyid": "LTAIICc6dV9MdBHK",
23
+    "accesskeysecret": "Ed5qMOJIp4QMMERpmMr48Zpu0BTcTN",
24
+    "messagetype": "SmsReport", //消息类型目前有4种. 短信回执:SmsReport; 短信上行:SmsUp; 语音回执:VoiceReport; 流量回执:FlowReport;
25
+    "queuename": "Alicom-Queue-1751140347246528-SmsReport",
26
+    "regionid": "cn-hangzhou",
27
+    "maxthread": 2,
28
+    "mnsaccountendpoint": "https://1943695596114318.mns.cn-hangzhou.aliyuncs.com/"
29
+  }
30
+}

BIN
SmsReceive/dll/Aliyun.MNS.dll


BIN
SmsReceive/dll/aliyun-net-sdk-core.dll


BIN
SmsReceive/dll/aliyun-net-sdk-dybaseapi.dll


BIN
SmsReceive/dll/aliyun-net-sdk-dysmsapi.dll