如何在C# WebAPI项目中使用【手机短信】发送验证码?(用于登录/注册等验证操作)

时间:2024-02-23 21:40:39

博主是调用第三方【棒子云】短信接口进行发送验证码的,然后也可以调用别的,方法都是大同小异的。

 

1.棒子云官网:http://smsow.zhenzikj.com/

 

2进行【注册】操作

 

3.在官网点击【个人登陆】进行操作。登录后可以看到自己的后台,自己可以设置短信模板什么的。系统会默认送你【10次】发送验证码的机会。然后就需要买了,最低充值10元,10元能发270条短信,大概就是0.03元一条咯,感觉也不是很贵~

 

4.点击【详情】可以获取应用的AppId、AppSecret,在调用的时候要用到的。

 

可以在官网自行看API文档,下载SDK源码

 

然后正式开始吧~~

5.新建一个程序就不用我说了吧,Windows窗体应用程序/ASP.NET Web应用程序都行,博主新建的是一个WebApi程序。。然后新建一个Class类,用来封装发送验证码的。可在官网SDK下载Coty。博主给出源码,注意修改命名空间。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
namespace 短信验证码.Models
{
    public class TaoTaoClient
    {
        private static readonly string DEFAULT_CHARSET = "UTF-8";
        private static readonly int CONNECTION_TIMEOUT = 20 * 1000;
        private static readonly int READ_TIMEOUT = 20 * 1000;
        private String apiUrl = "";
        private string appId;
        private string appSecret;


        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="apiUrl"></param>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        public  TaoTaoClient(string apiUrl, string appId, string appSecret)
        {
            this.apiUrl = apiUrl;
            this.appId = appId;
            this.appSecret = appSecret;
        }  



        public String Send(Dictionary<string, string> parameters)
        {
            parameters.Add("appId", appId);
            parameters.Add("appSecret", appSecret);
            var result = DoPost(apiUrl + "/sms/send.do", parameters, DEFAULT_CHARSET, CONNECTION_TIMEOUT,
                    READ_TIMEOUT);
            return result;
        }  


        public String Balance()
        {
            var parameters = new Dictionary<string, string>();
            parameters.Add("appId", appId);
            parameters.Add("appSecret", appSecret);

            var result = DoPost(apiUrl + "/account/balance.do",
                parameters,
                DEFAULT_CHARSET,
                CONNECTION_TIMEOUT,
                READ_TIMEOUT);
            return result;
        }


        public String FindSmsByMessageId(string messageId)
        {
            var parameters = new Dictionary<string, string>();
            parameters.Add("appId", appId);
            parameters.Add("appSecret", appSecret);
            parameters.Add("messageId", messageId);
            var result = DoPost(apiUrl + "/smslog/findSmsByMessageId.do",
                parameters,
                DEFAULT_CHARSET,
                CONNECTION_TIMEOUT,
                READ_TIMEOUT);
            return result;
        }


        private string DoPost(string url, Dictionary<string, string> parameters, string charset, int connectionTimeout, int readTimeout)
        {
            var ret = string.Empty;
            var contentType = "application/x-www-form-urlencoded;charset=" + charset;
            var encoding = BuildEncoding(charset);
            var query = BuildQuery(parameters, encoding);
            var queryBytes = encoding.GetBytes(query);
            var httpRequest = BuildRequest(url, contentType, queryBytes);

            var requestStream = httpRequest.GetRequestStream();
            requestStream.Write(queryBytes, 0, queryBytes.Length);

            using (var rsp = httpRequest.GetResponse())
            {
                using (var rspStream = rsp.GetResponseStream())
                {
                    using (var streamReader = new StreamReader(rspStream))
                    {
                        ret = streamReader.ReadToEnd();
                    }
                }
            }
            return ret;
        }


        private Encoding BuildEncoding(string charset)
        {
            var encoding = Encoding.UTF8;
            if (!string.IsNullOrEmpty(charset))
            {
                encoding = Encoding.GetEncoding(charset);
            }

            return encoding;
        }


        private HttpWebRequest BuildRequest(string url, string contentType, byte[] queryBytes)
        {
            HttpWebRequest httpRequest = null;
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                //ServicePointManager.SecurityProtocol = spt; //不指定,使之自动协商/适应, 避免指定的版本与服务器不一样反而连不上
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                httpRequest = WebRequest.Create(url) as HttpWebRequest;
                httpRequest.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                httpRequest = WebRequest.Create(url) as HttpWebRequest;
            }
            httpRequest.Method = "POST";
            httpRequest.ContentType = contentType;
            httpRequest.Accept = "text/xml,text/javascript,text/html";
            httpRequest.ContentLength = queryBytes.Length;
            return httpRequest;
        }


        /// <summary>
        /// 默认charset为UTF-8
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="charset"></param>
        /// <returns></returns>
        public String BuildQuery(Dictionary<string, string> parameters, Encoding encoding)
        {
            if ((parameters == null) || (parameters.Count == 0))
            {
                return string.Empty;
            }
            var query = new StringBuilder();
            var hasParam = false;

            foreach (var kvp in parameters)
            {
                String name = kvp.Key;
                String value = kvp.Value;
                if (!string.IsNullOrEmpty(name))
                {
                    if (hasParam)
                    {
                        query.Append("&");
                    }
                    else
                    {
                        hasParam = true;
                    }
                    query.Append(name).Append("=").Append(HttpUtility.UrlEncode(value, encoding));
                }
            }
            return query.ToString();
        }
        private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受
        }


    }
}

 

6.然后新建一个控制器【TestController】,在这个控制器中调用刚刚封装的【TaoTaoClient.cs】类,调用方法发送验证码。(注意:博主这里写的是API)

 

7.博主使用【postman】调用接口进行测试。可以看出是发送成功的~