|
|
1 settimana fa | |
|---|---|---|
| src | 1 settimana fa | |
| .gitignore | 1 settimana fa | |
| DATABASE_ARCHITECTURE.md | 1 settimana fa | |
| Dockerfile | 1 settimana fa | |
| README.md | 1 settimana fa | |
| docker-compose.yml | 1 settimana fa | |
| pom.xml | 1 settimana fa |
zsElectric-OpenApi 是一个独立的开放平台API服务,提供第三方应用调用的接口服务。该服务可以独立部署到服务器上,对外提供RESTful API接口。
zsElectric-openapi/
├── src/
│ ├── main/
│ │ ├── java/com/zsElectric/openapi/
│ │ │ ├── config/ # 配置类
│ │ │ ├── controller/ # 控制器
│ │ │ ├── service/ # 服务层
│ │ │ ├── entity/ # 实体类
│ │ │ ├── mapper/ # MyBatis Mapper
│ │ │ ├── common/ # 公共类
│ │ │ ├── dto/ # 数据传输对象
│ │ │ ├── vo/ # 视图对象
│ │ │ ├── security/ # 安全相关
│ │ │ └── ZsElectricOpenApiApplication.java
│ │ └── resources/
│ │ ├── application.yml # 主配置文件
│ │ ├── application-dev.yml # 开发环境配置
│ │ ├── application-prod.yml # 生产环境配置
│ │ └── mapper/ # MyBatis映射文件
│ └── test/
├── pom.xml
└── README.md
创建数据库并执行以下SQL脚本:
-- 创建开放平台应用信息表
CREATE TABLE `openapi_app_info` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`app_id` varchar(64) NOT NULL COMMENT '应用ID',
`app_name` varchar(128) NOT NULL COMMENT '应用名称',
`app_secret` varchar(128) NOT NULL COMMENT '应用密钥',
`contact_name` varchar(64) DEFAULT NULL COMMENT '联系人',
`contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`contact_email` varchar(128) DEFAULT NULL COMMENT '联系邮箱',
`callback_url` varchar(512) DEFAULT NULL COMMENT '回调地址',
`ip_whitelist` varchar(1024) DEFAULT NULL COMMENT 'IP白名单',
`status` tinyint DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`daily_limit` int DEFAULT '10000' COMMENT '每日调用限额',
`permissions` json DEFAULT NULL COMMENT '权限列表',
`remark` varchar(512) DEFAULT NULL COMMENT '备注信息',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_id` (`app_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开放平台应用信息表';
-- 创建API调用日志表
CREATE TABLE `openapi_api_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`app_id` varchar(64) NOT NULL COMMENT '应用ID',
`api_path` varchar(512) NOT NULL COMMENT '接口路径',
`request_method` varchar(10) NOT NULL COMMENT '请求方法',
`request_params` text COMMENT '请求参数',
`request_ip` varchar(64) DEFAULT NULL COMMENT '请求IP',
`response_code` int DEFAULT NULL COMMENT '响应状态码',
`response_message` varchar(512) DEFAULT NULL COMMENT '响应消息',
`response_time` bigint DEFAULT NULL COMMENT '响应时间(ms)',
`success` tinyint DEFAULT NULL COMMENT '是否成功:0-失败,1-成功',
`error_message` text COMMENT '错误信息',
`request_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '请求时间',
`response_time_field` datetime DEFAULT NULL COMMENT '响应时间',
PRIMARY KEY (`id`),
KEY `idx_app_id` (`app_id`),
KEY `idx_request_time` (`request_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API调用日志表';
-- 插入测试应用
INSERT INTO `openapi_app_info` (`app_id`, `app_name`, `app_secret`, `contact_name`, `contact_phone`, `status`)
VALUES ('TEST_APP_001', '测试应用', 'test_secret_123456', '测试人员', '13800138000', 1);
修改 application-dev.yml 中的数据库连接信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/zs_electric?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: your_password
修改 application.yml 中的API安全配置:
api:
security:
secret-key: your-secret-key-please-change-in-production # 生产环境请修改
timestamp-expire-minutes: 5
token-expire-hours: 24
rate-limit: 100
# 编译项目
mvn clean package
# 运行项目
java -jar target/zsElectric-openapi.jar
# 或者指定环境
java -jar target/zsElectric-openapi.jar --spring.profiles.active=prod
服务启动后,访问以下地址查看API文档:
POST /openapi/api/v1/token/get
Content-Type: application/json
X-App-Id: TEST_APP_001
X-App-Secret: test_secret_123456
响应:
{
"code": 200,
"message": "操作成功",
"data": {
"accessToken": "A1B2C3D4E5F6G7H8I9J0",
"tokenType": "Bearer",
"expireTime": 1704067200000
},
"timestamp": 1703980800000
}
所有需要认证的API请求都需要包含以下请求头:
X-App-Id: 应用IDX-Timestamp: 时间戳(毫秒)X-Nonce: 随机字符串X-Signature: 签名(MD5)签名生成算法:
signString = appId + timestamp + nonce + requestParams + secretKey
signature = MD5(signString).toUpperCase()
示例:
GET /openapi/api/v1/charging/stations?status=AVAILABLE
X-App-Id: TEST_APP_001
X-Timestamp: 1703980800000
X-Nonce: random123456
X-Signature: AABBCCDD11223344556677889900
使用获取到的令牌和签名调用具体的API接口。
GET /api/v1/health/check - 健康检查POST /api/v1/token/get - 获取访问令牌GET /api/v1/charging/stations - 获取充电桩列表GET /api/v1/charging/stations/{stationId} - 获取充电桩详情GET /api/v1/charging/stations/{stationId}/status - 获取充电桩实时状态GET /api/v1/order/list - 查询订单列表GET /api/v1/order/{orderId} - 查询订单详情# 打包
mvn clean package
# 生成的jar包位于: target/zsElectric-openapi.jar
修改 application-prod.yml 中的配置:
# 后台启动
nohup java -jar zsElectric-openapi.jar --spring.profiles.active=prod > app.log 2>&1 &
# 查看日志
tail -f app.log
创建 Dockerfile:
FROM openjdk:17-jdk-alpine
VOLUME /tmp
ADD target/zsElectric-openapi.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建并运行:
docker build -t zselectric-openapi:1.0.0 .
docker run -d -p 8081:8081 --name openapi zselectric-openapi:1.0.0
生产环境必须修改:
api.security.secret-key)app_secret)使用HTTPS: 生产环境必须使用HTTPS协议
IP白名单: 为每个应用配置IP白名单
限流控制: 根据业务需求调整API调用频率限制
日志监控: 定期查看API调用日志,及时发现异常
权限控制: 为不同应用分配不同的权限
A: 请检查:
A: 请确保客户端时间与服务器时间同步,误差不超过配置的过期时间(默认5分钟)
A: 在 openapi_app_info 表中设置 daily_limit 字段,或在 application.yml 中配置 api.security.rate-limit