玄武短信接口和移动MAS短信接口的API封装

直接上代码,关键点:

133行的敏感词过滤

176行的6位扩展码写入

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Web.UI;
  6 using System.Web.UI.WebControls;
  7 using CVTE.Utils;
  8 using ImApiDotNet;
  9 using CVTE.ServiceModel;
 10 using System.Configuration;
 11 using System.Threading;
 12 using System.Text;
 13 
 14 namespace CVTE.Portal
 15 {
 16     public partial class SmsSend : System.Web.UI.Page
 17     {
 18         private String[] retunvalues = new String[] { "成功", "连接数据库失败", "数据库关闭失败", "数据库插入错误", "数据库删除错误", "数据库查询错误", "参数错误", "API标识非法", "消息内容太长", "没有初始化或初始化失败", "API接口处于暂停(失效)状态", "短信网关未连接" };
 19         private String[] initvalues = new String[] { "成功", "连接失败", "用户名或密码错误", "密码错误", "接口编码不存在" };
 20         private ImApiDotNet.APIClient apiclient;
 21 
 22         //是否联通号码,用于MAS过滤。在玄武短信中已不用考虑这个问题。
 23         bool isLianTong(string mobile)
 24         {
 25             bool result = false;
 26             if (mobile.StartsWith("186") || mobile.StartsWith("185") || mobile.StartsWith("156") || mobile.StartsWith("155")
 27                 || mobile.StartsWith("131") || mobile.StartsWith("132") || mobile.StartsWith("130") || mobile.StartsWith("145"))
 28                 result = true;
 29 
 30             return result;
 31         }
 32 
 33         protected void Page_Load(object sender, EventArgs e)
 34         {
 35             if (!IsPostBack)
 36             {
 37                 try
 38                 {
 39                     if (Request["mobile"] == null)
 40                         return;
 41                     if (Request["context"] == null)
 42                         return;
 43                     if (Request["context"].Length < 1)
 44                         return;
 45                     if (Request["AppName"] == null)
 46                         return;
 47 
 48                     String context = Request["context"].Replace("&", "").Replace("+", "").Replace("#", "");
 49 
 50                     String mobileStr = Request["mobile"];
 51                     if (mobileStr == "")
 52                     {
 53                         return;
 54                     }
 55                     string smsProvider = ConfigurationManager.AppSettings["SmsProvider"];
 56 
 57                     if (Request["SmsProvider"] == null)
 58                     {
 59                         if (smsProvider.Equals("MAS"))
 60                         {
 61                             SendByMas(context, mobileStr);
 62                         }
 63 
 64                         if (smsProvider.Equals("MOS"))
 65                         {
 66                             //MOS的发送号码是以空格分隔的,和mas的半角逗号不同
 67                             mobileStr = mobileStr.Replace(";", " ").Replace(",", " ");
 68                             SendByMos(context, mobileStr);
 69                         }
 70                     }
 71                     else if (Request["SmsProvider"] == "MOS")
 72                     {
 73                         mobileStr = mobileStr.Replace(";", " ").Replace(",", " ");
 74                         SendByMos(context, mobileStr);
 75                     }
 76 
 77                 }
 78                 catch (Exception ex)
 79                 {
 80                     //MessageBox.Show(this.Page, ex.Message);
 81                 }
 82             }
 83 
 84         }
 85 
 86         /// <summary>
 87         /// 玄武短信发送
 88         /// </summary>
 89         /// <param name="context">短信内容</param>
 90         /// <param name="mobileStr">以,分隔的手机号码</param>
 91         private void SendByMos(String context, String mobileStr)
 92         {
 93             string AppName = "";
 94 
 95             if (Request["AppName"] == null)
 96             {
 97                 AppName = "CVTalk";
 98             }
 99             else
100             {
101                 AppName = Request["AppName"];
102             }
103 
104             string Phone6ID = "0";
105             //发送内容
106             string Context = "";
107 
108             PhoneDal phoneDal = new PhoneDal();
109             try
110             {
111                 string fromPhone = "";
112                 if (Request["from"] != null)
113                 {
114                     if (Request["from"].ToLower() != "sysmessage")
115                     {
116                         fromPhone = phoneDal.GetPhone(Request["from"]);
117                     }
118                 }
119 
120                 //MOS只能识别GB2312,所以要对utf-8进行UrlDecode转码
121                 string IMMoshost = ConfigurationManager.AppSettings["MosURL"] + @"username=XXXXXX&password=XXXXXX&";
122                 string contextUrlDecode = System.Web.HttpUtility.UrlDecode(context, System.Text.Encoding.UTF8);
123 
124                 //关键词库为空,则从数据库把词库导入内存
125                 if (SensitiveWords.GetWords().Count == 0)
126                 {
127                     SensitiveWords.SetWords(SensitiveWordsDal.GetAllWords());
128                 }
129 
130                 int keyMatchCount = 0;
131                 string keys = "";
132 
133                 //开始关键词过滤,通过内存查询
134                 foreach (string word in SensitiveWords.GetWords())
135                 {
136                     if (contextUrlDecode != null)
137                     {
138                         if (contextUrlDecode.Contains(word))
139                         {
140                             StringBuilder sb = new StringBuilder();
141                             foreach (char ch in word)
142                             {
143                                 sb.Append(ch + "~");
144                             }
145                             keyMatchCount++;
146                             keys += word + " ";
147                             context = context.Replace(word, sb.ToString());
148                         }
149                     }
150                 }
151 
152                 if (keyMatchCount > 0)
153                 {
154                     string alertMSG = "亲,您先前发送的短信包含运营商敏感字:“ " + keys + " ” 我们修改了您的短信内容后重新发送。修改后短信内容:" + context;
155                     string IMhost = "http://xxxxxxxx.cn:8989/IMMessageAPI/im/toim.do?tousername=" + Request["from"] + "&message=" + alertMSG + "&subject=CVTalk短信异常";
156                     WebHelper.GetWebData(IMhost);
157                     contextUrlDecode = System.Web.HttpUtility.UrlDecode(context, System.Text.Encoding.UTF8);
158 
159                 }
160                 string contextSuccess = System.Web.HttpUtility.UrlEncode(contextUrlDecode, System.Text.Encoding.GetEncoding("GB2312"));
161 
162                 if (Request["to"] != null)
163                 {
164                     if (Request["cnName"] != null && fromPhone != null)
165                     {
166                         Context = "CVTalk" + HttpUtility.UrlEncode(Request["cnName"], System.Text.Encoding.GetEncoding("GB2312")) + fromPhone + " :" + contextSuccess + ConfigurationSettings.AppSettings["smsAD"];
167                     }
168                     else
169                         Context = contextSuccess;
170                 }
171                 else
172                 {
173                     Context = contextSuccess;
174                 }
175 
176                 if (string.IsNullOrEmpty(fromPhone))
177                 {
178                     //fromPhone为空,则一定是系统发送的短信,不予处理回复,统一设置扩展码为0
179                     Phone6ID = "0";
180                 }
181                 else//查询到用户的手机号
182                 {
183                     //获取用户的手机号后6位,这里是为了定位用户,有100万分之一的重复风险
184                     Phone6ID = fromPhone.Substring(5);
185                 }
186 
187                 string result = WebHelper.GetWebData(IMMoshost + "to=" + mobileStr + "&text=" + Context + "&subid=" + Phone6ID + "&msgtype=1");
188                 //对第一次发送失败,进行第二次补发
189                 if (result != "0")
190                 {
191                     Thread.Sleep(20);
192                     //第二次发送
193                     string result2 = WebHelper.GetWebData(IMMoshost + "to=" + mobileStr + "&text=" + Context + "&subid=" + Phone6ID + "&msgtype=1");
194                     Response.Write(result2);
195                     Response.End();
196                 }
197                 Response.Write(result);
198                 Response.End();
199             }
200             catch (Exception ex)
201             {
202                 //Response.Write(ex.Message);
203             }
204         }
205 
206         /// <summary>
207         /// 移动MAS短信发送
208         /// </summary>
209         /// <param name="context">短信内容</param>
210         /// <param name="mobileStr">以,或;分隔的手机号码</param>
211         /// <returns></returns>
212         private string SendByMas(String context, String mobileStr)
213         {
214             string AppName = "";
215 
216             if (Request["AppName"] == null)
217             {
218                 AppName = "CVTalk";
219             }
220             else
221             {
222                 AppName = Request["AppName"];
223             }
224 
225             apiclient = new APIClient();
226 
227             int con = apiclient.init("172.xx.xx.xx", "bpm", "bpm", "BPM", "mas");
228             con = System.Math.Abs(con);
229 
230             mobileStr = mobileStr.Replace("", ",");
231 
232             int sm = 1;
233             //if (Request["cnName"] != null)
234             Random r = new Random();
235             int smsID = r.Next(0, 999999);//产生0-999999之间的整数,用于无后六位号码的情况
236             int Phone6ID = 0;
237             //只支持发送一个手机号码
238             string Context = "";
239 
240             PhoneDal phoneDal = new PhoneDal();
241             string fromPhone = phoneDal.GetPhone(Request["from"]);
242 
243             if (Request["to"] != null)
244             {
245                 if (Request["cnName"] != null)
246                     Context = "CVTalk" + Request["cnName"] + fromPhone + " :" + context + ConfigurationSettings.AppSettings["smsAD"];
247                 else
248                     Context = context;
249 
250             }
251             else
252             {
253                 Context = context;
254             }
255 
256             string[] mobiles = mobileStr.Split(',');
257             if (string.IsNullOrEmpty(fromPhone) || mobiles.Length > 1)
258             {
259                 //sm = apiclient.sendSM(mobiles, Context, smsID);
260                 for (int i = 0; i < mobiles.Length; i++)
261                 {
262                     //如果是联通号码
263                     if (isLianTong(mobiles[i]))
264                     {
265                         sm = apiclient.sendSM(mobiles[i], Context + "回复TD退订", smsID);
266                     }
267                     else
268                     {
269                         sm = apiclient.sendSM(mobiles[i], Context, smsID);
270                     }
271 
272                 }
273             }
274             else
275             {
276 
277                 //sm = apiclient.sendSM(mobileStr.Split(','), Context, smsID);
278                 //发送者号码的后6位
279                 //smsID和srcID 没有办法分离,如果分置,将无法回复,因为将溯源至srcID,而不是smsID。
280                 //smsID和srcID就必须设置为一样的!这样可以让发送者固定发送号码,但这样发送者给所有人的smsID都将将相同,
281                 //造成的结果是,第一次发送可以成功,第一次回复是可以成功,但第三次交互(发送者再次回复),信息会回复错乱
282                 //(这是因为在发送者给多人发送信息后,smsID是一样的,第三次回复将无法准确定位)
283                 //目前采用后6位为ID的方法,因为最多只能拿6位,如果重复将异常。
284 
285                 Phone6ID = Convert.ToInt32(fromPhone.Substring(5));
286                 sm = apiclient.sendSM(mobiles, Context, Phone6ID);
287                 smsID = Phone6ID;
288             }
289 
290             apiclient.release();
291 
292             CVTE.Model.IMSms model = new CVTE.Model.IMSms();
293             model.AppName = AppName;
294             model.FromUserName = Request["from"];
295             model.ToUserName = Request["to"];
296             model.ID = Guid.NewGuid().ToString();
297 
298             System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
299             byte[] key = Convert.FromBase64String("YzJjZGxmZ2hcamtsvW5vcHbycXXXXXXXXXX");
300             byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };      //当模式为ECB时,IV无用
301             byte[] data = utf8.GetBytes(context);
302 
303             byte[] byteEncode = DES3.Des3EncodeECB(key, iv, data);
304             string strEncode = Convert.ToBase64String(byteEncode);
305             //加密
306             model.Msg = sm.ToString() + "-" + strEncode;
307 
308             model.SendTime = System.DateTime.Now;
309             model.SmsID = smsID;// Convert.ToInt32(mobileStr.Split(',')[0].Substring(3)); srcID;// 
310             model.ToMoblie = Request["mobile"];
311             model.FromUserCNName = Request["cnName"];
312 
313             CVTE.BLL.IMSms bll = new CVTE.BLL.IMSms();
314             bll.Add(model);
315 
316             Response.Write(retunvalues[sm]);
317             Response.End();
318             return mobileStr;
319         }
320     }
321 }

 

posted @ 2016-03-04 10:11  昕友软件开发  阅读(2061)  评论(0编辑  收藏  举报
欢迎访问我的开源项目:xyIM企业即时通讯