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

5.3 KiB
Raw Blame History

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. 确保配置如下:
# 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访问

    curl https://175.178.252.59/api/health
    
  2. 测试Webhook端点

    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访问正常