玄武短信接口和移动MAS短信接口的API封装
直接上代码,关键点:
133行的敏感词过滤
176行的6位扩展码写入
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CVTE.Utils;
using ImApiDotNet;
using CVTE.ServiceModel;
using System.Configuration;
using System.Threading;
using System.Text; namespace CVTE.Portal
{
public partial class SmsSend : System.Web.UI.Page
{
private String[] retunvalues = new String[] { "成功", "连接数据库失败", "数据库关闭失败", "数据库插入错误", "数据库删除错误", "数据库查询错误", "参数错误", "API标识非法", "消息内容太长", "没有初始化或初始化失败", "API接口处于暂停(失效)状态", "短信网关未连接" };
private String[] initvalues = new String[] { "成功", "连接失败", "用户名或密码错误", "密码错误", "接口编码不存在" };
private ImApiDotNet.APIClient apiclient; //是否联通号码,用于MAS过滤。在玄武短信中已不用考虑这个问题。
bool isLianTong(string mobile)
{
bool result = false;
if (mobile.StartsWith("") || mobile.StartsWith("") || mobile.StartsWith("") || mobile.StartsWith("")
|| mobile.StartsWith("") || mobile.StartsWith("") || mobile.StartsWith("") || mobile.StartsWith(""))
result = true; return result;
} protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
if (Request["mobile"] == null)
return;
if (Request["context"] == null)
return;
if (Request["context"].Length < )
return;
if (Request["AppName"] == null)
return; String context = Request["context"].Replace("&", "&").Replace("+", "+").Replace("#", "#"); String mobileStr = Request["mobile"];
if (mobileStr == "")
{
return;
}
string smsProvider = ConfigurationManager.AppSettings["SmsProvider"]; if (Request["SmsProvider"] == null)
{
if (smsProvider.Equals("MAS"))
{
SendByMas(context, mobileStr);
} if (smsProvider.Equals("MOS"))
{
//MOS的发送号码是以空格分隔的,和mas的半角逗号不同
mobileStr = mobileStr.Replace(";", " ").Replace(",", " ");
SendByMos(context, mobileStr);
}
}
else if (Request["SmsProvider"] == "MOS")
{
mobileStr = mobileStr.Replace(";", " ").Replace(",", " ");
SendByMos(context, mobileStr);
} }
catch (Exception ex)
{
//MessageBox.Show(this.Page, ex.Message);
}
} } /// <summary>
/// 玄武短信发送
/// </summary>
/// <param name="context">短信内容</param>
/// <param name="mobileStr">以,分隔的手机号码</param>
private void SendByMos(String context, String mobileStr)
{
string AppName = ""; if (Request["AppName"] == null)
{
AppName = "CVTalk";
}
else
{
AppName = Request["AppName"];
} string Phone6ID = "";
//发送内容
string Context = ""; PhoneDal phoneDal = new PhoneDal();
try
{
string fromPhone = "";
if (Request["from"] != null)
{
if (Request["from"].ToLower() != "sysmessage")
{
fromPhone = phoneDal.GetPhone(Request["from"]);
}
} //MOS只能识别GB2312,所以要对utf-8进行UrlDecode转码
string IMMoshost = ConfigurationManager.AppSettings["MosURL"] + @"username=XXXXXX&password=XXXXXX&";
string contextUrlDecode = System.Web.HttpUtility.UrlDecode(context, System.Text.Encoding.UTF8); //关键词库为空,则从数据库把词库导入内存
if (SensitiveWords.GetWords().Count == )
{
SensitiveWords.SetWords(SensitiveWordsDal.GetAllWords());
} int keyMatchCount = ;
string keys = ""; //开始关键词过滤,通过内存查询
foreach (string word in SensitiveWords.GetWords())
{
if (contextUrlDecode != null)
{
if (contextUrlDecode.Contains(word))
{
StringBuilder sb = new StringBuilder();
foreach (char ch in word)
{
sb.Append(ch + "~");
}
keyMatchCount++;
keys += word + " ";
context = context.Replace(word, sb.ToString());
}
}
} if (keyMatchCount > )
{
string alertMSG = "亲,您先前发送的短信包含运营商敏感字:“ " + keys + " ” 我们修改了您的短信内容后重新发送。修改后短信内容:" + context;
string IMhost = "http://xxxxxxxx.cn:8989/IMMessageAPI/im/toim.do?tousername=" + Request["from"] + "&message=" + alertMSG + "&subject=CVTalk短信异常";
WebHelper.GetWebData(IMhost);
contextUrlDecode = System.Web.HttpUtility.UrlDecode(context, System.Text.Encoding.UTF8); }
string contextSuccess = System.Web.HttpUtility.UrlEncode(contextUrlDecode, System.Text.Encoding.GetEncoding("GB2312")); if (Request["to"] != null)
{
if (Request["cnName"] != null && fromPhone != null)
{
Context = "CVTalk" + HttpUtility.UrlEncode(Request["cnName"], System.Text.Encoding.GetEncoding("GB2312")) + fromPhone + " :" + contextSuccess + ConfigurationSettings.AppSettings["smsAD"];
}
else
Context = contextSuccess;
}
else
{
Context = contextSuccess;
} if (string.IsNullOrEmpty(fromPhone))
{
//fromPhone为空,则一定是系统发送的短信,不予处理回复,统一设置扩展码为0
Phone6ID = "";
}
else//查询到用户的手机号
{
//获取用户的手机号后6位,这里是为了定位用户,有100万分之一的重复风险
Phone6ID = fromPhone.Substring();
} string result = WebHelper.GetWebData(IMMoshost + "to=" + mobileStr + "&text=" + Context + "&subid=" + Phone6ID + "&msgtype=1");
//对第一次发送失败,进行第二次补发
if (result != "")
{
Thread.Sleep();
//第二次发送
string result2 = WebHelper.GetWebData(IMMoshost + "to=" + mobileStr + "&text=" + Context + "&subid=" + Phone6ID + "&msgtype=1");
Response.Write(result2);
Response.End();
}
Response.Write(result);
Response.End();
}
catch (Exception ex)
{
//Response.Write(ex.Message);
}
} /// <summary>
/// 移动MAS短信发送
/// </summary>
/// <param name="context">短信内容</param>
/// <param name="mobileStr">以,或;分隔的手机号码</param>
/// <returns></returns>
private string SendByMas(String context, String mobileStr)
{
string AppName = ""; if (Request["AppName"] == null)
{
AppName = "CVTalk";
}
else
{
AppName = Request["AppName"];
} apiclient = new APIClient(); int con = apiclient.init("172.xx.xx.xx", "bpm", "bpm", "BPM", "mas");
con = System.Math.Abs(con); mobileStr = mobileStr.Replace(",", ","); int sm = ;
//if (Request["cnName"] != null)
Random r = new Random();
int smsID = r.Next(, );//产生0-999999之间的整数,用于无后六位号码的情况
int Phone6ID = ;
//只支持发送一个手机号码
string Context = ""; PhoneDal phoneDal = new PhoneDal();
string fromPhone = phoneDal.GetPhone(Request["from"]); if (Request["to"] != null)
{
if (Request["cnName"] != null)
Context = "CVTalk" + Request["cnName"] + fromPhone + " :" + context + ConfigurationSettings.AppSettings["smsAD"];
else
Context = context; }
else
{
Context = context;
} string[] mobiles = mobileStr.Split(',');
if (string.IsNullOrEmpty(fromPhone) || mobiles.Length > )
{
//sm = apiclient.sendSM(mobiles, Context, smsID);
for (int i = ; i < mobiles.Length; i++)
{
//如果是联通号码
if (isLianTong(mobiles[i]))
{
sm = apiclient.sendSM(mobiles[i], Context + "回复TD退订", smsID);
}
else
{
sm = apiclient.sendSM(mobiles[i], Context, smsID);
} }
}
else
{ //sm = apiclient.sendSM(mobileStr.Split(','), Context, smsID);
//发送者号码的后6位
//smsID和srcID 没有办法分离,如果分置,将无法回复,因为将溯源至srcID,而不是smsID。
//smsID和srcID就必须设置为一样的!这样可以让发送者固定发送号码,但这样发送者给所有人的smsID都将将相同,
//造成的结果是,第一次发送可以成功,第一次回复是可以成功,但第三次交互(发送者再次回复),信息会回复错乱
//(这是因为在发送者给多人发送信息后,smsID是一样的,第三次回复将无法准确定位)
//目前采用后6位为ID的方法,因为最多只能拿6位,如果重复将异常。 Phone6ID = Convert.ToInt32(fromPhone.Substring());
sm = apiclient.sendSM(mobiles, Context, Phone6ID);
smsID = Phone6ID;
} apiclient.release(); CVTE.Model.IMSms model = new CVTE.Model.IMSms();
model.AppName = AppName;
model.FromUserName = Request["from"];
model.ToUserName = Request["to"];
model.ID = Guid.NewGuid().ToString(); System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
byte[] key = Convert.FromBase64String("YzJjZGxmZ2hcamtsvW5vcHbycXXXXXXXXXX");
byte[] iv = new byte[] { , , , , , , , }; //当模式为ECB时,IV无用
byte[] data = utf8.GetBytes(context); byte[] byteEncode = DES3.Des3EncodeECB(key, iv, data);
string strEncode = Convert.ToBase64String(byteEncode);
//加密
model.Msg = sm.ToString() + "-" + strEncode; model.SendTime = System.DateTime.Now;
model.SmsID = smsID;// Convert.ToInt32(mobileStr.Split(',')[0].Substring(3)); srcID;//
model.ToMoblie = Request["mobile"];
model.FromUserCNName = Request["cnName"]; CVTE.BLL.IMSms bll = new CVTE.BLL.IMSms();
bll.Add(model); Response.Write(retunvalues[sm]);
Response.End();
return mobileStr;
}
}
}
玄武短信接口和移动MAS短信接口的API封装的更多相关文章
- 移动MAS短信平台发送短信
MAS短信平台发送短信分为两种方式 参考文档下载 一.sdk调用 using mas.ecloud.sdkclient; using System; namespace 短信发送 { class Pr ...
- shopncv4 短信接口 提供商 中国短信网
前提是在后台开启手机注册功能:具体是在设置->账号同步->手机短信 里开启. 修改 siteroot\core\framework\libraries\sms.php 修改 sit ...
- 四:java调接口实现发送手机短信验证码功能
1.点击获取验证码之前的样式: 2.输入正确的手机号后点击获取验证码之后的样式: 3.如果手机号已经被注册的样式: 4.如果一个手机号一天发送超过3次就提示不能发送: 二:前台的注册页面的代码:reg ...
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...
- 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)
微信时代的今天,短信一样不可缺席,大系统都有集成短信接口.若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说, ...
- 4、下行短信发送WebService、下行短信发送服务 -功能详细设计 --短信平台
3. 下行短信发送WebService 开发一个WebService,供第三方系统调用,用于发送短信.WebService接收数据后,将信息存储入数据库的短信发送数据表中. WebService参数 ...
- 【API】短信通106端口验证短信的实现
信息时代,无论是电商还是网络营(chuan)销(xiao)都希望得道更多的用户信息.所以很多的网站注册上用到了手机验证码功能.网上有很多的SMS接口提供商.在选择的时候无非就是考虑到1.发送速度:2. ...
- 云之讯融合通讯开放平台_提供融合语音,短信,VoIP,视频和IM等通讯API及SDK。
云之讯融合通讯开放平台_提供融合语音,短信,VoIP,视频和IM等通讯API及SDK. undefined 全明星之极验证 - SendCloud undefined [转载]国内外几个主流的在线开发 ...
- 基于SMS短信平台给手机发送短信
JAVA发送手机短信,我知道的有三种方式,恰逢项目需求,自己整理了基于SMS的短信发送,其他两种这里就说说一下 使用webservice接口发送手机短信,这个可以使用sina提供的webservice ...
随机推荐
- zend studio导入外部项目乱码怎么解决
在zendstudio ide中,导入一个工程后,发现工程里面很多的文件都打上了红色的叉叉,打开这些文件一看,发现只要是有汉字存在的文件,都出现了乱码.按住alt+enter发现,该文件的编码默认为g ...
- SPRING 集成 KAFKA 发送消息
准备工作 1.安装kafka+zookeeper环境 2.利用命令创建好topic,创建一个topic my-topic 集成步骤 1.配置生产者 <?xml version="1.0 ...
- 关于SQL表字段值缺失的处理办法
在计算收益率时候, 收益率 = 收益 / 成本 一.如果成本为0,NULL,此时无法计算收益率: 方法: 1.将成本为0的数据 运算 (case when cost =0 or cost is n ...
- JS中的计时器事件
JS可以实现很多java代码不易完成的功能.这里学习一些js中的计时器事件. JavaScript 一个设定的时间间隔之后来执行代码,称之为计时事件. 主要通过两个方法来实现: 1.setInterv ...
- MySQL 安装与使用(二)
操作系统:CentOS release 5.10 (Final) MySQL版本:5.1.72-community 一.MySQL数据库简单迁移(备份与还原) 参考:http://dev.mysql. ...
- 20155205 2016-2017-2 《Java程序设计》第2周学习总结
20155205 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 变量 变量在命名时有一些规则,它不可以使用数字作为开头,也不可以使用特殊字符. 对常用忽略符 ...
- Ng第十九课:总结(Conclusion)
19.1 总结和致谢 欢迎来到<机器学习>课的最后一段视频.我们已经一起学习很长一段时间了.在最后视频中,我想快速地回顾一下这门课的主要内容,然后简单说几句想说的话. 作为这门课的结束时 ...
- thrift学习总结
thrift 重要的几个组件有 :数据类型,transport,protocol,versioning,processor 1.数据类型 thrift的数据类型有1.一些原生类型,比如string,i ...
- codeforces982A
题意 给你个排列 10001 满足下列条件输出yes 否则输出no 1.不能有两个1相连 2.当点排列不能再加入1 全0判断一下 开头判断一下 结尾判断一下 #include <iost ...
- python操作Hbase
本地操作 启动thrift服务:./bin/hbase-daemon.sh start thrift hbase模块产生: 下载thrfit源码包:thrift-0.8.0.tar.gz 解压安装 . ...