# PayPal Webhook 配置说明 ## 内网穿透配置 当前使用内网穿透服务(cpolar)将本地服务暴露到公网: - **内网地址**: `http://localhost:8082` - **公网地址**: `https://2646b437.r33.cpolar.top` - **Webhook URL**: `https://2646b437.r33.cpolar.top/api/paypal/webhook` ## 配置文件 Webhook URL 已配置在 `application-dev.yml` 中: ```yaml paypal: webhook-url: https://2646b437.r33.cpolar.top/api/paypal/webhook ``` ## PayPal 控制台配置步骤 1. **登录 PayPal 开发者控制台** - 沙箱环境:https://developer.paypal.com/dashboard/ - 使用你的 PayPal 开发者账号登录 2. **选择应用** - 进入 "My Apps & Credentials" - 选择你的沙箱应用(Sandbox App) 3. **配置 Webhook** - 在应用详情页面,找到 "Webhooks" 部分 - 点击 "Add Webhook" 或 "Edit Webhook" - 输入 Webhook URL: `https://2646b437.r33.cpolar.top/api/paypal/webhook` - 选择要监听的事件类型: - `PAYMENT.CAPTURE.COMPLETED` - 支付捕获完成 - `PAYMENT.CAPTURE.DENIED` - 支付捕获被拒绝 - `PAYMENT.CAPTURE.REFUNDED` - 支付退款 - `CHECKOUT.ORDER.APPROVED` - 订单已批准 - `CHECKOUT.ORDER.COMPLETED` - 订单已完成 - `CHECKOUT.ORDER.CANCELLED` - 订单已取消 - 保存配置 4. **获取 Webhook ID** - 配置完成后,PayPal 会生成一个 Webhook ID - 将此 Webhook ID 配置到 `application-dev.yml` 中的 `paypal.webhook-id` ## 注意事项 1. **内网穿透地址变化** - 免费版 cpolar 的地址可能会变化 - 如果地址变化,需要: - 更新 `application-dev.yml` 中的 `webhook-url` - 在 PayPal 控制台更新 Webhook URL 2. **HTTPS 要求** - PayPal Webhook 要求使用 HTTPS - cpolar 提供的地址默认支持 HTTPS 3. **测试 Webhook** - 在 PayPal 控制台可以测试 Webhook - 选择 "Send test event" 发送测试事件 - 检查后端日志确认是否收到事件 4. **生产环境** - 生产环境需要使用固定的域名 - 建议使用自己的域名配置 SSL 证书 - 更新 `application-prod.yml` 中的 `webhook-url` ## 验证配置 启动应用后,查看日志中的 PayPal 配置信息: ``` ═══════════════════════════════════════════════════════════ PayPal配置加载验证: - Client ID: ✅ 已配置 (...) - Client Secret: ✅ 已配置 (...) - Mode: sandbox - Enabled: true - Base URL: https://api-m.sandbox.paypal.com - Webhook URL: ✅ https://2646b437.r33.cpolar.top/api/paypal/webhook ═══════════════════════════════════════════════════════════ ``` 如果 Webhook URL 显示为 "❌ 未配置",请检查配置文件。 ## 后端接口 Webhook 回调接口路径:`/api/paypal/webhook` - **方法**: POST - **路径**: `/api/paypal/webhook` - **完整URL**: `https://2646b437.r33.cpolar.top/api/paypal/webhook` ## 前端配置 前端不需要修改,因为: - 前端使用 `window.location.origin` 自动获取当前域名 - 用户访问的是前端地址,不是后端地址 - 支付成功/取消回调使用前端路由,不涉及 Webhook