短信平台

SmsHelper.cs 6.9KB

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