玄武短信接口和移动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 ...
随机推荐
- 爬虫之mongodb数据库
一 mongodb的介绍 1.易用性:mongodb是一款强大.灵活并且易扩展的数据库.他面向于文档的数据库,而不是关系性数据库.不采用关系型主要是为了获得更好的扩展性.还有一个好处就是面向文档的数据 ...
- JavaScript常用定义和方法
1.字符串一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串.toUpperCase()把一个字符串全部变为大写: var s = 'Hello'; s.toUpper ...
- Linux服务器密钥安全登录
使用密钥登录的好处:1.省事,不用每次去敲用户名和密码:2.安全,密钥长度一般是1024位,比我们设的密码要长得多: 以下是为新用户jackson添加密钥登录的步骤. 1.添加用户,并添加到sudoe ...
- Remote Debugging (3)
use Eclipse| a Web application 创建一个简单的web项目 AServlet.java package cn.zno; import java.io.IOException ...
- Ng第十一课:机器学习系统的设计(Machine Learning System Design)
11.1 首先要做什么 11.2 误差分析 11.3 类偏斜的误差度量 11.4 查全率和查准率之间的权衡 11.5 机器学习的数据 11.1 首先要做什么 在接下来的视频将谈到机器学习系 ...
- 判断页面是app打开还是浏览器打开。cookie
有个需求需要对页面判断不同的打开方式来最里面的链接进行不同调整, 这样就要分四种情况,app,浏览器X安卓系统,苹果系统,起初是对页面url地址带有的参数(安卓)跟用户代理(苹果)返回值判断navig ...
- 使用Servlet动态生成验证码
最近在重新看了一遍servlert,看到篇优质博客推荐给大家:https://www.cnblogs.com/xdp-gacl/p/3798190.html 顺便把学习过程中的知识记录下来. 今天是如 ...
- android ActivityGroup接收不到onActivityResult
android 框架嵌套,用viewgroup是很好用的.首先实现一个框架的activity,可以继承ActivityGroup 将需要切换的界面,放到ViewGroup里面. 切换如下: Inten ...
- Android创建AVD模拟器
Android创建AVD模拟器 1. 新建一个安卓工程如下: 2. 点击windows里的 Android Virtual Device Manager,如果第一次安装 adt-bundle启动会出现 ...
- js五道经典练习题--第二道仿qq聊天框
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...