pangu-user-platform/scripts/test/README.md

336 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 开放接口 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**