概述

Android

iOS

REST API

服务端SDK

服务端V2版Rest API介绍

更新历史:

2018-09-13 更新2.1.4 msgStyle消息样式
2016-08-08 添加服务端管理字符串tag接口(删除、添加、查询)及按照字符串tag来发送消息接口。
2015-12-30 添加JAVA使用API发消息的demo源码
2015-10-30 ApiV2版本发布

1 RestApi介绍

1.1 概述

本Api可以实现从服务端推送消息到ixintui的服务器。可以对android和IOS使用统一的Api推送广播、组播、点播、标签发送等消息。

1.2 推送地址

api.ixintui.com:8300

1.3 请求方式

所有请求均为POST请求。

1.4 数据编码

所有的参数均需要使用utf-8编码。

1.5 响应编码

所有的响应数据包的格式为json,头部设置为application/json;charset=utf-8,响应输出内容正常,则result字段为0,否则设置相应的错误码。

正确响应示例:

{
    "desc": "OK", 
    "msgid": 51, 
    "result": 0
}

错误响应示例:

{
    "desc": "sign not correct", 
    "result": 401
}

1.6 安全性校验

对输入的json数据的key按字典序排序,json字符串中的json分隔符(,";{}[]等)之间不能留空白。

拼接上app的secret_key 求md5签名后放入输入json中的sign字段。

例如:

输入参数为

{
    "message": "hello,world", 
    "appkey": 10086
} 

sign=md5({"appkey":10086,"message":"hello,world"}your-secret_key)

2 RestApi详细接口

注意:在以下接口中使用到appkey时,请使用字符串形式表示。 例如:appkey为123456789 ,使用时请用“123456789”

2.1 推送消息接口

接口地址:api.ixintui.com:8300/v2/push
接口功能:给android和IOS用户发送点播、广播、组播消息,设置消息透传或展示的样式属性,设定消息的过期时间等。

一次消息推送的参数可以划分为4个维度:sendTo(推送对象)、msgStyle(消息样式)、option(消息选项)、extra(扩展字段)及sign签名字段。其中sendTo和msgStyle及sign是必须字段。

参数名 参数含义 参数类型 是否必须
sendTo 推送对象 json对象
msgStyle 消息样式 json对象
option 消息选项 json对象
extra 消息的附加签名 字符串
sign 签名校验 字符串
2.1.1 sign计算说明

如果只有一个应用,比如只有android或只有ios,则 secretKey就是该应用的secretKey, 如果同时有android和ios的应用,则secretKey则为 android和ios的secretKey,采用android SecretKey在前,ios secretKey在后的顺序连接起来,得到secretKey之后,计算sign的过程如下 对输入的json数据的key按字典序排序,json字符串中的json分隔符(,";{}[]等)之间不能留空白, 拼接上app的secret_key 求md5签名后放入输入json中的sign字段。
Python 代码示例

import json
import hashlib
#把未添加sign的消息添加sign, jsondata为消息的dict结构,
#has_android_app 是否有android 应用
#android_secret_key android应用的secretKey
#has_ios_app 是否有IOS应用
#ios_secret_key ios应用的secretKey
#返回值: 添加了sign的json字符串
def add_sign(jsondata,has_android_app, android_secret_key, has_ios_app,ios_secret_key):
    secret_key = ""
    if has_android_app:
        secret_key = android_secret_key
    if has_ios_app:
        secret_key ="{s}{o}".format(s=s,o=ios_secret_key)
    strdata = json.dumps(jsondata, ensure_ascii=False, encoding='utf8',separators=(',',':'), sort_keys=True)
    m = "{s}{p}".format(s=strdata, p=secret_key.strip())
    newSign = hashlib.md5(m).hexdigest()
    jsondata["sign"] = newSign
    return json.dumps(jsondata)
2.1.2 sendTo 推送对象说明

sendTo参数为一个json的对象,根据userScope字段将用户划分成8种情形:全部平台的用户(包括android及IOS的全部用户)、全部android用户、全部ios用户、指定别名发送且只给别名对应的最后活跃的1个设备发送、指定别名发送且给别名对应的所有设备发送、指定token发送、按tag过滤、按用户信息过滤。指定token发送需要单独指明为android或ios。

参数名 参数含义 参数类型 是否必须 备注
appkey appkey json对象 需分别指明android和ios,可以指定一个,若只给Android发送只需指定android appkey。 计算签名时,若指定了一种,则把该app的secretkey连接在json末尾计算。 若同时指定了Android和IOS,则需要把Android和IOS的secret连接起来(Android在前,IOS在后),连接在json末尾计算。 ios 可以用列表形式指定多个iosapp ,若指定多个iosapp 则需要按先后顺序将其secretkey拼接起来。
userScope 用户范围 int
tag tag过滤条件 json对象 (stag,not_stag)和(tag,not_tag) 互斥, not_tag和tag可以同时存在 它们且关系
not_tag 非tag过滤条件 json对象 not_tag和tag可以同时存在 它们且关系
stag string tag过滤条件 json对象 (stag,not_stag)和(tag,not_tag) not_stag和stag可以同时存在 它们是且关系
not_stag 非string tag过滤条件 json对象 not_tag和tag可以同时存在 它们且关系
alias 指定别名 json对象
token 指定token json对象 当userScope为5时指定。需要根据appkey来指定,若appkey指定了Android和IOS,则需要分别指定他们的token
optfilter 按用户信息过滤 json对象 目前只支持android
2.1.3 userScope 参数
userScope取值 含义 备注
0 全部用户
1 全部android用户
2 全部IOS用户
3 指定别名发送,只给别名对应的最后活跃的1个设备发送
4 指定别名发送,给别名对应的所有设备发送
5 指定token发送 需要使用android和ios单独指定token。
若ios只指定了一个app(类型为字符串)则wu无需给token指定appkey 如:token{android:[token1,token2],ios:[token3,token4]}
若ios指定了多个app(类型为列表) 则 需要给每一个appkey指定token 如:token{android:[token1,token2],ios:{appkey1:[token3,token4],appkey2:[token5,token6]}}
6 按tag或者stag过滤
7 按用户信息过滤 目前仅支持android
8 指定(tag或者stag)及用户信息 目前仅支持android

示例:
假设android的AppKey为1112019780, secretKey为 9mwGIaMIL6zCPBdfOoHOjZPZ4hBt9G9tHjklOyLYNLizLYXn9U1IXo4VuxUjOnj
IOS的AppKey为 2122321716, secretKey 为 F0CI6ou4w4hvjMZBs76o8c0WOSz6OS4QyZ0jenV5KXKvVWMGvIv7lqeafo4XWdEO
a. 给所有平台的用户发送消息,消息格式中的sendTo参数如下:
需要在AppKey中分别制定android和IOS的Appkey,缺一不可

 curl -H "Content-type: application/json" -d '{"sign": "694e77394e9613c20aed9014965e2537", "msgStyle": {"android": {"sound": true}, 
"ios": {"sound": "default", "badge": 1}, "basic":{"content": "hello,ixintui,\u6b22\u8fce\u4f7f\u7528", "is_notif": 1}}, "sendTo": 
{"appkey": {"android": "1112019780", "ios": "2122321716"}, "userScope": 0}}' http://api.ixintui.com:8300/v2/push 

返回值:

{ 
  "android": { 
    "desc": "OK", 
    "id": 5, 
    "result": 0 
  }, 
  "ios": { 
    "desc": "send ok", 
    "id": 100000005, 
    "result": 0 
  }, 
  "result": 0 
}

b. 给全部android用户发送消息
需要在AppKey中用android来指明AppKey,不需要指定ios的AppKey,此处即使指定了ios的AppKey也不会给ios发送消息。

 curl -H "Content-type: application/json" -d '{"sign": "3277cdc1d8f174bb671ff0f8b462f4eb", "option": {"period": 86400}, "msgStyle": 
{"android": {"sound": true, "unremovable": false, "title": "this is title", "click_param": "http://www.ixintui.com", "vibrate": true, 
"click_action": 2}, "basic": {"content": "\u5f53\u524d\u65f6\u95f42015-11-24 11:27:30.597238", "is_notif": 1}}, 
"sendTo": {"appkey": {"android": "1112019780"}, "userScope": 1}}' http://api.ixintui.com:8300/v2/push 

返回值:

{
  "desc": "OK", 
  "id": 7, 
  "result": 0
}

c. 给全部IOS用户发送消息

curl -H "Content-type: application/json" -d '{"sign": "b21276abf4456864b210667ce12d4a2b", "msgStyle": {"basic": {"content": "\u5f53
\u524d\u65f6\u95f42015-11-12 16:33:44.430646 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"ios": "2122321716"}, "userScope": 
2}}'  http://api.ixintui.com:8300/v2/push 

返回值:

{
  "desc": "send ok", 
  "id": 100000007, 
  "result": 0
}

d. 给全部android和IOS(多个)用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "7d61a67264531afd4977af9e9a6e2992", "msgStyle": {"android": {"sound": true}, 
"ios": {"sound": "default", "badge": -1}, "basic": {"content": "gen_broadcast burke\u5f53\u524d\u65f6\u95f42016-08-18 17:54:00.536035",
 "is_notif": 1}}, "sendTo": {"appkey": {"android": "1245227470", "ios": ["1762409330", "987654321"]}, "userScope": 0}}

返回值:

{
  "android": {
    "desc": "OK", 
    "id": 83386, 
    "result": 0
  }, 
  "ios": [
    {
      "desc": "send ok", 
      "id": 100000059, 
      "result": 0
    }, 
    {
      "desc": "send ok", 
      "id": 100000010, 
      "result": 0
    }
  ], 
  "result": 0
}
  • tag参数:
    tag支持与操作、或操作, 格式为 [ [tag1,tag2,tag3], [tag4,tag5,tag6] ],含义为给同时包含tag1、tag2、tag3的人或同时包含tag4、tag5、tag6的人发送消息。这里的tag为数字每个tag的取值范围为[-32727, 32727]。
    示例:
    a. 给同时包含1,2或包含3的tag的用户发送消息
curl -H "Content-type: application/json" -d '{"sign": "d58e999c95f034c64cbbc585fec3417c", "msgStyle": {"basic": {"content": 
"\u5f53\u524d\u65f6\u95f42015-11-12 16:41:22.967818","is_notif": 0}}, "sendTo": {"appkey": {"ios": "2122321716"},
 "userScope": 6, "tag": [[1, 2], [3]]}}'  http://api.ixintui.com:8300/v2/push

返回值:

{
  "desc": "send ok", 
  "id": 200000002, 
  "result": 0
}

b. 不给同时包含1,2或包含3的tag的用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "d58e999c95f034c64cbbc585fec3417c", "msgStyle": {"basic": {"content": 
"\u5f53\u524d\u65f6\u95f42015-11-12 16:41:22.967818","is_notif": 0}}, "sendTo": {"appkey": {"ios": "2122321716"},
 "userScope": 6, "not_tag": [[1, 2], [3]]}}'  http://api.ixintui.com:8300/v2/push

返回值:

{
  "desc": "send ok", 
  "id": 200000003, 
  "result": 0
}

c. 给包含 -10的用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "dd3c04be9ff5bb9f1906faeee267176f", "msgStyle": {"basic": 
{"content": "\u5f53\u524d\u65f6\u95f42015-11-12 16:43:50.891988","is_notif": 0}}, "sendTo": {"appkey":
 {"android": "1112019780", "ios": "2122321716"}, "userScope": 6, "tag": [[-10]]}}'    http://api.ixintui.com:8300/v2/push

返回值:

{
  "android": {
    "desc": "OK", 
    "id": 9, 
    "result": 0
  }, 
  "ios": {
    "desc": "send ok", 
    "id": 200000004, 
    "result": 0
  }, 
  "result": 0
}

d. 给android和多个iosapp的还有标签[333, 222]或者含有标签[111]的设备发送消息

curl -H "Content-type: application/json" -d '{"sign": "9f1d2c80a75ea33cf2e8bb4547c56ec7", "msgStyle": {"android": {"sound": true}, 
"ios": {"sound": "default", "badge": -1}, "basic": {"content": "gen_tag \u5f53\u524d\u65f6\u95f42016-08-18 18:43:03.100783", "is_notif":
 1}}, "sendTo": {"appkey": {"android": "1245227470", "ios": ["1762409330", "987654321"]}, "userScope": 6, "tag": [[333, 222], [111]]}}

返回值:

{
  "android": {
    "desc": "OK", 
    "id": 83390, 
    "result": 0
  }, 
  "ios": [
    {
      "desc": "send ok", 
      "id": 200000054, 
      "result": 0
    }, 
    {
      "desc": "send ok", 
      "id": 200000011, 
      "result": 0
    }
  ], 
  "result": 0
}
  • stag参数:

stag支持与操作、或操作, 格式为 [ [stag1,stag2,stag3], [stag4,stag5,stag6] ],含义为给同时包含stag1、stag2、stag3的人或同时包含stag4、stag5、stag6的人发送消息。
这里的stag为字符串长度最大为40 。
示例:
a. 给同时包含bbb或ddd的stag的用户发送消息

curl -H "Content-type: application/json" -d '{"sign": "a5013e7997136299a2678705c706b607", "msgStyle": {"basic": {"content": 
"gen_android_broadcast\u5f53\u524d\u65f6\u95f42016-08-08 21:17:22.441254", "is_notif": 1}}, "sendTo": {"appkey": {"android": 
"1245227470", "ios": "1762409338"}, "stag": [["bbb", "ddd"]], "userScope": 6}}'  http://api.ixintui.com:8300/v2/push

返回值:

{
  "android": {
    "desc": "OK", 
    "id": 81429, 
    "result": 0
  }, 
  "ios": {
    "desc": "send ok", 
    "id": 300000013, 
    "result": 0
  }, 
  "result": 0
}

b. 不给同时包含bbb或ddd的stag的用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "a5013e7997136299a2678705c706b607", "msgStyle": {"basic": {"content": 
"gen_android_broadcast\u5f53\u524d\u65f6\u95f42016-08-08 21:17:22.441254", "is_notif": 1}}, "sendTo": {"appkey": {"android": 
"1245227470", "ios": "1762409338"}, "not_stag": [["bbb", "ddd"]], "userScope": 6}}'  http://api.ixintui.com:8300/v2/push

返回值:

{
  "android": {
    "desc": "OK", 
    "id": 81429, 
    "result": 0
  }, 
  "ios": {
    "desc": "send ok", 
    "id": 300000013, 
    "result": 0
  }, 
  "result": 0
}

c.给android和多个iosapp的还有标签[aaa, ccc]或者含有标签[bbb]的设备发送消息

curl -H "Content-type: application/json" -d ' {"sign": "d1387dfdf3bc1d6b51ef41d69be9e0fe", "msgStyle": {"android": {"sound": true}, 
"ios": {"sound": "default", "badge": -1}, "basic": {"content": "gen_tag \u5f53\u524d\u65f6\u95f42016-08-18 18:43:04.229326", "is_notif": 
1}}, "sendTo": {"appkey": {"android": "1245227470", "ios": ["1762409330", "987654321"]}, "stag": [["aaa", "ccc"], ["bbb"]], "userScope": 6}}

返回值:

{
  "android": {
    "desc": "OK", 
    "id": 83391, 
    "result": 0
  }, 
  "ios": [
    {
      "desc": "send ok", 
      "id": 300000057, 
      "result": 0
    }, 
    {
      "desc": "send ok", 
      "id": 300000011, 
      "result": 0
    }
  ], 
  "result": 0
}
  • alias参数

alias/token可以为列表或字符串, 若为列表,则代表给列表中的所有用户发送消息,列表最大长度为1000。 alias为不超过40个字节的字符串,由客户端给用户添加别名。
示例:
a. 给别名为burke的最后活跃的设备发送消息

    curl -H "Content-type: application/json" -d '{"sign":"19992e144e3c8d91f088f3441f7d0de5", "msgStyle": {"basic": {"content": "only active receive\u5f53\u524d\u65f6\u95f42015-11-12 16:51:00.837689 2122321716", "is_notif": 0}}, "sendTo": {"appkey": {"android": "1112019780", "ios": "2122321716"}, "alias": "burke", "userScope": 3}}'   http://api.ixintui.com:8300/v2/push 

b. 给别名为burke、dong对应的最后活跃的设备发送消息

    curl -H "Content-type: application/json" -d '{"sign": "7714d3074292b8c2894fd70e05a5b9f7", "msgStyle": {"basic": {"content": "only active receive\u5f53\u524d\u65f6\u95f42015-11-1216:49:46.833746 2122321716", "is_notif": 0}}, "sendTo": {"appkey": {"android":"1112019780", "ios": "2122321716"}, "alias": ["burke", "dong"], "userScope": 3}}'   
http://api.ixintui.com:8300/v2/push 

c. 给绑定了别名为burke的所有设备发送消息

    curl -H "Content-type: application/json" -d '{"sign":"8a44a53603bf286081dc4723b23d9ef2", "msgStyle": {"basic": {"content": "\u5f53
\u524d\u65f6\u95f42015-11-12 16:54:13.311881 2122321716", "is_notif": 0}}, "sendTo": {"appkey": {"android": "1112019780", "ios": 
"2122321716"}, "alias": "burke", "userScope": 4}}'  http://api.ixintui.com:8300/v2/push 

d. 给绑定了别名为burke、dong的所有设备发送消息

    curl -H "Content-type: application/json" -d '{"sign": "1570a57cc4487a4e231b688ced73a12c", "msgStyle": {"basic": {"content": "\u5f53
\u524d\u65f6\u95f42015-11-12 16:52:51.814628 2122321716", "is_notif": 0}}, "sendTo": {"appkey": {"android": "1112019780", "ios": 
"2122321716"}, "alias": ["burke", "dong"], "userScope": 4}}' http://api.ixintui.com:8300/v2/push 

e. 给android和多个iosapp的别名为wkj,aaa的设备发送消息

curl -H "Content-type: application/json" -d ' {"extra": "gen_alias \u5f53\u524d\u65f6\u95f42016-08-18 18:43:02.065577", "sign": 
"290aacc67ae21d3be470480e6bb5db52", "msgStyle": {"android": {"sound": true}, "ios": {"sound": "default", "badge": -1}, "basic": 
{"content": "gen_alias \u5f53\u524d\u65f6\u95f42016-08-18 18:43:02.065577", "is_notif": 1}}, "sendTo": {"appkey": {"android": 
"1245227470", "ios": ["1762409330", "987654321"]}, "alias": ["wkj", "aaa"], "userScope": 4}} http://api.ixintui.com:8300/v2/push
  • token参数
    a. 给Android指定的token发送消息
    curl -H "Content-type: application/json" -d  '{"sign":"36a36145bfe980c1a272ad1dfffc2b59", "msgStyle":{"android"
{"click_action":1,"sound":true,"title":"This is Title","unremovable":false,"vibrate":true},"basic":{"content":"This is 
Content","is_notif":1}},"option":{"period":86400},"sendTo":{"appkey":{"android":"1245227470"},
"token":{"android":["4249317714557889999","5190956903548595010"]},"userScope":5},}'   http://api.ixintui.com:8300/v2/push

b. 给IOS指定token发送消息

    curl -H "Content-type: application/json" -d '{"sign":"54506644f5e89e4d68ca98919c038a53", "msgStyle":{"basic":
{"content":"This is Content","is_notif":1},"ios":{"badge":1}},"option":{"period":86400},"sendTo":{"appkey":{"ios":"1229311726"},
"token":{"ios":"27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dadd"},"userScope":5}}'
 http://api.ixintui.com:8300/v2/push 

c. 给Android和IOS指定的token发送消息

    curl -H "Content-type: application/json" -d {"sign":"68155bc9e35618570edb9ca9eed88103", "msgStyle":{"android":
{"click_action":2,"click_param":"www.ixintui.com","sound":true, "title":"This is Title","unremovable":false,"vibrate":true},"basic":
{"content":"This is Content","is_notif":1},"ios":{"badge":1}},"option":{"period":86400},
"sendTo":{"appkey":{"android":"1245227470","ios":"1229311726"},"token":{"android":["4249317714557889999","5190956903548595010"],
"ios":"27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dadd"}, "userScope":5}}' http://api.ixintui.com:8300/v2/push

d.给Android和IOS(多个)指定的token发送消息

curl -H "Content-type: application/json" -d {"extra": "gen_unicast burke\u5f53\u524d\u65f6\u95f42016-08-18 17:54:01.618648", "sign":
 "d58d3a23f2a1b0152af72d9ab00b9613", "msgStyle": {"android": {"sound": true}, "ios": {"sound": "default", "badge": -1}, "basic": 
{"content": "gen_unicast burke\u5f53\u524d\u65f6\u95f42016-08-18 17:54:01.618648", "is_notif": 1}}, "sendTo": {"appkey": {"android": 
"1245227470", "ios": ["1762409330", "987654321"]}, "userScope": 5, "token": {"android": "77237179891356241", "ios": {"987654321": 
"2a040371591d6a8677cbb794813e159432dfe45be8e4661f8238d1b1ec54e18d", "1762409330": 
"27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dadd"}}}}
  • optfilter参数

optfilter: 支持按地域、app版本,app渠道, 操作系统版本,手机品牌, 运营商、应用活跃度进行推送
格式为:

 {
 "locate": ["北京市", "天津市"], 
 "activity_7": {"<=": 30, ">=": 10}, 
 "activity_30": {"=": 100},
 "activity_90": {"<=": 100, ">=": 100}, 
 "appversion": ["1.1.0", "2.1.1"], 
 "phone": ["htc"],
 "operator": ["cm", "cu"], 
 "osversion": ["4.0.4", "2.2.1"], 
 "activity_1": {"<": 10, ">": 1},
 "channel": ["91", "wandoujia"]
  }

大小写敏感,编码为utf-8,必须完全匹配才会发送消息
参数列表如下:

参数名字 类型 是否必须 描述
locate string列表 非必须 地域选项,取值见附录
locate_not string列表 非必须 地域选项,取值见附录
osversion string列表 非必须 操作系统选项
osversion_not string列表 非必须 操作系统选项
appversion string列表 非必须 应用的版本选项
appversion_not string列表 非必须 应用的版本选项
channel string列表 非必须 应用的渠道选项
channel_not string列表 非必须 应用的渠道选项
phone string列表 非必须 手机品牌选项
phone_not string列表 非必须 手机品牌选项
model kv列表 非必须 手机型号选项,key为手机品牌,value为手机型号,配合phone选项使用
model_not kv列表 非必须 手机型号选项,key为手机品牌,value为手机型号,配合phone_not选项使用
operator string列表 非必须 运营商选项,取值见附录
operator_not string列表 非必须 运营商选项,取值见附录
activity_1 kv列表 非必须 1天内应用打开次数选项,支持>, <, >=, <=, =
activity_7 kv列表 非必须 7天内应用打开次数选项,支持>, <, >=, <=, =
activity_30 kv列表 非必须 30天内应用打开次数选项,支持>, <, >=, <=, =
activity_90 kv列表 非必须 90天内应用打开次数选项,支持>, <, >=, <=, =

这些选项之间是与关系,选项内部是或关系。
比如: {"locate": ["北京市"], "osversion": ["4.0.4", "2.2.1"]} 给在北京市且 (用户手机版本为4.0.4或2.2.1)的用户发送消息
a. 给北京市、上海市的所有用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "2cab5740275e5f5bafed4df3a74d9091", "msgStyle": {"basic": {"content": "\u5f5
\u524d\u65f6\u95f42015-11-12 17:21:30.506542 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780"}, "optfilter": 
{"android": {"locate": ["\u5317\u4eac\u5e02", "\u4e0a\u6d77\u5e02"]}}, "userScope": 7}}' http://api.ixintui.com:8300/v2/push 

b. 给系统版本为4.0、4.1的用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "cef782d8b0c14fedf608ef62ceebf2dc", "msgStyle": {"basic": {"content": "\u5f53
\u524d\u65f6\u95f42015-11-12 17:20:52.805864 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780"},
 "optfilter": {"android": {"osversion": ["4.0", "4.1"]}}, "userScope": 7}}' http://api.ixintui.com:8300/v2/push 

c. 给appversion为1.0、2.0的所有用户发送消息

curl -H "Content-type: application/json" -d '{"sign": "c6a4fac9f9ee211452684ab648171fff", "msgStyle": {"basic": {"content": "\u5f53\u524d
\u65f6\u95f42015-11-12 17:20:12.200543 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780"}, "optfilter": 
{"android": {"appversion": ["1.0", "2.0"]}}, "userScope": 7}}'  http://api.ixintui.com:8300/v2/push 

d. 给91、wandoujia的渠道用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "73e0289bfa7ebfd973f04dbf11173128", "option": {"period": 86400}, "msgStyle": 
{"basic":{"content": "\u5f53\u524d\u65f6\u95f42015-11-12 17:17:20.902412 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": 
"1112019780"}, "optfilter": {"android": {"channel": ["wandoujia", "91"]}}, "userScope": 7}}' http://api.ixintui.com:8300/v2/push

e. 给xiaomi手机的用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "0e126e8201be550333d61b9a5f4862a3", "msgStyle": {"basic": {"content": 
"\u5f53\u524d\u65f6\u95f42015-11-12 17:19:48.562734 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780"}, 
"optfilter": {"android": {"phone": ["xiaomi"]}}, "userScope": 7}}' http://api.ixintui.com:8300/v2/push

f. 给移动用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "55049a54310ac628041bcf6e6ead6cb1", "msgStyle": {"basic": {"content":
 "\u5f53\u524d\u65f6\u95f42015-11-12 17:22:30.2319382122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780"}, 
"optfilter": {"android": {"operator": ["cm"]}}, "userScope": 7}}' http://api.ixintui.com:8300/v2/push

g. 给30天内打开次数大于等于10次的用户发送消息

    curl -H "Content-type: application/json" -d '{"sign": "610dfb4b0688ab446eb694b25d1fc9d6", "msgStyle": {"basic": {"content": 
"\u5f53\u524d\u65f6\u95f42015-11-12 17:24:08.760766 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780"},
 "optfilter": {"android": {"activity_30": {">=": 10}}}, "userScope": 7}}' http://api.ixintui.com:8300/v2/push

h. 给北京市的91渠道安装应用的用户发送消息

   curl -H "Content-type: application/json" -d '{"sign": "7d63c5b398e0085f4481d925d4e97cf3", "msgStyle": {"basic": {"content": 
"\u5f53\u524d\u65f6\u95f42015-11-12 17:25:24.669502 2122321716", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780"}, 
"optfilter": {"android": {"locate": ["\u5317\u4eac\u5e02"], "channel": ["91"]}}, "userScope": 7}}' http://api.ixintui.com:8300/v2/push
2.1.4 msgStyle消息样式
维度 参数 参数含义 参数类型 默认值
basic content 消息内容可分别指定android或ios消息内容,参考示例f,其中ios的消息内容可以指定string或json对象,json对象的详细格式见下表 string或json对象 必须字段
is_notif 0:透传,1:通知,可分别指定android或ios消息类型,参考示例d json对象 必须字段
android sound false:无声音,true:有声音 bool false
unremovable false:不可移除,true:可移除 bool false
title 消息标题 string App名字
click_action 0:无动作,1:打开App,2:打开网页3:打开intent;4:landing page 5:popup 6:information flow 7:richmedia url,参数用click_param设置 int 无动作
click_param 详情参考click_param string或json对象 当click_action 存在时,必须字段
vibrate false:不振动 true:震动 bool false
badge 角标显示数字 int 默认无,不改变原有脚本,-1代表自增
ios badge 角标显示数字 int 默认无,不改变原有脚本,-1代表自增
sound 声音文件名 string 默认为default
content-available 0:不触发background mode,1: 触发background mode int 无默认
category 从IOS8支持,自定义动作设置 string 无默认

content表1

  • click_param详请:
click_action click_param 必须 条件限制 说明
0:无动作   不需要click_param
1:打开App   不需要click_param
2:打开网页 需要打开的url  
3:打开intent 需要打开的intent
4:landing-page "picture-addr" 图片大小限制为500k
  "picture-hyperlink" 图片链接
  "jump-button" 是否有“跳过”按钮0:不添加1.加
  "jump-seconds" 约束为1-60 自动跳过时间,用户无操作时等待N秒自动跳转
  "tip-content" 最多为10个中文字符 当提示信息tip-content内容不存在或为NULL时,不展示提示信息;当提示信息tip-content存在时,tip-url必须对应存在;
  "tip-url" 点击tip-content对应的url
  "download-condition" 0无限制1仅wifi环境下载  
5:pop-up "popup-mode" 1.单图模式(无标题)2.图文模式(有标题)  
  "title" 最多为15个中文字符 popup-mode=1,单图模式中title是不需要的,popup-mode=2,图文模式中title是必须的
  "picture-addr" 图片大小限制为500k
  "picture-hyperlink"
  "tip-content" 最多为10个中文字符
  "tip-url"
  "download-condition" 0无限制1仅wifi环境下载
6:information-flow "flow-mode" 1单图文模式,2多图文模式 单图文模式中"text-abstract"是必须的,多图文模式中"text-abstract"是不需要的,"information"长度范围为[27]
  "top-title" 最多为15个中文字符
  "download-condition" 0无限制1仅wifi环境下载
  "title" 最多为15个中文字符 此字段在"information"结构下
  "picture-addr" 图片大小限制为500k 此字段在"information"结构下
  "text-abstract" 最多为100个中文字符 此字段在"information"结构下
  "text-detail" 此字段在"information"结构下
7:richmeida-url "url" 富媒体url

示例:
a. 发送透传消息

 {"msgStyle": {"basic": {"content": "hello ixintui", "is_notif": 0}}}

b. 给android用户发送带声音、震动的消息, 设置title为Hello, 点击后打开App的消息

 {"msgStyle": {"android": {"sound": true, "click_action": 1, "vibrate": true, "title": "Hello"}, "basic": {"content": "hello ixintui", "is_notif": 1}}}

c.同时发送android和ios消息, ios消息设置角标为1,且触发accept的自定义动作, android则为带声音和震动的消息。

 {"msgStyle": {"android": {"sound": true, "vibrate": true}, "ios": {"category": "accept", "badge": 1}, "basic": {"content": "hello ixintui", "is_notif": 1}}}

d. 同时发送消息给android和ios,android为透传,ios设置消息

{"msgStyle": {"basic": {"content": "hello ixintui", "is_notif": {"android":0,"ios":1}}}}

f. 同时发送消息给android和ios,两者消息内容不同

{"msgStyle": {"basic": {"content": {"android":"hello ixintui,android","ios":"hello ixintui ios"}, "is_notif": {"android":0,"ios":1}}}}

g. 登录页模式,包含“跳过”按钮,用户无操作时,5秒自动跳转

{"click_param":
    {"picture_addr":"http://s4.sinaimg.cn/orignal/878940b3xbd8a1e439013&690",  
    "picture_hyperlink":"http://jigndong.com",  
    "jump-button":1,  
    "jump-seconds":5,  
    "tip-content":"了解详情",  
    "tip-url":"http://xiangqing.com.cn"}}

h.图文模式弹窗

{"click_param":  
    {"popup-mode":2,
    "title":"爱心推",
    "picture-addr":"http://s4.sinaimg.cn/orignal/878940b3xbd8a1e439013&690",
    "picture-hyperlink":"http://jigndong.com",
    "tip-content":"领取红包",
    "tip-url":"http://developer.ixintui.com/index.php"}}

i.单图文模式信息流

{"click_param":
  {"flow-mode":2,
  "top-title":"爱心推旅程",
  "information":[
    {"title":"您的足迹",
    "picture-addr":"http://developer.ixintui.com/index.php",
    "text-abstract":"aixintui陪你走过的每一天",
    "text-detail":"今天是aixintui陪你走过的367天…"
    }]
  }
}

j.多图文模式信息流

{"click_param":
  {"flow-mode":2"top-title":"爱心推旅程",
    "information":[
      {"title":"您的足迹",
      "picture-addr":"http://developer.ixintui.com/index.php",
      "text-detail":"今天是aixintui陪你走过的367天…"
      },
      {"title":"您的贡献",
      "picture-addr":"http://developer.ixintui.com/index.php",
      "text-detail":"截至今天你已经阅读333篇文章,…"
      }]
      }
  }
2.1.5 option消息选项
参数 参数含义 参数类型 默认值
period 消息存活周期,单位秒 int 在创建应用时指定
qps 发送速度,单位 个/秒,默认为0,代表以最大速度发送 int 默认为0,代表以最大速度发送。 最小值为1000,低于1000按1000算。 当用户量小于10000时,该值不生效。
timed 定时消息,默认0 int 0:非定时消息,默认值;
1:按具体时间点定时,用send_time参数来指定具体时间点;
2:按时间间隔定时,用send_time_interval参数指定时间间隔
send_time 定时消息具体发送时间点 string timed为1时生效, 格式Y-%m-%d %H:%M (for example 2014-09-01 5:30)
send_time_interval 定时消息的时间间隔 int timed为2时生效,单位秒

2.2 android广播消息取消接口

接口地址:http://androidmis.ixintui.com:8001/push
接口方法: DELETE
接口功能:已经发送的广播消息,若广播消息用户还未收到,可以调用该接口来取消消息,这样未收到该消息的用户将不会在收到该消息。比如,发送了一个广播消息,已经有1000个用户收到,但还有900000个用户没有收到,可以调用该接口,这样未收到该消息的用户将不在接收该消息。说明: 新注册的用户不会收到注册之前的消息,比如,在产品发版之前发送了一些广播消息,但发版后,新用户将不会收到之前的测试时的广播消息,不用来调用该接口来取消。
参数列表

参数名字 类型 是否必须 描述
appkey string app唯一标识
msgid uint64 要取消的消息id
sign string 签名(计算见1.4)

请求示例:

curl -H 'Content-type: application/json' -X DELETE -d '{"appkey": "1425830916", "msgid": "9", "sign": "c4a090f94acbfcd9789c6a1e0f4f9942"}' http://androidmis.ixintui.com:8001/push

返回值:

{
  "desc": "cancel succ",
  "result": 0,
}

2.3 获取定时消息发送信息列表接口

接口地址:http://api.ixintui.com:8300/v2/timedtasklist
接口功能:获取指定app的定时消息发送状态信息等,并分页显示。
参数列表

参数名字 类型 是否必须 描述
appkey json对象 需分别指明android和ios,可以指定一个,若指定了一种,则把该app的secretkey连接在json末尾计算。若同时指定了Android和IOS,则需要把Android和IOS的secret连接起来(Android在前,IOS在后),连接在json末尾计算。ios 可以用列表形式指定多个iosapp ,若指定多个iosapp 则需要按先后顺序将其secretkey拼接起来。
order int 按定时消息的创建时间进行排序。0:从小到大(正序)1:从大到小(逆序)默认为0
page_num int 标明需要显示第几页的数据,起始页码为1
page_size in t 是 标明每页的大小(单位:条)每页大小不得超过50条
sign string 签名(计算见1.4)

请求示例:
查询android的appkey为 1245227470的app定是消息信息,显示第一页,每页5条,逆序排序:

curl -H 'Content-type: application/json' -X POST -d '{"appkey:{"android":1245227470},"page_num":1,"page_size":5,"sign":"9a967816b108ec1c49fea4c4af45d019","order":1}'
http://api.ixintui.com:8300/v2/timedtasklist

响应示例:

"data": [
    {
      "CreateTime": "2016-06-29 10:45:00", 
      "MsgContent":"gen_android_broadcast\u5f53\u524d\u65f6\u95f42016-06-29 10:45:03.633010", 
      "SendTime": "2016-07-04 05:30:00", 
      "Status": "unsend", 
      "TaskKey": "1467581400@3_1245227470#0_1"
    }, 
    {
      "CreateTime": "2016-06-28 19:05:00", 
      "MsgContent":"gen_android_broadcast\u5f53\u524d\u65f6\u95f42016-06-28 19:05:44.741040", 
      "SendTime": "2016-06-29 05:30:00", 
      "Status": "unsend", 
      "TaskKey": "1467149400@2_1245227470#0_1"
    }, 
    {
      "CreateTime": "2015-10-23 17:16:00", 
      "MsgContent": "\u5e94\u8be52015-10-23 17:18:36\u6536\u5230 1229311726", 
      "SendTime": "2015-10-23 17:18:00", 
      "Status": "cancel", 
      "TaskKey": "1445591880@146_1245227470#1229311726_0"
    }, 
    {
      "CreateTime": "2015-10-23 17:14:00", 
      "MsgContent": "\u5e94\u8be52015-10-23 17:16:32\u6536\u5230 1229311726", 
      "SendTime": "2015-10-23 17:16:00", 
      "Status": "cancel", 
      "TaskKey": "1445591760@145_1245227470#1229311726_0"
    }, 
    {
      "CreateTime": "2015-10-23 17:11:00", 
      "MsgContent": "\u5e94\u8be52015-10-23 17:13:05\u6536\u5230 1229311726", 
      "SendTime": "2015-10-23 17:13:00", 
      "Status": "send", 
      "TaskKey": "1445591580@142_1245227470#1229311726_0"
    }
  ], 
  "result": 0, 
  "pagecount": 20

2.4 获取单个定时消息发送信息接口

接口地址:http://api.ixintui.com:8300/v2/timedtaskdetail
接口功能:获取指定定时消息发送状态信息。

参数列表

参数名字 类型 是否必须 描述
appkey json对象 需分别指明android和ios,可以指定一个,若指定了一种,则把该app的secretkey连接在json末尾计算。若同时指定了Android和IOS,则需要把Android和IOS的secret连接起来(Android在前,IOS在后),连接在json末尾计算。ios 可以用列表形式指定多个iosapp ,若指定多个iosapp 则需要按先后顺序将其secretkey拼接起来。
task_key string 在发送定是消息时从服务器返回的 “task_key”字段。
sign string 签名(计算见1.4)

请求示例:
查询task_key为1445588280@59_1245227470#1229311726_0的定时消息信息

curl -H 'Content-type: application/json' -X POST -d {"appkey":{"android":1245227470,"ios":1229311726},"sign":"52c6183b11373ca2f97757e00b1498ef",
"task_key":"1445588280@59_1245227470#1229311726_0"} http://api.ixintui.com:8300/v2/timedtaskdetail

响应示例:

"data": [
    {
      "CreateTime": "2015-10-23 15:58:00", 
      "MsgContent": "\u5e94\u8be52015-10-23 16:18:28\u6536\u5230 1229311726", 
      "SendTime": "2015-10-23 16:18:00", 
      "Status": "unsend", 
      "TaskKey": "1445588280@59_1245227470#1229311726_0"
    }
  ], 
"result": 0

注意:如果定时消息是同时发给android和ios的
比如(task_key=1445588280@59_1245227470#1229311726_0),此时我们可以仅仅给出android的appkey,或者ios的appkey即可,同时给出也可以。

请求示例:

curl -H 'Content-type: application/json' -X POST -d 
{"appkey":{"android":1245227470},"sign":"52c6183b11373ca2f97757e00b1498ef","task_key":"1445588280@59_1245227470#1229311726_0"}

响应示例:

"data": [
    {
      "CreateTime": "2015-10-23 15:58:00", 
      "MsgContent": "\u5e94\u8be52015-10-23 16:18:28\u6536\u5230 1229311726", 
      "SendTime": "2015-10-23 16:18:00", 
      "Status": "unsend", 
      "TaskKey": "1445588280@59_1245227470#1229311726_0"
    }
  ], 
"result": 0

2.5 取消定时消息接口

接口地址:http://api.ixintui.com:8300/v2/timed
接口方法:DELETE
接口功能:取消未发送的定时消息。
参数列表

参数名字 类型 是否必须 描述
appkey json对象 需分别指明android和ios,可以指定一个,若指定了一种,则把该app的secretkey连接在json末尾计算。若同时指定了Android和IOS,则需要把Android和IOS的secret连接起来(Android在前,IOS在后),连接在json末尾计算。ios 可以用列表形式指定多个iosapp ,若指定多个iosapp 则需要按先后顺序将其secretkey拼接起来。
task_key string 在发送定是消息时从服务器返回的 “task_key”字段。
sign string 签名(计算见1.4)

请求示例:
查询task_key为1445588280@59_1245227470#1229311726_0的定时消息信息

curl -H 'Content-type: application/json' -X DELETE -d {"appkey":{"android":1245227470,"ios":1229311726},"sign":"52c6183b11373ca2f97757e00b1498ef",
"task_key":"1445588280@59_1245227470#1229311726_0"} http://api.ixintui.com:8300/v2/timed

响应示例:

 "desc": "ok", 
 "result": 0

注意:如果定时消息是同时发给android和ios的
比如(task_key=1445588280@59_1245227470#1229311726_0),此时我们可以仅仅给出android的appkey,或者ios的appkey即可,同时给出也可以。

请求示例:

curl -H 'Content-type: application/json' -X POST -d 
{"appkey":{"android":1245227470},"sign":"52c6183b11373ca2f97757e00b1498ef","task_key":"1445588280@59_1245227470#1229311726_0"}

响应示例:

  "desc": "ok", 
  "result": 0

2.6 添加stringtag接口

接口地址:http://api.ixintui.com:8300/v2/device
接口方法:POST
接口功能:给设备添加stringtag
参数列表

参数名字 类型 是否必须 描述
appkey string或者string列表 若以列表形式则需要将secretkey按先后顺序进行拼接,计算校验值
action string 目前只能取值为stag
params dict 每个stag值长度限制为40个字节(中文为utf-8编码),示例: Appkey为string,
{token1:["stag1","stag2"],token2:["stag3","stag4"]} Appkey为列表: {appkey1:{token1:["stag1","stag2"],token2:["stag3","stag4"]}, appkey2:{token3:["stag1","stag2"],token4:["stag3","stag4"]}}
sign string 签名(计算见1.4)

请求示例:至指定单个app

curl -H 'Content-type: application/json' -X POST -d '{"appkey": "1245227470", "action": "stag", "params": {"3551144067725105229": 
["bbb", "ccc"], "3551144067725105228": ["ccc"]}, "sign": "2bab9397b676f4f45f3e004826bda76f"}' http://api.ixintui.com:8300/v2/device

响应示例:

{
  "desc": "OK", 
  "detailsinfo": [
    {
      "desc": "OK", 
      "result": 0, 
      "token": "3551144067725105228"
    }, 
    {
      "desc": "OK", 
      "result": 0, 
      "token": "3551144067725105229"
    }
  ], 
  "result": 0
}

请求示例:指定多个app

{"appkey": ["1245227470", "1762409330", "987654321"], "action": "stag", "params": {"987654321": 
{"2a040371591d6a8677cbb794813e159432dfe45be8e4661f8238d1b1ec54e18d": ["aaa", "ccc"], 
"0c397a12b5c0b03ce889fc24d2b38dc02ce284ff0799e01bb5ecc0da3dc7de43": ["aaa", "ccc"]}, "1245227470": {"3551144067725105229": ["bbb", 
"ccc"], "3551144067725105228": ["ccc"]}, "1762409330": {"27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dadd": ["bbb"], 
"3551144067725105229": ["bbb", "ccc"], "3551144067725105228": ["ccc"]}}, "sign": "5273ad28b6c7c2477a50983cea9a77df"}

响应示例:

{
  "1245227470": {
    "desc": "OK", 
    "detailsinfo": [
      {
        "desc": "OK", 
        "result": 0, 
        "token": "3551144067725105229"
      }, 
      {
        "desc": "OK", 
        "result": 0, 
        "token": "3551144067725105228"
      }
    ], 
    "result": 0
  }, 
  "1762409330": {
    "desc": "OK", 
    "detailsinfo": [
      {
        "desc": "OK", 
        "result": 0, 
        "token": "3551144067725105229"
      }, 
      {
        "desc": "OK", 
        "result": 0, 
        "token": "3551144067725105228"
      }, 
      {
        "desc": "OK", 
        "result": 0, 
        "token": "27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dadd"
      }
    ], 
    "result": 0
  }, 
  "987654321": {
    "desc": "OK", 
    "detailsinfo": [
      {
        "desc": "OK", 
        "result": 0, 
        "token": "2a040371591d6a8677cbb794813e159432dfe45be8e4661f8238d1b1ec54e18d"
      }, 
      {
        "desc": "OK", 
        "result": 0, 
        "token": "0c397a12b5c0b03ce889fc24d2b38dc02ce284ff0799e01bb5ecc0da3dc7de43"
      }
    ], 
    "result": 0
  }, 
  "desc": "ok", 
  "result": 0
}

2.7 删除stringtag接口

接口地址:http://api.ixintui.com:8300/v2/device
接口方法:DELETE
接口功能:删除设备stringtag
参数列表

参数名字 类型 是否必须 描述
appkey string或者string列表 若以列表形式则需要将secretkey按先后顺序进行拼接,计算校验值.
action string 目前只能取值为stag
param dict 每个stag值长度限制为40个字节(中文为utf-8编码),示例: {appkey1:{token1:["stag1","stag2"],token2:["stag3","stag4"]}, appkey2:{token3:["stag1","stag2"],token4:["stag3","stag4"]}}
sign string 签名(计算见1.4)

请求示例:

curl -H 'Content-type: application/json' -X DELETE -d '{"appkey": "1245227470", "action": "stag", "params": {"3551144067725105229": 
["bbb", "ccc"], "3551144067725105228": ["ccc"]}, "sign": "2bab9397b676f4f45f3e004826bda76f"}' http://api.ixintui.com:8300/v2/device

响应示例:

{
  "desc": "OK", 
  "detailsinfo": [
    {
      "desc": "OK", 
      "result": 0, 
      "token": "3551144067725105229"
    }, 
    {
      "desc": "OK", 
      "result": 0, 
      "token": "3551144067725105228"
    }
  ], 
  "result": 0
}

2.8 查询stringtag接口

接口地址:http://api.ixintui.com:8300/v2/deviceinfo
接口方法:POST
接口功能: 查询设备stringtag
参数列表

参数名字 类型 是否必须 描述
appkey string或者string的列表 若以列表形式则需要将secretkey按先后顺序进行拼接,计算校验值。
action string 目前只能取值为stag
param dict 示例:{appkey1:[token1,token2], appkey2:[token3,token4]}
sign string 签名(计算见1.4)

请求示例:
指定单个app

curl -H 'Content-type: application/json' -X POST -d '{"appkey": "1245227470", "action": "stag", "params": ["3551144067725105229", 
"3551144067725105228"], "sign": "ed118e3586f5769402c1fd691d84232d"}' http://api.ixintui.com:8300/v2/deviceinfo

响应示例:

{
  "desc": "OK", 
  "detailsinfo": [
    {
      "infolist": [
        "bbb", 
        "ccc"
      ], 
      "result": 0, 
      "token": "3551144067725105229"
    }, 
    {
      "infolist": [
        "ccc"
      ], 
      "result": 0, 
      "token": "3551144067725105228"
    }
  ], 
  "result": 0
}

请求示例:指定多个app

{"appkey": ["1245227470", "1762409330", "987654321"], "action": "stag", "params": {"987654321": 
["0c397a12b5c0b03ce889fc24d2b38dc02ce284ff0799e01bb5ecc0da3dc7de43", 
"2a040371591d6a8677cbb794813e159432dfe45be8e4661f8238d1b1ec54e18d"], "1245227470": ["3551144067725105229", "3551144067725105228"], 
"1762409330": ["3551144067725105229", "3551144067725105228", "27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dadd"]}, 
"sign": "79a78486089578179c7201960f989e02"}

响应示例:

{
  "1245227470": {
    "desc": "OK", 
    "detailsinfo": [
      {
        "infolist": [
          "bbb", 
          "ccc"
        ], 
        "result": 0, 
        "token": "3551144067725105229"
      }, 
      {
        "infolist": [
          "ccc"
        ], 
        "result": 0, 
        "token": "3551144067725105228"
      }
    ], 
    "result": 0
  }, 
  "1762409330": {
    "desc": "OK", 
    "detailsinfo": [
      {
        "infolist": [
          "bbb"
        ], 
        "result": 0, 
        "token": "27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dadd"
      }, 
      {
        "infolist": [
          "bbb", 
          "ccc"
        ], 
        "result": 0, 
        "token": "3551144067725105229"
      }, 
      {
        "infolist": [
          "ccc"
        ], 
        "result": 0, 
        "token": "3551144067725105228"
      }
    ], 
    "result": 0
  }, 
  "987654321": {
    "desc": "OK", 
    "detailsinfo": [
      {
        "infolist": [
          "aaa", 
          "ccc"
        ], 
        "result": 0, 
        "token": "2a040371591d6a8677cbb794813e159432dfe45be8e4661f8238d1b1ec54e18d"
      }, 
      {
        "infolist": [
          "aaa", 
          "ccc"
        ], 
        "result": 0, 
        "token": "0c397a12b5c0b03ce889fc24d2b38dc02ce284ff0799e01bb5ecc0da3dc7de43"
      }
    ], 
    "result": 0
  }, 
  "desc": "ok", 
  "result": 0
}

2.9 获取ios错误token接口

接口地址:http://api.ixintui.com:8300/v2/errortoken
接口方法:POST
接口功能:获取ios错误token
错误token是指:

  1. token不存在
  2. token已经卸载app
    参数列表
参数名字 类型 是否必须 描述
appkey string或者string列表 若以列表形式则需要将secretkey按先后顺序进行拼接,计算校验值.
sign string 签名(计算见1.4)

请求示例:

curl -H 'Content-type: application/json' -X POST -d '{"appkey": ["1762409338", "1762409338"], "sign": 
"374c0c22a859d66155381193065e26ff"}' http://api.ixintui.com:8300/v2/errortoken

响应示例:

{
  "data": {
    "1762409338": [
      "c04de42b29a28b3aebe00ae75df7e818f4328c8143db8f19bbfce86455409a13", 
      "7de623f9cf94abe19e1cc7f39c008d2b92c5ab0eeeaf2886fa54d30e909ee78c", 
      "68b8d7c7555a8a82aa4476cb66227444d8ab256a3deda467ee2ae709fa39fda1", 
      "b1fe2bb1258a5c8dd37522701e04208fa65719e3bb790760e98b4099b7314e56", 
      "6d33d0560623233fde1163972606298a9c4a861c1e7e570991eea88cdb78fa62", 
      "b99d09808a73e6f1bc72dc804a7b9824e9424e965a5bd82e69f71ef1ca74e3c3", 
      "634f39165b1cd6f29f37782f6fbc8053a17e46c054919c4df93d35bbd52d2330", 
      "a3818ee612eb6ea5631737e89281ee6f0a15c94511275b79e9e341c8d3b4d62e", 
      "71f27c0f54d9843ae436b325b276cd4270c98a8cccb5a810b2161b0c14f635d6", 
      "3c94ec9bebbfbd7ce615071fc97efddf216425e77427fe8b08feaf225426b7b3", 
      "483ffc12198bb36983b98af095ba130308fd30e36fd091b50a14255934ec8344", 
      "27e9ed00cd73cb6d4b6fc6ac96e8c03cb502560b7b6b93f1ac382fc9f6d8dad2", 
      "63ad18e3417a66e696fb991235f3ae338c61661b8a68ec7951990d288c2f0031", 
      "cfb0c8c4437ba8cdf19a2627ffde8fa2a56642ebd05738923fb95725760fe77f", 
      "8e9ec72ce547d5d1f9b41879793704f61155e2c723180a89accfed2b5d8818e2", 
      "2a474a2d16534e635ddb20c8917def7adc05793482901eb771b1b8806044bae8", 
      "faa27afc06956005d7c1e07c02062a3731d938f8c19e701deda7585df95775b4", 
      "b9876fcbcfd9e93172e6d4dae0c71756f3db209961fd97aef1bfd9d1557e6f86", 
      "968144169a34aa58cda504e0b37d66122f5b5041c66ff63b0993edfe45bce33a", 
      "b6f8a3835e2ec2f7bba38190eb29bb5d3658a0e01924ab4a9ca6232d4e57c751", 
      "8da8400f3c2e6b80b6a5b2833edbb1c219ab4defebb7377275e032f02a7e7829"
    ]
  }, 
  "desc": "OK", 
  "result": 0
}

2.10 获取统计信息接口

接口地址:http://api.ixintui.com:8300/v2/statistics
接口功能:与ixintui官网上获取统计信息的网页功能相同,使用者能通过该接口获取app的长连接,广播消息,注册用户,登入用户等统计信息。
参数列表

参数名字 类型 是否必须 描述
appkey string App编号
type int 0:长连接统计 1:广播消息统计 2:注册用户数统计 3:登入用户数统计
param json对象 参数
sign string 签名(计算见1.4)
2.10.1 param
参数名字 类型 是否必须 描述
category int 0:不分布(忽略info值)1:地域分布(type==2时无效) 2:运营商分布 3:渠道分布 4:Sdk版本分布 5:品牌分布 6:分辨率分布(type==3时无效) 7:Os版本分布(type==3时无效) 8:app版本分部(type==3时无效)
dur json对象 时间范围
Info string 查询信息,当category!=0时生效且必须存在。 特殊值:“all”:返回分布列表(由category的值决定) 指定查询的信息如:“上海”,“华为”,“1.0”等 (查询内容需要和category对应)
msgid int 广播消息id特殊值:-1:返回消息列表,且忽略其他所有项 默认值-1 (当type==1时生效)。
usertype int 0:新增用户,1:累计用户 ,默认值0 (当type==2时生效)
2.10.2 dur
参数名字 类型 是否必须 描述
timeScope int 0:今天 1:昨天,2:最近七天,3:自定义定的时间段
from Y-%m-%d 起始时间 当time==3时,生效
to Y-%m-%d 结束时间 当time==3时,生效
查询实例:
1.查询2014-12-01 在香港特别行政区登入的用户数量:
curl -H 'Content-type: application/json' -X POST -d '{"appkey":0,"type":3,"param":{"category":1,"info":"\u6fb3\u95e8\u7279\u522b\u884c
\u653f\u533a", "dur": {"from": "2014-12-01", "timeScope": 3, "to": "2014-12-01"}}, "sign": "52c6183b11373ca2f97757e00b1498ef"}' 
http://api.ixintui.com:8300/v2/statistics

响应示例:

"data": [
    {
      "1": 2388,           //1天内累计登入用户数
      "2": 2842,           //2天内累计登入用户数
      "3": 3183,           //3天内累计登入用户数
      "4": 3436,           //4天内累计登入用户数
      "5": 3664,           //5天内累计登入用户数
      "6": 3850,        //6天内累计登入用户数
      "7": 4030,           //7天内累计登入用户数
      "30": 6926,           //30天内累计登入用户数
      "date": "2014-12-01"   //日期
    }
  ], 
  "result": 0

查询实例:
1.查询2014-12-01到2016-12-01时间段中按地域分布的链接数。

curl -H 'Content-type: application/json' -X POST -d '{"appkey": 1172049780, "type": 0, "param": {"category": 1, "info": "all", "dur": 
{"from": "2014-12-01", "timeScope": 3, "to": "2016-12-01"}}, "sign": "52c6183b11373ca2f97757e00b1498ef"}'
' http://api.ixintui.com:8300/v2/statistics

响应示例:

"data": [
    {
      "avgCount": 439,        //平均链接数
      "info": "\u5e7f\u4e1c",   //广东
      "maxCount": 9982,       //最大链接数
      "minCount": 0        //最小连接数
    }, 
    {
      "avgCount": 434, 
      "info": "\u4e0a\u6d77",  //上海
      "maxCount": 10000, 
      "minCount": 0
    }, 
    {
      "avgCount": 440, 
      "info": "\u6cb3\u5317",  //河北
      "maxCount": 10010, 
      "minCount": 0
    }, 
    {
      "avgCount": 443, 
      "info": "\u5c71\u4e1c",  //山东
      "maxCount": 10089, 
      "minCount": 0
    }, 
    {
      "avgCount": 442, 
      "info": "\u5929\u6d25",  //天津
      "maxCount": 10081, 
      "minCount": 0
    }
  ], 
  "result": 0

2.11 android获取点播消息的接收信息

接口地址:http://androidmis.ixintui.com:8001/getAckInfo
接口功能:该接口获取指定应用发送的所有点播信息的接收信息,每次返回从指定位置开始的最多1000条记录,每条记录包含已经确认接收消息的token及点播消息id(该ID为发送消息时我方返回的ID)。
使用该接口需要注意的地方:

  • 服务器只保留两天的消息接收信息,起始时间点从用户收到消息的时间点算起(非消息发送时间)
  • 接收信息获取有15分钟延迟 ,即用户收到信息后15分钟后,才能通过该接口获取的该消息的接收情况。比如手机用户在16:00接收的消息,16:15分可以通过本接口获取到该信息的接收信息。
  • 如需获取指定消息ID的接收信息,用户需要持续读取接收信息,并从中过滤出自己需要的消息ID;为防止丢失特定消息的接收信息,读取持续时间应比消息存活期长至少15分钟;
  • 该接口可以多次重复调用,使用同一个位置信息,可以重复读取已读取的接收信息;
  • 该接口对应用默认不开放,如需使用,请联系我们。
    参数列表
参数名字 类型 是否必须 描述
appkey string app唯一标识
pos string 上次获取ACK的位置,第一次请求设为0即可
sign string 签名(计算见1.4)
reqno int 每次返回的个数, 默认值1000,取值范围(0,1000]

请求示例:

curl -H 'Content-type: application/json' -X POST -d '{"reqno": 3, "appkey": "1425830916", "pos": 0, "sign": 
"ba0eb5b71d9b127e5c660ab1f39d4aac"}' http://androidmis.ixintui.com:8001/getAckInfo

响应示例:

{ 
  "ack_info_list": [ 
    { 
      "msgid": 650041232, 
      "token": "6562110519428123318" 
    }, 
    { 
      "msgid": 650143110, 
      "token": "97583663092345565" 
    }, 
    { 
      "msgid": 650143739, 
      "token": "219874452234413458" 
    }
  ], 
  "desc": "OK", 
  "has_more": true, 
  "pos": "201412291100@0@3", 
  "result": 0 
}

调用方式:
a 第一次将pos设为0,并设定reqno(如无该参数,默认为1000)发送请求,保存获取的结果中的pos
b.判断返回结果中的result字段, 如果为0继续,否则表示请求失败,请根据返回的desc描述信息来判断原因。
c.检查返回结果中的has_more字段,如为true,则表示还有数据需要继续请求,之后的请求将上次请求的返回结果中取出pos,作为本次请求返回的pos字段的值,再次请求;否则,即所有当前接收消息已经获取完毕,建议等待30秒后,用本次请求返回的pos字段再次请求
python示例代码:

import urllib2
import json
import hashlib
import sys

def send_message(data_str):
    req = urllib2.Request("http://androidmis.ixintui.com:8001/getAckInfo")
    req.add_header("Content-Type", "application/json")
    response = urllib2.urlopen(req, data_str)
    html = response.read()
    response.close()
    return html

def add_sign(jsondata, secret_key):
    strdata = json.dumps(jsondata, ensure_ascii=False, encoding='utf8', separators=(',',':'), sort_keys=True)
    m = "{s}{p}".format(s=strdata, p=secret_key.strip())
    newSign = hashlib.md5(m).hexdigest()
    jsondata["sign"] = newSign
    return json.dumps(jsondata)

appkey="1425830916"
secret_key="7sbKpsq5LhnFk4SYeVYLdBMcDKBXMfaMqUDSm2OgzOTS9c2Uze6Q9DOXOZU50wqL"

pos = 0

i=0
while True:
    try:
        jsondata = dict(appkey=appkey, pos=pos)
        jsondata["reqno"] =  3
        data = add_sign(jsondata, secret_key)
        res = send_message(data)
        print res
        res_json = json.loads(res)
        result = res_json["result"]
        if result != 0:
            desc = res_json["desc"]
            print "error happend result[{r}] desc[{d}]".format(r=result, d=desc)
            break
        ack_info_list = res_json["ack_info_list"]
        for ack_info in ack_info_list:
            msgid = ack_info["msgid"]
            token = ack_info["token"]
            #print msgid,token
        has_more = res_json["has_more"]
        if not has_more:
            print "all ack has fetch"
            break
        pos = res_json["pos"]
    except Exception,e:
        print "exception happend e[{e}]".format(e=e)
        break

2.12 IOS 的token添加

接口地址: api.ixintui.com:8300/v2/ios_token_register
接口功能: 向指定的app的token库中添加token。
方法: POST

参数名称 类型 是否必须 描述
appkey string
token string或list 单个token或token列表
sign string 签名

请求示例:

curl -H 'Content-type: application/json' -X POST -d '{"appkey": "1228980285", "token": ["a8b789d4d0eb5dac040c2d0d780185ea1aab3c5af15932e674f0281eca78b022"], "sign": "6c37e547bdaa83cfa28cc4e391c39090"}' http://api.ixintui.com:8300/v2/ios_token_register

返回示例:

{
  "desc": "OK", 
  "fail_tokens": [], 
  "result": 0
}

说明: 当fail_tokens不为空时,代表有部分没有成功。

2.13 IOS的token 删除

接口地址: api.ixintui.com:8300/v2/ios_token_register
接口功能: 向指定的app的token库中添加token。
方法: DELETE

参数名称 类型 是否必须 描述
appkey string
token string或list 单个token或token列表
sign string 签名

请求示例:

curl -H 'Content-type: application/json' -X  DELETE -d '{"appkey": "1228980285", "token": ["a8b789d4d0eb5dac040c2d0d780185ea1aab3c5af15932e674f0281eca78b022"], "sign": "6c37e547bdaa83cfa28cc4e391c39090"}' http://api.ixintui.com:8300/v2/ios_token_register

返回示例:

{
  "desc": "OK", 
  "fail_tokens": [], 
  "result": 0
}

说明: 当fail_tokens不为空时,代表有部分没有成功。

3 服务端返回

根据推送消息的类型来判断返回值:

  1. 当推送类型为:全部用户,全部android用户,全部IOS用户,按tag过滤,按用户信息过滤,指定tag及用户信息 时
{
    "desc":描述,
    "result": 返回码
}

result字段不为0,发送不成功,desc字段为描述信息
result字段为0,发送成功

  1. 当推送类型为:指定别名发送 时
    result字段不为0,发送失败,desc字段为描述信息
{
    "desc":描述,
    "result": 返回码
}

resutl字段为0
如果发送对象同时包含Android和IOS

{
    "android":{"result":返回码, "not_found":"别名列表"},
    "ios":{"result":返回码 , "not_found":"别名列表"},
    "result":返回码
}

如果只发送Android或者IOS

{
    "not_found":"别名列表"},
     "result":返回码
}

not_found字段为未发送成功别名列表

  1. 当推送类型为:指定token发送 时,result字段不为0,发送失败,desc字段为描述信息
{
    "desc":描述,
    "result": 返回码
}

result字段为0
如果发送对象包含Android

{
    "android":{"result", "desc":"对结果的说明" , 
    "details":[{"msgid":"",result":0, "pos":0, "token":"", "desc":"xxx"}]},
    "result":返回码
}

details中的token字段为发送失败的token
如果发送对象不包括Android

{
    "desc":描述,
    "result":返回码
}

示例

  1. 给所有的用户发送消息,包括android和ios的所有用户,发送带声音,内容为hello,ixintui的消息
curl -H "Content-type: application/json" -d '{"sign": "ec5b8cb18ee0cd27b525fc6db324201f", "option": {"period": 86400}, "msgStyle": 
{"android": {"sound": true}, "ios": {"sound": "default", "badge": 1},
 "basic": {"content": "hello,ixintui", "is_notif": 1}}, "sendTo": {"appkey": {"android": "1112019780", "ios": "2122321716"}, "userScope": 0}}' http://api.ixintui.com:8300/v2/push 
  1. 给别名为burke的最后活跃用户发送消息,包括android和ios的所有用户,发送带声音,内容为hello,ixintui的消息
curl -H "Content-type: application/json" -d '{"sign": "160dbbb3e1825eb4af100c7e8497aaac", "msgStyle": {"android": {"sound": true}, 
"basic": {"content": "hello,ixintui", "is_notif": 0}}, "sendTo": 
{"appkey": {"android": "1112019780", "ios": "2122321716"}, "alias": "burke", "userScope": 3}}'  http://api.ixintui.com:8300/v2/push

4 发送demo

1. JAVA DEMO CODE
使用java给所有的用户发送广播的示例如下

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Iterator;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class TuiSong {

    public String sendBroadcast(String str) {
        return postJson("http://api.ixintui.com:8300/v2/push", str);
    }

    public String postJson(String url, String json) {
        if (url == null || json == null) {
            return null;
        }

        HttpURLConnection con;
        try {
            // Create connection
            URL u = new URL(url);
            con = (HttpURLConnection) u.openConnection();
            con.setRequestMethod("POST");

            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setRequestProperty("Content-Type",
                    "application/json; charset=utf-8");
            byte[] jsonbytes = json.getBytes();
            con.setRequestProperty("Content-Length", "" + jsonbytes.length);
            // Create I/O streams
            OutputStream os = con.getOutputStream();
            DataOutputStream outStream = new DataOutputStream(os);
            // Post request
            outStream.write(jsonbytes);
            outStream.flush();
            outStream.close();

            int responseCode = con.getResponseCode();
            if (responseCode != 200) {
                return null;
            }
            return getResponse(con);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String getResponse(URLConnection con) {
        InputStream inStream;
        String json = null;
        try {
            // 从链接中获取一个输入流对象
            inStream = con.getInputStream();
            // 格式样例:{"desc": "OK","msgid": 51,"result": 0}
            json = inputStream2String(inStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return json;
    }

    private static String inputStream2String(InputStream input) {
        StringBuilder sb = new StringBuilder();
        byte[] b = new byte[4096];
        try {
            for (int n; (n = input.read(b)) != -1;) {
                sb.append(new String(b, 0, n));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    public String sign(JSONObject json, String android, String ios) {
        String rtn = getSortedJsonString(json);   
        String sign = signWithMd5(rtn + android + ios);
        rtn = rtn.substring(0, rtn.length() - 1);    
        rtn += ",\"sign\":\"" + sign + "\"}";
        return rtn;
    }

    public String getSortedJsonString(JSONObject json) {
        int len = json.length();
        String[] keys = new String[len];
        @SuppressWarnings("unchecked")
        Iterator it = json.keys();
        int index = 0;
        while (it.hasNext()) {
            keys[index++] = it.next().toString();
        }
        Arrays.sort(keys);
        String sortedString = "{";
        try {
            Object o;
            for (int i = 0; i < len; i++) {
                o = json.get(keys[i]);
                if (o instanceof JSONArray) {
                    JSONArray jsona = (JSONArray) o;
                    sortedString += "\"" + keys[i] + "\":[" + jsona.join(",") + "],";
                } else if (o instanceof String) {
                    sortedString += "\"" + keys[i] + "\":\"" + o.toString() + "\",";
                } else if (o instanceof JSONObject) {
                    JSONObject jsono = (JSONObject) o;
                    sortedString += "\"" + keys[i] + "\":" + getSortedJsonString(jsono) + ",";
                } else {
                    sortedString += "\"" + keys[i] + "\":" + o + ",";
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return sortedString.replaceFirst(",$", "}");
    }

    public byte[] getMd5SignedBytes(String input) {
        MessageDigest md5;
        md5 = null;
        byte[] messageDigest = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
            md5.update(input.getBytes());
            messageDigest = md5.digest();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return messageDigest;
    }

    public String signWithMd5(String input) {
        byte[] messageDigest = getMd5SignedBytes(input);
        return getString(messageDigest);
    }

    private String getString(byte[] messageDigest) {
        if (messageDigest == null) {
            return null;
        }
        // Create Hex String
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < messageDigest.length; i++) {
            String h = Integer.toHexString(0xFF & messageDigest[i]);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        }
        return hexString.toString();
    }

    public static void test() {
        // For example
        TuiSong ts = new TuiSong();
        String androidSecretkey = "2Vz7bXkgaZukP1PRCbfkLsYsFpbn7fGA2YSGIdgHnpAbyYtdZoNwIrsO7Mg6WVXn";
        String iosSecretkey = "Av81AOoK8HOQgazze8T0Z3L0SoTjgvoEhxawLdWray0xPU0E2oKowj8NpQFA9ObH";

        JSONObject json = new JSONObject();
        try {
            //sendTo
            JSONObject sendTo = new JSONObject();
            JSONObject appkey = new JSONObject();
            appkey.put("ios", 1693314034);
            appkey.put("android", 1176227119);
            sendTo.put("appkey",appkey);
            sendTo.put("userScope", 0); // send to all platform, include Android and IOS

            //msgStyle
            JSONObject msgStyle = new JSONObject();
            JSONObject basic = new JSONObject();
            basic.put("content", "java test sign");
            basic.put("is_notif", 1);
            msgStyle.put("basic", basic);

            //option
            JSONObject option = new JSONObject();
            option.put("period", 604800); // 7 days

            json.put("sendTo",sendTo);
            json.put("msgStyle", msgStyle);
            json.put("option", option);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String jsonstring = ts.sign(json, androidSecretkey, iosSecretkey);
        String rtn = ts.sendBroadcast(jsonstring);
        System.out.println(rtn);
    }
}

2. PHP demo
可以集成我们服务端的SDK
http://www.ixintui.com/?indexactive=2&indexpage=intro
Server SDK V2中即可找到