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