高速触发接口短信加密发送
发送加密短信
发送加密短信,与“发送短信”接口不同的是短信相关信息发送过程中为加密状态。
接口描述
发送短信,内容加密
方法名
sendMsgByEncrypt
承载协议
HTTP Get/Post
调用地址
http://120.55.197.77:1210/Services/MsgSend.asmx
请求参数
参数名 数据类型 说明
userCode string 登录名称
submitInfo string 加密字符串,详见下面说明
加密方式
加密逻辑如下:

    先将密码userPass进行SHA1加密(40位大写),取前8位作为DES加密的key及IV

    然后用以下格式拼接加密字符串,格式如下:(说明:用实际的值替换时不需要保留尖括号)

userPass=<userPass>&DesNo=<DesNo>&Msg=<Msg>&Channel=<Channel>

    将以上字符串中替换实际值后的字符串进行DES加密,加密结果转成十六进制字符串作为submitInfo参数的值提交


加密字符串中参数说明如下:
参数名 数据类型 说明
userPass string 登录密码
DesNo string 手机号码每次只能提交1个号码
Msg string 短信内容。Get或者Post方式注意要用UTF8编码
Channel string 通道号。获取方式 账号开通后由云信提供问http://yes.itissm.com登录云信平台,进入“发短信”页面,在选择“发送通道”操作中点击下拉列表,可看到您拥有的通道。通道名称前面的阿拉伯数字即为通道号,如下图:

(本示例图所示通道号即为37,仅仅是示例请根据方法查看并使用自己的Channel)

加密示例
例如:需加密的字符串拼接后为:6
userPass=123&DesNo=18616300000&Msg=你的验证码是:2345【饿了么】&Channel=67
加密过程如下:

    密码是:123,先将密码123进行SHA1加密,值为:40BD001563085FC35165329EA1FF5C5ECBDBBEEF
    取密码SHA1加密之后前8位:40BD0015。
    对需加密的字符串进行DES加密其中key和IV都设置为:40BD0015
    得到结果为:9ECD998D9F60F7963E137DBC61734970FEE419418FBD2E1622286696AD70D909BF58BB27091607
    3B0464030D4FC52D4AF06BF97B34D7CCB4CA87E2099218499E467074C1711B02A1EBD0A5328DE1DAB1

最后加密结果即作为接口请求时的submitInfo参数
                                        

注:短信内容里面含有尖括号< > 斜杠线 \ 连接符号& 单引号‘ ’会导致提交失败.

返回值类型
string
成功返回值
返回本次提交的批次号(如:2114355899380234221),(或叫序列号、流水号等,提交一次返回一个)
失败返回值

返回带负号的失败代码,代码说明如下

失败状态码 状态码说明
-1 应用程序异常
-3 用户名密码错误或者用户无效
-4 短信内容和备案的模板不一样
-5 签名不正确(格式为:XXX【签名内容】), 注意:短信内容最后一个字符必须是】
-7 余额不足
-8 通道错误
-9 无效号码
-10 签名内容不符合长度
-11 用户有效期过期
-12 黑名单
-13 语音验证码的Amount参数必须是整形字符串
-14 语音验证码的内容只能为数字
-15 语音验证码的内容最长为6位
-16 余额请求过于频繁,5秒才能取余额一次
-17 非法IP
-18 Msg格式错误
-19 短信数量错误,小于1或者大于50
-20 号码错误或者黑名单
-21 没有找到对应的SubmitID设置
-23 解密失败
C#代码示例
http请求

                                        
            string url="http://120.55.197.77:1210/Services/MsgSend.asmx";

        protected string sendmsgencryptByPost() //POST方式请求
        {
            string encryptCode=EncodeStr("userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号",SHA1_Hash(密码));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode=用户名&");
            sb.Append("submitInfo="+encryptCode);
            string result = httpPost(url + "/sendMsgByEncrypt", sb.ToString());

            return result;
        }

        protected string sendmsgencryptByGet() //Get方式请求
        {
            string encryptCode=EncodeStr("userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号",SHA1_Hash(密码));
            StringBuilder sb = new StringBuilder();
            sb.Append("userCode=用户名&");
            sb.Append("submitInfo="+encryptCode);
            string result = httpGet(url + "/sendMsgByEncrypt", sb.ToString());
            return result;
        }

        protected string httpGet(string url, string data) //http get请求
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + data);
                request.Method = "GET";
                request.ContentType = "text/html;charset=UTF-8";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                string retString = myStreamReader.ReadToEnd();
                myStreamReader.Close();
                myResponseStream.Close();
                return retString;
            }
            catch (Exception ex)
            {

                return ex.Message;
            }
        }
        protected string httpPost(string url, string data) //http post请求
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                byte[] info = Encoding.UTF8.GetBytes(data);
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(info, 0, info.Length);
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream myResponseStream = response.GetResponseStream();
                StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                string retString = myStreamReader.ReadToEnd();
                myStreamReader.Close();
                myResponseStream.Close();
                return retString;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        public string EncodeStr(string str, string key) //DES加密
        {
            try
            {
                DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
                provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
                provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
                byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(str);
                MemoryStream stream = new MemoryStream();
                CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
                stream2.Write(bytes, 0, bytes.Length);
                stream2.FlushFinalBlock();
                StringBuilder builder = new StringBuilder();
                foreach (byte num in stream.ToArray())
                {
                    builder.AppendFormat("{0:X2}", num);
                }
                stream.Close();
                return builder.ToString();
            }
            catch (Exception ex) 
            { 
                return ex.Message; 
            }
        }

        public string SHA1_Hash(string str_sha1_in) //sha1加密
        {
            SHA1 sha1 = new SHA1CryptoServiceProvider();
            byte[] bytes_sha1_in = UTF8Encoding.Default.GetBytes(str_sha1_in);
            byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
            string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
            str_sha1_out = str_sha1_out.Replace("-", "");
            return str_sha1_out;
        }


		
                                    
webservice请求

       private void SendMsgByEncrypt()
        {
            TopenServiceReference.MsgSendSoapClient topen = new TopenServiceReference.MsgSendSoapClient();
            string userName = "用户名";
            string encryptCode=EncodeStr("userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号",SHA1_Hash(密码));
            string sendResult = topen.sendMsgByEncrypt(userName, encryptCode);

            //然后,根据返回的sendResult作相应处理
        }
                  
                                    
PHP代码示例
http请求

<?php

$urlsend="http://120.55.197.77:1210/Services/MsgSend.asmx/sendMsgByEncrypt";

$key=strtoupper(substr(sha1("密码"),0,8));

$str="userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号";

$encryptstr=iconv("GBK","GB2312",$str);

$encryptCode=encrypt($encryptstr,$key,$key);

$token=array("userCode"=>"用户名","submitInfo"=>$encryptCode); 

echo http($urlsend,$token,"GET"); //get请求

echo http($urlsend,$token,"POST"); //post请求

	function encrypt($str,$key,$iv) {
	//加密,返回大写十六进制字符串
		$size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
		$str = pkcs5Pad ( $str, $size );
		return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $key, $str, MCRYPT_ENCRYPT, $iv ) ) );
	}
	
	function decrypt($str,$key,$iv) {
	//解密
		$strBin = $this->hex2bin( strtolower( $str ) );
		$str = mcrypt_cbc( MCRYPT_DES, $key, $strBin, MCRYPT_DECRYPT, $iv );
		$str = $this->pkcs5Unpad( $str );
		return $str;
	}
	
	function hex2bin($hexData) {
		$binData = "";
		for($i = 0; $i < strlen ( $hexData ); $i += 2) {
			$binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
		}
		return $binData;
	}

	function pkcs5Pad($text, $blocksize) {
		$pad = $blocksize - (strlen ( $text ) % $blocksize);
		return $text . str_repeat ( chr ( $pad ), $pad );
	}
	
	function pkcs5Unpad($text) {
		$pad = ord ( $text {strlen ( $text ) - 1} );
		if ($pad > strlen ( $text ))
			return false;
		if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
			return false;
		return substr ( $text, 0, - 1 * $pad );
	}

function http($url,$param,$action="GET"){
	$ch=curl_init();
	$config=array(CURLOPT_RETURNTRANSFER=>true,CURLOPT_URL=>$url);	
	if($action=="POST"){
		$config[CURLOPT_POST]=true;		
	}
	$config[CURLOPT_POSTFIELDS]=http_build_query($param);
	curl_setopt_array($ch,$config);	
	$result=curl_exec($ch);	
	curl_close($ch);
	return $result;
}
?>
                                    
webservice请求

<?php
	//此处仅示例发送短信,其他可类推
	header("Content-type: text/html; charset=utf-8");
	$client = new SoapClient("http://120.55.197.77:1210/Services/MsgSend.asmx?WSDL");

    $key=substr(sha1("密码"),0,8);

    $str="userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号";

    $encryptstr=iconv("GBK","GB2312",$str);

    $encryptCode=encrypt($encryptstr,$key,$key);

    $param=array("userCode"=>"用户名","submitInfo"=>$encryptCode); 

	$p = $client->sendMsgByEncrypt($param);
	print_r($p);
	?>
		
                                    
java代码示例
http请求

                                //说明:此处需引用httpclient、httpcore、commons-logging三个jar包

        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.util.*;
        import java.security.MessageDigest;
        import org.apache.http.HttpEntity;
        import org.apache.http.HttpResponse;
        import org.apache.http.client.HttpClient;
        import org.apache.http.client.methods.HttpPost;
        import org.apache.http.client.methods.HttpGet;
        import org.apache.http.client.entity.UrlEncodedFormEntity;
        import org.apache.http.impl.client.DefaultHttpClient;
        import org.apache.http.message.BasicNameValuePair;
        import org.apache.http.*;
        import javax.crypto.SecretKey;
        import javax.crypto.spec.DESKeySpec;
        import javax.crypto.spec.IvParameterSpec;
        import javax.crypto.SecretKeyFactory;
        import javax.crypto.Cipher;

        public static void main(String[] args) {
            String url="http://120.55.197.77:1210/Services/MsgSend.asmx/sendMsgByEncrypt";

            String encryptStr=DESEncrypt("userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号","密码");

            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
            nvps.add(new BasicNameValuePair("userCode", "用户名"));
            nvps.add(new BasicNameValuePair("submitInfo",encryptStr));


            String post=httpPost(url,nvps);  //post请求

            String getparam="userCode=用户名&submitInfo="+encryptStr;
            String result=httpGet(url,getparam); //get请求
        }

        public static String DESEncrypt(String encryptStr,String key){        
        String result="";
        try
        {
            String encryptKey=SHA1(key).substring(0, 8).toUpperCase();;
            DESKeySpec desKeySpec=new DESKeySpec(encryptKey.getBytes());
            SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES");
            SecretKey securekey=keyFactory.generateSecret(desKeySpec); 
            Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding");
            IvParameterSpec ivp=new IvParameterSpec(encryptKey.getBytes());
            cipher.init(Cipher.ENCRYPT_MODE,securekey,ivp);
            byte[] encryptResult=cipher.doFinal(encryptStr.getBytes("GB2312"));
            result=BinaryToHexString(encryptResult);
        }
        catch(Exception e){
            System.out.println(e.getStackTrace());
            System.out.println(e.getMessage());
        }      
        return result;
    }    
    
    public static String SHA1(String key){
        StringBuffer sb=new StringBuffer();
        try{
            MessageDigest md=MessageDigest.getInstance("SHA-1");
            md.update(key.getBytes("GB2312"));
            byte[] resultsha=md.digest();            
            for(byte b:resultsha){
                int i = b & 0xff;
                if (i < 0xf) {
                    sb.append(0);
                }
                sb.append(Integer.toHexString(i));
            }            
        }catch(Exception e){}     
        return sb.toString();
    }
    
    public static String BinaryToHexString(byte[] bytes){
        String hexStr =  "0123456789ABCDEF";
        String result = "";
        String hex = "";  
        for(int i=0;i<bytes.length;i++){
            //字节高4位  
            hex = String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4));
            //字节低4位  
            hex += String.valueOf(hexStr.charAt(bytes[i]&0x0F));  
            result +=hex;  
        }
        return result;  
    }

    public static String httpPost(String url,List<NameValuePair> params) {
            String result = "";
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);            
            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
            HttpResponse response = httpclient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            if (entity != null) {    
            	 InputStream instreams = entity.getContent();    
            	 result = convertStreamToString(instreams);  
                 System.out.println(result);  
             }
        } catch (Exception e) {
        }
        return result;
    }
    
    public static String httpGet(String url,String params){
        String result="";        
        try{
            HttpClient client=new DefaultHttpClient();            
            if(params!=""){
                url=url+"?"+params;
            }            
            HttpGet httpget=new HttpGet(url);
            HttpResponse response=client.execute(httpget);            
            HttpEntity entity=response.getEntity();
            if (entity != null) {    
            	 InputStream instreams = entity.getContent();    
            	 result = convertStreamToString(instreams);  
                 System.out.println(result);  
             }
        }catch(Exception e){}
        return result;
    }
    
    public static String convertStreamToString(InputStream is) {      
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));      
        StringBuilder sb = new StringBuilder();      
       
        String line = null;
        try {      
            while ((line = reader.readLine()) != null) {  
                sb.append(line + "\n");      
            }      
        } catch (IOException e) {      
            e.printStackTrace();      
        } finally {
            try {
                is.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
        }
        return sb.toString();
    }
           
           
                                    
webservice请求

         public static void main(String[] args) {
            org.tempuri.MsgSend service = new org.tempuri.MsgSend();
            org.tempuri.MsgSendSoap port = service.getMsgSendSoap();
            String encryptStr=DESEncrypt("userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号","密码");
            String result= port.sendMsgByEncrypt("用户名",encryptStr);
            System.out.println(result);
        }
                                    
asp代码示例
http请求

<!—— #include file ="DESClass.asp" ——>
<!—— #include file="sha1.js.inc" ——>
<%
dim sendurl,senddata

set des=new DesClass

encryptstr="userPass=密码&DesNo=手机号&Msg=短信内容【签名】&Channel=通道号"
encryptkey=UCase(left(hex_sha1("密码"),8))

des.Key = encryptkey
des.IV = encryptkey 'cbc mode only
des.Mode = "cbc"
des.Padding = "pkcs5"
des.Encoding = "GB2312"

submitInfo=UCase(des.Encode(encryptstr))

sendurl="http://112.124.24.5/api/MsgSend.asmx/sendMsgByEncrypt"
senddata="userCode=用户名&submitInfo="+submitInfo

Response.Write(HTTPRequest(sendurl,senddata,"GET")) <!—— get请求 ——>

Response.Write(HTTPRequest(sendurl,senddata,"POST")) <!—— post请求 ——>

function HTTPRequest(url,data,method)
	dim http
	set http=server.createobject("MSXML2.SERVERXMLHTTP.3.0")

	if method = "GET" then
	Http.open "GET",url+"?"+data,false
	elseif method = "POST" then
	Http.open "POST",url,false
	end if

	Http.setRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"
	Http.send(data)
	if Http.readystate<>4 then
	exit function
	End if

	HTTPRequest=BytesToStr(Http.responseBody,"utf-8")
	set http=nothing
	if err.number<>0 then err.Clear
End function

Function BytesToStr(body, charset)
    Dim objStream
    Set objStream = Server.CreateObject("Adodb.Stream")
    objStream.Type = 1
    objStream.Mode = 3
    objStream.Open
    objStream.Write body
    objStream.Position = 0
    objStream.Type = 2
    objStream.Charset = charset
    BytesToStr = objStream.ReadText 
    objStream.Close
    Set objStream = Nothing
End Function

%>