Files
MTKJPAY/NGINX_SSL_CONFIG.md
qiube a3633577b4 feat(config): 更新配置以支持HTTPS域名访问
- 将所有环境的前端URL从localhost和IP地址更新为https://shopd.mtkj2025.com
- 配置PayPal webhook使用HTTPS域名以满足PayPal安全要求
- 统一后端服务端口从18082调整为8082
- 更新Java代码中的默认URL配置和启动日志信息
- 创建域名配置、Nginx SSL配置和公网访问检查清单文档
- 为商品链接生成和API访问配置HTTPS协议支持
2025-12-26 15:18:34 +08:00

191 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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访问正常