336 lines
7.2 KiB
Markdown
336 lines
7.2 KiB
Markdown
# 开放接口 PHP 客户端使用指南
|
||
|
||
## 📋 文件说明
|
||
|
||
| 文件 | 说明 | 用途 |
|
||
|------|------|------|
|
||
| `OpenApiClient.php` | PHP 客户端类 | 封装签名计算、请求发送等逻辑 |
|
||
| `quickstart.php` | 快速开始示例 | 最简单的调用示例 |
|
||
| `openapi-student-list-test.php` | 完整测试示例 | 演示多种查询场景 |
|
||
| `README.md` | 使用文档 | 本文件 |
|
||
|
||
---
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 1. 准备工作
|
||
|
||
**环境要求**:
|
||
- PHP 7.4 或以上
|
||
- 启用 curl 扩展
|
||
|
||
**检查 PHP 版本**:
|
||
```bash
|
||
php -v
|
||
```
|
||
|
||
**检查 curl 扩展**:
|
||
```bash
|
||
php -m | grep curl
|
||
```
|
||
|
||
### 2. 获取应用凭证
|
||
|
||
在盘古管理后台获取您的应用凭证:
|
||
1. 登录管理后台:http://localhost:80
|
||
2. 进入【应用管理】菜单
|
||
3. 新增或查看应用,获取:
|
||
- **应用编码**(AppCode):如 `YY000001`
|
||
- **应用密钥**(AppSecret):如 `a1b2c3d4e5f6789012345678901234ab`
|
||
|
||
### 3. 运行快速示例
|
||
|
||
```bash
|
||
cd /Users/felix/pgWorkSpace/pangu-user-platform/scripts/test
|
||
|
||
# 方式一:使用命令行参数
|
||
php quickstart.php
|
||
|
||
# 方式二:修改 quickstart.php 中的配置后运行
|
||
php quickstart.php
|
||
```
|
||
|
||
---
|
||
|
||
## 📖 详细使用
|
||
|
||
### 方式一:使用完整测试脚本
|
||
|
||
```bash
|
||
# 基本用法
|
||
php openapi-student-list-test.php <appCode> <appSecret> [baseUrl]
|
||
|
||
# 示例:连接本地服务
|
||
php openapi-student-list-test.php YY000001 a1b2c3d4e5f6789012345678901234ab
|
||
|
||
# 示例:连接远程服务
|
||
php openapi-student-list-test.php YY000001 a1b2c3d4e5f6789012345678901234ab http://your-domain.com:8080
|
||
```
|
||
|
||
**输出示例**:
|
||
```
|
||
========================================
|
||
【开放接口调用】
|
||
========================================
|
||
【请求方法】GET
|
||
【请求 URL】http://localhost:8080/open/api/student/list?pageNum=1&pageSize=10
|
||
【请求头】
|
||
X-App-Id: YY000001
|
||
X-Timestamp: 1738656000000
|
||
X-Sign: A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6
|
||
Content-Type: application/json
|
||
【请求参数】
|
||
{
|
||
"pageNum": 1,
|
||
"pageSize": 10
|
||
}
|
||
【签名计算】
|
||
签名字符串: pageNum=1&pageSize=10&appSecret=a1b2c3d4e5f6789012345678901234ab
|
||
MD5 结果: A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6
|
||
========================================
|
||
|
||
【响应状态码】200
|
||
【响应内容】
|
||
{"code":200,"msg":"操作成功","rows":[...],"total":100}
|
||
|
||
✅ 调用成功!
|
||
```
|
||
|
||
### 方式二:在您的项目中使用
|
||
|
||
**1. 引入客户端类**:
|
||
```php
|
||
require_once '/path/to/OpenApiClient.php';
|
||
```
|
||
|
||
**2. 创建客户端实例**:
|
||
```php
|
||
$client = new OpenApiClient(
|
||
'http://localhost:8080', // API 基础地址
|
||
'YY000001', // 应用编码
|
||
'a1b2c3d4e5f6789012345678901234ab', // 应用密钥
|
||
false // 调试模式(true=开启, false=关闭)
|
||
);
|
||
```
|
||
|
||
**3. 调用接口**:
|
||
```php
|
||
try {
|
||
// GET 请求
|
||
$result = $client->get('/open/api/student/list', [
|
||
'pageNum' => 1,
|
||
'pageSize' => 10,
|
||
'studentName' => '张',
|
||
'schoolId' => 1
|
||
]);
|
||
|
||
// 处理响应
|
||
if ($result['code'] === 200) {
|
||
echo "总记录数: {$result['total']}\n";
|
||
foreach ($result['rows'] as $student) {
|
||
echo "{$student['studentName']} - {$student['studentCode']}\n";
|
||
}
|
||
} else {
|
||
echo "调用失败: {$result['msg']}\n";
|
||
}
|
||
} catch (Exception $e) {
|
||
echo "异常: {$e->getMessage()}\n";
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 签名算法说明
|
||
|
||
### 签名计算步骤
|
||
|
||
1. **收集请求参数**(不含签名本身)
|
||
```
|
||
pageNum=1, pageSize=10, studentName=张
|
||
```
|
||
|
||
2. **按参数名 ASCII 码升序排序**
|
||
```
|
||
pageNum=1, pageSize=10, studentName=张
|
||
```
|
||
|
||
3. **拼接键值对,末尾追加 appSecret**
|
||
```
|
||
pageNum=1&pageSize=10&studentName=张&appSecret=a1b2c3d4e5f6789012345678901234ab
|
||
```
|
||
|
||
4. **MD5 加密并转大写**
|
||
```php
|
||
$sign = strtoupper(md5($signStr));
|
||
```
|
||
|
||
### PHP 实现示例
|
||
|
||
```php
|
||
function calculateSign(array $params, string $appSecret): string
|
||
{
|
||
// 1. 按 key 升序排序
|
||
ksort($params);
|
||
|
||
// 2. 拼接参数
|
||
$signStr = '';
|
||
foreach ($params as $key => $value) {
|
||
if ($value === '' || $value === null) continue;
|
||
if ($signStr !== '') $signStr .= '&';
|
||
$signStr .= $key . '=' . $value;
|
||
}
|
||
|
||
// 3. 追加密钥
|
||
if ($signStr !== '') $signStr .= '&';
|
||
$signStr .= 'appSecret=' . $appSecret;
|
||
|
||
// 4. MD5 加密并转大写
|
||
return strtoupper(md5($signStr));
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 常见问题
|
||
|
||
### 1. 签名验证失败
|
||
|
||
**错误信息**:`签名验证失败`
|
||
|
||
**可能原因**:
|
||
- appSecret 不正确
|
||
- 参数排序错误(必须按 ASCII 码升序)
|
||
- MD5 结果未转大写
|
||
- 签名字符串拼接错误
|
||
|
||
**解决方法**:
|
||
```bash
|
||
# 开启调试模式,查看签名计算过程
|
||
$client = new OpenApiClient($baseUrl, $appCode, $appSecret, true);
|
||
```
|
||
|
||
### 2. 请求已过期
|
||
|
||
**错误信息**:`请求已过期`
|
||
|
||
**可能原因**:
|
||
- 服务器时间与客户端时间相差超过 5 分钟
|
||
|
||
**解决方法**:
|
||
```bash
|
||
# 同步服务器时间
|
||
sudo ntpdate -u time.apple.com
|
||
```
|
||
|
||
### 3. 无权访问该接口
|
||
|
||
**错误信息**:`无权访问该接口`
|
||
|
||
**可能原因**:
|
||
- 应用未授权访问该接口
|
||
|
||
**解决方法**:
|
||
1. 登录管理后台
|
||
2. 进入【应用管理】
|
||
3. 编辑应用,勾选需要的接口
|
||
4. 保存配置
|
||
|
||
### 4. 应用已停用
|
||
|
||
**错误信息**:`应用已停用`
|
||
|
||
**可能原因**:
|
||
- 应用状态为停用
|
||
|
||
**解决方法**:
|
||
1. 登录管理后台
|
||
2. 进入【应用管理】
|
||
3. 编辑应用,将状态改为正常
|
||
4. 保存配置
|
||
|
||
---
|
||
|
||
## 📚 接口参数说明
|
||
|
||
### 学生列表查询
|
||
|
||
**接口路径**:`/open/api/student/list`
|
||
|
||
**请求方法**:`GET`
|
||
|
||
**请求参数**:
|
||
|
||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||
|--------|------|------|------|------|
|
||
| pageNum | int | 是 | 页码(从 1 开始) | 1 |
|
||
| pageSize | int | 是 | 每页条数 | 10 |
|
||
| studentName | string | 否 | 学生姓名(模糊查询) | 张 |
|
||
| schoolId | int | 否 | 学校 ID | 1 |
|
||
| gradeId | int | 否 | 年级 ID | 1 |
|
||
| classId | int | 否 | 班级 ID | 1 |
|
||
|
||
**响应数据**:
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"rows": [
|
||
{
|
||
"studentId": 1,
|
||
"studentCode": "S2024001",
|
||
"studentName": "张*",
|
||
"gender": "1",
|
||
"schoolId": 1,
|
||
"schoolName": "第一小学",
|
||
"gradeId": 1,
|
||
"gradeName": "三年级",
|
||
"classId": 1,
|
||
"className": "1班"
|
||
}
|
||
],
|
||
"total": 100
|
||
}
|
||
```
|
||
|
||
**字段说明**:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| studentId | int | 学生 ID |
|
||
| studentCode | string | 学号 |
|
||
| studentName | string | 学生姓名(已脱敏) |
|
||
| gender | string | 性别(0未知 1男 2女) |
|
||
| schoolId | int | 学校 ID |
|
||
| schoolName | string | 学校名称 |
|
||
| gradeId | int | 年级 ID |
|
||
| gradeName | string | 年级名称 |
|
||
| classId | int | 班级 ID |
|
||
| className | string | 班级名称 |
|
||
|
||
---
|
||
|
||
## 🔗 相关链接
|
||
|
||
- **技术文档**:`/docs/应用管理-需求与技术设计方案.md`
|
||
- **实现说明**:`/docs/开放接口实现说明.md`
|
||
- **Swagger 文档**:http://localhost:8080/doc.html
|
||
|
||
---
|
||
|
||
## 📝 更新日志
|
||
|
||
### v1.0 (2026-02-04)
|
||
- 初始版本
|
||
- 支持学生列表查询接口
|
||
- 提供完整的签名计算实现
|
||
- 提供调试模式
|
||
|
||
---
|
||
|
||
## 🤝 技术支持
|
||
|
||
如有问题,请联系技术支持或查看项目文档。
|
||
|
||
**pangu**
|