LOOPC软件工作室

首页 » 技术文章 » 代码编程 » C# 电信能力开放平台API
admin - 2009/12/7 16:11:00
本代码封装了对电信能力开放平台提供的发短信、语言呼叫接口的调用。把此代码加到自己的项目中就很容易实现短信验证码、短信提示、回拨卡业务等功能。

TelephoneAPI.cs:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Security.Cryptography;
  5. using System.Web;
  6. using System.Net;

  7. namespace Telephone
  8. {
  9.     public enum ResultCode
  10.     {
  11.         OK = 200,
  12.         非法请求_禁止发送 = 403,
  13.         请求消息错误 = 400,
  14.         请求失败 = 480
  15.     }


  16.     public class API
  17.     {
  18.         string transactionID;
  19.         string token;


  20.         #region 获取由SHA1加密的字符串
  21.         public string EncryptToSHA1(string str)
  22.         {
  23.             SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
  24.             byte[] str1 = Encoding.UTF8.GetBytes(str);
  25.             byte[] str2 = sha1.ComputeHash(str1);
  26.             sha1.Clear();
  27.             (sha1 as IDisposable).Dispose();
  28.             return Convert.ToBase64String(str2);
  29.         }
  30.         #endregion

  31.         #region 获取由MD5加密的字符串
  32.         public string EncryptToMD5(string str)
  33.         {
  34.             MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
  35.             byte[] str1 = Encoding.UTF8.GetBytes(str);
  36.             byte[] str2 = md5.ComputeHash(str1, 0, str1.Length);
  37.             md5.Clear();
  38.             (md5 as IDisposable).Dispose();
  39.             return Convert.ToBase64String(str2);
  40.         }


  41.         #endregion

  42.         public string GetBase64String(string str)
  43.         {
  44.             byte[] buf = Encoding.UTF8.GetBytes(str);
  45.             return Convert.ToBase64String(buf);
  46.         }

  47.         /// <summary>
  48.         /// 获取一个时间戳,它是从1970年1月1日0时开始至现在的毫秒数
  49.         /// </summary>
  50.         /// <returns></returns>
  51.         public long GetTimeStamp()
  52.         {
  53.             TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1);
  54.             long timeStamp = (long)ts.TotalMilliseconds;
  55.             return timeStamp;
  56.         }


  57.         /// <summary>
  58.         /// 登录
  59.         /// </summary>
  60.         /// <param name="apID">你的用户ID</param>
  61.         /// <param name="apUserAccount">你的用户名</param>
  62.         /// <param name="funID">功能ID(短信或者呼叫等能力的编号)</param>
  63.         /// <param name="apKey">密钥</param>
  64.         public void Login(int apID, string apUserAccount, int funID, string apKey)
  65.         {
  66.             long timeStamp = this.GetTimeStamp();

  67.             //AuthRequestValue 格式如下:TimeStamp + “$” + APID+ “$” + APUserAccount + “$” + FunID + “$” + UrlEncode(Authenticator),其中Authenticator的生成算法如下:Authenticator = Base64(SHA1 (TimeStamp + “$” + APID+ “$” + APUserAccount + “$” + FunID + “$” + APKEY))
  68.             string authenticator = EncryptToSHA1(string.Format("{0}${1}${2}${3}${4}", timeStamp, apID, apUserAccount, funID, apKey));
  69.             string authRequestValue = string.Format("{0}${1}${2}${3}${4}", timeStamp, apID, apUserAccount, funID, HttpUtility.UrlEncode(authenticator));

  70.             using (WebClient client = new WebClient())
  71.             {
  72.                 client.Encoding = Encoding.UTF8;
  73.                 string authResponseValue = client.DownloadString(string.Format("http://www.ctopen.cn/InterfaceForAP/Auth.aspx?AuthRequest={0}", authRequestValue));
  74.                 //AuthResponseValue格式如下:Result + “$”+ TransactionID + “$”+ Token+ “$” + ErrorDescription+ “$” + TimeStamp
  75.                 string[] resultArr = authResponseValue.Split(new char[] { '$' });
  76.                 int resultCode = int.Parse(resultArr[0]);
  77.                 if (resultCode == 0)
  78.                 {
  79.                     this.transactionID = resultArr[1];
  80.                     this.token = resultArr[2];
  81.                     timeStamp = long.Parse(resultArr[4]);
  82.                 }
  83.                 else
  84.                 {
  85.                     string errorDesc = resultArr[3];
  86.                     throw new Exception(errorDesc);
  87.                 }
  88.             }
  89.         }

  90.         /// <summary>
  91.         /// 打电话
  92.         /// </summary>
  93.         /// <param name="num1">第一呼叫号码(目前会听到广告)</param>
  94.         /// <param name="num2">第二呼叫号码</param>
  95.         /// <param name="num3"></param>
  96.         /// <param name="num4"></param>
  97.         /// <param name="num5"></param>
  98.         /// <returns>返回本次通话的会话ID,用于挂断电话</returns>
  99.         public string MakeCall(string num1, string num2, string num3, string num4, string num5)
  100.         {
  101.             string callbackUrl = "http://mail.loopc.com:443/CallReport.aspx";//用于记录通话时间等信息。查看费用请访问[url]http://mail.loopc.com:443/[/url]你的电话号码.txt
  102.             string safeCode = "";//好像没有作用。
  103.             long timeStamp = this.GetTimeStamp();//时间戳,用于计费
  104.             //用以标识唯一的呼叫,呼叫模块在中间计费或结束计费上报时将通过该字段上报。格式:第一呼叫号_时间戳(秒)_三位随机数
  105.             string sessionId = string.Format("{0}_{1}_{2}", num1, timeStamp, 123);//挂机时会用到

  106.             // 其中MakeCallRequestValue格式如下:Token+ “$” + Sessionid + “$” + Num1 + “$” + Num2+ “$”+Num3+ “$”+Num4+ “$”+Num5+ “$”+Code+ “$”+Url
  107.             string makeCallRequestValue = string.Format("{0}${1}${2}${3}${4}${5}${6}${7}${8}", this.token, sessionId, num1, num2, num3, num4, num5, safeCode, callbackUrl);
  108.             using (WebClient client = new WebClient())
  109.             {
  110.                 client.Encoding = Encoding.UTF8;
  111.                 string makeCallResponse = client.DownloadString(string.Format("http://118.123.249.4/ims/ghcall.php?MakeCallRequest={0}", makeCallRequestValue));
  112.                 ResultCode resultCode = (ResultCode)int.Parse(makeCallResponse);//200: 发送成功,403:非法请求_禁止发送,400:请求消息错误,480:请求失败
  113.                 if (resultCode != ResultCode.OK)
  114.                 {
  115.                     throw new Exception(resultCode.ToString());
  116.                 }
  117.                 return sessionId;
  118.             }
  119.         }

  120.         /// <summary>
  121.         /// 挂断电话
  122.         /// </summary>
  123.         /// <param name="sessioinId">打电话时的会话ID</param>
  124.         public void HangupCall(string sessioinId)
  125.         {
  126.             using (WebClient client = new WebClient())
  127.             {
  128.                 client.Encoding = Encoding.UTF8;
  129.                 string response = client.DownloadString(string.Format("http://118.123.249.4/ims/ghcall.php?HangupCallRequest={0}", sessioinId));
  130.                 ResultCode resultCode = (ResultCode)int.Parse(response);//挂断呼叫结果{200: 挂机成功,400:请求消息错误,480:请求失败}
  131.                 if (resultCode != ResultCode.OK)
  132.                 {
  133.                     throw new Exception(resultCode.ToString());
  134.                 }
  135.             }
  136.         }

  137.         /// <summary>
  138.         /// 发送短信给指定号码
  139.         /// </summary>
  140.         /// <param name="msg">消息内容(不超过70汉字,英文不能超过140字符)</param>
  141.         /// <param name="toNo">接收者号码</param>
  142.         public void SendMsg(string msg, string toNo)
  143.         {
  144.             string fromNo = "";//指定以电信的哪个号码发出去。
  145.             msg = GetBase64String(msg);
  146.             //SendMsgRequestValue=UrlEncode(Token+ “$” + Phone + “$” + Msg + “$” + From)
  147.             string sendMsgRequestValue = string.Format("{0}${1}${2}${3}", this.token, toNo, msg, fromNo);
  148.             sendMsgRequestValue = HttpUtility.UrlEncode(sendMsgRequestValue);

  149.             using (WebClient client = new WebClient())
  150.             {
  151.                 client.Encoding = Encoding.UTF8;
  152.                 string response = client.DownloadString(string.Format("http://118.123.249.4/ims/ghsendim.php?SendMsgRequest={0}", sendMsgRequestValue));
  153.                 response = response.Replace("SendMsgResponse=", "");//接口返回格式不统一,只好去除多余的字符。
  154.                 ResultCode resultCode = (ResultCode)int.Parse(response); //短信发送结果:{200: 发送成功,403:非法请求_禁止发送,400:请求消息错误}
  155.                 if (resultCode != ResultCode.OK)
  156.                 {
  157.                     throw new Exception(resultCode.ToString());
  158.                 }
  159.             }
  160.         }

  161.     }
  162. }
复制代码
测试代码
Program.cs:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace Telephone
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             API api = new API();

  12.             api.Login(10000111, "xu123456", 10000033, "5e30d0303a874415ae641f227b5c29b6");  //登录

  13.             api.SendMsg("hello", "13500000001");//发短信

  14.             string sessionId = api.MakeCall("13500000001", "1350000002", null, null, null);//打电话,目前好像就支持两个人通话
  15.             Console.WriteLine(sessionId);

  16.             Console.WriteLine("press any key to hangup the call.");
  17.             Console.ReadLine();
  18.             api.HangupCall(sessionId);//挂断电话

  19.             Console.WriteLine("end.");
  20.             Console.ReadLine();
  21.         }
  22.     }
  23. }
复制代码
net200 - 2009/12/7 22:52:00
支持 ,这个需要跟电信申请什么么
admin - 2009/12/8 14:16:00
原帖由 net200 于 2009-12-7 22:52:00 发表
支持 ,这个需要跟电信申请什么么


对,需要到电信的网站注册账号就可以使用了。
电信能力开放平台网址:http://open.ctfactory.com/Portal/index/index.aspx
12
查看完整版本: C# 电信能力开放平台API