191 lines
5.3 KiB
Markdown
191 lines
5.3 KiB
Markdown
|
|
# 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访问正常
|
|||
|
|
|