# Nginx SSL配置指南(PayPal Webhook必需) ## 问题说明 PayPal Webhook **只接受HTTPS(端口443)**的URL,不接受HTTP或其他端口。 当前配置: - ❌ `http://175.178.252.59:8082/api/paypal/webhook` - PayPal不接受 - ✅ `https://175.178.252.59/api/paypal/webhook` - PayPal接受 ## 解决方案 需要通过Nginx配置SSL证书,将HTTPS请求转发到后端的HTTP服务。 ## 配置步骤 ### 1. 在宝塔面板中配置SSL证书 1. **进入网站设置** - 宝塔面板 → 网站 → 选择你的网站(175.178.252.59) - 点击"设置" → "SSL" 2. **申请或配置SSL证书** **选项A:使用Let's Encrypt免费证书(推荐)** - 点击"Let's Encrypt" - 输入域名(如果有)或使用IP地址 - 点击"申请" - 等待证书申请完成 **选项B:使用自签名证书(仅测试用)** - 点击"自签证书" - 生成自签名证书 - ⚠️ 注意:自签名证书PayPal可能不接受,建议使用Let's Encrypt 3. **启用HTTPS** - 证书申请成功后,点击"强制HTTPS" - 保存配置 ### 2. 配置Nginx反向代理(SSL) 在宝塔面板中: 1. 网站 → 设置 → 配置文件 2. 找到 `location /api/` 配置块 3. 确保配置如下: ```nginx # HTTP请求重定向到HTTPS(可选,如果启用了强制HTTPS) # server { # listen 80; # server_name 175.178.252.59; # return 301 https://$server_name$request_uri; # } # HTTPS服务器配置 server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name 175.178.252.59; # SSL证书配置(宝塔会自动配置) ssl_certificate /www/server/panel/vhost/cert/175.178.252.59/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/175.178.252.59/privkey.pem; # SSL配置(宝塔会自动配置) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; root /www/wwwroot/175.178.252.59; index index.html index.htm; # 前端路由配置 location / { try_files $uri $uri/ /index.html; } # API反向代理(关键配置) location /api/ { proxy_pass http://127.0.0.1:8082; # 转发到后端HTTP服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(HTTPS) # WebSocket支持(如果需要) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 超时配置 proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # 静态资源缓存 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } } ``` ### 3. 修改后端配置 后端配置文件已更新: - `application-dev.yml`: `paypal.webhook-url: https://175.178.252.59/api/paypal/webhook` ### 4. 更新PayPal控制台 在PayPal控制台中配置Webhook URL: - **Webhook URL**: `https://175.178.252.59/api/paypal/webhook` - ✅ 使用HTTPS(不是HTTP) - ✅ 不指定端口(默认443) - ✅ 通过Nginx转发到后端 ### 5. 验证配置 1. **测试HTTPS访问** ```bash curl https://175.178.252.59/api/health ``` 2. **测试Webhook端点** ```bash curl -X POST https://175.178.252.59/api/paypal/webhook \ -H "Content-Type: application/json" \ -d '{"test": "data"}' ``` 3. **检查PayPal Webhook配置** - 在PayPal控制台测试Webhook - 应该不再显示端口错误 ## 重要提示 1. **SSL证书是必需的** - PayPal只接受HTTPS - 建议使用Let's Encrypt免费证书 - 自签名证书PayPal可能不接受 2. **Nginx配置要点** - 监听443端口(HTTPS) - 将 `/api/` 请求转发到 `http://127.0.0.1:8082` - 设置 `X-Forwarded-Proto` 头,让后端知道原始请求是HTTPS 3. **后端不需要修改** - 后端仍然监听8082端口(HTTP) - Nginx负责SSL终止和转发 4. **防火墙配置** - 确保443端口已开放 - 80端口可以重定向到443 ## 常见问题 ### Q1: 没有域名,只有IP地址,能申请SSL证书吗? **A:** Let's Encrypt需要域名,不能为IP地址签发证书。解决方案: - 使用自签名证书(PayPal可能不接受) - 使用内网穿透服务(如ngrok、cpolar)提供HTTPS - 申请一个域名并解析到服务器IP ### Q2: 使用自签名证书PayPal会接受吗? **A:** 通常不会。PayPal会验证SSL证书的有效性,自签名证书会被拒绝。建议: - 使用Let's Encrypt免费证书(需要域名) - 或使用内网穿透服务 ### Q3: 如何测试Webhook是否正常工作? **A:** 1. 在PayPal控制台发送测试Webhook 2. 查看后端日志,确认收到请求 3. 检查Nginx访问日志和错误日志 ## 配置检查清单 - [ ] SSL证书已申请并配置 - [ ] Nginx监听443端口 - [ ] `/api/` 路径正确转发到 `http://127.0.0.1:8082` - [ ] 后端配置中的webhook URL已改为HTTPS - [ ] PayPal控制台Webhook URL已更新为 `https://175.178.252.59/api/paypal/webhook` - [ ] 443端口已开放防火墙 - [ ] 测试HTTPS访问正常