吴晓阳
发布于 2025-06-18 / 18 阅读
0

移动云MAS短信发送代码

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);