简单发送短信功能.net core版实用技巧

2021年10月26日09:53:29 评论 4528字阅读15分5秒

简单发送短信功能.net core版实用技巧

下面是.net core版实现,只是简单发送短信功能: 

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;

namespace ConsoleApp1
{
public class SmsHelper
{
public static string Post(string url, string data, Encoding encoding)
{
try
{
HttpWebRequest req = WebRequest.CreateHttp(new Uri(url));
req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
req.Method = "POST";
req.Accept = "text/xml,text/javascript";
req.ContinueTimeout = 60000;

byte[] postData = encoding.GetBytes(data);
Stream reqStream = req.GetRequestStreamAsync().Result;
reqStream.Write(postData, 0, postData.Length);
reqStream.Dispose();

var rsp = (HttpWebResponse)req.GetResponseAsync().Result;
var result = GetResponseAsString(rsp, encoding);
return result;
}
catch (Exception ex)
{
throw;
}
}

public static T Post<T>(string url, string data, Encoding encoding)
{
try
{
var result = Post(url, data, encoding);
return JsonConvert.DeserializeObject<T>(result);
}
catch (Exception ex)
{
return default(T);
}
}

public static string BuildQuery(IDictionary<string, string> parameters)
{
if (parameters == null || parameters.Count == 0)
{
return null;
}

StringBuilder query = new StringBuilder();
bool hasParam = false;

foreach (KeyValuePair<string, string> kv in parameters)
{
string name = kv.Key;
string value = kv.Value;
// 忽略参数名或参数值为空的参数
if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
{
if (hasParam)
{
query.Append("&");
}

query.Append(name);
query.Append("=");
query.Append(WebUtility.UrlEncode(value));
hasParam = true;
}
}

return query.ToString();
}

public static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
Stream stream = null;
StreamReader reader = null;

try
{
// 以字符流的方式读取HTTP响应
stream = rsp.GetResponseStream();
reader = new StreamReader(stream, encoding);
return reader.ReadToEnd();
}
finally
{
// 释放资源
if (reader != null) reader.Dispose();
if (stream != null) stream.Dispose();
if (rsp != null) rsp.Dispose();
}
}

public static string GetAlidayuSign(IDictionary<string, string> parameters, string secret, string signMethod)
{
//把字典按Key的字母顺序排序
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);

//把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
if (Constants.SIGN_METHOD_MD5.Equals(signMethod))
{
query.Append(secret);
}
foreach (KeyValuePair<string, string> kv in sortedParams)
{
if (!string.IsNullOrEmpty(kv.Key) && !string.IsNullOrEmpty(kv.Value))
{
query.Append(kv.Key).Append(kv.Value);
}
}

//使用MD5/HMAC加密
if (Constants.SIGN_METHOD_HMAC.Equals(signMethod))
{
return Hmac(query.ToString(), secret);
}
else
{
query.Append(secret);
return Md5(query.ToString());
}
}

public static string Hmac(string value, string key)
{
byte[] bytes;
using (var hmac = new HMACMD5(Encoding.UTF8.GetBytes(key)))
{
bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(value));
}
StringBuilder result = new StringBuilder();
foreach (byte t in bytes)
{
result.Append(t.ToString("X2"));

}
return result.ToString();
}

public static string Md5(string value)
{
byte[] bytes;
using (var md5 = MD5.Create())
{
bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
}
var result = new StringBuilder();
foreach (byte t in bytes)
{
result.Append(t.ToString("X2"));
}
return result.ToString();
}

public static SmsResultAli SendSms(string url, string appKey, string appSecret, DateTime timestamp, Dictionary<string, string> parsms)
{
var txtParams = new SortedDictionary<string, string>();
txtParams.Add(Constants.METHOD, "alibaba.aliqin.fc.sms.num.send");
txtParams.Add(Constants.VERSION, "2.0");
txtParams.Add(Constants.SIGN_METHOD, Constants.SIGN_METHOD_HMAC);
txtParams.Add(Constants.APP_KEY, appKey);
txtParams.Add(Constants.FORMAT, "json");
txtParams.Add(Constants.TIMESTAMP, timestamp.ToString(Constants.DATE_TIME_FORMAT));
txtParams.Add(Constants.SMS_TYPE, "normal");
foreach (var item in parsms)
{
txtParams.Add(item.Key,item.Value);
}

txtParams.Add(Constants.SIGN, GetAlidayuSign(txtParams, appSecret, Constants.SIGN_METHOD_HMAC));
var result = Post<SmsResultAli>(url, BuildQuery(txtParams), Encoding.UTF8);

return result;
}

}

public class SmsResultAli
{
public SmsResponseALi Alibaba_Aliqin_Fc_Sms_Num_Send_Response { get; set; }
}

public class SmsResponseALi
{
public string Request_Id { get; set; }
public SmsResponseResultAli Result { get; set; }
}

public class SmsResponseResultAli
{
public string Err_Code { get; set; }

public string Model { get; set; }

public bool Success { get; set; }
}
}

发送短信时:

var parms = new Dictionary<string, string>();
parms.Add(Constants.EXTEND, "123456");
parms.Add(Constants.REC_NUM, "138********");
parms.Add(Constants.SMS_FREE_SIGN_NAME, "霍山网站建设尚仁建站");
parms.Add(Constants.SMS_PARAM, "{\"code\":\"1234\",\"product\":\"霍山网站建设尚仁建站\"}");
parms.Add(Constants.SMS_TEMPLATE_CODE, "SMS_10000000");

var req = SmsHelper.SendSms("http://gw.api.taobao.com/router/rest", "appKey", "appSecret", DateTime.Now, parms);

继续阅读
  • 文本由 发表于 2021年10月26日09:53:29
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
微信公众号编辑实用的小工具和小技巧 新媒体

微信公众号编辑实用的小工具和小技巧

微信公众号编辑实用的小工具和小技巧 最近有关注我的朋友应该可以感觉到我对公众号的更新和推送变的比较及时了,基本上可以保证是跟网站同步更新推送了。在微信公众号里更新文章时我就发现公众号的编辑器简直是弱爆...
微博实时号养成攻略 新媒体

微博实时号养成攻略

微博实时号养成攻略 1.什么是微博实时号? 比如:在手机端/电脑PC端搜索栏中搜索“刘强东管理京东的精髓都概括”这个句话的时候,能够在综合和实时这个两个板块看到这个实时号发的微博。(以下截图为例) 搜...
微博话题运营之话题上榜 新媒体

微博话题运营之话题上榜

微博话题运营之话题上榜 今天,想要跟大家分享的内容是“微博话题”。 微博话题,直观的反射了当下大众对社会热点及事件的关注。 由于话题独有的开放性及互动性,通常也会被企业作为用来曝光产品或者服务一个非常...
微博运营之怎样蹭流量 新媒体

微博运营之怎样蹭流量

微博运营之怎样蹭流量 上周围绕微博运营同大家风向关于微博话题的创建及内容规划的思维及策略 今天,想要跟大家分享的内容偏向于落地。 也就是,我们创建了话题,怎样借助热门话题、热门事件实现内容的曝光,所谓...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: