博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
玄武短信接口和移动MAS短信接口的API封装
阅读量:4134 次
发布时间:2019-05-25

本文共 12517 字,大约阅读时间需要 41 分钟。

直接上代码,关键点:

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         ///  87         /// 玄武短信发送 88         ///  89         /// 短信内容 90         /// 以,分隔的手机号码 91         private void SendByMos(String context, String mobileStr) 92         { 93             string AppName = ""; 94  95             if (Request["AppName"] == null) 96             { 97                 AppName = "CVTalk"; 98             } 99             else100             {101                 AppName = Request["AppName"];102             }103 104             string Phone6ID = "0";105             //发送内容106             string Context = "";107 108             PhoneDal phoneDal = new PhoneDal();109             try110             {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                     else169                         Context = contextSuccess;170                 }171                 else172                 {173                     Context = contextSuccess;174                 }175 176                 if (string.IsNullOrEmpty(fromPhone))177                 {178                     //fromPhone为空,则一定是系统发送的短信,不予处理回复,统一设置扩展码为0179                     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         /// 207         /// 移动MAS短信发送208         /// 209         /// 短信内容210         /// 以,或;分隔的手机号码211         /// 
212 private string SendByMas(String context, String mobileStr)213 {214 string AppName = "";215 216 if (Request["AppName"] == null)217 {218 AppName = "CVTalk";219 }220 else221 {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 else248 Context = context;249 250 }251 else252 {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 else268 {269 sm = apiclient.sendSM(mobiles[i], Context, smsID);270 }271 272 }273 }274 else275 {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 }

 

转载地址:http://rxpvi.baihongyu.com/

你可能感兴趣的文章
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
JAVA数据类型
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>