Lorenzo-Benvenuti/transport-ticketing-and-payment-system
GitHub: Lorenzo-Benvenuti/transport-ticketing-and-payment-system
一个基于 PHP/MySQL 的双服务交通票务与模拟支付平台,通过 Docker 容器化部署并集成 CI 流水线,演示完整的购票与支付 Webhook 交互流程。
Stars: 1 | Forks: 0
# 交通票务与支付系统 (SFT + PaySteam)
[](https://github.com/Lorenzo-Benvenuti/Transport-Ticketing-and-Payment-System/actions/workflows/php-lint.yml)
[](LICENSE)
[](docker-compose.yml)
[](#tech-stack)
一个仓库包含两个全栈 **PHP + MySQL** Web 应用程序:
- **SFT** — 公共交通票务系统(路线/时刻表、购票、管理/运营后台)
- **PaySteam** — 支付/钱包系统(消费者仪表板、商户专区、签名回调模拟)
## 概述
- 双服务架构(票务 + 支付提供商模拟器)
- 基于 Webhook 的确认机制(PaySteam → SFT),带有 HMAC 签名验证
- 明确区分 PUBLIC 与 INTERNAL base URL(Docker 内部的浏览器与服务器到服务器通信)
- 可重现的本地设置(Docker Compose + DB 初始化脚本)
- 通过 GitHub Actions 实现基础自动化(lint/测试)
## 技术栈
- PHP(面向过程)
- MySQL
- Apache
- Docker Compose(推荐)
- XAMPP(受支持,但支付演示需要额外配置)
## 项目结构
- `sft/` — SFT 应用程序
- `paysteam/` — PaySteam 应用程序
- `docker/` — Docker Compose + MySQL 初始化脚本
- `docs/` — PDF(项目报告)
## 快速开始(推荐使用 Docker)
### 太长不看
```
cp sft/.env.example sft/.env
cp paysteam/.env.example paysteam/.env
docker compose up -d --build
```
### 1) 创建 env 文件
复制示例文件:
- `sft/.env.example` → `sft/.env`
- `paysteam/.env.example` → `paysteam/.env`
### 2) 启动容器
从仓库根目录开始:
```
docker compose up -d --build
```
### 3) 打开应用
- SFT: http://localhost:8080/sft/public/index.php
- PaySteam: http://localhost:8080/paysteam/public/index.php
### URL 配置参考 (Docker)
| 变量 | 应用 | 使用者 | 示例 | 备注 |
|---|---|---|---|---|
| `PUBLIC_BASE_URL` | SFT | 浏览器重定向/返回 URL | `http://localhost:8080/sft` | Docker 暴露的主机/端口 |
| `INTERNAL_BASE_URL` | SFT | PaySteam → SFT webhook(服务器到服务器) | `http://localhost/sft` | 在 `php` 容器内部(端口 80) |
| `PAYSTEAM_BASE_URL` | SFT | SFT → PaySteam API/result(服务器到服务器) | `http://localhost/paysteam` | 在 `php` 容器内部(端口 80) |
| `PAYSTEAM_MERCHANT_EMAIL` | SFT | 商户在 PaySteam 上的身份 | `esercente@paysteam.it` | 必须在 PaySteam 中存在且角色为 `esercente` |
| `APP_BASE_URL` | Paysteam | 向浏览器展示的 URL | `http://localhost:8080/paysteam` | Docker 暴露的主机/端口 |
### 4) 重置 DB(如果您需要重新开始)
```
docker compose down -v
docker compose up -d --build
```
## 演示凭据
### SFT
- 管理员: `admin@sft.it` / `admin123`
- 运营人员: `responsabile@sft.it` / `responsabile123`
- 乘客: `utente@example.com` / `utente123`
### PaySteam
- 消费者: `utente@example.com` / `utente123`
- 商户: `esercente@paysteam.it` / `merchant123`
## 注意事项
SFT 结账流程通过 HTTP 调用和返回/webhook URL 与 PaySteam 模拟器相连。
- **Docker(推荐):** 开箱即用(示例包含适合 Docker 的正确 PUBLIC 与 INTERNAL base URL)。
- **XAMPP:** 您必须在 `sft/.env` 和 `paysteam/.env` 中设置 base URL 为您本地的 Apache URL(通常是 `http://localhost/...`)。
另请注意:演示支付流程通过 **email** 解析用户(推荐),以避免跨数据库的 ID 耦合。请确保两个应用中存在相同的 email(种子数据为:`utente@example.com`)。
## 安全说明
这是一个模拟项目。它包含了基本的安全实践(prepared statements、密码哈希、基于环境变量的密钥、强化的 session cookies),但目前**尚不适用于生产环境**。
## 架构概述
```
+------------------+ HTTP (API/redirect) +------------------+
| SFT (Ticketing) | ---------------------------> | PaySteam (PSP) |
| - orders/tickets | | - payments |
| - backoffice | <--------------------------- | - webhook sender |
+------------------+ Signed webhook/callback +------------------+
|
| MySQL (init scripts)
v
+--------+
| DB |
+--------+
```
该仓库包含两个通过 HTTP 进行通信的 PHP Web 应用。
- **SFT**(票务应用):管理用户、路线/时刻表以及结账流程。
- **PaySteam**(支付模拟器):提供消费者/商户仪表板和模拟支付 API。
### 支付流程(宏观层面)
1. 用户在 **SFT** 上开始结账。
2. **SFT** 通过服务器到服务器调用在 **PaySteam** 上创建一笔交易。
3. 浏览器被重定向到 **PaySteam** 以批准/拒绝支付。
4. **PaySteam** 通过签名的 webhook 通知 **SFT**。
5. 用户返回到 **SFT** 确认页面(返回 URL)。
**注意:为了确保交易成功,用户必须首先在两个应用程序(SFT 和 Pay Steam)上使用相同的账户登录。**
包含的安全机制:
- Prepared statements(缓解 SQLi)
- 密码哈希
- 基于环境变量的密钥(API token + webhook 密钥)
- 来自 PaySteam 的 HMAC 签名回调
## 截图
**SFT — 结账**
**PaySteam — 支付审批**
SFT — Dashboard
SFT — Ticket Section
SFT — Admin Backoffice
SFT — Operations Backoffice
PaySteam — Dashboard
PaySteam — User Dashboard
PaySteam — Transactions
## License
MIT
**PaySteam — 支付审批**
更多截图
标签:Docker Compose, ffuf, OpenVAS, PHP, Webhook, 力导向图, 支付平台, 版权保护, 票务系统