From 19428a49b4c07b14097615d48a7a72dbf941c4e7 Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期五, 18 四月 2025 15:20:02 +0800
Subject: [PATCH] Merge branch 'master' of http://47.96.225.205:8888/r/smart_message

---
 src/main/java/com/mzl/flower/utils/wechatpay/CommonUtils.java                |   48 ++
 src/main/java/com/mzl/flower/service/pay/AlipayService.java                  |   12 
 src/main/java/com/mzl/flower/config/pay/WechatClientConfigurator.java        |   41 ++
 src/main/java/com/mzl/flower/domain/CategoryConfigDO.java                    |   29 +
 src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java              |    3 
 src/main/java/com/mzl/flower/dto/request/pay/PayQueryDTO.java                |   25 +
 pom.xml                                                                      |   25 +
 src/main/java/com/mzl/flower/config/pay/WechatAppProperties.java             |   43 ++
 src/main/java/com/mzl/flower/service/customer/CategoryConfigServiceImpl.java |   67 +++
 src/main/java/com/mzl/flower/web/login/CustomerLoginController.java          |   63 +++
 src/main/java/com/mzl/flower/service/TosService.java                         |   72 ++++
 src/main/java/com/mzl/flower/service/system/UserService.java                 |    1 
 src/main/java/com/mzl/flower/config/TosClientConfig.java                     |   22 +
 src/main/java/com/mzl/flower/domain/CategoryConfig.java                      |   15 
 src/main/java/com/mzl/flower/config/TosProperties.java                       |   18 +
 src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java                |   18 +
 src/main/java/com/mzl/flower/domain/CategoryConfigSync.java                  |   15 
 src/main/java/com/mzl/flower/utils/wechatpay/WxPayUtil.java                  |  166 +++++++++
 src/main/java/com/mzl/flower/service/customer/CustomerService.java           |   14 
 src/main/java/com/mzl/flower/service/pay/PayService.java                     |   12 
 src/main/java/com/mzl/flower/config/ResourceServerConfig.java                |    4 
 src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java          |    3 
 src/main/java/com/mzl/flower/web/supplier/SupplierController.java            |   48 ++
 src/main/java/com/mzl/flower/web/v2/pay/WechatPayController.java             |  139 +++++++
 src/main/java/com/mzl/flower/web/customer/CategoryConfigController.java      |   27 +
 src/main/java/com/mzl/flower/mapper/CategoryConfigMapper.java                |   27 +
 src/main/java/com/mzl/flower/service/customer/CategoryConfigService.java     |   11 
 src/main/java/com/mzl/flower/entity/customer/Customer.java                   |    4 
 src/main/java/com/mzl/flower/service/impl/pay/AlipayServiceImpl.java         |   74 ++++
 src/main/resources/application.yml                                           |   20 +
 30 files changed, 1,058 insertions(+), 8 deletions(-)

diff --git a/pom.xml b/pom.xml
index 54d84d8..2aa773d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -281,6 +281,7 @@
             <version>3.1.0</version>
         </dependency>
 
+
         <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
         <dependency>
             <groupId>com.alipay.sdk</groupId>
@@ -288,6 +289,30 @@
             <version>4.40.82.ALL</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-pay</artifactId>
+            <version>4.6.0</version>
+        </dependency>
+
+
+        <!-- https://mvnrepository.com/artifact/com.github.wechatpay-apiv3/wechatpay-java -->
+<!--        <dependency>-->
+<!--            <groupId>com.github.wechatpay-apiv3</groupId>-->
+<!--            <artifactId>wechatpay-java</artifactId>-->
+<!--            <version>0.2.15</version>-->
+<!--        </dependency>-->
+
+
+        <dependency>
+            <groupId>com.volcengine</groupId>
+            <artifactId>ve-tos-java-sdk</artifactId>
+            <version>2.8.8</version>
+        </dependency>
+
+
+
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
index dc560c6..9dc9ce7 100644
--- a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
+++ b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
@@ -66,6 +66,10 @@
                 .antMatchers("/v2/config-param/base/info").permitAll()
                 .antMatchers("/api/supplier/**").permitAll()
                 .antMatchers("/api/customer/center").permitAll()
+
+//                微信支付暂时测试
+                .antMatchers("/v2/wechat/**").permitAll()
+
                 .antMatchers("/api/**").authenticated();//配置访问控制,必须认证过后才可以访问
 
     }
diff --git a/src/main/java/com/mzl/flower/config/TosClientConfig.java b/src/main/java/com/mzl/flower/config/TosClientConfig.java
new file mode 100644
index 0000000..557b5d5
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/TosClientConfig.java
@@ -0,0 +1,22 @@
+package com.mzl.flower.config;
+
+import com.volcengine.tos.TOSV2;
+import com.volcengine.tos.TOSV2ClientBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.Resource;
+
+@Configuration
+public class TosClientConfig {
+
+    @Resource
+    private TosProperties properties;
+
+    @Bean
+    public TOSV2 tosClient() {
+        return new TOSV2ClientBuilder().build(properties.getRegion(), properties.getEndpoint(), properties.getKeyid(), properties.getKeysecret());
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/config/TosProperties.java b/src/main/java/com/mzl/flower/config/TosProperties.java
new file mode 100644
index 0000000..6d966cd
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/TosProperties.java
@@ -0,0 +1,18 @@
+package com.mzl.flower.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "tos-oss")
+public class TosProperties {
+
+    private String endpoint;
+    private String region;
+    private String keyid;
+    private String keysecret;
+    private String bucketname;
+
+}
diff --git a/src/main/java/com/mzl/flower/config/pay/WechatAppProperties.java b/src/main/java/com/mzl/flower/config/pay/WechatAppProperties.java
new file mode 100644
index 0000000..41b4fdc
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/pay/WechatAppProperties.java
@@ -0,0 +1,43 @@
+package com.mzl.flower.config.pay;
+
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "wechat-app")
+public class WechatAppProperties {
+
+    /**
+     * 商户号
+     */
+    private String merchantId;
+
+    /**
+     * 商户密钥
+     */
+    private String merchantKey;
+
+    /**
+     * appId
+     */
+    private String appid;
+
+    /**
+     *密钥
+     */
+    private String secret;
+
+    /**
+     *
+     */
+    private String tradeType;
+
+    /**
+     * 回调地址
+     */
+    private String notifyUrl;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/config/pay/WechatClientConfigurator.java b/src/main/java/com/mzl/flower/config/pay/WechatClientConfigurator.java
new file mode 100644
index 0000000..7207b9b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/pay/WechatClientConfigurator.java
@@ -0,0 +1,41 @@
+package com.mzl.flower.config.pay;
+
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author  Taojie
+ *  微信APP支付
+ */
+@Configuration
+public class WechatClientConfigurator {
+
+    @Autowired
+    private WechatAppProperties wechatProperties;
+
+
+    @Bean
+    public WxPayConfig wxPayConfig() {
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(wechatProperties.getAppid());
+        payConfig.setMchId(wechatProperties.getMerchantId());             // 商户号
+        payConfig.setMchKey(wechatProperties.getMerchantKey());
+//        payConfig.setMchKey(wechatProperties.getSecret());
+        payConfig.setTradeType(wechatProperties.getTradeType());
+        payConfig.setNotifyUrl(wechatProperties.getNotifyUrl());                 // 关键!APP支付必须指定
+        return payConfig;
+    }
+
+    @Bean
+    public WxPayService wxPayService(WxPayConfig wxPayConfig) {
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(wxPayConfig);
+        return wxPayService;
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/domain/CategoryConfig.java b/src/main/java/com/mzl/flower/domain/CategoryConfig.java
new file mode 100644
index 0000000..846f6ba
--- /dev/null
+++ b/src/main/java/com/mzl/flower/domain/CategoryConfig.java
@@ -0,0 +1,15 @@
+package com.mzl.flower.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CategoryConfig   {
+    private Integer id;
+    private String name;
+    private Integer order;
+    private Boolean isEnabled;
+} 
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/domain/CategoryConfigDO.java b/src/main/java/com/mzl/flower/domain/CategoryConfigDO.java
new file mode 100644
index 0000000..da23a1f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/domain/CategoryConfigDO.java
@@ -0,0 +1,29 @@
+package com.mzl.flower.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("category_config")
+public class CategoryConfigDO extends BaseAutoEntity {
+    
+    @TableField("user_id")
+    private String userId;
+    
+    @TableField("category_id")
+    private Integer categoryId;
+    
+    private String name;
+    
+    @TableField("`order`")
+    private Integer order;
+    
+    @TableField("is_enabled")
+    private Boolean isEnabled;
+} 
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/domain/CategoryConfigSync.java b/src/main/java/com/mzl/flower/domain/CategoryConfigSync.java
new file mode 100644
index 0000000..55c4398
--- /dev/null
+++ b/src/main/java/com/mzl/flower/domain/CategoryConfigSync.java
@@ -0,0 +1,15 @@
+package com.mzl.flower.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CategoryConfigSync {
+    private String userId;
+    private List<CategoryConfig> categories;
+} 
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java b/src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java
index e199a9d..f405ec0 100644
--- a/src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java
@@ -18,5 +18,8 @@
     @ApiModelProperty(value = "用户类型")
     private String userType;
 
+    @ApiModelProperty(value = "用户注销id")
+    private String customUserId;
+
 
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/pay/PayQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/pay/PayQueryDTO.java
new file mode 100644
index 0000000..932fda0
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/pay/PayQueryDTO.java
@@ -0,0 +1,25 @@
+package com.mzl.flower.dto.request.pay;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class PayQueryDTO {
+    /**
+     * 订单名称
+     */
+    @ApiModelProperty(value = "订单编号")
+    @NotEmpty(message = "订单编号不能为空")
+    private String outerOrderNo;
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java b/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java
index 38de9e7..dc46231 100644
--- a/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java
@@ -74,4 +74,7 @@
 
     @ApiModelProperty("我的邀请码")
     private String intervialcode;
+    
+    @ApiModelProperty("注销/非注销")
+    private Boolean isClosed;
 }
diff --git a/src/main/java/com/mzl/flower/entity/customer/Customer.java b/src/main/java/com/mzl/flower/entity/customer/Customer.java
index 1da4a4d..993b665 100644
--- a/src/main/java/com/mzl/flower/entity/customer/Customer.java
+++ b/src/main/java/com/mzl/flower/entity/customer/Customer.java
@@ -52,6 +52,10 @@
     private LocalDateTime memberOvertime;
     @ApiModelProperty("是否会员")
     private Boolean isMember;
+
+    @ApiModelProperty("是否注销")
+    private Boolean isClosed;
+
     @ApiModelProperty("我的邀请码")
     private String intervialcode;
     @ApiModelProperty("注册邀请码")
diff --git a/src/main/java/com/mzl/flower/mapper/CategoryConfigMapper.java b/src/main/java/com/mzl/flower/mapper/CategoryConfigMapper.java
new file mode 100644
index 0000000..7f6333f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/CategoryConfigMapper.java
@@ -0,0 +1,27 @@
+package com.mzl.flower.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mzl.flower.domain.CategoryConfigDO;
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface CategoryConfigMapper extends BaseMapper<CategoryConfigDO> {
+
+//    @Insert("INSERT INTO category_config( user_id, category_id, name, `order`, is_enabled) " + "VALUES( #{userId}, #{categoryId}, #{name}, #{order}, #{isEnabled})")
+//    void insert(CategoryConfigDO categoryConfigDO);
+//
+//    @Update("UPDATE category_config SET name = #{name}, `order` = #{order}, " + "is_enabled = #{isEnabled} WHERE id = #{id}")
+//    void update(CategoryConfigDO categoryConfigDO);
+
+//    @Select("SELECT * FROM category_config WHERE id = #{id}")
+//    CategoryConfigDO findById(Long id);
+
+    @Select("SELECT * FROM category_config WHERE user_id = #{userId}")
+    List<CategoryConfigDO> findByUserId(String userId);
+
+    @Delete("DELETE FROM category_config WHERE user_id = #{userId}")
+    void deleteByUserId(String userId);
+} 
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/service/TosService.java b/src/main/java/com/mzl/flower/service/TosService.java
new file mode 100644
index 0000000..ad096ce
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/TosService.java
@@ -0,0 +1,72 @@
+package com.mzl.flower.service;
+
+
+import com.mzl.flower.config.TosProperties;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.utils.UUIDGenerator;
+import com.volcengine.tos.TOSV2;
+
+import com.volcengine.tos.TosClientException;
+import com.volcengine.tos.TosServerException;
+import com.volcengine.tos.model.object.PutObjectFromFileInput;
+import com.volcengine.tos.model.object.PutObjectFromFileOutput;
+import com.volcengine.tos.model.object.PutObjectInput;
+import com.volcengine.tos.model.object.PutObjectOutput;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+@Service
+public class TosService {
+
+    @Autowired
+    private TOSV2 tosClient;
+
+    @Autowired
+    private TosProperties tosProperties;
+
+    private String upladPre="https://";
+
+
+
+    public TosService(TOSV2 tosClient) {
+        this.tosClient = tosClient;
+    }
+
+
+    public String uploadFile(String objectKey, String filePath) throws IOException {
+        try {
+            PutObjectFromFileInput input = new PutObjectFromFileInput()
+                    .setBucket(tosProperties.getBucketname()).setKey(objectKey).setFilePath(filePath);
+
+            PutObjectFromFileOutput output = tosClient.putObjectFromFile(input);
+            return "Upload success! ETag: " + output.getEtag();
+        } catch (TosClientException | TosServerException e) {
+            throw new IOException("Upload failed: " + e.getMessage(), e);
+        }
+    }
+
+    public String uploadFile(InputStream inputStream, String fileName) throws IOException {
+        try {
+            //获取文件名称
+            String filename = fileName;
+            //使文件名称唯一
+            String uuid = UUIDGenerator.getUUID();
+            filename = uuid + filename;
+            String dir = uuid.substring(0, 2);
+            filename = dir + "/" + filename;
+            PutObjectInput putObjectInput = new PutObjectInput().setBucket(tosProperties.getBucketname()).setKey(filename).setContent(inputStream);
+            PutObjectOutput output = tosClient.putObject(putObjectInput);
+//            System.out.println("putObject succeed, object's etag is " + output.getEtag());
+//            System.out.println("putObject succeed, object's crc64 is " + output.getHashCrc64ecma());
+            // https://edu-mys.oss-cn-chengdu.aliyuncs.com/yy.JPG
+            String url = upladPre+tosProperties.getBucketname() + "." + tosProperties.getEndpoint() + "/" + filename;
+            return url;
+        } catch (TosClientException | TosServerException e) {
+            throw new ValidationException("上传到云服务器发生异常");
+        }
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/customer/CategoryConfigService.java b/src/main/java/com/mzl/flower/service/customer/CategoryConfigService.java
new file mode 100644
index 0000000..698bf18
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/customer/CategoryConfigService.java
@@ -0,0 +1,11 @@
+package com.mzl.flower.service.customer;
+
+import com.mzl.flower.domain.CategoryConfig;
+import com.mzl.flower.domain.CategoryConfigSync;
+
+import java.util.List;
+
+public interface CategoryConfigService {
+    void saveOrUpdateCategoryConfig(CategoryConfigSync categoryConfigSync);
+    List<CategoryConfig> getCategoryConfigsByUserId(String userId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/service/customer/CategoryConfigServiceImpl.java b/src/main/java/com/mzl/flower/service/customer/CategoryConfigServiceImpl.java
new file mode 100644
index 0000000..e6949b3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/customer/CategoryConfigServiceImpl.java
@@ -0,0 +1,67 @@
+package com.mzl.flower.service.customer;
+
+import com.mzl.flower.domain.CategoryConfig;
+import com.mzl.flower.domain.CategoryConfigDO;
+import com.mzl.flower.domain.CategoryConfigSync;
+import com.mzl.flower.mapper.CategoryConfigMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class CategoryConfigServiceImpl implements CategoryConfigService {
+
+    @Autowired
+    private CategoryConfigMapper categoryConfigMapper;
+
+    @Override
+    @Transactional
+    public void saveOrUpdateCategoryConfig(CategoryConfigSync categoryConfigSync) {
+        if (categoryConfigSync == null || categoryConfigSync.getUserId() == null) {
+            throw new IllegalArgumentException("用户ID不能为空");
+        }
+
+        // 先删除该用户之前的所有分类配置
+        categoryConfigMapper.deleteByUserId(categoryConfigSync.getUserId());
+
+        // 然后插入新的分类配置
+        if (categoryConfigSync.getCategories() != null && !categoryConfigSync.getCategories().isEmpty()) {
+            for (CategoryConfig clientCategory : categoryConfigSync.getCategories()) {
+                CategoryConfigDO dbCategory = new CategoryConfigDO();
+                dbCategory.setUserId(categoryConfigSync.getUserId());
+                dbCategory.setCategoryId(clientCategory.getId());
+                dbCategory.setName(clientCategory.getName());
+                dbCategory.setOrder(clientCategory.getOrder());
+                dbCategory.setIsEnabled(clientCategory.getIsEnabled());
+                categoryConfigMapper.insert(dbCategory);
+            }
+        }
+    }
+
+    @Override
+    public List<CategoryConfig> getCategoryConfigsByUserId(String userId) {
+        if (userId == null) {
+            throw new IllegalArgumentException("用户ID不能为空");
+        }
+
+        List<CategoryConfigDO> dbCategories = categoryConfigMapper.findByUserId(userId);
+        if (dbCategories == null || dbCategories.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        List<CategoryConfig> clientCategories = new ArrayList<>();
+        for (CategoryConfigDO dbCategory : dbCategories) {
+            CategoryConfig clientCategory = new CategoryConfig();
+            clientCategory.setId(dbCategory.getCategoryId());
+            clientCategory.setName(dbCategory.getName());
+            clientCategory.setOrder(dbCategory.getOrder());
+            clientCategory.setIsEnabled(dbCategory.getIsEnabled());
+            clientCategories.add(clientCategory);
+        }
+
+        return clientCategories;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/service/customer/CustomerService.java b/src/main/java/com/mzl/flower/service/customer/CustomerService.java
index 401be19..91f59f1 100644
--- a/src/main/java/com/mzl/flower/service/customer/CustomerService.java
+++ b/src/main/java/com/mzl/flower/service/customer/CustomerService.java
@@ -302,4 +302,18 @@
         }
         return sb.toString();
     }
+
+    public void updateMemberInfoByUserId(Customer customer) {
+        if(null!= customer && StringUtils.isNotBlank(customer.getUserId())){
+            Customer byUserId = getByUserId(customer.getUserId());
+            if(null !=byUserId){
+                byUserId.setName(customer.getName());
+                byUserId.setCover(customer.getCover());
+                customerMapper.updateById(byUserId);
+            }else{
+                throw new ValidationException("用户不存在");
+            }
+
+        }
+    }
 }
diff --git a/src/main/java/com/mzl/flower/service/impl/pay/AlipayServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/pay/AlipayServiceImpl.java
new file mode 100644
index 0000000..e0f7d6e
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/impl/pay/AlipayServiceImpl.java
@@ -0,0 +1,74 @@
+package com.mzl.flower.service.impl.pay;
+
+import com.alipay.api.AlipayClient;
+import com.alipay.api.domain.AlipayMerchantSolcreditserviceprodOrderQueryModel;
+import com.alipay.api.domain.AlipayTradeQueryModel;
+import com.alipay.api.request.AlipayMerchantSolcreditserviceprodOrderQueryRequest;
+import com.alipay.api.request.AlipayTradeQueryRequest;
+import com.alipay.api.response.AlipayMerchantSolcreditserviceprodOrderQueryResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.mzl.flower.config.pay.AlipayProperties;
+import com.mzl.flower.service.pay.AlipayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Slf4j
+public class AlipayServiceImpl implements AlipayService {
+
+
+    @Autowired
+    private AlipayProperties alipayProperties;
+
+    @Autowired
+    AlipayClient alipayClient;
+    @Override
+    public AlipayTradeQueryResponse queryOrderByOutOrderNo(String outOrderNo) {
+
+     try {
+         // 构造请求参数以调用接口
+         AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
+         AlipayTradeQueryModel model = new AlipayTradeQueryModel();
+
+         // 设置订单支付时传入的商户订单号
+         model.setOutTradeNo(outOrderNo);
+
+         // 设置支付宝交易号
+//         model.setTradeNo("2014112611001004680 073956707");
+
+         // 设置查询选项
+         List<String> queryOptions = new ArrayList<String>();
+         queryOptions.add("trade_settle_info");
+         model.setQueryOptions(queryOptions);
+
+         request.setBizModel(model);
+         // 第三方代调用模式下请设置app_auth_token
+         // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
+
+         AlipayTradeQueryResponse response = alipayClient.execute(request);
+         System.out.println(response.getBody());
+
+         if (response.isSuccess()) {
+             System.out.println("调用成功");
+
+         } else {
+             System.out.println("调用失败");
+             // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
+             // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
+             // System.out.println(diagnosisUrl);
+         }
+         return response;
+     } catch (Exception e) {
+         throw new RuntimeException(e);
+     }
+    }
+
+    @Override
+    public String notifyCallBack() {
+        return "";
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/pay/AlipayService.java b/src/main/java/com/mzl/flower/service/pay/AlipayService.java
new file mode 100644
index 0000000..01364a1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/pay/AlipayService.java
@@ -0,0 +1,12 @@
+package com.mzl.flower.service.pay;
+
+import com.alipay.api.response.AlipayTradeQueryResponse;
+
+public interface AlipayService extends PayService {
+
+    @Override
+    AlipayTradeQueryResponse queryOrderByOutOrderNo(String outOrderNo);
+
+    @Override
+    String notifyCallBack();
+}
diff --git a/src/main/java/com/mzl/flower/service/pay/PayService.java b/src/main/java/com/mzl/flower/service/pay/PayService.java
new file mode 100644
index 0000000..eca7ae8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/pay/PayService.java
@@ -0,0 +1,12 @@
+package com.mzl.flower.service.pay;
+
+public interface PayService {
+
+    /**
+     * 根据订单编号查询订单状态
+     * @param outOrderNo
+     */
+    <T> T queryOrderByOutOrderNo(String outOrderNo);
+
+    String notifyCallBack();
+}
diff --git a/src/main/java/com/mzl/flower/service/system/UserService.java b/src/main/java/com/mzl/flower/service/system/UserService.java
index 502000a..4ee1b65 100644
--- a/src/main/java/com/mzl/flower/service/system/UserService.java
+++ b/src/main/java/com/mzl/flower/service/system/UserService.java
@@ -637,6 +637,7 @@
                         updateCustomerDTO.setUserId(user.getId());
                         updateCustomerDTO.setRegesterCode(dto.getIntevailCode());
                         //有效邀请码注册成功后赠送1天会员
+                        updateCustomerDTO.setIsMember(false);
                         if (!customerService.checkCode(dto.getIntevailCode())) {
                             updateCustomerDTO.setIsMember(true);
                             updateCustomerDTO.setMemberOvertime(LocalDateTime.now().plusDays(1));
diff --git a/src/main/java/com/mzl/flower/utils/wechatpay/CommonUtils.java b/src/main/java/com/mzl/flower/utils/wechatpay/CommonUtils.java
new file mode 100644
index 0000000..8b33cc1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/utils/wechatpay/CommonUtils.java
@@ -0,0 +1,48 @@
+package com.mzl.flower.utils.wechatpay;
+
+import java.security.MessageDigest;
+import java.util.UUID;
+
+/**
+ * 常用工具类的封装,md5,uuid等
+ */
+public class CommonUtils {
+
+
+    /**
+     * 生成 uuid, 即用来标识一笔单,也用做 nonce_str
+     * @return
+     */
+    public static String generateUUID(){
+        String uuid = UUID.randomUUID().toString().
+                replaceAll("-","").substring(0,32);
+
+        return uuid;
+    }
+
+
+    /**
+     * md5常用工具类
+     * @param data
+     * @return
+     */
+    public static String MD5(String data){
+        try {
+
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            byte [] array = md5.digest(data.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+            return sb.toString().toUpperCase();
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/utils/wechatpay/WxPayUtil.java b/src/main/java/com/mzl/flower/utils/wechatpay/WxPayUtil.java
new file mode 100644
index 0000000..81a3131
--- /dev/null
+++ b/src/main/java/com/mzl/flower/utils/wechatpay/WxPayUtil.java
@@ -0,0 +1,166 @@
+package com.mzl.flower.utils.wechatpay;
+
+import java.util.Map;
+
+import org.springframework.util.DigestUtils;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.*;
+
+/**
+ * 微信支付工具类,xml转map,map转xml,生成签名
+ */
+public class WxPayUtil {
+
+    /**
+     * XML格式字符串转换为Map
+     *
+     * @param strXML XML字符串
+     * @return XML数据转换后的Map
+     * @throws Exception
+     */
+    public static Map<String, String> xmlToMap(String strXML) throws Exception {
+        try {
+            Map<String, String> data = new HashMap<String, String>();
+            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+            InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
+            org.w3c.dom.Document doc = documentBuilder.parse(stream);
+            doc.getDocumentElement().normalize();
+            NodeList nodeList = doc.getDocumentElement().getChildNodes();
+            for (int idx = 0; idx < nodeList.getLength(); ++idx) {
+                Node node = nodeList.item(idx);
+                if (node.getNodeType() == Node.ELEMENT_NODE) {
+                    org.w3c.dom.Element element = (org.w3c.dom.Element) node;
+                    data.put(element.getNodeName(), element.getTextContent());
+                }
+            }
+            try {
+                stream.close();
+            } catch (Exception ex) {
+                // do nothing
+            }
+            return data;
+        } catch (Exception ex) {
+            throw ex;
+        }
+
+    }
+
+    /**
+     * 将Map转换为XML格式的字符串
+     *
+     * @param data Map类型数据
+     * @return XML格式的字符串
+     * @throws Exception
+     */
+    public static String mapToXml(Map<String, String> data) throws Exception {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+        org.w3c.dom.Document document = documentBuilder.newDocument();
+        org.w3c.dom.Element root = document.createElement("xml");
+        document.appendChild(root);
+        for (String key: data.keySet()) {
+            String value = data.get(key);
+            if (value == null) {
+                value = "";
+            }
+            value = value.trim();
+            org.w3c.dom.Element filed = document.createElement(key);
+            filed.appendChild(document.createTextNode(value));
+            root.appendChild(filed);
+        }
+        TransformerFactory tf = TransformerFactory.newInstance();
+        Transformer transformer = tf.newTransformer();
+        DOMSource source = new DOMSource(document);
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+        StringWriter writer = new StringWriter();
+        StreamResult result = new StreamResult(writer);
+        transformer.transform(source, result);
+        String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
+        try {
+            writer.close();
+        }
+        catch (Exception ex) {
+        }
+        return output;
+    }
+
+
+    /**
+     * 生成微信支付sign
+     * @return
+     */
+    public static String createSign(SortedMap<String, String> params, String key){
+        StringBuilder sb = new StringBuilder();
+        Set<Map.Entry<String, String>> es =  params.entrySet();
+        Iterator<Map.Entry<String,String>> it =  es.iterator();
+
+        //生成 stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
+        while (it.hasNext()){
+            Map.Entry<String,String> entry = (Map.Entry<String,String>)it.next();
+            String k = (String)entry.getKey();
+            String v = (String)entry.getValue();
+            if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)){
+                sb.append(k+"="+v+"&");
+            }
+        }
+
+        sb.append("key=").append(key);
+        String sign = CommonUtils.MD5(sb.toString()).toUpperCase();
+        return sign;
+    }
+
+
+    /**
+     * 校验签名
+     * @param params
+     * @param key
+     * @return
+     */
+    public static boolean isCorrectSign(SortedMap<String, String> params, String key){
+        String sign = createSign(params,key);
+
+        String weixinPaySign = params.get("sign").toUpperCase();
+
+        return weixinPaySign.equals(sign);
+    }
+
+    public static String generateNonceStr() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+
+    public static String generateSignature(Map<String, String> data, String key) throws Exception {
+        // 1. 字典序排序
+        List<String> keys = new ArrayList<>(data.keySet());
+        Collections.sort(keys);
+
+        // 2. 拼接字符串
+        StringBuilder sb = new StringBuilder();
+        for (String k : keys) {
+            if (data.get(k) != null && !"".equals(data.get(k)) && !"sign".equals(k)) {
+                sb.append(k).append("=").append(data.get(k)).append("&");
+            }
+        }
+        sb.append("key=").append(key);
+
+        // 3. MD5加密
+        return DigestUtils.md5DigestAsHex(sb.toString().getBytes("UTF-8")).toUpperCase();
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/web/customer/CategoryConfigController.java b/src/main/java/com/mzl/flower/web/customer/CategoryConfigController.java
new file mode 100644
index 0000000..0551ab4
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/customer/CategoryConfigController.java
@@ -0,0 +1,27 @@
+package com.mzl.flower.web.customer;
+
+import com.mzl.flower.domain.CategoryConfig;
+import com.mzl.flower.domain.CategoryConfigSync;
+import com.mzl.flower.service.customer.CategoryConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/categoryConfig")
+public class CategoryConfigController {
+    
+    @Autowired
+    private CategoryConfigService categoryConfigService;
+
+    @PostMapping("/saveOrUpdate")
+    public void saveOrUpdateCategoryConfig(@RequestBody CategoryConfigSync categoryConfigSync) {
+        categoryConfigService.saveOrUpdateCategoryConfig(categoryConfigSync);
+    }
+
+    @GetMapping("/getByUserId/{userId}")
+    public List<CategoryConfig> getCategoryConfigsByUserId(@PathVariable String userId) {
+        return categoryConfigService.getCategoryConfigsByUserId(userId);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java b/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
index 29a6bce..1894dd6 100644
--- a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
+++ b/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
@@ -8,6 +8,7 @@
 import com.mzl.flower.base.cache.StringCacheClient;
 import com.mzl.flower.config.exception.BaseException;
 import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
 import com.mzl.flower.config.security.token.PhoneAuthenticationToken;
 import com.mzl.flower.config.security.token.UserIdAuthenticationToken;
 import com.mzl.flower.config.security.token.WebAuthenticationToken;
@@ -17,6 +18,8 @@
 import com.mzl.flower.dto.request.UserPhoneLoginDTO;
 import com.mzl.flower.dto.response.customer.CustomerDTO;
 import com.mzl.flower.dto.response.wx.WxUserVO;
+import com.mzl.flower.dto.security.UserDTO;
+import com.mzl.flower.entity.customer.Customer;
 import com.mzl.flower.entity.system.User;
 import com.mzl.flower.mapper.customer.CustomerMapper;
 import com.mzl.flower.service.customer.CustomerService;
@@ -28,6 +31,7 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.authentication.AuthenticationDetailsSource;
@@ -283,10 +287,11 @@
         }
 
         User user = userService.findByTel(tel, Constants.USER_TYPE.customer.name());
+        User user1 = null;
         String tokenCache ="";
         if(user == null){
             loginDTO.setUserType(Constants.USER_TYPE.customer.name());
-            User user1 = userService.registPhoneUser(loginDTO);
+            user1 = userService.registPhoneUser(loginDTO);
             if(org.springframework.util.StringUtils.isEmpty(user1)){
                 throw new ValidationException("注册用户信息报错");
             }
@@ -311,6 +316,8 @@
             if (currentCustomer.getIsEnabled() == false) {
                 throw new ValidationException("用户已禁用,请联系管理员");
             }
+
+
             tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId());
             if (StringUtils.isNotBlank(tokenCache))  {
                 //强制删除token,下线
@@ -324,7 +331,11 @@
             OAuth2AccessToken token = loginService.getAccessToken(authentication, Constants.USER_TYPE.customer.name());
             //删除缓存中的验证码
             stringCacheClient.delete(SMS_CODE_KEY + SEPARATOR + Constants.USER_TYPE.customer.name() + SEPARATOR + tel);
-            stringCacheClient.set(TOKEN_KEY + SEPARATOR + user.getId(),token.getValue());
+            if(user == null){
+                  stringCacheClient.set(TOKEN_KEY + SEPARATOR + user1.getId(),token.getValue());
+            }else {
+                stringCacheClient.set(TOKEN_KEY + SEPARATOR + user.getId(), token.getValue());
+            }
             return returnData(R.SUCCESS.getCode(),token);
         }catch (UsernameNotFoundException e){
             throw new ValidationException("用户不存在");
@@ -333,4 +344,50 @@
             throw new BaseException(R.RUNTIME_EXCEPTION.getCode(),"登录错误");
         }
     }
-}
+
+
+    @PostMapping("/account/close")
+    @ApiOperation(value = "账户注销", notes = "账户注销")
+    public ResponseEntity<ReturnDataDTO<Boolean>>  accountClose() {
+
+        String userId = SecurityUtils.getUserId();
+
+        if(StringUtils.isNotBlank(userId)){
+            //
+            CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(userId);
+            if(null==currentCustomer){
+                throw new BaseException(R.RUNTIME_EXCEPTION.getCode(),"用户不存在");
+            }
+
+            currentCustomer.setIsClosed(true);
+
+            User user=userService.getUserById(userId);
+
+
+            if (StringUtils.isNotBlank(user.getLoginName())) {
+                currentCustomer.setName("智信-" + user.getLoginName().substring(user.getLoginName().length() - 4));
+
+            }
+            currentCustomer.setCover("https://hmy-flower.oss-cn-shanghai.aliyuncs.com/8f/8f205ea4618b4ce48d5bd204ae73f075tmp_f0c47a66148245dc17d74563c5939e764273ba583619664d.jpg");
+
+            Customer customer=new Customer();
+            BeanUtils.copyProperties(currentCustomer,customer);
+
+            // 会员注销
+            customer.setIsMember(false);
+            // 会员过期时间设置为空
+            customer.setMemberOvertime(null);
+
+            customerMapper.updateById(customer);
+
+            return returnData(R.SUCCESS.getCode(),true);
+
+        }else{
+            throw new BaseException(R.RUNTIME_EXCEPTION.getCode(),"用户ID不能为空");
+        }
+
+
+    }
+
+
+    }
diff --git a/src/main/java/com/mzl/flower/web/supplier/SupplierController.java b/src/main/java/com/mzl/flower/web/supplier/SupplierController.java
index 59aa78c..a0fdd16 100644
--- a/src/main/java/com/mzl/flower/web/supplier/SupplierController.java
+++ b/src/main/java/com/mzl/flower/web/supplier/SupplierController.java
@@ -9,11 +9,15 @@
 import com.mzl.flower.constant.Constants;
 import com.mzl.flower.dto.request.supplier.*;
 import com.mzl.flower.dto.response.supplier.SupplierDTO;
+import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.service.TosService;
+import com.mzl.flower.service.customer.CustomerService;
 import com.mzl.flower.service.supplier.SupplierService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -35,6 +39,12 @@
 
 //    private static final R ALLOWED_CONTENT_TYPES = R.valueOf("jpg");
     private final SupplierService supplierService;
+
+    @Autowired
+    private CustomerService customerService;
+
+    @Autowired
+    private TosService tosService;
 
     public SupplierController(SupplierService supplierService) {
         this.supplierService = supplierService;
@@ -79,15 +89,24 @@
 //                }
 
                 // 3. 生成文件名
-                String fileName = "avatar/" + UUID.randomUUID().toString() +
-                        getFileExtension(avatar.getOriginalFilename());
+                String originalFilename = avatar.getOriginalFilename(); // 原始文件名可能没有后缀
+                String contentType = avatar.getContentType();           // 例如 image/jpeg
+                String extension = getExtensionFromContentType(contentType); // 我们下面实现这个方法
+
+                String newFileName = originalFilename + (extension != null ? extension : "");
 
                 // 4. 上传到 OSS
-                //avatarUrl = ossService.uploadFile(fileName, avatar.getInputStream());
+                avatarUrl = tosService.uploadFile( avatar.getInputStream(),newFileName);
             }
 
             // 5. 更新用户信息
-            //supplierService.operationUpdate(nickname, avatarUrl);
+//            supplierService.operationUpdate(nickname, avatarUrl);
+            String userId = SecurityUtils.getUserId();
+            Customer customer=new Customer();
+            customer.setUserId(userId);
+            customer.setCover(avatarUrl);
+            customer.setName(nickname);
+            customerService.updateMemberInfoByUserId(customer);
 
             return returnData(R.SUCCESS.getCode(),null);
         } catch (Exception e) {
@@ -96,6 +115,27 @@
         }
     }
 
+
+    private String getExtensionFromContentType(String contentType) {
+        if (contentType == null) return null;
+
+        switch (contentType) {
+            case "image/jpeg":
+                return ".jpg";
+            case "image/png":
+                return ".png";
+            case "image/gif":
+                return ".gif";
+            case "image/webp":
+                return ".webp";
+            case "image/bmp":
+                return ".bmp";
+            default:
+                return ".png";
+        }
+    }
+
+
     @GetMapping("/page")
     @ApiOperation(value = "运营端-供应商分页查询", notes = "运营端-供应商分页查询")
     public ResponseEntity<ReturnDataDTO<Page<SupplierDTO>>> querySupplier(QuerySupplierDTO dto, Page page) {
diff --git a/src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java b/src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java
index 7dbab6b..478ac3b 100644
--- a/src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java
+++ b/src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java
@@ -7,12 +7,15 @@
 import com.alipay.api.request.AlipayTradeAppPayRequest;
 import com.alipay.api.response.AlipayTradeAppPayResponse;
 
+import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.mzl.flower.base.BaseController;
 import com.mzl.flower.base.R;
 import com.mzl.flower.config.pay.AlipayProperties;
+import com.mzl.flower.dto.request.pay.PayQueryDTO;
 import com.mzl.flower.dto.request.productOrders.ProductOrdersCreateDTO;
 import com.mzl.flower.entity.productOrders.ProductOrdersDO;
 import com.mzl.flower.enums.PayTypeEnum;
+import com.mzl.flower.service.pay.AlipayService;
 import com.mzl.flower.service.productOrders.ProductOrdersService;
 import com.mzl.flower.utils.alipay.OrderInfoUtil2_0;
 import io.swagger.annotations.Api;
@@ -46,6 +49,9 @@
 
     @Autowired
     private ProductOrdersService productOrdersService;
+
+    @Autowired
+    private AlipayService alipayService;
 
     /**
      * 获取订单支付请求参数
@@ -96,6 +102,18 @@
      * @return
      * @throws Exception
      */
+    @PostMapping(value = "/order/status")
+    @ApiOperation(value = "订单状态")
+    public AlipayTradeQueryResponse queryOrderByOutOrderNo(@Validated @RequestBody PayQueryDTO payQueryDTO, HttpServletRequest request) throws Exception{
+        AlipayTradeQueryResponse response=alipayService.queryOrderByOutOrderNo(payQueryDTO.getOuterOrderNo());
+        return response;
+    }
+    /**
+     * 支付宝回调url
+     * @param request
+     * @return
+     * @throws Exception
+     */
     @PostMapping(value = "/notify")
     @ApiOperation(value = "支付宝回调url")
     public String notify(HttpServletRequest request) throws Exception{
diff --git a/src/main/java/com/mzl/flower/web/v2/pay/WechatPayController.java b/src/main/java/com/mzl/flower/web/v2/pay/WechatPayController.java
new file mode 100644
index 0000000..4da617d
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/pay/WechatPayController.java
@@ -0,0 +1,139 @@
+package com.mzl.flower.web.v2.pay;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.response.AlipayTradeAppPayResponse;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.config.pay.AlipayProperties;
+import com.mzl.flower.dto.request.productOrders.ProductOrdersCreateDTO;
+import com.mzl.flower.entity.productOrders.ProductOrdersDO;
+import com.mzl.flower.enums.PayTypeEnum;
+import com.mzl.flower.service.productOrders.ProductOrdersService;
+import com.mzl.flower.utils.wechatpay.WxPayUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+
+/**
+ * @author taojie 20250321
+ */
+@RestController
+@RequestMapping(value = "/v2/wechat")
+@Api(tags = {"微信支付相关"})
+public class WechatPayController extends BaseController {
+
+    private Logger logger = LoggerFactory.getLogger(WechatPayController.class);
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
+    private ProductOrdersService productOrdersService;
+
+    /**
+     * 获取订单支付请求参数
+     * @param
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/pay-order-info")
+    @ApiOperation(value = "获取订单支付请求参数")
+    public ResponseEntity getPayOrderInfo(@Validated @RequestBody ProductOrdersCreateDTO productOrdersCreateDTO) throws Exception {
+
+
+        ProductOrdersDO productOrdersDTO=new ProductOrdersDO();
+        BeanUtils.copyProperties(productOrdersCreateDTO,productOrdersDTO);
+        productOrdersDTO.setPaymentMethod(PayTypeEnum.WECHAT.getName());
+        ProductOrdersDO productOrdersDO=productOrdersService.createProductOrders(productOrdersDTO);
+
+        // 1. 构建请求对象
+//        WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder()
+//                .outTradeNo(productOrdersDO.getOrderNo())
+//                .totalFee(productOrdersDO.getCurrentPrice().intValue()*100) // 单位:分,1元 = 100分
+//                .body(productOrdersDO.getOrderType()+"_"+productOrdersDO.getCurrentPrice())
+//                .spbillCreateIp("127.0.0.1")
+//                .tradeType("APP")
+//                .notifyUrl(wxPayService.getConfig().getNotifyUrl())
+//                .build();
+
+// 1. 构建请求对象
+        WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder()
+                .outTradeNo("11111111111")
+                .totalFee(1) // 单位:分,1元 = 100分
+                .body("商品描述")
+                .spbillCreateIp("127.0.0.1")
+                .tradeType("APP")
+                .notifyUrl(wxPayService.getConfig().getNotifyUrl())
+                .build();
+        
+        try {
+            // 2. 请求统一下单接口
+            WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request);
+            // 3. 构造给客户端的支付参数(Map 形式,客户端直接传给微信SDK)
+            Map<String, String> appPayParams = createAppPayParams(result);
+            return returnData(R.SUCCESS.getCode(), appPayParams);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+            return returnData(R.RUNTIME_EXCEPTION.getCode(), "",e.getMessage());
+        }
+    }
+
+
+    public Map<String, String> createAppPayParams(WxPayUnifiedOrderResult result) throws Exception {
+        String prepayId = result.getPrepayId();  // 获取统一下单返回的prepay_id
+        String nonceStr = WxPayUtil.generateNonceStr();  // 随机字符串
+        long timestamp = System.currentTimeMillis() / 1000;  // 当前时间戳(秒)
+
+        // 构建支付参数
+        SortedMap<String, String> payParams = new TreeMap<>();
+        payParams.put("appid", wxPayService.getConfig().getAppId());  // 微信公众号APPID
+        payParams.put("partnerid", wxPayService.getConfig().getMchId());  // 商户号
+        payParams.put("prepayid", prepayId);  // 统一下单接口返回的prepay_id
+        payParams.put("package", "Sign=WXPay");  // 固定值
+        payParams.put("noncestr", nonceStr);  // 随机字符串
+        payParams.put("timestamp", String.valueOf(timestamp));  // 时间戳
+
+        // 使用商户API密钥生成签名
+        String sign = WxPayUtil.generateSignature(payParams, wxPayService.getConfig().getMchKey());
+        payParams.put("sign", sign);  // 签名
+
+        return payParams;
+    }
+
+    /**
+     * 支付宝回调url
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/notify")
+    @ApiOperation(value = "微信回调url")
+    public String notify(HttpServletRequest request) throws Exception{
+
+        return null;
+    }
+
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 5f9d880..ba93892 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -65,6 +65,15 @@
   keysecret: BrY0BM4pvDXhVKOMLsXzgzlhVe1keQ
   bucketname: hmy-flower
 
+#https://www.volcengine.com/docs/6349/107356
+tos-oss:
+  endpoint: tos-cn-beijing.volces.com
+  region: cn-beijing
+  keyid: AKLTNTFmOTFkMDg3ZDRmNGZkMmFkOTBmMTcyZmM4N2MyMmY
+  keysecret: TW1FelpUY3lOalkxWWpjMk5HWTNOV0ZtWVdWa1lURTNNRE13WVdJMVkySQ==
+  bucketname: smart-manager-new
+#  bucketname: zhixinguanjia
+
 wx:
   miniapp:
     appid: wx1441324401626290    #小程序appId 花店端
@@ -85,6 +94,7 @@
   supplier:
     appid: wx3203fd935a6ffe09    #小程序appId
     secret: 9121c703fb0c416b21a8c289dd73ae9b     #secret
+
 
 sms:
   verificationCode: SMS_301300012   #验证码通用模版
@@ -111,4 +121,12 @@
   publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoXlmlW2TI0DmYm/eZqGxHSPEdzULsrCTFPW2B4VrMk5gj8afPS/nq/cXEOIjsCrTP0dJsdbDqk+YlVRGEHCxgkl6nZGgRtZmzHJxwWw+YEMejI/fP0Sr8nKSEa/+otcX6LO7ktl4vVcvAU0Q9RVEGLpz62djkkwrJMMds6wSRsJI1GDwT+5Ra4s06+lVN4ISU0IUx6E2m2NaZBimMiB+buy7ZPXg6eDE5B2oXOQ5qdL2E18Q7hm7XI+DYAQslLXGr2pjLGLRZ01/b4XyIPzZmusNF+vNp4qKji38a23MjO33ONWqBj/JlWkPW5Vl1AiL5vg6HuqEEfHdBq9mVuZBEwIDAQAB
   gatewayUrl: https://openapi.alipay.com/gateway.do
   sandboxGatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
-  notifyUrl: http://azcbit.natappfree.cc/jshERP-boot/alipay/notify
\ No newline at end of file
+  notifyUrl: http://ta5p5m.natappfree.cc/flower/v2/alipay/notify
+
+wechat-app:
+  merchantId: 1711247186
+  merchantKey: 6m8HhGNmk2S4sNPkwNJpawrCGUrnWNyV
+  appid: wx7f9c8a2e924a4815    #小程序appId
+  secret: 208d5eb98918856a6ac95ee01deba3ad    #secret
+  notifyUrl: http://ta5p5m.natappfree.cc/flower/v2/alipay/notify
+  tradeType: APP
\ No newline at end of file

--
Gitblit v1.9.3