using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace YunMas
{
public class SmsClient
{
private readonly string _apiUrl;
private readonly string _ecName;
private readonly string _apId;
private readonly string _secretKey;
private readonly HttpClient _httpClient;
public SmsClient()
{
_apiUrl = "https://112.33.46.17:37892/sms";
_ecName = "单位名称";
_apId = "账号";
_secretKey = "密码";
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
}
public async Task<string> SendSMSAsync(string mobiles, string content)
{
// 准备发送参数
string sign = "kShfoldpE"; // 签名编码
string addSerial = ""; // 扩展码
// 发送短信
string result = await SendSMSAsync(mobiles, content, sign, addSerial);
Console.WriteLine("短信发送结果: " + result);
return result;
}
/// <summary>
/// 发送短信
/// </summary>
/// <param name="mobiles">接收手机号,逗号分隔</param>
/// <param name="content">短信内容</param>
/// <param name="sign">签名编码</param>
/// <param name="addSerial">扩展码</param>
/// <returns>API响应结果</returns>
public async Task<string> SendSMSAsync(string mobiles, string content, string sign, string addSerial = "")
{
try
{
// 生成MAC签名
string mac = GenerateMac(_ecName, _apId, _secretKey, mobiles, content, sign, addSerial);
// 构建请求参数
var requestData = new Dictionary<string, string>
{
["ecName"] = _ecName,
["apId"] = _apId,
["mobiles"] = mobiles,
["content"] = content,
["sign"] = sign,
["addSerial"] = addSerial,
["mac"] = mac
};
// 序列化请求数据
var jsonContent = JsonConvert.SerializeObject(requestData);
// 将 JSON 字符串转换为 base64 编码
string encodedContent = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonContent));
// 创建 StringContent 对象
var base64content = new StringContent(encodedContent, Encoding.UTF8, "application/json");
// 发送请求
HttpResponseMessage response = await _httpClient.PostAsync(_apiUrl + "/submit", base64content);
// 处理响应
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
return $"Error: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}";
}
}
catch (Exception ex)
{
return $"Exception: {ex.Message}";
}
}
/// <summary>
/// 生成MAC签名
/// </summary>
private string GenerateMac(string ecName, string apId, string secretKey,
string mobiles, string content, string sign, string addSerial)
{
// 按顺序拼接参数
string rawString = $"{ecName}{apId}{secretKey}{mobiles}{content}{sign}{addSerial}";
// 计算MD5哈希
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(rawString);
byte[] hashBytes = md5.ComputeHash(inputBytes);
// 转换为32位小写字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
return sb.ToString();
}
}
public async Task<string> SendDeliverAsync()
{
try
{
// 构建请求参数
var requestData = new Dictionary<string, string>
{
["ecName"] = _ecName,
["apId"] = _apId,
["secretKey"] = _secretKey,
};
// 序列化请求数据
var jsonContent = JsonConvert.SerializeObject(requestData);
// 将 JSON 字符串转换为 base64 编码
string encodedContent = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonContent));
// 创建 StringContent 对象
var base64content = new StringContent(encodedContent, Encoding.UTF8, "application/json");
// 发送请求
HttpResponseMessage response = await _httpClient.PostAsync(_apiUrl + "/report", base64content);// deliver report
// 处理响应
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
return $"Error: {response.StatusCode} - {await response.Content.ReadAsStringAsync()}";
}
}
catch (Exception ex)
{
return $"Exception: {ex.Message}";
}
}
}
}
使用方式:
string mobiles = "13736969112";
string content = "这是一条测试短信,吴晓阳,重构后的版本123456";
SmsClient client = new SmsClient();
string result = await client.SendSMSAsync(mobiles, content);
Console.WriteLine("短信发送结果: " + result);