在富士行云V2平台中,将有很多的车场,人行项目接入。为了方便车场,人行项目运营方可以在他们自己已有的平台,或者其他第三方平台对接我们的数据,并提供数据服务。
为了实现开放平台的功能,我们需要设计一个开放平台的总体设计文档,包括功能模块、系统架构、数据库设计、接口设计、安全设计、流量监控与分析等。
本文档仅涉及开放平台的总体设计,不涉及具体的功能模块设计。
系统依赖富士行云V2整体的spring cloud微服务架构。通过gateway在新的路径前缀下路由到开放平台,在通过openfeign、nacos、 load_balance 等组件实现服务间的调用。 具体实现就利用我们现有的中台服务(transferService). 在中台服务上面去建立一个新的目录(openapi),在openapi目录下建立应用管理、接口管理、开发接口三个模块。
对接方需要注册开放平台用户,用户去绑定应用,一个用户可以创建一个或者多个应用。应用去绑定项目,应用也可以绑定一个或者多个项目。
请求参数:JSON格式
{
"username": "13800000000",
"password": "123456", //前端传入的应该是rsa加密的后的密码
"phoneNumber": "13800000000",
"nikeName": "admin"
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": {
"id": 1,
"username": "13800000000",
"phoneNumber": "13800000000",
"nikeName": "admin",
"createTime": "2019-08-30 17:56:40",
"updateTime": "2019-08-30 17:56:40"
}
}
请求参数:JSON格式
{
"oldPassword": "123456", //前端传入的应该是rsa加密的后的旧密码
"newPassword": "<PASSWORD>" //前端传入的应该是rsa加密的后的新密码
}
json
{
"code": 1000000,
"msg": "操作成功"
}
##### 重置密码接口地址:/openapi/user/resetPassword
请求方式:PUT
平台: 开放平台
请求参数:JSON格式
{
"userId": 1,
"newPassword": "123456", //前端传入的应该是rsa加密的后的新密码
"smsCode": "1234" //短信验证码
}
json
{
"username": "13800000000",
"password": "123456", //前端传入的应该是rsa加密的后的密码
"verfiyCode": "1234" //验证码
}
响应参数:JSON格式
响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": {
"token": "" //除了登录 其他的开放平台用户操作都需要带上这个token
}
}
响应示例:
{
"code": 1000000,
"msg": "操作成功"
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": {
"id": 1,
"username": "13800000000",
"phoneNumber": "13800000000",
"nikeName": "admin",
"createTime": "2019-08-30 17:56:40",
"updateTime": "2019-08-30 17:56:40"
}
}
}
* 响应参数:JSON格式
* 响应示例:
```json
{
"code": 1000000,
"msg": "操作成功",
"data": [
{
"id": 1,
"username": "13800000000",
"phoneNumber": "13800000000",
"nikeName": "admin",
"createTime": "2019-08-30 17:56:40",
"updateTime": "2019-08-30 17:56:40"
}
]
}
响应示例:
{
"code": 1000000,
"msg": "操作成功"
}
开放平台应用管理模块负责对接车场、人行项目的应用,包括应用的注册、认证、授权、管理等。
在系统添加一个应用,用于对接车场、人行项目的开放接口。 需要输入应用名称、服务行业、应用描述、应用logo、用户名(负责人)、手机号码。
具体参数表格如下:
字段名 | 参数名称 | 类型 | 说明 | 是否必填 |
---|---|---|---|---|
name | 应用名称 | 字符串 | 应用名称 | 是 |
serviceType | 服务行业 | 字符串 | 服务行业 | 是 |
remark | 应用描述 | 字符串 | 应用描述 | 否 |
logo | 应用logo | 字符串 | 应用logo 存oss key | 否 |
userId | 用户id | 字符串 | 开放平台用户id | 是 |
json
{
"name": "车场应用",
"serviceType": "车场",
"remark": "车场应用",
"logo": "osskey",
"userId": 1
}
响应参数:JSON格式 响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": {
"id": 1,
"name": "车场应用",
"serviceType": "车场",
"remark": "车场应用",
"logo": "osskey",
"userId": 1,
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"expirationTime " : "2021-01-01 00:00:00",
"status" : 1 // 0启用 1禁用
}
}
json
{
"projectIds": [1,2,3]
}
响应参数:JSON格式 响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"interfaceIds": [1,2,3]
}
响应参数:JSON格式 响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"expirationTime": "2021-01-01 00:00:00"
}
响应参数:JSON格式 响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
##### 启用应用应用处于禁用状态时,需要平台认为的开启才可以使用。
接口地址:/openapi/app/enable/{1}
请求方式:PUT
平台: 总部端
请求参数:路径参数
响应参数:JSON格式 响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
##### 重置应用秘钥新创建的应用的秘钥是随机生成的32位数字跟英文大写字母。
如果用户签名秘钥存在泄露的情况,可以自己重置签名秘钥,平台也可以重置签名秘钥。
重置的签名秘钥也是随机生成的。
接口地址:/openapi/app/resetSignKey/{1}
请求方式:PUT
平台: 总部端
请求参数:路径参数
响应参数:JSON格式 响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"expirationTime": "2021-01-01 00:00:00"
}
响应参数:JSON格式 响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
##### 修改通知回调地址对于一些下行的接口,或者推送的接口,需要应用配置下行的地址。
回调的地址支持到端口后的特定前缀。例如:http://www.baidu.com/callback, 推送的消息会发送到http://www.baidu.com/callback/push/xxx
新创建的应用的通知回调地址为空。没有配置的情况下,平台不会推送消息。
平台对于每个应用只支持推送一个通知回调地址。
接口地址:/openapi/app/callback/{1}
请求方式:PUT
平台: 总部端
请求参数:JSON格式 body 体中参数
{
"callbackAddress": "2021-01-01 00:00:00"
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
##### 查询详情接口地址:/openapi/app/{1}
请求方式:GET
平台: 总部端,开放平台
请求参数:路径参数
响应参数:JSON格式
响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": {
"id": 1,
"name": "车场应用",
"serviceType": "车场",
"remark": "车场应用",
"logo": "osskey",
"userName": "admin",
"phoneNumber": "13800138000",
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"createUser": "admin",
"updateUser": "admin",
"expirationTime " : "2021-01-01 00:00:00",
"status" : 1, // 0启用 1禁用
}
}
参数名 | 类型 | 说明 | 是否必填 |
---|---|---|---|
current | int | 页码 | 是 |
size | int | 每页条数 | 是 |
name | string | 应用名称 | 否 |
serviceType | string | 服务行业 | 否 |
status | int | 状态 | 否 |
phoneNumber | string | 手机号码 | 否 |
json
{
"code": 1000000,
"msg": "操作成功",
"data": {
"total": 10,
"pages": 20,
"current": 1,
"size": 10,
"records": [
{
"id": 1,
"name": "车场应用",
"serviceType": "车场",
"remark": "车场应用",
"logo": "osskey",
"userName": "admin",
"phoneNumber": "13800138000",
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"createUser": "admin",
"updateUser": "admin",
"expirationTime " : "2021-01-01 00:00:00",
"status" : 1, // 0启用 1禁用
}
]
}
}
开放平台数据接口管理模块负责对接车场、人行项目的接口,包括接口的注册、认证、授权、管理等。我们将配置两类接口,一个是上行接口,一个是下行接口。 上行接口
开放平台对外提供的接口,包括车场、人行项目的接口。都是在这里添加。 需要的参数有,接口名称,路径,请求方式,接口类型,版本,发布状态,接口展示文档,启用状态,访问限制次数。
具体参数表格如下:
| 字段名 | 参数名称 | 类型 | 说明 | 是否必填 | |--------------|--------|-----|---------------------------|------|
| name | 接口名称 | 字符串 | 接口名称 | 是 |
| path | 路径 | 字符串 | 接口路径 | 是 |
| method | 请求方式 | 字符串 | 请求方式 POST PUT GET DELETE | 是 |
| type | 接口类型 | int | 接口类型 0 上行 1 下行 | 是 |
| serviceType | 业务类型 | int | 1 车位 2 支付 3 月卡 4 车场 5 优惠券 | 是 |
| version | 版本 | 字符串 | 版本号 v1 v2 ... | 是 |
| status | 发布状态 | int | 发布状态 0 未发出 1 已发布 | 是 |
| doc | 接口展示文档 | 字符串 | 接口展示文档 markdown格式 | 否 |
| enable | 启用状态 | int | 启用状态 0 启用 1 禁用 | 是 |
| limitCount | 访问限制次数 | int | 每秒访问限制次数 | 否 |
请求参数:JSON格式
{
"name": "车场接口",
"path": "/api/v1/car/parking",
"method": "GET",
"type": 0,
"serviceType": 1,
"version": "v1",
"doc": "",
"limitCount": 100
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": {
"id": 1,
"name": "车场接口",
"path": "/api/v1/car/parking",
"method": "GET",
"type": 0,
"serviceType": 1,
"version": "v1",
"status": 1,
"doc": "",
"enable": 1,
"limitCount": 100,
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"createUser": "admin",
"updateUser": "admin"
}
}
请求参数:JSON格式
{
"name": "车场接口",
"path": "/api/v1/car/parking",
"method": "GET",
"type": 0,
"serviceType": 1,
"version": "v1",
"doc": "",
"limitCount": 100
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": {
"id": 1,
"name": "车场接口",
"path": "/api/v1/car/parking",
"method": "GET",
"type": 0,
"serviceType": 1,
"version": "v1",
"status": 1,
"doc": "",
"enable": 1,
"limitCount": 100,
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"createUser": "admin",
"updateUser": "admin"
}
}
响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"doc": "接口文档"
}
响应参数:JSON格式
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
响应参数:JSON格式
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": null
}
请求参数: json
{
"ids" : "1,2,3" //多个接口id用逗号隔开。 不传则导出全部
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": [
{
"id": 1,
"name": "车场接口",
"path": "/api/v1/car/parking",
"method": "GET",
"type": 0,
"serviceType": 1,
"version": "v1",
"status": 1,
"doc": "",
"enable": 1,
"limitCount": 100,
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"createUser": "admin",
"updateUser": "admin"
}
]
}
响应示例:
{
"code": 1000000,
"msg": "操作成功",
"data": {
"id": 1,
"name": "车场接口",
"path": "/api/v1/car/parking",
"method": "GET",
"type": 0,
"serviceType": 1,
"version": "v1",
"status": 1,
"doc": "",
"enable": 1,
"limitCount": 100,
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"createUser": "admin",
"updateUser": "admin"
}
}
参数名 | 类型 | 说明 | 是否必填 |
---|---|---|---|
current | int | 页码 | 是 |
size | int | 每页条数 | 是 |
name | string | 应用名称 | 否 |
serviceType | string | 服务行业 | 否 |
status | int | 状态 | 否 |
path | string | 访问路径 | 否 |
json
{
"code": 1000000,
"msg": "操作成功",
"data": {
"total": 10,
"pages": 20,
"current": 1,
"size": 10,
"records": [
{
"id": 1,
"name": "车场接口",
"path": "/api/v1/car/parking",
"method": "GET",
"type": 0,
"serviceType": 1,
"version": "v1",
"status": 1,
"doc": "",
"enable": 1,
"limitCount": 100,
"createTime": "2021-01-01 00:00:00",
"updateTime": "2021-01-01 00:00:00",
"createUser": "admin",
"updateUser": "admin"
}
]
}
}
开放平台安全校验模块负责对接车场、人行项目的安全校验,包括接口的安全校验、数据加密、数据权限校验、数据流量监控等。
请求参数:JSON格式
{
"appId": "123456",
"appSecret": "123456",
"timestamp": 1610123456789,
"sign": "123456"
}
json
{
"code": 1000000,
"msg": "操作成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
}
通过jwt解析token。对比jwt中的body数据是否正确。并获取当前应用的一些权限。
所有的接口按照接口都需要参数签名。
对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。
对于post, put请求,加密参数会在body中。
对于get, delete请求,加密参数会在url中。
字段名 | 参数名称 | 类型 | 能否为空 | 说明 |
---|---|---|---|---|
id | 主键 | int | 否 | 应用id |
name | 应用名称 | varchar(16) | 否 | 应用名称 |
app_id | 应用id | varchar(32) | 否 | 应用id |
app_secret | 应用密钥 | varchar(32) | 否 | 应用密钥 |
status | 应用状态 | int | 否 | 应用状态 0 禁用 1 启用 |
create_time | 创建时间 | datetime | 否 | 创建时间 |
update_time | 更新时间 | datetime | 是 | 更新时间 |
user_id | 创建人 | varchar(16) | 否 | 创建人 |
expiration_time | 过期时间 | datetime | 否 | 过期时间 |
is_delete | 是否已删除 | int | 否 | 0 正常 1 已删除 |
remark | 备注 | varchar(255) | 是 | 备注 |
字段名 | 参数名称 | 类型 | 能否为空 | 说明 |
---|---|---|---|---|
id | 主键 | int | 否 | 主键 |
app_id | 应用id | varchar(32) | 否 | 应用id 应用表的主键 |
project_id | 项目id | int | 否 | 项目id 对应项目表的主键 |
字段名 | 参数名称 | 类型 | 能否为空 | 说明 |
---|---|---|---|---|
id | 主键 | int | 否 | 接口id |
name | 接口名称 | varchar(16) | 否 | 接口名称 |
path | 接口路径 | varchar(128) | 否 | 接口路径 |
method | 请求方式 | varchar(16) | 否 | 请求方式 |
type | 接口类型 | int | 否 | 接口类型 0 上行 1下行 |
service_type | 服务类型 | int | 否 | 1 车位 2 支付 3 月卡 4 车场 5 优惠券 |
version | 版本号 | varchar(16) | 否 | 版本号 v1 v2 |
doc | 接口文档 | text | 是 | 接口文档 |
status | 接口状态 | int | 否 | 接口状态 0 禁用 1 启用 |
enable | 是否启用 | int | 否 | 是否启用 0 禁用 1 启用 |
limit_count | 限制次数 | int | 否 | 限制次数 |
create_time | 创建时间 | datetime | 否 | 创建时间 |
update_time | 更新时间 | datetime | 是 | 更新时间 |
create_user | 创建人 | varchar(16) | 否 | 创建人 |
update_user | 更新人 | varchar(16) | 是 | 更新人 |
is_delete | 是否已删除 | int | 否 | 0 正常 1 已删除 |
remark | 备注 | varchar(255) | 是 | 备注 |
字段名 | 参数名称 | 类型 | 能否为空 | 说明 |
---|---|---|---|---|
id | 主键 | int | 否 | 主键 |
app_id | 应用id | varchar(32) | 否 | 应用id 应用表的主键 |
interface_id | 接口id | int | 否 | 接口id 接口表的主键 |