
开发者进行开放平台开发时,除了要满足接口的规范限制和接口调用频率限制外,还需特别注意用户敏感信息的使用规范。 涉及用户数据时:
不同类型的开放平台账号具有不同的接口权限,见下表
| 接口名称 | 未认证开放平台账号 | 认证开放平台账号 |
|---|---|---|
| 获取accessToken | 有 | 有 |
| 免登授权 | 无 | 有 |
| 获取部门列表 | 无 | 有 |
| 创建部门 | 无 | 有 |
| 更新部门 | 无 | 有 |
| 删除部门 | 无 | 有 |
| 获取部门下所有人员 | 无 | 有 |
| 导入部门成员 | 无 | 有 |
| 发送聊天消息 | 无 | 有 |
| 上传媒体文件 | 无 | 有 |
| 获取媒体文件 | 无 | 有 |
| 其他接口完善中 | ... | ... |
{"status":4006,"message":"接口调用频率超过限制"}
| 接口名称 | 每日限额 |
|---|---|
| 获取accessToken | 2000 |
| 免登授权 | 5000 |
| 获取部门列表 | 5000 |
| 创建部门 | 5000 |
| 更新部门 | 5000 |
| 删除部门 | 5000 |
| 获取部门下所有人员 | 5000 |
| 导入部门成员 | 20 |
| 发送聊天消息 | 5000 |
| 上传媒体文件 | 5000 |
| 获取媒体文件 | 5000 |
| 其他接口完善中 | ... |
应用每次调用接口时,可能获得正确或错误的返回码,开发者可以根据返回码信息调试接口,排查错误。见下表
| 返回码 | 说明 |
|---|---|
| 0 | 调用成功 |
| -1 | 开放平台系统错误 |
| 4000 | 用户登录token错误 |
| 4001 | 用户登录token和accessToken错误,重新获取 |
| 4002 | accessToken错误 |
| 4003 | AccessToken超时 |
| 4004 | AccessToken刷新过于频繁,注意每天的接口调用次数 |
| 4005 | accessToken错误,一般是系统原因,重新获取或者联系客服 |
| 4006 | 接口调用频率超过限制 |
| 4007 | 获取accessToken时appId或者appSecret错误 |
| 4008 | 缺少accessToken参数 |
| 4009 | 需要get请求 |
| 4010 | 需要post请求 |
| 4011 | 需要httpss请求 |
| 4012 | Post数据包为空 |
| 4013 | Api无权限 |
| 4014 | 调用来源ip不在ip白名单 |
| 4015 | 不合法的callback url |
| 4016 | 企业未对该应用授权 |
| 4500 | 用户uid不存在或者错误 |
| 4501 | 缺少uid参数 |
接入开放平台,开发者需要完成以下3步:
- 1.1 提交服务器配置 由于目前开发者后台还在公测中,还未对正式开发者开放,所有需要开发者把以下信息通过以下格式,以邮件(luohj@shinemo.com)发送给 后台超级管理员,暂时由超级管理员负责录入,录入成功后会返回应用的appId和appSecret 。
| 名称 | 说明 |
|---|---|
| 开发者名字 | 张三 |
| 开发者地址 | 浙江省杭州市西湖区文二西路888号我的公司 |
| 开发者联系手机号 | 18888888888 |
| 开发者身份证号 | 370686199904440000 |
| 开发者照片 | 照片形式放到附件中 |
| 开发者企业名称 | ... |
| 开发者企业地址 | ... |
| 开发者企业法人代表名字 | ... |
| 开发者企业法人代表身份证号 | ... |
| 开发者企业营业执照 | 照片形式放到附件 |
| 开发者企业类型 | ... |
| 应用名称 | ... |
| 应用icon | 照片形式放到附件 |
| 应用描述 | 256字以内 |
| 服务器白名单ip(开放平台服务端只允许白名单内的ip访问,逗号分隔) | ... |
| H5地址(应用如果是h5须填写h5地址) | ... |
| Android_feature(应用如果是native,填写android的应用信息) | ... |
| Ios_feature(应用如果是native,填写ios的应用信息) | ... |
| 应用的语言版本(中文 ,英文…) | ... |
| 应用发布到的客户端( ,集团彩云,联通客户端,全部) | ... |
| 应用需要使用的接口列表(目前只有获取用户信息) | ... |
| 应用的可见范围(企业名称或者全部) | ... |
accessToken是开放平台的全局唯一票据,开放平台各接口时都需使用accessToken。开发者需要进行妥善保存。accessToken的存储至少要保留512个字符空间。accessToken的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的accessToken失效。
接口调用请求说明
https://api.open.imasheng.com/openapi/token/get?appId=APPID&appSecret=APPSECRET
| 参数 | 是否必须 | 描述 |
|---|---|---|
| appId | 是 | 应用注册成功后返回 |
| appSecret | 是 | 应用注册成功后返回 |
{"status":0,"data":{"accessToken":"MDAwMjM0M0RBNjIwMURENDAxOTJDRkE0MkVGMDlERjQ5MjVFODAzQTlFMThERDBCMzNBNzFEMjBFMkRCNjExRDgxQjM3RkU0QzM1NkMwQzM5NkNCODUyN0JFQTE1OUE5OUUzMg==","expiresIn":7200}}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
| data | 处理成功后会把数据字段放到这里 |
| accessToken | 访问凭据 |
| expiresIn | 凭证有效时间,单位:秒 |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误)
{"status":4007,"message":"获取accessToken时appId或者appSecret错误"}
开放平台为每个开发者账号最多提供10个测试应用账号,测试应用不需要企业认证,默认拥有所有接口权限,访问频率控制与正式应用相同。
开发者需要通过此接口做免登
https://api.open.imasheng.com/openapi/auth/getUserInfoByToken?token=TOKEN&accessToken=ACCESSTOKEN
| 参数 | 是否必须 | 描述 |
|---|---|---|
| token | 是 | 客户端拼接上的token |
| accessToken | 是 | 接口访问凭据 |
{"status":0,"data":{"uid":"REAM123","name":"张三", "orgList":[{"orgName":"杭州讯盟科技",orgId:1}, {"orgName":"芒果医生",orgId:2}, {"orgName":"阿里巴巴",orgId:3}...]}}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
| data | 处理成功后会把数据字段放到这里 |
| uid | 用户在开放平台的id(经过加密),后续获取用户信息需要通过此uid |
| orgList | 用户所在机构列表 |
| orgName | 用户所在机构名字 |
| orgId | 用户所在机构id |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
开发者可以通过通讯录管理接口,将整个企业组织架构导入到系统;并且可以做修改和查看;
https://api.open.imasheng.com/openapi/department/list?accessToken=ACCESSTOKEN
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
{"status":0,"data":{"departments":[{"id":1,name:"开发部","parentid":1}, {"id":2,name:"测试部","parentid":1}...]}}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
| data | 处理成功后会把数据字段放到这里 |
| departments | 部门列表数据 |
| id | 部门id |
| name | 部门名称 |
| parentid | 父部门id(根部门为0) |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/department/create?accessToken=ACCESSTOKEN
{"name":"芒果医生", "parentId":"0", "order":"1"}
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
| name | 是 | 部门名称(长度限制为1~64个字符) |
| parentId | 是 | 父部门id(根部门为0) |
| order | 是 | 在父部门中的次序值。order值小的排序靠前 |
{"status":0,"data":{"id":"230332"}}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
| data | 处理成功后会把数据字段放到这里 |
| id | 部门id |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/department/update?accessToken=ACCESSTOKEN
{"name":"芒果医生", "parentId":"0", "order":"1", "id":"23004"}
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
| name | 否 | 部门名称(长度限制为1~64个字符) |
| parentId | 否 | 父部门id(根部门为0) |
| order | 否 | 在父部门中的次序值。order值小的排序靠前 |
| id | 是 | 部门id |
{"status":0}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/department/delete?accessToken=ACCESSTOKEN
{"id":"23004"}
| 参数 | 是否必须 | 描述 |
|---|---|---|
| id | 是 | 部门id |
{"status":0}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/user/list?accessToken=ACCESSTOKEN&deptId=DEPTID&offset=0&size=100
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
| deptId | 是 | 部门id |
| offset | 是 | 页偏移量 |
| size | 是 | 每页的数量 |
| order | 否 | 排序 |
{"status":0,"data":{
"hasMore":true,
"users":
[{"uid":123, "name":"张三", "mobile":"18268080277", "title":"我的职位"},
{"uid":124, "name":"李四", "mobile":"18268080277", "title":"我的职位"},
...]}}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
| data | 处理成功后会把数据字段放到这里 |
| hasMore | 是否还有更多 |
| uid | 用户id |
| name | 用户名字 |
| mobile | 手机号 |
| title | 职位 |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/user/import?accessToken=ACCESSTOKEN
[
{
"deptId": ["1", "2"],
"uid":"",
"mobile":"18806886888",
"title":"销售主管",
"name":"旻浩"
},
{
"deptId": ["0", "5"],
"uid":"12",
"mobile":"18806886887",
"title":"销售小弟",
"name":"旻浩1"
},
...
]
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
| name | 是 | 成员名字(长度限制为1~64个字符) |
| deptId | 是 | 数组类型,数组里面值为字符串,成员所属部门id列表 |
| mobile | 是 | 手机号码。企业内必须唯一 |
| uid | 是 | 用户唯一id,为空则新增,非空则更新 |
| title | 是 | 人员职务(长度限制为1~64个字符) |
{"status":0}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/message/chat/push
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
| uid | 是 | 发送者id |
| targetId | 是 | 接受者id |
| msgType | 是 | 消息类型 |
** msgType(消息类型)及数据格式 **
| 参数 | 是否必须 | 描述 |
|---|---|---|
| msgType | 是 | 消息类型,此时固定为:text |
| content | 是 | 消息内容 |
{
"msgType": "text",
"text": {
"content": "张三的请假申请"
}
}
| 参数 | 是否必须 | 描述 |
|---|---|---|
| msgType | 是 | 消息类型,此时固定为:image |
| mediaId | 是 | 图片媒体文件id,可以调用上传媒体文件接口获取 |
{
"msgType": "image",
"image": {
"mediaId": "MEDIA_ID"
}
}
| 参数 | 是否必须 | 描述 |
|---|---|---|
| msgType | 是 | 消息类型,此时固定为:image |
| mediaId | 是 | 图片媒体文件id,可以调用上传媒体文件接口获取 |
{
"msgType": "voice",
"voice": {
"mediaId": "MEDIA_ID",
"duration": "10"
}
}
| 参数 | 是否必须 | 描述 |
|---|---|---|
| msgType | 是 | 消息类型,此时固定为:link |
| messageUrl | 是 | 消息点击链接地址 |
| mediaId | 是 | 图片媒体文件id,可以调用上传媒体文件接口获取 |
| title | 是 | 消息标题 |
| text | 是 | 消息描述 |
{
"msgType": "link",
"link": {
"messageUrl": "https://www.baidu.com",
"mediaId":"@lALOACZwe2Rk",
"title": "测试",
"text": "测试"
}
}
{"status":0,"success":true}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/media/upload
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
| type | 是 | 用户id |
| media | 是 | form-data中媒体文件标识,有filename、filelength、content-type等信息 |
** 上传的媒体文件限制 **
图片(image):1MB,支持JPG格式
语音(voice):2MB,播放长度不超过60s,AMR格式
{"status":0,"data":{"type":"image", "mediaId":"dsa8d87y7c8d8c"}}
| 参数 | 描述 |
|---|---|
| status | 开放平台处理状态 |
| data | 处理成功后会把数据字段放到这里 |
| type | 媒体文件类型,分别有图片(image)、语音(voice)等 |
| mediaId | 媒体文件上传后获取的唯一标识 |
错误时开放平台会返回错误码等信息,JSON数据包示例如下(该示例为accessToken超时)
{"status":4003,"message":"accessToken超时,请重新获取"}
https://api.open.imasheng.com/openapi/media/get?accessToken=ACCESSTOKEN&mediaId=MEDIAID
| 参数 | 是否必须 | 描述 |
|---|---|---|
| accessToken | 是 | 接口访问凭据 |
| mediaId | 是 | 媒体文件的唯一标示 |
开放平台会向回调url推送事件变更,假设您提供的回调URL是:
https://127.0.0.1/demo/receive
那么在开放平台服务器每一次访问回调URL的时候 将请求(下面链接中的signature,timestamp,nonce的值只是示例,并不代表真实返回的值):
https://127.0.0.1/demo/receive?signature=111108bb8e6dbce3c9671d6fdb69d15066227608 ×tamp=1783610513&nonce=380320111
{"encrypt":"1ojQf0NSvw2WPvW7LijxS8UvISr8pdDP+rXpPbcLGOmIBNbWetRg7IP0vdhVgkVwSoZBJeQwY2zhROsJq/HJ+q6tp1qhl9L1+ccC9ZjKs1wV5bmA9NoAWQiZ+7MpzQVq+j74rJQljdVyBdI/dGOvsnBSCxCVW0ISWX0vn9lYTuuHSoaxwCGylH9xRhYHL9bRDskBc7bO0FseHQQasdfghjkl"
}
其中的encrypt字段是经过加密的消息体,encrypt经过一系列解密步骤后,才能产生下面所说的“POST数据解密后示例”,您可以直接使用开放平台提供的库进行解密的处理。 除此之外,在接收到推送之后,需要返回字符串success(代表了你收到了推送),返回的数据也需要做加密处理,如果不返回,开放平台服务器将持续推送下去,达到一定阈值后将不再推送。
** 目前可以监听的事件类型分别为: **
** 参数说明: **
| 参数 | 描述 |
|---|---|
| EventType | 事件类型,有八种,"user_add_org”, “user_modify_org”, “user_leave_org”,“org_admin_add”, “org_admin_remove”, “org_dept_create”, “org_dept_modify”, “org_dept_remove”, “org_remove” |
| TimeStamp | 时间戳 |
| nonce | 随机串 |
| signature | 签名 |
| UserId | 用户发生变更的userid列表 |
| DeptId | 部门发生变更的userid列表 |
| CorpId | 发生通讯录变更的企业 |
** 返回说明 **
服务提供商在收到此事件推送后务必返回包含经过加密的字符串"success"的json数据
| 参数 | 描述 |
|---|---|
| signature | 消息体签名 |
| TimeStamp | 时间戳 |
| nonce | 随机串 |
| encrypt | “success"加密字符串 |
开发者通过jssdk调用应用native的相关方法;
var data = '{""appId":"应用appId", "timestamp":"生成签名的时间戳", "nonceStr":"生成签名的随机串", "signature":"签名(签名算法见下文)",...}';
window.JSBridge.requestHybrid({
method: "方法名称",
data: JSON.parse(data),
callback: function(data) {
conosle.log(JSON.stringify(data));
}
});
| 参数 | 描述 |
|---|---|
| method | 要调用的方法名称 |
| data | JSON格式, 方法所需参数 |
| callback | 处理回调, JSON格式{ "status":"200", "data":"..."} (status == 200表示回调成功) |
var data = '{"max":3, "appId":"应用appId", "timestamp":"生成签名的时间戳", "nonceStr":"生成签名的随机串", "signature":"签名"}';
window.JSBridge.requestHybrid({
method: "selectpic",
data: JSON.parse(data),
callback: function(data) {
conosle.log(JSON.stringify(data));
}
});