開發者中心
為開發者提供技術支持及幫助
版本概況
版本號 日期 修改人 審閱人 摘要
V1.0 2010-10-20 - - 初稿
V1.5 2012-12-17 - - 12修訂版
V2.0 2013-06-17 - - 13修訂版
V2.1 2016-06-03 - - 16修訂版
V2.2 2016-06-29 - - 修正狀態報告推送方式
接口通信方式
各客戶平臺與融合云平臺通過HTTP POST XML或JSON 進行數據的交互。
消息格式
消息格式分為HTTP消息頭和消息體兩部分。消息體為完整的XML或JSON。注意消息體編碼要求:utf-8。
測試服務器信息
http://123.56.14.50:9191/adc_posthandler_test

用戶名密碼都是123456,測試用簽名:【測試】

測試服務只能用于檢測程序是否正確,不能下發短信

接口常見問題

這么多接口普通接入需要開發那個?

一般接入只需開發 2.1、2.2、2.4 即可。

狀態報告可以推送給客戶么?

可以.客戶需要提供ip,端口.我們會以json格式推送狀態報告。數據格式請參考 2.7 進行開發。

下發消息和返回的狀態報告如何對應?

下發消息中用戶端生成的usermsgid鍵值(12位由數字和英文字母組成的字符串組合),可與狀態報告中的usermsgid進行對應,即可完成下發消息與狀態報告的一一對應。

下發短信內容應該采取什么編碼格式?

必須為utf-8格式,不支持gbk等其他格式,并且需要進行base64加密。

可以多進程或者多線程獲取狀態報告和上行消息么?

不可以,只能用一個線程獲取狀態報告和上行。獲取狀態報告時候,如果有上行,會同時返回狀態報告和上行消息。

發送請求消息參數
消息頭
POST /url HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
Action: "submitreq" #注意submitreq兩邊的雙引號要加
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <user>用戶名</user>
 <password>密碼</password>
 <version>1.2</version>
 <submit>
  <usermsgid>唯一標識,12位由數字和英文字母組成的字符串,由用戶生成,該值將與狀態報告中的usermsgid一一對應</usermsgid>
  <desttermid>目的號碼,用戶手機號碼</desttermid>
  <srctermid>下發源號碼的擴展號碼</srctermid>
  <msgcontent>base64(utf-8)</msgcontent>
  <signid>默認填0</signid>
  <desttype>1移動,2聯通,3電信</desttype>
  <needreply>0,不需要狀態報告 1,需要</needreply>
 </submit>
 <submit></submit>
</Body>
發送結果消息參數
消息頭
HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <result>0成功,其他失敗</result>
</Body>
發送請求消息參數
消息頭
POST /url HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
Action: "batchsubmit" #注意batchsubmit兩邊的雙引號要加
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <user>用戶名</user>
 <password>密碼</password>
 <version>1.2</version>
 <desttermid>目的號碼,用戶手機號碼,每個號碼單元由usermsgid與手機號碼組成,中間通過半角冒號分隔,多個號碼單元用半角逗號分隔,如:usermsgid1:138********,usermsgid2:138********,最多一次100個號碼,usermsgid為唯一標識(12位由數字和英文字母組成的字符串),由用戶生成,該值將與狀態報告中的usermsgid一一對應</desttermid>
 <srctermid>下發源號碼的擴展號碼</srctermid>
 <msgcontent>base64(utf-8)</msgcontent>
 <signid>默認填0</signid>
 <desttype>1移動,2聯通,3電信</desttype>
 <needreply>0,不需要狀態報告 1,需要</needreply>
</Body>
發送結果消息參數
消息頭
HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <result>0成功,其他失敗</result>
</Body>
發送請求消息參數
消息頭
POST /url HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
Action: "checkbalances" #注意checkbalances兩邊的雙引號要加
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <user>用戶名</user>
 <password>密碼</password>
 <version>1.2</version>
</Body>
發送結果消息參數
消息頭
HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <result>0或大于0為移動剩余金額,其他為錯誤</result>
</Body>
發送請求消息參數
消息頭
POST /url HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
Action: "getreportsms2" #注意getreportsms2兩邊的雙引號要加
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <user>用戶名</user>
 <password>密碼</password>
 <version>1.2</version>
</Body>
發送結果消息參數
消息頭
HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
<result>1表示有數據,0表示沒有數據,其余為失敗</result>
<deliver>
<srctermid>源號碼,用戶手機號碼</srctermid>
<desttermid>目的號碼,長號碼</desttermid>
<msgcontent>base64(utf-8)上行短信內容</msgcontent>
<srctype>1移動,2聯通,3電信</srctype>
<receivedatetime>接收時間格式:YYYY-MM-DD HH24:MI:SS</receivedatetime>
</deliver>
.
.
.
最長到350條,上行一次最多50條、狀態報告最多300條
.
.
.
<report>
<msgid>空,保留字段</msgid>
<srctermid>源號碼,用戶手機號碼</srctermid>
<desttermid>目的號碼,長號碼</desttermid>
<msgcontent>狀態報告結果,base64編碼格式,DELIVRD為成功,其余請參考cmpp3.0協議</msgcontent>
<srctype>1移動,2聯通,3電信,狀態報告目前只支持移動</srctype>
<usermsgid>用戶發送時定義的usermsgid</usermsgid>
<receivedatetime>接收時間格式:YYYY-MM-DD HH24:MI:SS</receivedatetime>
</report>
 .
 .
 .
</Body>
發送請求消息參數
消息頭
POST /url HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
Action: "submitreq" #注意submitreq兩邊的雙引號要加
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <user>用戶名</user>
 <password>密碼</password>
 <version>1.2</version>
 <submit>
  <usermsgid>唯一標識,12位由數字和英文字母組成的字符串,由用戶生成,該值將與狀態報告中的usermsgid一一對應</usermsgid>
  <desttermid>目的號碼,用戶手機號碼</desttermid>
  <srctermid>下發源號碼的擴展號碼</srctermid>
  <msgcontent>base64(utf-8)</msgcontent>
  <signid>默認填0</signid>
  <desttype>1移動,2聯通,3電信</desttype>
  <tempid>模板編號</tempid>
  <needreply>0,不需要狀態報告 1,需要</needreply>
 </submit>
 <submit></submit>
</Body>
發送結果消息參數
消息頭
HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <result>0成功,其他失敗</result>
</Body>
發送請求消息參數
消息頭
POST /url HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
Action: "batchsubmit" #注意batchsubmit兩邊的雙引號要加
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <user>用戶名</user>
 <password>密碼</password>
 <version>1.2</version>
 <desttermid>目的號碼,用戶手機號碼,每個號碼單元由usermsgid與手機號碼組成,中間通過半角冒號分隔,多個號碼單元用半角逗號分隔,如:usermsgid1:138********,usermsgid2:138********,最多一次100個號碼,usermsgid為唯一標識(12位由數字和英文字母組成的字符串),由用戶生成,該值將與狀態報告中的usermsgid一一對應</desttermid>
 <srctermid>下發源號碼的擴展號碼</srctermid>
 <msgcontent>base64(utf-8)</msgcontent>
 <signid>默認填0</signid>
 <desttype>1移動,2聯通,3電信</desttype>
 <tempid>模板編號</tempid>
 <needreply>0,不需要狀態報告 1,需要</needreply>
</Body>
發送結果消息參數
消息頭
HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: length #消息體(xml)長度
消息體
<?xml version="1.0" encoding="utf-8"?>
<Body>
 <result>0成功,其他失敗</result>
</Body>
發送請求消息參數
消息頭
POST /url HTTP/1.1
Host: xxx.xxx.xxx.xxx
Connection: close
Content-Type: application/json; charset=utf-8
Content-Length: length #消息體(json)長度
消息體
{"report": [
 ["123456","13812345678", "1069000000", "REVMSVZSRA==", "1", "012345678901", "2016-06-29 11:16:00"],
 ["123456","13812345679", "1069000000", "REVMSVZSRA==", "1", "012345678902", "2016-06-29 11:16:00"]
]
}
列表的格式順序:[接口賬戶名,手機號碼,源號碼,狀態報告結果(base64),所屬運營商,usermsgid,網關接收時間]
{"mo": [
 ["123456',"13812345678", "1069000000", "REVMSVZSRA==", "1", "2016-06-29 11:16:00"], 
 ["123456',"13812345679", "1069000000", "REVMSVZSRA==", "1", "2016-06-29 11:16:00"]
]
}
列表的格式順序是[接口帳戶名,手機號,目的號碼,狀態報告結果(base64),所屬運營商,網關接收時間]
發送結果消息參數
消息頭
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json; charset=utf-8
Content-Length: length #消息體(json)長度
消息體
{"result":"0"}
常規提交返回錯誤
錯誤碼 參考說明
0 成功
-1 消息個數大于100
-2 消息內容不是base64格式
-3 沒有消息內容
-4 沒有目的號碼
-5 desttype填寫錯誤
-6 手機號碼不正確
-8 needreply填寫錯誤
-9 余額不足
-10 數據庫準備失敗
-11 用戶名密碼錯誤
-12 xml格式錯誤
-13 Action填寫錯誤
-14 消息內容加上簽名長度大于469字
-15 signid填寫錯誤,未找到對應簽名
-16 聯通全網發送失敗
-17 聯通全網下發源號碼配置錯誤,與管理員確認
-18 該簽名為指定號碼下發,不支持長號碼擴展
-19 短信內容含有敏感詞匯
-20 usermsgid長度不等于12位
-21 usermsgid不是由數字和英文字母組成
-23 msgcontent短信內容中的簽名錯誤
-24 模板編號錯誤
-25 發送內容不匹配模板
-26 消息頭中沒有Content-Length
JAVA樣例
package com.cmcc.tj.res;
import it.sauronsoftware.base64.Base64;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class demo {
public static String[] sendSms(String phoneNumber, String smsContent) {
System.out.println("sendSms begin");
String url = "http://123.56.14.50:9191/adc_posthandler_test";          //此處修改為最終發送地址
  String result = testPost(url, phoneNumber, smsContent);
  System.out.println(result);
  if (result == ""){
  	String[] arr = {"-1", "null err"};
  	return arr;
  }else{
  	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(result)));
Element root = doc.getDocumentElement();
NodeList books = root.getChildNodes();
String nl =  books.item(0).getFirstChild().getNodeValue();
System.out.println(nl);
if (nl.equalsIgnoreCase("0")){
return null;
}else{
return nl.split(":");
  		}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch blockwebservice.putheader("
e.printStackTrace();
}
  }
return null;
}
public static String testPost(String urlStr, String phoneNumber, String smsContent) {
String line = "";
  try {
URL url = new URL(urlStr);
URLConnection con = url.openConnection();
con.setDoOutput(true);
con.setRequestProperty("Pragma:", "no-cache");
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Connection", "close");
con.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
con.setRequestProperty("Action", "\"submitreq\"");	         //此處按照接口文檔說明按收發實際正確配置

String xmlInfo = getXmlInfo(phoneNumber, smsContent);
System.out.println("urlStr=" + urlStr);
System.out.println("xmlInfo=" + xmlInfo);
if (xmlInfo == ""){
return "";
}else{
 con.setRequestProperty("Content-Length", Integer.toString(new String(xmlInfo.getBytes("UTF-8")).length()));
 OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
 out.write(new String(xmlInfo.getBytes("UTF-8")));
 out.flush();
 out.close();
 BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
//	            System.out.println(br.readLine());
 for (line = br.readLine(); line != null; line = br.readLine()) {
  break;
 }
}
  } catch (MalformedURLException e) {
e.printStackTrace();
line = "";
  } catch (IOException e) {
e.printStackTrace();
line = "";
  }
  return line;
 }

private static String getXmlInfo(String phoneNumber, String smsContent) {
StringBuffer msg = new StringBuffer();
msg.append(smsContent);
String msgutf8;
try {
msgutf8 = new String(msg.toString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
msgutf8 = "";
}
if (msgutf8 != ""){
  StringBuilder sb = new StringBuilder();
  sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?><Body>");
  sb.append("<user>123456</user><password>123456</password><version>1.2</version><submit><usermsgid>123456789012</usermsgid><desttermid>" + phoneNumber + "</desttermid><srctermid></srctermid><msgcontent>" + getBase64(msgutf8) + "</msgcontent><signid></signid><desttype>0</desttype><needreply>1</needreply></submit></Body>");	
  //此處改成正式配給的賬號密碼
  return sb.toString();
}else{
return "";
}
}
public static String getBase64(String str) {
String encoded = Base64.encode(str, "UTF-8");
  return encoded;
 }  

public String getFromBase64(String s) {
String decoded = Base64.decode(s, "UTF-8");
  return decoded;
 }  
public static void main(String[] args) {
// TODO Auto-generated method stub

String[] results = sendSms("13888888888", "測試下發【測試】");
//此處改成目的手機號碼和實際短信內容
System.out.println(results);
if (results == null) {
System.out.println(results);
}else{
for (int i = 0 ; i <results.length ; i++ ) {
System.out.println("--"+results[i]);
}
}
}
}
PYTHON樣例
#coding=utf-8

import base64
import httplib
from xml.sax.saxutils import unescape
import urllib

ip = "123.56.14.50"
port = 9191
mobile = "13888888888"
src_term = "" # 測試時候填空
msg = base64.encodestring("這是測試!【測試】")

def sendsms():
 try:
  XmlMessage = """<?xml version="1.0" encoding="UTF-8"?><Body><user>123456</user><password>123456</password><version>1.2</version>%s</Body>
  """.replace('\r', '').replace('\n', '')
  submit = "<submit><usermsgid>012345678912</usermsgid><desttermid>%s</desttermid><srctermid>%s</srctermid><msgcontent>%s</msgcontent><signid></signid><desttype>0</desttype><tempid>1</tempid><needreply>1</needreply></submit>"
  submit = submit %(mobile, src_term, msg)
  XmlMessage = XmlMessage % submit
  conn = httplib.HTTPConnection(ip, port)
  conn.putrequest("POST", "/adc_posthandler_test",0,1)
  conn.putheader("Content-Type", "text/xml; charset=utf-8")
  conn.putheader("Content-Length", "%d" % len(XmlMessage))
  conn.putheader("Pragma", "no-cache")
  conn.putheader("Connection", 'Close')
  conn.putheader("Action", '"submitreq"')
  conn.endheaders()
  conn.send(XmlMessage)
  response = conn.getresponse()
  resp = response.read()
  resp = unescape(resp.replace('\n','').replace('\r',''))
  print resp
 except Exception, e:
  print e
 finally:
  if conn:
conn.close()

if __name__ == '__main__':
 sendsms()
PHP樣例
<?php

//下面的demo,實現了簡單的發送功能。

//首先檢測是否支持curl
if (!extension_loaded("curl")) {
 trigger_error("對不起,請開啟curl功能模塊!", E_USER_ERROR);
}

//構造xml
$xmldata=
'<?xml version="1.0" encoding="utf-8"?><Body><user>123456</user><password>123456</password>
<version>1.2</version><submit><usermsgid>L6z6CGj2tK9T</usermsgid><desttermid>17610063060
</desttermid><srctermid>1451</srctermid><msgcontent>5rWL6K+V54q25oCB5oql5ZGK44CQ5rWL6K+
V44CR</msgcontent><signid></signid><desttype>0</desttype><needreply>1</needreply></submit>
</Body>'; //初始一個curl會話 $curl = curl_init(); //設置url curl_setopt($curl, CURLOPT_URL,"http://123.56.14.50:9191/adc_posthandler_test"); //設置發送方式:post curl_setopt($curl, CURLOPT_POST, true); //注意: 'Action: "submitreq"' 里面必須有雙引號,其他Action也類似 curl_setopt($curl, CURLOPT_HTTPHEADER, array('Pragma: no-cache', 'Connection: close', 'Content-Type:
text/xml; charset=utf-8', 'Content-Length: ' . strlen($xmldata), 'Action: "submitreq"')); //設置發送數據 curl_setopt($curl, CURLOPT_POSTFIELDS, $xmldata); //TRUE 將curl_exec()獲取的信息以字符串返回,而不是直接輸出 curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); //執行cURL會話 ( 返回的數據為xml ) $return_xml = curl_exec($curl); //關閉cURL資源,并且釋放系統資源 curl_close($curl); echo $return_xml; exit; ?>

服務熱線

400-158-0018

sg飞艇预测软件