可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了
# yansongda/pay AGENTS.md
## OVERVIEW
PHP 支付 SDK,支持支付宝、微信、银联、抖音、江苏银行、PayPal、Stripe。基于插件管道架构,关注支付流程、回调验签和 Provider 扩展一致性。
## STRUCTURE
```
src/
├── Config/ # Typed Config(WechatConfig、AlipayConfig 等)
├── Event/ # PSR-14 事件
├── Plugin/{Provider}/V{n}/
├── Provider/ # Alipay、Wechat 等
├── Shortcut/{Provider}/
├── Traits/ # {Provider}Trait、ProviderConfigTrait
├── CertManager.php # 证书缓存
└── Pay.php
```
## 核心组件
| 符号 | 位置 | 用途 |
|---|---|---|
| `Pay::alipay()` | `Pay.php` | 支付入口 |
| `Pay::wechat()` | `Pay.php` | 微信入口 |
| `ProviderInterface` | `Contract/` | 核心接口(pay/query/cancel/close/refund/callback/success) |
| `Rocket` | `Yansongda\Artful\Rocket` | 承载 params/payload/radar/destination |
| `CertManager` | `CertManager.php` | 证书读取与缓存 |
| `Event` | `Event.php` | PSR-14 事件分发 |
| `{Provider}Config` | `Config/` | 类型化配置对象 |
## 核心原则
- **安全第一**:回调/Webhook 必须验签,禁止直接信任传入数据
- **代码一致性**:新增 Provider 遵循现有结构
## COMMANDS & 开发规范
详见 `.agents/skills/dev-guide/SKILL.md`,使用时加载。
## 架构要点
- **插件管道**:`StartPlugin → [前置] → 业务插件 → [后置] → ParserPlugin`
- **动态调用**:Provider 通过 `__call` 调用 Shortcut,再进入管道
- **配置系统**:`Config` 类自动将数组配置转为 `{Provider}Config` 对象
- **事件系统**:`PayListener` 桥接 Artful 事件 → Pay 事件
## 签名验证(必须)
| Provider | 方式 | Trait 方法 |
|---|---|---|
| 支付宝 | RSA 本地验证 | `AlipayTrait::verifyAlipaySign()` |
| 微信 | 证书签名本地验证 | `WechatTrait::verifyWechatSign()` |
| PayPal | API 验证 | `PaypalTrait::verifyPaypalWebhookSign()` |
| Stripe | HMAC-SHA256 本地 | `StripeTrait::verifyStripeWebhookSign()` |
| 银联 | 证书签名本地验证 | `UnipayTrait::verifyUnipaySign()` |
| 江苏银行 | RSA 本地验证 | `JsbTrait::verifyJsbSign()` |
| 抖音 | SHA1 本地验证 | `CallbackPlugin::verifySign()` |
| 通联支付 | RSA-SHA1 本地验证 | `AllinpayTrait::verifyAllinpaySign()` |
回调处理差异:
- **Wechat/Stripe/Paypal**:传 `_request`(ServerRequestInterface)到 CallbackPlugin
- **Alipay/Douyin/Unipay/Jsb/Allinpay**:通过 `getCallbackParams()` 获取 Collection
## Trait 参考
| 用途 | 方法(示例) |
|---|---|
| 配置获取 | `ProviderConfigTrait::getProviderConfig()`、`getTenant()`、`getRadarUrl()` |
| URL 构建 | `get{Provider}Url()`(各 Trait) |
| 签名验证 | `verify{Provider}Sign()`、`verify{Provider}WebhookSign()` |
| 证书管理 | `CertManager::getPublicCert()`、`getPrivateCert()` |
| 微信专用 | `decryptWechatResource()`、`reloadWechatPublicCerts()` |
> 完整方法列表见 `src/Traits/{Provider}Trait.php`