U-Push API集成文档

U-Push API集成文档

球


	
代码:
复制代码到剪切板
  1. {
  2. "ret":"SUCCESS/FAIL",
  3. "data": {
  4. // 当"ret"为"SUCCESS"时
  5. "task_id":"xx"
  6.  
  7. // 当"ret"为"FAIL"时,包含参数如下:
  8. "error_code": "xx", // 错误码
  9. "error_msg": "xx" // 错误详情
  10. }
  11. }

文件上传

功能说明

文件上传接口支持两种应用场景:

  1. 发送类型为”filecast”的时候, 开发者批量上传device_token;
  2. 发送类型为”customizedcast”时, 开发者批量上传alias。

上传文件后获取file_id, 从而可以实现通过文件id来进行消息批量推送的目的。

文件自创建起,服务器会保存两个月。开发者可以在有效期内重复使用该file-id进行消息发送。

注意:上传的文件不超过10M。

调用地址

POST (Content-Type: application/json)

签名(sign=mysign)的计算方式参见附录K。

调用参数


	
代码:
复制代码到剪切板
  1. {
  2. "appkey":"xx", // 必填, 应用唯一标识
  3. "timestamp":"xx", // 必填, 时间戳,10位或者13位均可, 时间戳有效期为10分钟
  4. "content":"xx" // 必填, 文件内容, 多个device_token/alias请用回车符" "分隔。
  5. }

注意:content文件内容建议不要超过10M,文件内容为开发者的device_token/alias,每行一个device_token/alias,由于换行符的特殊性,请将” ”(或者” ”) 显示置于每个device_token/alias之后,如:


	
代码:
复制代码到剪切板
  1. StringBuffer contentBuffer = new StringBuffer();
  2. for (String alias: aliasList) {
  3. contentBuffer.append(alias);
  4. contentBuffer.append(" "); // don't forget the return character
  5. }

调用实例请参照附录E

调用返回


	
代码:
复制代码到剪切板
  1. {
  2. "ret":"SUCCESS/FAIL",
  3. "data": {
  4. // 当"ret"为"SUCCESS"时
  5. "file_id":"xx"
  6.  
  7. // 当"ret"为"FAIL"时,包含参数如下:
  8. "error_code": "xx", //错误码
  9. "error_msg": "xx" // 错误详情
  10. }
  11. }

常见问题

  1. 如何添加/关闭IP白名单?

    添加IP:首先查看服务器的外网ip(可通过myip查看),然后登录Web后台,在“应用信息”页面进行设置。网站后台截图如下: 关闭IP:关闭“启用服务器IP地址”按钮,并保存即可。

  2. 为什么调用API返回HTTP 400错误?

    我们对于格式错误或其他原因导致发送失败的消息返回400,在返回的内容里面会有error_codeerror_msg表明发送失败的原因(参见附录I)。

    您需要在代码里面输出返回内容(java/php/python代码中显示返回内容可参考示例代码,其他语言的开发者可参考相关手册)。

  3. 消息推送接口的响应时间?调用推送API时超时应设置多久?

    消息推送接口响应时间一般来说都不会超过2s,具体根据推送类型不同有一些差别,例如广播平均响应时间约1102.583ms,单播的响应时间约4.994ms。但是考虑到开发者的网络情况以及一些IO操作偶尔会耗时较长,我们推荐开发者将超时设置为1分钟

  4. 友盟消息推送API调用有什么频率或者次数的限制?

    见本文开头“发送限制”部分

  5. customizedcast中通过alias发送消息和通过file_id发送消息有什么区别?什么情况下使用file_id方式发送?

    通过alias发送的消息使用单播方式发送,通过file_id发送的消息则需要在后台创建任务进行异步处理。

    通常来说,通过file_id方式发送消息到达设备的延时会比通过alias方式发送消息的延时大。所以我们建议alias个数小于500个时使用alias方式发送,超过500个使用file_id方式发送。

  6. 已经发送完成的消息是否可以撤销?

    任务类消息,可以进行撤销操作。

    撤销操作首先会从服务端尝试撤销(Android消息,排队中/发送中状态可以服务端撤销;iOS消息,排队中状态可以服务端撤销);其次,针对组建版,Android SDK 4.0及以上和iOS sdk 3.0及以上,会尝试从设备端撤销已展示的消息。

  7. out_biz_no是什么?什么情况下需要填写?

    out_biz_no是开发者的消息标识,和消息一一对应,如果两条消息的out_biz_no相同,推送服务器认为是同一条消息。所以,如果发送多个msg key相同的消息,后发送的消息服务器不会下发。

    如果开发者在sdk中调用了mPushAgent.setMergeNotificaiton(false),服务端程序又在网络异常时进行了重试,就有可能造成同一条消息通过友盟服务器在用户手机上显示两次以上的情况。可以通过使用out_biz_no参数避免这种情况的发生。

附录

附录A unicast消息发送示例


	
代码:
复制代码到剪切板
  1. // Android
  2. {
  3. "appkey":"你的appkey",
  4. "timestamp":"你的timestamp",
  5. "type":"unicast",
  6. "production_mode":"false",
  7. "device_tokens":"xx(Android为44位)",
  8. "payload": {
  9. "display_type": "message", // 消息,message
  10. "body": {
  11. "custom":"自定义custom"/{} // message类型只需填写custom即可,可以是字符串或JSON。
  12. }
  13. },
  14. "policy": {
  15. "expire_time": "2013-10-30 12:00:00"
  16. },
  17. "description":"测试单播消息-Android"
  18. }
  19.  
  20. // iOS
  21. {
  22. "appkey":"你的appkey",
  23. "timestamp":"你的timestamp",
  24. "type":"unicast",
  25. "production_mode":"false",
  26. "device_tokens":"xx(iOS为64位)",
  27. "payload": {
  28. "aps":{ // 苹果必填字段
  29. "alert":""/{ // 当content-available=1时(静默推送),可选; 否则必填。
  30. // 可为JSON类型和字符串类型
  31. "title":"title",
  32. "subtitle":"subtitle",
  33. "body":"body"
  34. }
  35. }
  36. "k1":"v1", // 自定义key-value, key不可以是"d","p"
  37. "k2":"v2",
  38. ...
  39. },
  40. "policy": {
  41. "expire_time":"2013-10-30 12:00:00"
  42. },
  43. "description":"测试单播消息-iOS"
  44. }

返回结果示例:


	
代码:
复制代码到剪切板
  1. // 返回成功
  2. {
  3. "ret":"SUCCESS",
  4. "data": {
  5. "msg_id":"uu07343141897754408310"
  6. }
  7. }
  8.  
  9. // 返回失败
  10. {
  11. "ret":"FAIL",
  12. "data": {
  13. "error_code":"xxx" //错误码
  14. "error_msg":"xxx" //错误信息
  15. }
  16. }

附录B listcast消息发送示例


	
代码:
复制代码到剪切板
  1. // Android
  2. {
  3. "appkey":"你的appkey",
  4. "timestamp":"你的timestamp",
  5. "type":"listcast",
  6. "device_tokens":"device1,device2,…", // 不能超过500个,多个device_token用英文逗号分隔
  7. "payload": {
  8. "display_type": "notification", // 通知,notification
  9. "body": {
  10. "ticker":"测试提示文字",
  11. "title":"测试标题",
  12. "text":"测试文字描述",
  13. "after_open":"go_app"
  14. }
  15. },
  16. "policy": {
  17. "expire_time": "2013-10-30 12:00:00"
  18. },
  19. "description":"测试列播通知-Android"
  20. }
  21.  
  22. // iOS
  23. {
  24. "appkey":"你的appkey",
  25. "timestamp":"你的timestamp",
  26. "type":"listcast",
  27. "device_tokens":"device_token1,device_token2,...", // 不能超过500个,多个device_token用英文逗号分隔
  28. "payload": {
  29. "aps": { // 苹果必填字段
  30. "alert":""/{ // 当content-available=1时(静默推送),可选; 否则必填。
  31. // 可为JSON类型和字符串类型
  32. "title":"title",
  33. "subtitle":"subtitle",
  34. "body":"body"
  35. }
  36. },
  37. "k1":"v1", // 自定义key-value, key不可以是"d","p"
  38. "k2":"v2",
  39. ...
  40. },
  41. "policy": {
  42. "expire_time":"2013-10-30 12:00:00"
  43. }
  44. "description":"测试列播消息-iOS"
  45. }

返回结果示例:


	
代码:
复制代码到剪切板
  1. // 返回成功
  2. {
  3. "ret":"SUCCESS",
  4. "data": {
  5. "msg_id":"uu07343141897754408310"
  6. }
  7. }
  8.  
  9. // 返回失败
  10. {
  11. "ret":"FAIL",
  12. "data": {
  13. "error_code":"xxx" //错误码
  14. "error_msg":"xxx" //错误信息
  15. }
  16. }

附录C broadcast消息发送示例


	
代码:
复制代码到剪切板
  1. // Android
  2. {
  3. "appkey":"你的appkey",
  4. "timestamp":"你的timestamp",
  5. "type":"broadcast",
  6. "payload":
  7. {
  8. "display_type": "notification", // 通知,notification
  9. "body":
  10. {
  11. "ticker":"测试提示文字",
  12. "title":"测试标题",
  13. "text":"测试文字描述",
  14. "after_open" : "go_app"
  15. }
  16. },
  17. "policy":
  18. {
  19. "start_time": "2013-10-29 12:00:00", //定时发送
  20. "expire_time": "2013-10-30 12:00:00"
  21. },
  22. "description":"测试广播通知-Android"
  23. }
  24.  
  25. // iOS
  26. {
  27. "appkey":"你的appkey",
  28. "timestamp":"你的timestamp",
  29. "type":"broadcast",
  30. "payload":
  31. {
  32. "aps":{ // 苹果必填字段
  33. "alert":""/{ // 当content-available=1时(静默推送),可选; 否则必填。
  34. // 可为JSON类型和字符串类型
  35. "title":"title",
  36. "subtitle":"subtitle",
  37. "body":"body"
  38. }
  39. }
  40. "k1":"v1", // 自定义key-value
  41. "k2":"v2",
  42. ...
  43. },
  44. "policy":
  45. {
  46. "start_time": "2013-10-29 12:00:00", //定时发送
  47. "expire_time": "2013-10-30 12:00:00"
  48. },
  49. "description":"测试广播通知-iOS"
  50. }

返回结果示例:


	
代码:
复制代码到剪切板
  1. // 返回成功
  2. {
  3. "ret":"SUCCESS",
  4. "data": {
  5. "msg_id":"uu07343141897754408310"
  6. }
  7. }
  8.  
  9. // 返回失败
  10. {
  11. "ret":"FAIL",
  12. "data": {
  13. "error_code":"xxx" //错误码
  14. "error_msg":"xxx" //错误信息
  15. }
  16. }

附录D groupcast消息发送示例


	
代码:
复制代码到剪切板
  1. // Android
  2. {
  3. "appkey":"你的appkey",
  4. "timestamp":"你的timestamp",
  5. "type":"groupcast",
  6. "filter":
  7. {
  8. "where":
  9. {
  10. "and": [{"app_version": "1.0"}] // 发送给app_version为1.0的用户群
  11. }
  12. },
  13. "payload":
  14. {
  15. "display_type": "notification", // 通知,notification
  16. "body":
  17. {
  18. "ticker":"测试提示文字",
  19. "title":"测试标题",
  20. "text":"测试文字描述",
  21. "after_open": "go_url",
  22. "url": "http://message.umeng.com"
  23. }
  24. },
  25. "policy":
  26. {
  27. "expire_time": "2013-10-30 12:00:00"
  28. },
  29. "description":"测试组播通知-Android"
  30. }
  31.  
  32. // iOS
  33. {
  34. "appKey":"你的appkey",
  35. "timestamp":"你的timestamp",
  36. "type":"groupcast",
  37. "filter":
  38. {
  39. "where":
  40. {
  41. "and": [{"app_version": "1.0"}]
  42. }
  43. },
  44. "payload":
  45. {
  46. "aps":{ // 苹果必填字段
  47. "alert":""/{ // 当content-available=1时(静默推送),可选; 否则必填。
  48. // 可为JSON类型和字符串类型
  49. "title":"title",
  50. "subtitle":"subtitle",
  51. "body":"body"
  52. }
  53. }
  54. "k1":"v1", // 自定义key-value
  55. "k2":"v2",
  56. ...
  57. },
  58. "policy":
  59. {
  60. "expire_time": "2013-10-30 12:00:00"
  61. },
  62. "description":"测试组播通知-iOS"
  63. }

说明:其中的filter条件表示向当前所有app_version是v1.0的应用客户端发送消息,其内容的使用语法示例请参考附录G。

返回结果示例:


	
代码:
复制代码到剪切板
  1. // 返回成功
  2. {
  3. "ret":"SUCCESS",
  4. "data": {
  5. "msg_id":"uu07343141897754408310"
  6. }
  7. }
  8.  
  9. // 返回失败
  10. {
  11. "ret":"FAIL",
  12. "data": {
  13. "error_code":"xxx" //错误码
  14. "error_msg":"xxx" //错误信息
  15. }
  16. }

附录E customizedcast消息发送示例

  1. 通过alias发送消息示例:

    
    			
    代码:
    复制代码到剪切板
    1. // Android
    2. {
    3. "appkey":"你的appkey",
    4. "timestamp":"你的timestamp",
    5. "type":"customizedcast",
    6. "alias": "你的alias", //不能超过50个,多个alias以英文逗号风格
    7. "alias_type":"alias对应的type(SDK调用addAlias(alias,alis_type)接口指定的alias_type)",
    8. "payload":
    9. {
    10. "display_type": "notification", // 通知,notification
    11. "body":
    12. {
    13. "ticker":"测试提示文字",
    14. "title":"测试标题",
    15. "text":"测试文字描述",
    16. "after_open": "go_activity",
    17. "activity": "xxx"
    18. }
    19. },
    20. "policy":
    21. {
    22. "expire_time": "2013-10-30 12:00:00"
    23. },
    24. "description":"测试alias通知-Android"
    25. }
    26.  
    27. // iOS
    28. {
    29. "appKey":"你的appkey",
    30. "timestamp":"你的timestamp",
    31. "type":"customizedcast",
    32. "alias": "你的alias", //不能超过50个,多个alias以英文逗号分隔。
    33. "alias_type":"alias对应的type",
    34. "payload":
    35. {
    36. "aps":{ // 苹果必填字段
    37. "alert":""/{ // 当content-available=1时(静默推送),可选; 否则必填。
    38. // 可为JSON类型和字符串类型
    39. "title":"title",
    40. "subtitle":"subtitle",
    41. "body":"body"
    42. }
    43. }
    44. "k1":"v1", // 自定义key-value
    45. "k2":"v2",
    46. ...
    47. },
    48. "policy":
    49. {
    50. "expire_time": "2013-10-30 12:00:00"
    51. }
    52. "description":"测试alias通知-iOS"
    53. }

    返回结果示例:

    
    			
    代码:
    复制代码到剪切板
    1. // 返回成功
    2. {
    3. "ret":"SUCCESS",
    4. "data": {
    5. "msg_id":"uu07343141897754408310"
    6. }
    7. }
    8.  
    9. // 返回失败
    10. {
    11. "ret":"FAIL",
    12. "data": {
    13. "error_code":"xxx" //错误码
    14. "error_msg":"xxx" //错误信息
    15. }
    16. }
  2. 通过file_id方式发送消息示例:

    
    			
    代码:
    复制代码到剪切板
    1. // 1. 先通过文件上传接口获取文件id:
    2. {
    3. "appkey":"你的appkey",
    4. "timestamp":"你的timestamp",
    5. "content":"alias1 alias2 alias3 ..." // 多个alias用回车符分隔,回车符需要显示出现。
    6. }
    7.  
    8. // 返回结果:
    9. {
    10. "ret":"SUCCESS",
    11. "data":
    12. {
    13. "file_id":"PF212711418961495056"
    14. }
    15. }
    16.  
    17. // 2. 再通过文件方式发送消息:
    18. // Android
    19. {
    20. "appkey":"你的appkey",
    21. "timestamp":"你的timestamp",
    22. "type":"customizedcast",
    23. "alias_type":"alias对应的type",
    24. "file_id": "PF8961384936199949", // 通过文件上传接口获得的file_id
    25. "payload":
    26. {
    27. "display_type": "notification", // 通知,notification
    28. "body":
    29. {
    30. "ticker":"测试提示文字",
    31. "title":"测试标题",
    32. "text":"测试文字描述",
    33. "after_open":"go_custom",
    34. "custom": {"key":"value",...}
    35. }
    36. },
    37. "policy":
    38. {
    39. "expire_time": "2013-10-30 12:00:00"
    40. },
    41. "description":"测试alias文件通知-Android"
    42. }
    43.  
    44. // iOS
    45. {
    46. "appKey":"你的appkey",
    47. "timestamp":"你的timestamp",
    48. "type":"customizedcast",
    49. "alias_type":"alias对应的type(SDK添加的alias的时候,会带一个type)",
    50. "file_id": "PF8961384936199949",
    51. "payload":
    52. {
    53. "aps":{ // 苹果必填字段
    54. "alert":""/{ // 当content-available=1时(静默推送),可选; 否则必填。
    55. // 可为JSON类型和字符串类型
    56. "title":"title",
    57. "subtitle":"subtitle",
    58. "body":"body"
    59. }
    60. }
    61. "k1":"v1", // 自定义key-value
    62. "k2":"v2",
    63. ...
    64. },
    65. "policy":
    66. {
    67. "expire_time": "2013-10-30 12:00:00"
    68. }
    69. "description":"测试alias文件通知-iOS"
    70. }

    返回结果示例:

    
    			
    代码:
    复制代码到剪切板
    1. // 返回成功
    2. {
    3. "ret":"SUCCESS",
    4. "data": {
    5. "msg_id":"uu07343141897754408310"
    6. }
    7. }
    8.  
    9. // 返回失败
    10. {
    11. "ret":"FAIL",
    12. "data": {
    13. "error_code":"xxx" //错误码
    14. "error_msg":"xxx" //错误信息
    15. }
    16. }

附录F filecast消息发送示例


	
代码:
复制代码到剪切板
  1. // 1. 先通过文件上传接口获取文件id:
  2. {
  3. "appkey":"你的appkey",
  4. "timestamp":"你的timestamp",
  5. "content":"device_token_1 device_token_2 device_token_3 ..."
  6. // 多个device_token用回车符分隔,回车符需要显示出现。
  7. }
  8.  
  9. // 返回结果:
  10. {
  11. "ret":"SUCCESS",
  12. "data":
  13. {
  14. "file_id":"PF8961384936199949"
  15. }
  16. }
  17.  
  18. // 2. 再通过文件方式发送消息:
  19. // Android
  20. {
  21. "appkey":"你的appkey",
  22. "timestamp":"你的timestamp",
  23. "type":"filecast",
  24. "file_id": "PF8961384936199949", // 通过文件上传接口获得的file_id
  25. "payload":
  26. {
  27. "display_type": "notification", // 通知,notification
  28. "body":
  29. {
  30. "ticker":"测试提示文字",
  31. "title":"测试标题",
  32. "text":"测试文字描述",
  33. "after_open": "go_app"
  34. }
  35. },
  36. "policy":
  37. {
  38. "expire_time": "2013-10-30 12:00:00"
  39. },
  40. "description":"测试filecast文件通知-Android"
  41. }
  42.  
  43. // iOS
  44. {
  45. "appKey":"你的appkey",
  46. "timestamp":"你的timestamp",
  47. "type":"filecast",
  48. "file_id": "PF8961384936199949",
  49. "payload":
  50. {
  51. "aps":{ // 苹果必填字段
  52. "alert":""/{ // 当content-available=1时(静默推送),可选; 否则必填。
  53. // 可为JSON类型和字符串类型
  54. "title":"title",
  55. "subtitle":"subtitle",
  56. "body":"body"
  57. }
  58. }
  59. "k1":"v1", // 自定义key-value
  60. "k2":"v2",
  61. ...
  62. },
  63. "policy":
  64. {
  65. "expire_time": "2013-10-30 12:00:00"
  66. }
  67. "description":"测试filecast文件通知-iOS"
  68. }

返回结果示例:


	
代码:
复制代码到剪切板
  1. // 返回成功
  2. {
  3. "ret":"SUCCESS",
  4. "data": {
  5. "msg_id":"uu07343141897754408310"
  6. }
  7. }
  8.  
  9. // 返回失败
  10. {
  11. "ret":"FAIL",
  12. "data": {
  13. "error_code":"xxx" //错误码
  14. "error_msg":"xxx" //错误信息
  15. }
  16. }

附录G 过滤条件示例

目前开放的筛选字段有:

  • “app_version”(应用版本)
  • “channel”(渠道)
  • “device_model”(设备型号)
  • “province”(省)
  • “tag”(用户标签)
  • “country”(国家和地区) //“country”和”province”的类型定义请参照 附录J
  • “language”(语言)
  • “launch_from”(一段时间内活跃)
  • “not_launch_from”(一段时间内不活跃)

我们的筛选条件非常灵活,支持逻辑上的and(与), or(或), not(非)操作, 以及这些操作的组合。具体请参照下面的示例。

and条件示例

已注册的(registered_user)并且版本(app_version)是1.0的用户群,且这些用户在2014-11-15之后活跃过。


	
代码:
复制代码到剪切板
  1. "where":
  2. {
  3. "and":
  4. [
  5. {"tag":"registered_user"}, // 开发者自定义tag
  6. {"app_version":"1.0"}, // app-version
  7. {"launch_from":"2014-11-15"} // X天活跃/不活跃
  8. ]
  9. }

or条件示例

自定义标签为“美剧”的用户或者自定义标签为“文艺”的用户


	
代码:
复制代码到剪切板
  1. "where":{
  2. "and":[
  3. {
  4. "or":[
  5. {"tag":"美剧"},
  6. {"tag":"文艺"} ]
  7. }
  8. ]
  9. }

not条件示例

注册的(registered_user)的用户群


	
代码:
复制代码到剪切板
  1. "where":
  2. {
  3. "and":
  4. [
  5. {
  6. "not":
  7. {
  8. "tag": "registered_user"
  9. }
  10. }
  11. ]
  12. }

and, or, not组合条件示例

发送给分渠道360或者“版本号为1.2”并且“2014-11-15之后不活跃”的用户


	
代码:
复制代码到剪切板
  1. "where":
  2. {
  3. "and":
  4. [
  5. {
  6. "or":
  7. [
  8. {
  9. "not":
  10. {
  11. "channel": "360"
  12. }
  13. },
  14. {
  15. "app_version": "1.2"
  16. }
  17. ]
  18. },
  19. {
  20. "not_launch_from": "2014-11-15"
  21. }
  22. ]
  23. }

大于等于(>=)及小于等于(<=)组合条件示例

如果要选择推送给版本>=某版本或者<=某版本的设备,以筛选>=1.0的设备为例,可采用以下两种方法实现:

  • 方法一:自己筛选出符合要求的各个版本。(官方建议方案)格式为:
    
    			
    代码:
    复制代码到剪切板
    1. {"and":[{"or":[{"app_version":">1.0"}]}]}
  • 方法二:自己筛选出符合要求的各个版本。格式为:
    
    			
    代码:
    复制代码到剪切板
    1. {"and":[{"or":[{"app_version":"1.0"},{"app_version":"2.0"},{"app_version":"3.0"},{"app_version":"4.0"}]}]}

附录I 接口调用错误码

API通过HTTP Status Code来说明请求是否成功, 200表示成功, 400表示失败。

HTTP常见Status Code及其含义

错误码 错误信息提示 Http Status Code
1000 请求参数没有appkey或为空值 400
1001 请求参数没有payload或为非法json 400
1002 请求参数payload中, 没有body或为非法json 400
1003 payload.display_type为message时, 请求参数payload.body中, 没有custom字段 400
1004 请求参数payload中, 没有display_type或为空值 400
1005 请求参数payload.body中, img格式有误, 需以http或https开始 400
1007 payload.body.after_open为go_url时, 请求参数payload.body中, url格式有误, 需以http或https开始 400
1008 payload.display_type为notification时, 请求参数payload.body中, 没有ticker参数 400
1009 payload.display_type为notification时, 请求参数payload.body中, 没有title参数 400
1010 payload.display_type为notification时, 请求参数payload.body中, 没有text参数 400
1014 task_id对应任务没有找到 400
1015 type为unicast或listcast时, 请求参数没有device_tokens或为空值 400
1016 请求参数没有type或为空值 400
1019 请求参数payload中, display_type值非法 400
1020 应用组中尚未添加应用 400
1022 payload.body.after_open为go_url时, 请求参数payload.body中, 没有url参数或为空 400
1024 payload.body.after_open为go_activity时, 请求参数payload.body中, 没有activity或为空值 400
1026 请求参数payload中, extra为非法json 400
1027 请请求参数payload中, policy为非法json 400
1028 task_id对应任务无法撤销 400
2000 该应用已被禁用 400
2002 请求参数policy中, start_time必须大于当前时间 400
2003 请求参数policy中, expire_time必须大于start_time和当前时间 400
2004 IP白名单尚未添加, 请到网站后台添加您的服务器IP或关闭IP白名单功能 400
2006 Validation token不一致(PS: 此校验方法已废弃, 请采用sign进行校验) 400
2007 未对请求进行签名 400
2008 json解析错误 400
2009 type为customizedcast时, 请求参数没有alias、file_id或皆为空值 400
2016 type为groupcast时, 请求参数没有filter或为非法json 400
2017 添加tag失败 400
2018 type为filecast时, 请求参数没有file_id或为空值 400
2019 type为filecast时, file_id对应的文件不存在 400
2021 appkey不存在 400
2022 payload长度过长 400
2023 文件上传失败, 请稍后重试 400
2025 请求参数没有aps或为非法json 400
2027 签名不正确 400
2028 时间戳已过期 400
2029 请求参数没有content或为空值 400
2031 filter格式不正确 400
2032 未上传生产证书, 请到Web后台上传 400
2033 未上传开发证书, 请到Web后台上传 400
2034 证书已过期 400
2035 定时任务发送时, 证书已过期 400
2036 时间戳格式错误 400
2039 请求参数policy中, 时间格式必须是yyyy-MM-dd HH:mm:ss 400
2040 请求参数policy中, expire_time不能超过发送时间+7天 400
2046 请求参数policy中, start_time不能超过当前时间+7天 400
2047 type为customizedcast时, 请求参数没有alias_type或为空值 400
2048 type值须为unicast、listcast、filecast、broadcast、groupcast、groupcast中的一种 400
2049 type为customizedcast时, 请求参数alias、file_id只可二选一 400
2050 发送频率超出限制 400
2052 请求参数没有timestamp或为空值 400
2053 请求参数没有task_id或为空值 400
2054 IP不在白名单中, 请到网站后台添加您的服务器IP或关闭IP白名单功能 400
5001 证书解析bundle id失败, 请重新上传 400
5002 请求参数payload中p、d为友盟保留字段 400
5007 certificate_revoked错误 400
5008 certificate_unkown错误 400
5009 handshake_failure错误 400
5010 配置使用Token Auth, 但未上传p8证书 400
6001 该app未开通服务端tag接口 400
6002 内部错误(iOS证书) 400
6003 内部错误(数据库) 400
6004 内部错误(TFS) 400

附录J 国家和地区 & 省市 定义表

国家和地区

  • 美国
  • 日本
  • 英国
  • 澳大利亚
  • 德国
  • 加拿大
  • 法国
  • 意大利
  • 中国
  • 瑞士
  • 俄罗斯
  • 韩国
  • 荷兰
  • 阿根廷
  • 奥地利
  • 比利时
  • 巴西
  • 保加利亚
  • 智利
  • 捷克
  • 丹麦
  • 埃及
  • 芬兰
  • 希腊
  • 香港
  • 匈牙利
  • 印度
  • 印度尼西亚
  • 爱尔兰
  • 以色列

  • 北京
  • 上海
  • 广东
  • 安徽
  • 澳门
  • 重庆
  • 福建
  • 甘肃
  • 广西
  • 贵州
  • 海南
  • 河北
  • 河南
  • 黑龙江
  • 湖北
  • 湖南
  • 吉林
  • 江苏
  • 江西
  • 辽宁
  • 内蒙古
  • 宁夏
  • 青海
  • 山东
  • 山西
  • 陕西
  • 四川
  • 台湾
  • 天津
  • 西藏
  • 香港
  • 新疆
  • 云南
  • 浙江

附录K 关于签名

为了确保用户发送的请求不被更改,我们设计了签名算法。该算法基本可以保证请求是合法者发送且参数没有被修改,但无法保证不被偷窥。 签名生成规则:

  • 提取请求方法method(POST,全大写);
  • 提取请求url信息,包括Host字段的域名(或ip:端口)和URI的path部分。注意不包括path的querystring。比如
  • 提取请求的post-body;
  • 拼接请求方法、url、post-body及应用的app_master_secret;
  • 将D形成字符串计算MD5值,形成一个32位的十六进制(字母小写)字符串,即为本次请求sign(签名)的值;Sign=MD5($http_method$url$post-body$app_master_secret);

python生成签名示例


	
代码:
复制代码到剪切板
  1. import hashlib
  2. def md5(s):
  3. m = hashlib.md5(s)
  4. return m.hexdigest()
  5.  
  6. appkey = '你的appkey'
  7. app_master_secret = '你的app_master_secret'
  8. timestamp = '你的timestamp'
  9. method = 'POST'
  10. url = 'http://msg.umeng.com/api/send'
  11. params = {'appkey': appkey,
  12. 'timestamp': timestamp,
  13. 'device_tokens': device_token,
  14. 'type': 'unicast',
  15. 'payload': {'body': {'ticker': 'Hello World',
  16. 'title':'你好',
  17. 'text':'来自友盟推送',
  18. 'after_open': 'go_app'},
  19. 'display_type': 'notification'
  20. }
  21. }
  22. post_body = json.dumps(params)
  23. print post_body
  24. sign = md5('%s%s%s%s' % (method,url,post_body,app_master_secret))

温馨提示

为了保证使用友盟推送的开发者都能获得良好的用户体验,我们坚决杜绝滥用推送服务的事件发生。一经发现,友盟推送将有权对滥用服务的appkey实施封禁发送权限的处理。

技术支持

如果还有问题,请把您的问题发邮件至msg-support@umeng.com或者联系客服:联系客 (在线时间:工作日10:00~18:00),我们会尽快回复您。

服务端代码调用示例


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://0008fc.com/a/jingyan/14.html