xdd пре 1 месец
родитељ
комит
7335ca50b7

+ 19 - 0
fs-admin/src/main/java/com/fs/task/OrderTask.java

@@ -0,0 +1,19 @@
+package com.fs.task;
+
+import com.fs.company.service.CompanyRechargeOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("orderTask")
+public class OrderTask {
+    @Autowired
+    private CompanyRechargeOrderService companyRechargeOrderService;
+
+
+    /**
+     * 自动关闭超时订单
+     */
+    public void autoCloseTimeOutOrder(){
+        companyRechargeOrderService.autoClosedOrder();
+    }
+}

+ 0 - 2
fs-admin/src/test/java/com/fs/course/controller/FsCourseDomainNameControllerTest.java

@@ -38,8 +38,6 @@ class FsCourseDomainNameControllerTest {
     private ISysConfigService configService;
     @Test
     public void nativePay() throws WxPayException {
-        String json = configService.selectConfigByKey("redPacket.config");
-        RedPacketConfig config = JSONUtil.toBean(json, RedPacketConfig.class);
 
         WxPayConfig payConfig = new WxPayConfig();
         payConfig.setAppId("wx961fadab9bcb792b");

+ 18 - 0
fs-company/src/main/java/com/fs/company/controller/CompanyRechargeController.java

@@ -13,6 +13,7 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyRecharge;
+import com.fs.company.dto.RechargeDTO;
 import com.fs.company.param.CompanyRechargeParam;
 import com.fs.company.service.ICompanyRechargeService;
 import com.fs.company.service.ICompanyService;
@@ -75,6 +76,23 @@ public class CompanyRechargeController extends BaseController
     }
 
 
+    /**
+     * 充值
+     * @return AjaxResult
+     */
+    @PostMapping("/recharge")
+    public AjaxResult recharge(@RequestBody RechargeDTO dto){
+        String payLink;
+        try {
+            payLink = companyRechargeService.recharge(dto);
+        }catch (Exception e) {
+            logger.error("给公司充值失败",e);
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success(payLink);
+    }
+
+
 
     /**
      * 新增充值

+ 83 - 0
fs-service-system/src/main/java/com/fs/company/constant/PaymentStatus.java

@@ -0,0 +1,83 @@
+package com.fs.company.constant;
+
+import lombok.Getter;
+
+/**
+ * 支付状态枚举类
+ *
+ * 描述支付过程中可能的状态
+ */
+@Getter
+public enum PaymentStatus {
+
+    /**
+     * 支付创建,初始状态
+     */
+    CREATED(0, "创建"),
+
+    /**
+     * 支付处理中
+     */
+    PROCESSING(1, "处理中"),
+
+    /**
+     * 支付成功
+     */
+    SUCCESS(2, "支付成功"),
+
+    /**
+     * 支付失败
+     */
+    FAILED(3, "支付失败");
+
+    /**
+     * 状态码
+     * -- GETTER --
+     *  获取状态码
+     *
+     * @return 状态码
+
+     */
+    private final int code;
+
+    /**
+     * 状态描述
+     * -- GETTER --
+     *  获取状态描述
+     *
+     * @return 状态描述
+
+     */
+    private final String description;
+
+    /**
+     * 构造函数
+     *
+     * @param code 状态码
+     * @param description 状态描述
+     */
+    PaymentStatus(int code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    /**
+     * 根据状态码获取对应的枚举值
+     *
+     * @param code 状态码
+     * @return 对应的支付状态枚举,如果没找到则返回null
+     */
+    public static PaymentStatus getByCode(int code) {
+        for (PaymentStatus status : PaymentStatus.values()) {
+            if (status.getCode() == code) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return code + ":" + description;
+    }
+}

+ 69 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyRechargeOrder.java

@@ -0,0 +1,69 @@
+package com.fs.company.domain;
+
+import lombok.Data;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 公司充值订单表
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CompanyRechargeOrder {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+    /**
+     * 支付平台交易号
+     */
+    private String transactionId;
+
+    /**
+     * 支付方式:1-微信 2-支付宝 3-银行卡 4-其他
+     */
+    private Integer payType;
+
+    /**
+     * 支付金额
+     */
+    private BigDecimal payAmount;
+
+    /**
+     * 支付状态:0-创建 1-处理中 2-支付成功 3-支付失败
+     */
+    private Integer payStatus;
+
+    /**
+     * 支付时间
+     */
+    private LocalDateTime paymentTime;
+
+    /**
+     * 回调内容
+     */
+    private String callbackContent;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 14 - 0
fs-service-system/src/main/java/com/fs/company/dto/RechargeDTO.java

@@ -0,0 +1,14 @@
+package com.fs.company.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class RechargeDTO {
+    /**
+     * 充值金额
+     */
+    private BigDecimal amount;
+
+}

+ 74 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyRechargeOrderMapper.java

@@ -0,0 +1,74 @@
+package com.fs.company.mapper;
+
+import com.fs.company.domain.CompanyRechargeOrder;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 公司充值订单表 Mapper
+ */
+@Mapper
+public interface CompanyRechargeOrderMapper {
+
+    /**
+     * 根据ID查询订单
+     */
+    @Select("SELECT * FROM company_recharge_order WHERE id = #{id}")
+    CompanyRechargeOrder selectById(Long id);
+
+    /**
+     * 根据订单号查询订单
+     */
+    @Select("SELECT * FROM company_recharge_order WHERE order_no = #{orderNo}")
+    CompanyRechargeOrder selectByOrderNo(String orderNo);
+
+    /**
+     * 根据交易号查询订单
+     */
+    @Select("SELECT * FROM company_recharge_order WHERE transaction_id = #{transactionId}")
+    CompanyRechargeOrder selectByTransactionId(String transactionId);
+
+    /**
+     * 查询所有订单
+     */
+    @Select("SELECT * FROM company_recharge_order")
+    List<CompanyRechargeOrder> selectAll();
+
+    /**
+     * 新增订单
+     */
+    @Insert("INSERT INTO company_recharge_order (order_no, transaction_id, pay_type, pay_amount, pay_status, payment_time, callback_content) " +
+            "VALUES (#{orderNo}, #{transactionId}, #{payType}, #{payAmount}, #{payStatus}, #{paymentTime}, #{callbackContent})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(CompanyRechargeOrder order);
+
+    /**
+     * 更新订单
+     */
+    @Update("UPDATE company_recharge_order SET " +
+            "transaction_id = #{transactionId}, " +
+            "pay_type = #{payType}, " +
+            "pay_amount = #{payAmount}, " +
+            "pay_status = #{payStatus}, " +
+            "payment_time = #{paymentTime}, " +
+            "callback_content = #{callbackContent} " +
+            "WHERE order_no = #{orderNo}")
+    int updateByOrderNo(CompanyRechargeOrder order);
+
+    /**
+     * 更新订单支付状态
+     */
+    @Update("UPDATE company_recharge_order SET " +
+            "pay_status = #{payStatus}, " +
+            "payment_time = #{paymentTime}, " +
+            "transaction_id = #{transactionId}, " +
+            "callback_content = #{callbackContent} " +
+            "WHERE order_no = #{orderNo}")
+    int updatePayStatus(CompanyRechargeOrder order);
+
+    @Select("SELECT * FROM company_recharge_order " +
+            "WHERE pay_status = 0 " +
+            "AND create_time <= DATE_SUB(NOW(), INTERVAL 2 HOUR)")
+    List<CompanyRechargeOrder> queryOverdueOrder();
+}

+ 14 - 0
fs-service-system/src/main/java/com/fs/company/service/CompanyRechargeOrderService.java

@@ -0,0 +1,14 @@
+package com.fs.company.service;
+
+import com.fs.company.domain.CompanyRechargeOrder;
+
+import java.util.List;
+
+public interface CompanyRechargeOrderService {
+
+    List<CompanyRechargeOrder> queryOverdueOrder();
+
+    void autoClosedOrder();
+
+    String createOrder(CompanyRechargeOrder order) throws Exception;
+}

+ 8 - 0
fs-service-system/src/main/java/com/fs/company/service/ICompanyRechargeService.java

@@ -5,6 +5,7 @@ import java.util.List;
 
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyRecharge;
+import com.fs.company.dto.RechargeDTO;
 import com.fs.company.vo.CompanyRechargeExportVO;
 import com.fs.company.vo.CompanyRechargeVO;
 
@@ -80,4 +81,11 @@ public interface ICompanyRechargeService
      * @return 充值集合
      */
     List<CompanyRechargeExportVO> selectCompanyRechargeExportList(CompanyRecharge companyRecharge);
+
+    /**
+     * 充值
+     * @param dto 参数
+     * @return 地址
+     */
+    String recharge(RechargeDTO dto) throws Exception;
 }

+ 97 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRechargeOrderServiceImpl.java

@@ -0,0 +1,97 @@
+package com.fs.company.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.OrderUtils;
+import com.fs.company.constant.PaymentStatus;
+import com.fs.company.domain.CompanyRechargeOrder;
+import com.fs.company.mapper.CompanyRechargeOrderMapper;
+import com.fs.company.service.CompanyRechargeOrderService;
+import com.fs.wx.pay.config.WxPayProperties;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.service.WxPayService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class CompanyRechargeOrderServiceImpl implements CompanyRechargeOrderService {
+    @Autowired
+    private CompanyRechargeOrderMapper companyRechargeOrderMapper;
+
+    @Autowired
+    private WxPayProperties wxPayProperties;
+
+    @Autowired
+    private WxPayService wxPayService;
+    @Override
+    public List<CompanyRechargeOrder> queryOverdueOrder() {
+        return companyRechargeOrderMapper.queryOverdueOrder();
+    }
+
+    /**
+     * 自动关闭超时订单号
+     */
+    @Override
+    public void autoClosedOrder(){
+        List<CompanyRechargeOrder> companyRechargeOrders = companyRechargeOrderMapper.queryOverdueOrder();
+        for (CompanyRechargeOrder order : companyRechargeOrders) {
+            order.setPayStatus(PaymentStatus.FAILED.getCode());
+            companyRechargeOrderMapper.updateByOrderNo(order);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
+    public String createOrder(CompanyRechargeOrder order) throws Exception{
+
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(wxPayProperties.getAppId());
+        payConfig.setMchId(wxPayProperties.getMchId());
+        payConfig.setMchKey(wxPayProperties.getMchKey());
+        payConfig.setPrivateKeyPath(wxPayProperties.getPrivateKeyPath());
+        payConfig.setPrivateCertPath(wxPayProperties.getPrivateCertPath());
+        payConfig.setCertSerialNo(wxPayProperties.getCertSerialNo());
+        payConfig.setUseSandboxEnv(false);
+        payConfig.setSignType(WxPayConstants.SignType.HMAC_SHA256);
+
+        wxPayService.setConfig(payConfig);
+
+        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+
+        orderRequest.setBody("公司余额充值");
+        orderRequest.setOutTradeNo(OrderUtils.getOrderNo());
+        orderRequest.setTotalFee(order.getPayAmount().multiply(BigDecimal.valueOf(100)).intValue());
+        orderRequest.setSpbillCreateIp(IpUtil.getLocalhostIp());
+        orderRequest.setNotifyUrl(wxPayProperties.getNativeNotifyUrl());
+        orderRequest.setTradeType(WxPayConstants.TradeType.NATIVE);
+        orderRequest.setProductId(String.valueOf(order.getId()));
+
+
+        WxPayNativeOrderResult wxOrder = wxPayService.createOrder(orderRequest);
+
+
+        order.setOrderNo(OrderUtils.getOrderNo());
+        order.setPayType(1);
+        order.setPayStatus(1);
+        order.setCreateTime(LocalDateTime.now());
+        order.setCallbackContent(JSON.toJSONString(wxOrder));
+
+
+        companyRechargeOrderMapper.insert(order);
+
+        return wxOrder.getCodeUrl();
+    }
+
+
+
+}

+ 14 - 0
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyRechargeServiceImpl.java

@@ -8,8 +8,11 @@ import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMoneyLogs;
+import com.fs.company.domain.CompanyRechargeOrder;
+import com.fs.company.dto.RechargeDTO;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.company.service.CompanyRechargeOrderService;
 import com.fs.company.vo.CompanyRechargeExportVO;
 import com.fs.company.vo.CompanyRechargeVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +20,7 @@ import org.springframework.stereotype.Service;
 import com.fs.company.mapper.CompanyRechargeMapper;
 import com.fs.company.domain.CompanyRecharge;
 import com.fs.company.service.ICompanyRechargeService;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -34,6 +38,8 @@ public class CompanyRechargeServiceImpl implements ICompanyRechargeService
     private CompanyMoneyLogsMapper moneyLogsMapper;
     @Autowired
     private CompanyMapper companyMapper;
+
+    private CompanyRechargeOrderService companyRechargeOrderService;
     /**
      * 查询充值
      *
@@ -150,4 +156,12 @@ public class CompanyRechargeServiceImpl implements ICompanyRechargeService
     public List<CompanyRechargeExportVO> selectCompanyRechargeExportList(CompanyRecharge companyRecharge) {
         return companyRechargeMapper.selectCompanyRechargeExportList(companyRecharge);
     }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Throwable.class)
+    public String recharge(RechargeDTO dto) throws Exception {
+        CompanyRechargeOrder order = new CompanyRechargeOrder();
+        order.setPayAmount(dto.getAmount());
+        return companyRechargeOrderService.createOrder(order);
+    }
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/wx/pay/config/WxPayProperties.java

@@ -40,4 +40,12 @@ public class WxPayProperties {
 
   private String notifyUrl;
 
+  private String privateKeyPath;
+
+  private String privateCertPath;
+
+  private String certSerialNo;
+
+  private String nativeNotifyUrl;
+
 }

+ 7 - 4
fs-service-system/src/main/resources/application-config-fby.yml

@@ -84,14 +84,17 @@ wx:
         msgDataFormat: JSON
 
   pay:
-    appId: wx11a2ce7c2bbc4521 #微信公众号或者小程序等的appid
-    mchId: 1703311381 #微信支付商户号
-    mchKey: FotTIbIzn4AisMW7de712LJQIazSqqAl #微信支付商户密钥
-    v3Key: y5Eo99q93qzdQRAs6E2BDKIF7f3EnS3G
+    appId: wx961fadab9bcb792b #微信公众号或者小程序等的appid
+    mchId: 1716217886 #微信支付商户号
+    mchKey: a7Fc5B9dE2h8J3kL4mN6pQ7rS9tU2vW1 #微信支付商户密钥
     subAppId:  #服务商模式下的子商户公众账号ID
     subMchId:  #服务商模式下的子商户号
     keyPath: c:\\Tools\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
     notifyUrl:  https://userapp.bly.ylrztop.com/app/wxpay/wxPayNotify
+    privateKeyPath: 'C:\cert\1716217886_20250509_cert\apiclient_key.pem'
+    privateCertPath: 'C:\cert\1716217886_20250509_cert\apiclient_cert.pem'
+    certSerialNo: '4E8BD68BC2BFD37CA58244D660E5FDCCE475D82E'
+    nativeNotifyUrl: ''
   mp:
     useRedis: false
     redisConfig:

+ 235 - 0
nginx.config

@@ -0,0 +1,235 @@
+worker_processes auto;
+worker_rlimit_nofile 51200;
+events
+{
+	worker_connections 51200;
+	multi_accept on;
+}
+http {
+		include       mime.types;
+		#include luawaf.conf;
+		include proxy.conf;
+        default_type  application/octet-stream;
+
+        server_names_hash_bucket_size 512;
+        client_header_buffer_size 32k;
+        large_client_header_buffers 4 32k;
+        client_max_body_size 50m;
+
+        sendfile   on;
+        tcp_nopush on;
+
+        keepalive_timeout 60;
+
+        tcp_nodelay on;
+
+        fastcgi_connect_timeout 300;
+        fastcgi_send_timeout 300;
+        fastcgi_read_timeout 300;
+        fastcgi_buffer_size 64k;
+        fastcgi_buffers 4 64k;
+        fastcgi_busy_buffers_size 128k;
+        fastcgi_temp_file_write_size 256k;
+		fastcgi_intercept_errors on;
+
+        gzip on;
+        gzip_min_length  1k;
+        gzip_buffers     4 16k;
+        gzip_http_version 1.1;
+        gzip_comp_level 2;
+        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
+        gzip_vary on;
+        gzip_proxied   expired no-cache no-store private auth;
+        gzip_disable   "MSIE [1-6]\.";
+
+        limit_conn_zone $binary_remote_addr zone=perip:10m;
+		limit_conn_zone $server_name zone=perserver:10m;
+
+        server_tokens off;
+        access_log off;
+
+    server {
+        listen       80;
+        server_name  localhost;
+
+        #charset koi8-r;
+
+        #access_log  logs/host.access.log  main;
+
+        location / {
+            root   html;
+            index  index.html index.htm;
+        }
+		location /nginx_status {
+        	allow 127.0.0.1;
+            deny all;
+            stub_status on;
+            access_log  off;
+        }
+    }
+    server {
+    listen       80;
+    server_name  admin.fbylive.com;
+	proxy_connect_timeout 300;
+	proxy_send_timeout 300;
+	proxy_read_timeout 300;
+        location / {
+          root   C:\Tools\ui\adminUI;
+          try_files $uri $uri/ /index.html;
+          index  index.html index.htm;
+    }
+     location /prod-api/ {
+            proxy_set_header Host $http_host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header REMOTE_HOST $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+			proxy_set_header X-NginX-Proxy true;
+            proxy_pass http://localhost:7011/;
+    		client_body_timeout 500s;
+			client_max_body_size 200m;
+			proxy_connect_timeout 1800s;
+			proxy_send_timeout 1800s;
+			proxy_read_timeout 1800s;
+			send_timeout 1800s;
+       		 }
+    }
+     server {
+      listen       80;
+        server_name  company.fbylive.com;
+		proxy_connect_timeout 300;
+	proxy_send_timeout 300;
+	proxy_read_timeout 300;
+        location / {
+            root   C:\Tools\ui\companyUI;
+            try_files $uri $uri/ /index.html;
+            index  index.html index.htm;
+        	}
+        location /prod-api/ {
+            			proxy_set_header Host $http_host;
+            			proxy_set_header X-Real-IP $remote_addr;
+            			proxy_set_header REMOTE_HOST $remote_addr;
+            			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+			proxy_set_header X-Forwarded-Proto $scheme;
+			proxy_set_header X-NginX-Proxy true;
+            			proxy_pass http://localhost:7012/;
+    			client_body_timeout 500s;
+			client_max_body_size 200m;
+			proxy_connect_timeout 1800s;
+			proxy_send_timeout 1800s;
+			proxy_read_timeout 1800s;
+			send_timeout 1800s;
+       		 }
+       }
+		server {
+		listen 80;
+		server_name scrm.fbylive.com;
+		location / {
+			proxy_pass http://localhost:8006/;
+			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;
+		}
+		location /WW_verify_CquJP69UyLfoMwTY.txt {
+			alias C:\\Tools\\ui\\WW_verify_CquJP69UyLfoMwTY.txt;
+
+        }
+		location /qwh5/ {
+
+			alias C:\\Tools\\ui\\qwh5\\;
+			try_files $uri $uri/ /qwh5/index.html;
+
+
+		}
+		location /apis/ {
+			proxy_pass http://localhost:7771/;
+			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;
+		}
+	}
+    		server {
+		listen 80;
+		server_name scrm.hyljcourse.com;
+		location / {
+			proxy_pass http://localhost:8006/;
+			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;
+		}
+		location /WW_verify_CquJP69UyLfoMwTY.txt {
+			alias C:\\Tools\\ui\\WW_verify_CquJP69UyLfoMwTY.txt;
+
+        }
+
+        location /qwh5 {
+        alias C:\\Tools\\ui\\qwh5UI\\;
+        try_files $uri $uri/ /qwh5/index.html;
+        }
+		location /apis/ {
+			proxy_pass http://localhost:7771/;
+			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;
+		}
+	}
+    server {
+		listen 80;
+		server_name tool.fbylive.com;
+		location / {
+			proxy_pass http://localhost:7771/;
+			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;
+		}
+	}
+    server {
+		listen 80;
+		server_name userapp.fbylive.com;
+		location / {
+			proxy_pass http://localhost:7005/;
+			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;
+		}
+	}
+     server {
+		listen 80;
+		server_name h5.fbylive.com;
+		location / {
+
+            root   C:\Tools\ui\companyAppUI;
+            index  index.html index.htm;
+            try_files $uri $uri/ /index.html;
+        }
+        location /courseH5 {
+        alias C:\Tools\ui\courseh5UI;
+         try_files $uri $uri/ /courseH5/index.html;  # 回退到index.html
+        }
+        location /prod-api/ {
+            proxy_pass http://localhost:7015/;
+            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;
+        }
+        location /MP_verify_W5rBtdyb9f8ytWWG.txt {
+			alias C:\\Tools\\ui\\MP_verify_W5rBtdyb9f8ytWWG.txt;
+        }
+	}
+    include vhost/*.conf;
+    #加载vhost目录下的虚拟主机配置文件
+}
+stream {
+    # TCP/UDP 代理配置
+    server {
+        listen 2345;
+        proxy_pass 192.168.0.74:3306;
+    }
+}