|
|
@@ -0,0 +1,303 @@
|
|
|
+# zsElectric-OpenApi 开放平台服务
|
|
|
+
|
|
|
+## 项目简介
|
|
|
+
|
|
|
+zsElectric-OpenApi 是一个独立的开放平台API服务,提供第三方应用调用的接口服务。该服务可以独立部署到服务器上,对外提供RESTful API接口。
|
|
|
+
|
|
|
+## 技术栈
|
|
|
+
|
|
|
+- **Java**: 17
|
|
|
+- **Spring Boot**: 3.5.6
|
|
|
+- **MyBatis Plus**: 3.5.5
|
|
|
+- **Druid**: 1.2.24
|
|
|
+- **Hutool**: 5.8.34
|
|
|
+- **Knife4j**: 4.5.0 (API文档)
|
|
|
+- **MySQL**: 8.0+
|
|
|
+- **Lombok**: 工具类
|
|
|
+
|
|
|
+## 项目结构
|
|
|
+
|
|
|
+```
|
|
|
+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
|
|
|
+```
|
|
|
+
|
|
|
+## 快速开始
|
|
|
+
|
|
|
+### 1. 环境要求
|
|
|
+
|
|
|
+- JDK 17+
|
|
|
+- Maven 3.6+
|
|
|
+- MySQL 8.0+
|
|
|
+
|
|
|
+### 2. 数据库初始化
|
|
|
+
|
|
|
+创建数据库并执行以下SQL脚本:
|
|
|
+
|
|
|
+```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);
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 配置修改
|
|
|
+
|
|
|
+修改 `application-dev.yml` 中的数据库连接信息:
|
|
|
+
|
|
|
+```yaml
|
|
|
+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安全配置:
|
|
|
+
|
|
|
+```yaml
|
|
|
+api:
|
|
|
+ security:
|
|
|
+ secret-key: your-secret-key-please-change-in-production # 生产环境请修改
|
|
|
+ timestamp-expire-minutes: 5
|
|
|
+ token-expire-hours: 24
|
|
|
+ rate-limit: 100
|
|
|
+```
|
|
|
+
|
|
|
+### 4. 编译运行
|
|
|
+
|
|
|
+```bash
|
|
|
+# 编译项目
|
|
|
+mvn clean package
|
|
|
+
|
|
|
+# 运行项目
|
|
|
+java -jar target/zsElectric-openapi.jar
|
|
|
+
|
|
|
+# 或者指定环境
|
|
|
+java -jar target/zsElectric-openapi.jar --spring.profiles.active=prod
|
|
|
+```
|
|
|
+
|
|
|
+### 5. 访问文档
|
|
|
+
|
|
|
+服务启动后,访问以下地址查看API文档:
|
|
|
+
|
|
|
+- **Knife4j文档**: http://localhost:8081/openapi/doc.html
|
|
|
+- **Swagger UI**: http://localhost:8081/openapi/swagger-ui.html
|
|
|
+
|
|
|
+## API调用流程
|
|
|
+
|
|
|
+### 1. 获取访问令牌
|
|
|
+
|
|
|
+```http
|
|
|
+POST /openapi/api/v1/token/get
|
|
|
+Content-Type: application/json
|
|
|
+X-App-Id: TEST_APP_001
|
|
|
+X-App-Secret: test_secret_123456
|
|
|
+```
|
|
|
+
|
|
|
+响应:
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "code": 200,
|
|
|
+ "message": "操作成功",
|
|
|
+ "data": {
|
|
|
+ "accessToken": "A1B2C3D4E5F6G7H8I9J0",
|
|
|
+ "tokenType": "Bearer",
|
|
|
+ "expireTime": 1704067200000
|
|
|
+ },
|
|
|
+ "timestamp": 1703980800000
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. API签名认证
|
|
|
+
|
|
|
+所有需要认证的API请求都需要包含以下请求头:
|
|
|
+
|
|
|
+- `X-App-Id`: 应用ID
|
|
|
+- `X-Timestamp`: 时间戳(毫秒)
|
|
|
+- `X-Nonce`: 随机字符串
|
|
|
+- `X-Signature`: 签名(MD5)
|
|
|
+
|
|
|
+签名生成算法:
|
|
|
+
|
|
|
+```
|
|
|
+signString = appId + timestamp + nonce + requestParams + secretKey
|
|
|
+signature = MD5(signString).toUpperCase()
|
|
|
+```
|
|
|
+
|
|
|
+示例:
|
|
|
+
|
|
|
+```http
|
|
|
+GET /openapi/api/v1/charging/stations?status=AVAILABLE
|
|
|
+X-App-Id: TEST_APP_001
|
|
|
+X-Timestamp: 1703980800000
|
|
|
+X-Nonce: random123456
|
|
|
+X-Signature: AABBCCDD11223344556677889900
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 调用API
|
|
|
+
|
|
|
+使用获取到的令牌和签名调用具体的API接口。
|
|
|
+
|
|
|
+## 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}` - 查询订单详情
|
|
|
+
|
|
|
+## 部署说明
|
|
|
+
|
|
|
+### 打包部署
|
|
|
+
|
|
|
+```bash
|
|
|
+# 打包
|
|
|
+mvn clean package
|
|
|
+
|
|
|
+# 生成的jar包位于: target/zsElectric-openapi.jar
|
|
|
+```
|
|
|
+
|
|
|
+### 生产环境配置
|
|
|
+
|
|
|
+修改 `application-prod.yml` 中的配置:
|
|
|
+
|
|
|
+- 数据库连接信息
|
|
|
+- 日志路径
|
|
|
+- API密钥
|
|
|
+- 其他生产环境特定配置
|
|
|
+
|
|
|
+### 启动服务
|
|
|
+
|
|
|
+```bash
|
|
|
+# 后台启动
|
|
|
+nohup java -jar zsElectric-openapi.jar --spring.profiles.active=prod > app.log 2>&1 &
|
|
|
+
|
|
|
+# 查看日志
|
|
|
+tail -f app.log
|
|
|
+```
|
|
|
+
|
|
|
+### Docker部署
|
|
|
+
|
|
|
+创建 `Dockerfile`:
|
|
|
+
|
|
|
+```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"]
|
|
|
+```
|
|
|
+
|
|
|
+构建并运行:
|
|
|
+
|
|
|
+```bash
|
|
|
+docker build -t zselectric-openapi:1.0.0 .
|
|
|
+docker run -d -p 8081:8081 --name openapi zselectric-openapi:1.0.0
|
|
|
+```
|
|
|
+
|
|
|
+## 安全建议
|
|
|
+
|
|
|
+1. **生产环境必须修改**:
|
|
|
+ - API签名密钥 (`api.security.secret-key`)
|
|
|
+ - 数据库密码
|
|
|
+ - 应用密钥 (`app_secret`)
|
|
|
+
|
|
|
+2. **使用HTTPS**: 生产环境必须使用HTTPS协议
|
|
|
+
|
|
|
+3. **IP白名单**: 为每个应用配置IP白名单
|
|
|
+
|
|
|
+4. **限流控制**: 根据业务需求调整API调用频率限制
|
|
|
+
|
|
|
+5. **日志监控**: 定期查看API调用日志,及时发现异常
|
|
|
+
|
|
|
+6. **权限控制**: 为不同应用分配不同的权限
|
|
|
+
|
|
|
+## 常见问题
|
|
|
+
|
|
|
+### Q: 签名验证失败?
|
|
|
+A: 请检查:
|
|
|
+- 签名算法是否正确
|
|
|
+- 时间戳是否在有效期内(默认5分钟)
|
|
|
+- 请求参数是否包含在签名中
|
|
|
+- 密钥是否正确
|
|
|
+
|
|
|
+### Q: 时间戳过期?
|
|
|
+A: 请确保客户端时间与服务器时间同步,误差不超过配置的过期时间(默认5分钟)
|
|
|
+
|
|
|
+### Q: 如何限制应用调用频率?
|
|
|
+A: 在 `openapi_app_info` 表中设置 `daily_limit` 字段,或在 `application.yml` 中配置 `api.security.rate-limit`
|
|
|
+
|
|
|
+## 联系方式
|
|
|
+
|
|
|
+- 项目作者: Ray.Hao
|
|
|
+- 技术支持: support@zselectric.com
|