如何在C# WebAPI項目中使用【手機短信】發送驗證碼?(用於登錄/注冊等驗證操作)


博主是調用第三方【棒子雲】短信接口進行發送驗證碼的,然后也可以調用別的,方法都是大同小異的。

 

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】調用接口進行測試。可以看出是發送成功的~

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM