该文档旨在介绍短信服务群推接口,通过调用文中的所述接口,可以帮助用户实现短信的群推业务。
全文包括两个部分:
第一部分常用说明:调用接口的字段解释、接口返回值编码说明
第二部分接口说明:鉴权、群推等接口的使用方式
请联系文档中心右侧“技术咨询”,开通服务
请至短信开发者中心新建应用,获取APPId,APPKey和MasterSecret参数
请至短信开发者中心创建签名与模板
出于安全考虑,请至短信开发者中心设置IP白名单
鉴权和短信群推接口返回result字段的返回码说明:
错误码 | 说明 |
---|---|
20000 | success |
40004 | app is unvalid |
40026 | sign error |
40027 | get auth_token error |
40028 | auth_token expired |
40031 | ip blocked |
40032 | params error |
40033 | phone num over limit |
40034 | template is not exist |
50000 | other error |
50001 | other error |
50002 | other error |
短信群推接口返回每个pn对应发送结果的code说明:
错误码 | 说明 |
---|---|
20000 | success |
40000 | send error |
40006 | phone is invalid |
40007 | template parse error |
40008 | phone daily msg overlimit |
40009 | appid daily msg overlimit |
50000 | server error |
该接口为鉴权接口,在调用短信群发接口之前,需先调用该接口进行鉴权,鉴权成功获得authToken,后续接口使用authToken进行调用。
用户调用短信群推接口,需上传鉴权成功后返回的authToken,短信群推接口会对authToken进行校验。
请求地址: https://openapi-smsp.getui.com/v1/sps/auth_sign
请求方法:POST
字段 | 类型 | 是否必传 | 备注 |
---|---|---|---|
appId | String | 是 | 由个推短信服务提供,每个应用都对应一个唯一的appId |
sign | String | 是 | 鉴权时的签名。 生成 sign 值:将 appkey、timestamp、mastersecret 对应的字符串按此固定顺序拼接后,使用 SHA256 算法加密。 示例 java 代码格式: String sign = sha256(appkey+timestamp+mastersecret) |
timestamp | String | 是 | 毫秒时间戳(13位),请使用当前毫秒时间戳,误差太大可能出错 |
字段 | 类型 | 备注 |
---|---|---|
result | String | 20000 |
msg | String | success |
data | Json | json格式 |
authToken | String | 权限令牌,调用其他接口时需提供;data字段的属性 |
Json示例, 具体请求需转Json格式
{
"appId": "xxxxxx",
"timestamp": "1234567890000",
"sign": "xxxxxx"
}
鉴权结果响应Json格式示例
{
"result": "20000",
"msg": "success",
"data": {
"authToken": "xxxxxxxxxxx"
}
}
鉴权生成的authToken有效期为2个小时,若authToken过期,需重新进行鉴权。
根据用户上传MD5加密后的手机号码,匹配模板进行短信推送。
注意:MD5采用32位小写加密
用户调用短信发送接口,将需要发送的MD5加密后手机号码列表和模板中的参数配置上传,处理后由短信服务向手机推送短信。
请求地址: https://openapi-smsp.getui.com/v1/sps/push_sms_list
请求方法:POST
字段 | 类型 | 是否必传 | 备注 |
---|---|---|---|
appId | String | 是 | 由个推短信服务提供,每个应用都对应一个唯一的appId |
authToken | String | 是 | 由鉴权接口返回 |
smsTemplateId | String | 是 | 模板id |
smsParam | Json | 否 | 短信模板变量,传参规则{"key":"value"},key的名字需和模板中定义的变量一致;若模板无变量,此参数不需要传 |
recNum | JsonArray | 是 | 接收短信的号码,目前单次最大发送量为50个MD5加密后的手机号码。例如:["md5(pn1)","md5(pn2)"] |
notifyUrl | String | 否 | 客户用于接收短信发送回执的接口地址,请求以Json格式POST方式提交 |
字段 | 类型 | 备注 |
---|---|---|
result | String | 20000 |
msg | String | success |
data | String | Json格式 |
taskId | String | 个推短信服务生成的推送任务id |
results | JsonArray | 短信推送结果返回,例如:[{ "md5(pn1)": code}, { "md5(pn2)": code}] |
Json示例, 具体请求需转Json字符串
{
"appId": "XXXXXXXXXXXXXX",
"authToken": "XXXXXXXXXXXXXX",
"smsTemplateId": "000001",
"smsParam": {
"key1": "value1",
"key2": "value2"
},
"recNum": [
"3c41dc04cbc783dc66091ad49c7b755b",
"9a54ab45622e64bd76b5d50d4e6487ac"
]
}
Json示例
{
"result": "20000",
"msg": "success",
"data": {
"taskId": "xxxxxxxxxxx",
"results": {
"3c41dc04cbc783dc66091ad49c7b755b": 20000,
"9a54ab45622e64bd76b5d50d4e6487ac": 40000
}
}
}
接口中返回的每个手机号对应的结果仅代表服务的请求状况,不代表短信是否发送成功。短信是否发送成功以手机接收的实际情况为准。
/**
* 鉴权接口
*/
public class AuthSignTest {
//鉴权url
static String url = "https://openapi-smsp.getui.com/v1/sps/auth_sign";
public static void main(String[] args) throws Exception {
URL urlObj = new URL(url);
URLConnection con = urlObj.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection) con;
//http头部
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
long timestamp = System.currentTimeMillis();
//将个推短信服务提供的app对应的appkey和masterSecret,可自行替换
String appkey="";
String masterSecret="";
String appId="";
//sha256加密,使用org.apache.commons包中自带的加密方法,需将加密后数据一起上传
String sign = DigestUtils.sha256Hex(String.format("%s%d%s", appkey, timestamp, masterSecret));
JSONObject requestDataObject = new JSONObject();
requestDataObject.put("sign", sign);
requestDataObject.put("timestamp", timestamp);
requestDataObject.put("appId", appId);
//建立连接,将数据写入内存
OutputStreamWriter out = new
OutputStreamWriter (httpURLConnection.getOutputStream());
out.write(requestDataObject.toString());
out.flush();
out.close();
BufferedReader in = null;
String result = "";
//将数据发送给服务端,并获取返回结果
in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
System.out.println(result);
}
}
/**
* 群推接口
*/
public class SmsPushListTest {
//短信群推url
static String url = "https://openapi-smsp.getui.com/v1/sps/push_sms_list";
public static void main(String[] args) throws Exception {
URL urlObj = new URL(url);
URLConnection con = urlObj.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection) con;
//http头部
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
String appId="";
JSONObject requestDataObject = new JSONObject();
requestDataObject.put("appId", appId);
requestDataObject.put("authToken", "9e46cf0fac0bd94b01c6396db8700f6b5c988cd4e51eaff94f1cefec50ad17c9");
requestDataObject.put("smsTemplateId", "000001");
Map<String, String> param = new HashMap<String, String>();
param.put("name", "***");
param.put("code", "***");
requestDataObject.put("smsParam", param);
List<String> phoneNum = new ArrayList<String>();
for (int i = 0; i < 1; i++) {
phoneNum.add("9a54ab64562e64bd76b5d50d4e6487ac");
phoneNum.add("b6fda656f377a5b8ebdb7db70aa29870");
}
requestDataObject.put("recNum", phoneNum);
//建立连接,将数据写入内存
OutputStreamWriter out = new
OutputStreamWriter (httpURLConnection.getOutputStream());
out.write(requestDataObject.toString());
out.flush();
out.close();
BufferedReader in = null;
String result = "";
//将数据发送给服务端,并获取返回结果
in = new BufferedReader(new
InputStreamReader(httpURLConnection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
System.out.println(result);
}
}
/**
* 鉴权接口
*/
function AuthSignTest(){
//鉴权url
$url="https://openapi-smsp.getui.com/v1/sps/auth_sign";
//将个推短信服务提供的app对应的appkey和masterSecret,可自行替换
$appkey="";
$masterSecret="";
$appId="";
$timestamp = micro_time();
$signCombination = $appkey.$timestamp.$masterSecret;
$sign = hash("sha256", $signCombination);
$params = array();
$params["sign"] = $sign;
$params["timestamp"] = $timestamp;
$params["appId"] = $appId;
//http头部
$headers=array(
"Content-Type:application/json;charset=utf-8",
"Accept:application/json;charset=utf-8"
);
//json序列化
$params=json_encode($params);
$result=do_post($url,$params,$headers);
echo json_encode($result);
return;
}
/**
* 群推接口
*/
function SmsPushListTest(){
//短信群推url
$url="https://openapi-smsp.getui.com/v1/sps/push_sms_list";
$appId="";
$requestDataObject = array();
$requestDataObject["appId"] = $appId;
$requestDataObject["authToken"] = "";
$requestDataObject["smsTemplateId"] = "";
$params = array();
//params中填写你的模版中的占位符参数;
$params["name"] = "***";
$params["code"] = "***";
$requestDataObject["smsParam"] = $params;
$phoneNum = array();
for($i = 0; $i < 1; $i++){
$phoneNum[0] = "";
}
$requestDataObject["recNum"] = $phoneNum;
$headers=array(
"Content-Type:application/json;charset=utf-8",
"Accept:application/json;charset=utf-8"
);
//json序列化
$params=json_encode($requestDataObject);
$result=do_post($url,$params,$headers);
echo json_encode($result);
return;
}
function do_post($url, $params, $headers) {
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'POST' );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $params );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 60 );
$result = curl_exec ( $ch );
curl_close ( $ch );
return $result;
}
function micro_time()
{
list($usec, $sec) = explode(" ", microtime());
$time = ($sec . substr($usec, 2, 3));
return $time;
}
import requests
import hashlib
import json
import time
#鉴权接口
def AuthSignTest():
url = "https://openapi-smsp.getui.com/v1/sps/auth_sign"
headers = {
"Content-Type": "application/json; charset=UTF-8",
"Accept": "application/json;charset=utf-8"
}
#将个推短信服务提供的app对应的appkey和masterSecret,可自行替换
appkey = ""
masterSecret = ""
appId = ""
timestamp = getCurrentTime()
sign = getSign(appkey, timestamp, masterSecret)
params = dict()
params["sign"] = sign
params["timestamp"] = timestamp
params["appId"] = appId
params = json.dumps(params)
r = requests.post(url, data=params, headers=headers)
print(r.text)
def getSign(appKey, timeStamp, masterSecret):
rawValue = appKey + str(timeStamp) + masterSecret
return hashlib.sha256(rawValue.encode()).hexdigest()
def getCurrentTime():
return int(time.time() * 1000)
#群推接口
def SmsPushListTest():
url = "https://openapi-smsp.getui.com/v1/sps/push_sms_list"
headers = {
"Content-Type": "application/json; charset=UTF-8",
"Accept": "application/json;charset=utf-8"
}
appId = ""
requestDataObject = dict()
requestDataObject["appId"] = appId
requestDataObject["authToken"] = ""
requestDataObject["smsTemplateId"] = ""
params = dict()
#params中填写你的模版中的占位符参数
params["name"] = "***";
params["code"] = "***";
requestDataObject["smsParam"] = params
phoneNum = []
for i in range(1):
phoneNum.append("")
requestDataObject["recNum"] = phoneNum
params = json.dumps(requestDataObject)
r = requests.post(url, data=params, headers=headers)
print(r.text)
using System;
using System.IO;
using System.Net;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using System.Text;
using System.Security.Cryptography;
namespace c_
{
public class SendMsg
{
static string authurl= "https://openapi-smsp.getui.com/v1/sps/auth_sign";
static string sendmsgurl= "https://openapi-smsp.getui.com/v1/sps/push_sms_list";
//鉴权方法,获得token值
public static void authsign()
{
Uri uri = new Uri(authurl);
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json;charset=UTF-8";
long timestamp= (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
//将个推短信服务提供的app对应的appkey和masterSecret,可自行替换
string appkey = "";
string masterSecret = "";
string appId = "";
string sign = sha256(String.Format("{0}{1}{2}", appkey, timestamp, masterSecret));
JObject jObject = new JObject();
jObject.Add("sign", sign);
jObject.Add("timestamp", timestamp);
jObject.Add("appId", appId);
//建立连接,将数据写入内存
StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream());
streamWriter.WriteLine(jObject.ToString());
streamWriter.Flush();
streamWriter.Close();
StreamReader streamReader = null;
string result = "";
//将数据发送给服务端,并获取返回结果
HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
streamReader = new StreamReader(httpWebResponse.GetResponseStream());
string line;
while((line=streamReader.ReadLine())!=null)
{
result += line;
}
Console.WriteLine(result);
Console.ReadLine();
}
//sha256值
public static string sha256(string data)
{
byte[] bytes = Encoding.UTF8.GetBytes(data);
byte[] hash = SHA256Managed.Create().ComputeHash(bytes);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
builder.Append(hash[i].ToString("X2"));
}
return builder.ToString();
}
//短信发送方法
public static void send()
{
Uri uri = new Uri(sendmsgurl);
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json;charset=UTF-8";
string appId="";
JObject jObject = new JObject();
JObject smsParam = new JObject();
//smsParam中填写你的模版中的占位符参数;
smsParam.Add("name","***");
smsParam.Add("code","***");
jObject.Add("appId", appId);
jObject.Add("authToken", "");
jObject.Add("smsTemplateId", "");
jObject.Add("smsParam",smsParam);
JArray phoneNum = new JArray();
for(int i= 0;i<1;i++){
//md5(手机号码)
phoneNum.Add("");
}
jObject.Add("recNum",phoneNum);
//建立连接,将数据写入内存
StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream());
streamWriter.WriteLine(jObject.ToString());
streamWriter.Flush();
streamWriter.Close();
StreamReader streamReader = null;
string result = "";
//将数据发送给服务端,并获取返回结果
HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
streamReader = new StreamReader(httpWebResponse.GetResponseStream());
string line;
while((line=streamReader.ReadLine())!=null)
{
result += line;
}
Console.WriteLine(result);
Console.ReadLine();
}
}
}
以上文档对您是否有帮助?