在给客户开发一个信息发送功能的时候,需要涉及到短信的发送,短信发送一般不同的厂商提供的接口不同,处理方式也不太一样,之前用的一个厂商的,提供了一个封装类就很容易发送短息,因此都是基于HTTP协议做的一个数据发送而已,接触阿里云的短信服务器后,发现阿里云还增加了非常多的参数,其中包括一些秘钥和签名的内容。短信发送由于比较敏感原因,大多数应用场景是验证码或者一些固定的信息提醒,因此厂商都要求客户按预定的模板来发送,这样限制了短信的应用场景,只能根据业务进行消息定制了。本篇随笔主要介绍阿里云的短信服务的发送处理。
1、短信发送的处理介绍
在短信发送中,阿里云提供自己的SDK封装,以降低使用的难度,不过需要引入它提供的SDK类库;本篇随笔主要介绍基于HTTP方式进行自行的封装处理,这部分代码我从网上摘录并进行一定的调整,测试成功。
使用阿里云的短信服务,需要注册登录自己的阿里云控制台,然后进入AccessKeys的处理界面
然后系统会提示需要创建一个新的Key(如果没有的话就创建,否则使用已有的即可)
这里我们获取到AccessKey ID 和Access Key Secret两个关键信息,需要用在数据签名的里面的。
另外我们需要创建一个SignName,也就是签名,一般为我们短信提示的公司名称,如【广州爱奇迪】这样的字样。
短信是基于模板的,阿里云不能发送随意的内容,因此只能基于模板发送,如验证码或者业务消息,有点类似微信的模板消息了,因此里面可以添加变量发送的。
记得我以前写过一个关于动态变量的信息发送的文章《一个包含动态变量的短信模板设计分析》,就是介绍如何处理变量模板消息的。
阿里云默认提供了一些基础模板,如下所示。
一般我们业务可能还需要定制一些业务消息,那么需要审核通过才可以使用新增的模板消息。
短信的发送可以利用API接口进行发送,如下所示是它的API说明
如果需要采集用户的回复信息,如一些随访记录,那么需要做一个接口的处理,如下所示。
发送短信的API接口详细说明如下所示。
其实请求信息比上面列出的信息多很多,包括秘钥和数据加密信息等的处理,下面详细给出代码说明。
2、模板消息发送
有了上面的信息介绍,我们大概了解了短信消息发送的处理规则了。
实际上,发送信息的时候,我们可能需要添加很多参数信息,如下代码所示。
Dictionary<string, string> keyValues = new Dictionary<string, string>();//声明一个字典 //1.系统参数 keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid().ToString()); keyValues.Add("AccessKeyId", AccessKeyId); keyValues.Add("SignatureVersion", "1.0"); keyValues.Add("Timestamp", nowDate); keyValues.Add("Format", "Json");//可换成xml //2.业务api参数 keyValues.Add("Action", "SendSms"); keyValues.Add("Version", "2017-05-25"); keyValues.Add("RegionId", "cn-hangzhou"); keyValues.Add("PhoneNumbers", mobile); keyValues.Add("SignName", SignName); keyValues.Add("TemplateParam", "{\"code\":\"" + code + "\"}"); keyValues.Add("TemplateCode", templateCode); keyValues.Add("OutId", "123");
具体我们来贴出不用SDK的短信发送辅助类,如下代码所示。
/// <summary> /// 阿里短信发送 /// </summary> public class SmsHelper { private const string endpoint = "dysmsapi.aliyuncs.com"; private const string AccessKeyId = "你的秘钥键"; private const string AccessKeySecret = "你的秘钥值"; private const string SignName = "广州爱奇迪"; /// <summary> /// 短信验证码 /// </summary> /// <param name="mobile"></param> /// <param name="code"></param> /// <returns></returns> public static string SendSms(string mobile, int code, string templateCode = "SMS_126645400") { string nowDate = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss'Z'");//GTM时间 Dictionary<string, string> keyValues = new Dictionary<string, string>();//声明一个字典 //1.系统参数 keyValues.Add("SignatureMethod", "HMAC-SHA1"); keyValues.Add("SignatureNonce", Guid.NewGuid().ToString()); keyValues.Add("AccessKeyId", AccessKeyId); keyValues.Add("Signatu