diff --git a/src/main/java/com/ai/da/common/constant/AffiliateConstants.java b/src/main/java/com/ai/da/common/constant/AffiliateConstants.java new file mode 100644 index 00000000..3d1b926d --- /dev/null +++ b/src/main/java/com/ai/da/common/constant/AffiliateConstants.java @@ -0,0 +1,9 @@ +package com.ai.da.common.constant; + +public class AffiliateConstants { + public static final String STATUS_ACTIVE = "Active"; + public static final String STATUS_INACTIVE = "Inactive"; + public static final String STATUS_DELETE = "Delete"; + public static final Integer DELETED = 1; + public static final Integer NOT_DELETED = 0; +} diff --git a/src/main/java/com/ai/da/common/task/AccountTask.java b/src/main/java/com/ai/da/common/task/AccountTask.java index 6baba322..4907014f 100644 --- a/src/main/java/com/ai/da/common/task/AccountTask.java +++ b/src/main/java/com/ai/da/common/task/AccountTask.java @@ -31,7 +31,7 @@ public class AccountTask { accountService.refreshCreditsMonthly(); } - @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes +// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes public void getPaidUser() { // 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单 accountService.extendValidityForCC(); diff --git a/src/main/java/com/ai/da/common/task/PaymentTask.java b/src/main/java/com/ai/da/common/task/PaymentTask.java index 82d92f0d..794c8483 100644 --- a/src/main/java/com/ai/da/common/task/PaymentTask.java +++ b/src/main/java/com/ai/da/common/task/PaymentTask.java @@ -109,7 +109,7 @@ public class PaymentTask { affiliateService.syncLinkViewCountToDB(); } - @Scheduled(cron = "0 0 8 28-31 * ?") +// @Scheduled(cron = "0 0 8 28-31 * ?") public void commissionSummaryReminder(){ // 每个月末的最后一天的早上八点执行 LocalDate today = LocalDate.now(); diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 98d70ad7..c155b463 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -766,7 +766,7 @@ public class SendEmailUtil { try { String merchantEmail = "kimwong@code-create.com.hk"; String developer = "xupei3360@163.com"; - String[] receiverEmail = {merchantEmail, developer}; + String[] receiverEmail = {/*merchantEmail,*/ developer}; Credential cred = new Credential(SECRET_ID, SECRET_KEy); // 实例化一个http选项,可选的,没有特殊需求可以跳过 HttpProfile httpProfile = new HttpProfile(); @@ -965,7 +965,7 @@ public class SendEmailUtil { req.setFromEmailAddress(SEND_ADDRESS); String merchantEmail = "kimwong@code-create.com.hk"; String developerEmail = "xupei@code-create.com.hk"; - req.setDestination(new String[]{merchantEmail, developerEmail}); + req.setDestination(new String[]{/*merchantEmail,*/ developerEmail}); Template template = new Template(); req.setSubject("New Credit Purchase Order"); template.setTemplateID(CREDITS_PURCHASE_MERCHANT); diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java index 21220cef..ab293a1c 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java @@ -19,6 +19,7 @@ public class DesignItemDetailPrintServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("design_item_detail_id", designItemDetailId); queryWrapper.eq("print_type", printType); + queryWrapper.eq("is_deleted", 0); return baseMapper.selectList(queryWrapper); } diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java index e5406560..5c55ad3c 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java @@ -65,6 +65,7 @@ public class DesignItemDetailServiceImpl extends ServiceImpl selectByDesignItemId(Long designItemId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("design_item_id", designItemId); + queryWrapper.eq("is_deleted", 0); return designItemDetailMapper.selectList(queryWrapper); } diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index ccb3a151..f3b798c9 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -23,6 +23,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -288,24 +289,50 @@ public class DesignItemServiceImpl extends ServiceImpl existingDetails = designItemDetailService.selectByDesignItemId(designItemId); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingDetailMap = existingDetails.stream() + .collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old)); + + // 收集新 detail 的 priority,用于后续删除不存在的旧记录 + Set newDetailPriorities = new HashSet<>(); List designItemDetails = Lists.newArrayList(); pythonObjects.getObjects().get(0).getItems().forEach(detail -> { if (null == detail) { return; } - DesignItemDetail designItemDetail = CopyUtil.copyObject(detail, DesignItemDetail.class); + Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority(); + newDetailPriorities.add(priority); + + DesignItemDetail designItemDetail; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingDetailMap.containsKey(priority)) { + // 更新现有记录 + designItemDetail = existingDetailMap.get(priority); + designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + } else { + // 创建新记录 + designItemDetail = new DesignItemDetail(); + designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + } + + // 设置/更新字段 designItemDetail.setAccountId(userInfo.getId()); designItemDetail.setDesignId(designId); designItemDetail.setDesignItemId(designItemId); designItemDetail.setCollectionElementId(detail.getElementId()); - designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + designItemDetail.setType(detail.getType()); + designItemDetail.setPriority(priority); if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) { designItemDetail.setPath(detail.getBody_path()); //BODY不关联businessId designItemDetail.setBusinessId(0L); + } else { + // 非BODY类型使用path字段 + designItemDetail.setPath(detail.getPath()); } designItemDetail.setIconPath(detail.getIcon()); // todo @@ -314,7 +341,20 @@ public class DesignItemServiceImpl extends ServiceImpl { + if (!newDetailPriorities.contains(existingDetail.getPriority())) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingDetail.getId()); + updateWrapper.set("is_deleted", (byte) 1); + updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone)); + designItemDetailService.update(null, updateWrapper); + } + }); + + designItemDetailService.saveOrUpdateBatch(designItemDetails); //封装item信息 List designCollectionItems = CopyUtil.copyList(getByDesignId(designId) , DesignCollectionItemVO.class, (o, d) -> { @@ -343,26 +383,51 @@ public class DesignItemServiceImpl extends ServiceImpl existingDetails = designItemDetailService.selectByDesignItemId(designItemId); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingDetailMap = existingDetails.stream() + .collect(Collectors.toMap(DesignItemDetail::getPriority, detail -> detail, (old, newVal) -> old)); + + // 收集新 detail 的 priority,用于后续删除不存在的旧记录 + Set newDetailPriorities = new HashSet<>(); + List designItemDetails = Lists.newArrayList(); - // 3、保存新的designItemDetail + // 3、保存新的designItemDetail(使用 saveOrUpdate 方式) pythonObjects.getObjects().get(0).getItems().forEach(detail -> { if (null == detail) { return; } - DesignItemDetail designItemDetail = CopyUtil.copyObject(detail, DesignItemDetail.class); + Integer priority = SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) ? 0 : detail.getPriority(); + newDetailPriorities.add(priority); + + DesignItemDetail designItemDetail; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingDetailMap.containsKey(priority)) { + // 更新现有记录 + designItemDetail = existingDetailMap.get(priority); + designItemDetail.setUpdateDate(DateUtil.getByTimeZone(timeZone)); + } else { + // 创建新记录 + designItemDetail = new DesignItemDetail(); + designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + } + + // 设置/更新字段 designItemDetail.setAccountId(userId); designItemDetail.setDesignId(designId); designItemDetail.setDesignItemId(designItemId); designItemDetail.setCollectionElementId(detail.getElementId()); - designItemDetail.setPriority(detail.getPriority()); - designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); + designItemDetail.setType(detail.getType()); + designItemDetail.setPriority(priority); if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) { designItemDetail.setPath(detail.getBody_path()); //BODY不关联businessId designItemDetail.setBusinessId(0L); - designItemDetail.setPriority(0); + } else { + // 非BODY类型使用path字段 + designItemDetail.setPath(detail.getPath()); } designItemDetail.setIconPath(detail.getIcon()); // designItemDetail.setUndividedLayer(priorityAndUndividedLayer.get(detail.getType().toLowerCase())); @@ -374,12 +439,25 @@ public class DesignItemServiceImpl extends ServiceImpl { + if (!newDetailPriorities.contains(existingDetail.getPriority())) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingDetail.getId()); + updateWrapper.set("is_deleted", (byte) 1); + updateWrapper.set("update_date", DateUtil.getByTimeZone(timeZone)); + designItemDetailService.update(null, updateWrapper); + } + }); + // businessId 来自t_sys_file或者t_library - designItemDetailService.saveBatch(designItemDetails); + designItemDetailService.saveOrUpdateBatch(designItemDetails); - // 4、保存印花信息到designItemDetailPrint + // 4、保存印花信息到designItemDetailPrint(使用 saveOrUpdate 方式) List designItemDetailPrints = setDesignItemDetailPrintList(designItemDetails, designSingleItemDTOList, timeZone); - designItemDetailPrintService.saveBatch(designItemDetailPrints); + designItemDetailPrintService.saveOrUpdateBatch(designItemDetailPrints); // 5、覆盖designPythonOutfit表中的模特全身图 TDesignPythonOutfit designPythonOutfit = new TDesignPythonOutfit(); @@ -388,10 +466,16 @@ public class DesignItemServiceImpl extends ServiceImpl existingLayers = designPythonOutfitDetailService.getDetailByDesignPythonOutfitId(designPythonOutfit.getId()); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingLayerMap = existingLayers.stream() + .collect(Collectors.toMap(TDesignPythonOutfitDetail::getPriority, layer -> layer, (old, newVal) -> old)); - // 7、将新生成的图层信息存入designPythonOutfitDetail表 + // 收集新 layer 的 priority,用于后续删除不存在的旧记录 + Set newLayerPriorities = new HashSet<>(); + + // 7、将新生成的图层信息存入designPythonOutfitDetail表(使用 saveOrUpdate 方式) JSONArray layers = outfit.getJSONArray("layers"); Map> priorityOffset = null; @@ -399,9 +483,55 @@ public class DesignItemServiceImpl extends ServiceImpl list = setTDesignPythonOutfitDetailList(layers, designId, designPythonOutfit.getId(), userId, priorityOffset); + List list = new ArrayList<>(); + for (int i = 0; i < layers.size(); i++) { + JSONObject jsonObject = layers.getJSONObject(i); + Integer priority = (Integer) jsonObject.get("priority"); + newLayerPriorities.add(Math.abs(priority)); + + TDesignPythonOutfitDetail designPythonOutfitDetail; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingLayerMap.containsKey(Math.abs(priority))) { + // 更新现有记录 + designPythonOutfitDetail = existingLayerMap.get(Math.abs(priority)); + designPythonOutfitDetail.setUpdateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } else { + // 创建新记录 + designPythonOutfitDetail = new TDesignPythonOutfitDetail(); + designPythonOutfitDetail.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } + + // 设置/更新字段 + designPythonOutfitDetail.setDesignId(designId); + designPythonOutfitDetail.setDesignPythonOutfitId(designPythonOutfit.getId()); + designPythonOutfitDetail.setPosition(jsonObject.getString("position")); + designPythonOutfitDetail.setImageUrl(jsonObject.getString("image_url")); + designPythonOutfitDetail.setImageSize(jsonObject.getString("image_size")); + designPythonOutfitDetail.setImageCategory(jsonObject.getString("image_category")); + designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url")); + designPythonOutfitDetail.setScale(Objects.isNull(jsonObject.getString("resize_scale")) ? "1.0" : jsonObject.getString("resize_scale")); + designPythonOutfitDetail.setUserId(userId); + if (priorityOffset != null && !priorityOffset.isEmpty()){ + designPythonOutfitDetail.setOffset(String.valueOf(priorityOffset.get(Math.abs(priority)))); + } + designPythonOutfitDetail.setPriority(priority); + + list.add(designPythonOutfitDetail); + } + + // 逻辑删除不在新列表中的旧记录 + existingLayers.forEach(existingLayer -> { + if (!newLayerPriorities.contains(Math.abs(existingLayer.getPriority()))) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingLayer.getId()); + updateWrapper.set("is_deleted", 1); + updateWrapper.set("update_date", LocalDateTime.now(ZoneId.of(timeZone))); + designPythonOutfitDetailService.update(null, updateWrapper); + } + }); - designPythonOutfitDetailService.saveBatch(list); + designPythonOutfitDetailService.saveOrUpdateBatch(list); return list; } @@ -923,7 +1053,6 @@ public class DesignItemServiceImpl extends ServiceImpl designItemDetailTypeIdMap, String timeZone) { - // todo 这边这样做对吗 DesignSinglePrintDTO printObject; if (printType.equals("print")) { printObject = designSingleItem.getPrintObject(); @@ -931,32 +1060,64 @@ public class DesignItemServiceImpl extends ServiceImpl { - // 2.1 判断是否第一次添加印花,是:直接添加 - List designItemDetailPrintList = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority()), printType); - if (!designItemDetailPrintList.isEmpty()) { - // 2.2 否:先删除原始印花,再添加新印花信息 - designItemDetailPrintService.deleteByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); - } - setUriToMinioPath(print); + Long designItemDetailId = designItemDetailTypeIdMap.get(designSingleItem.getPriority()); + + // 查询现有的记录,用于 saveOrUpdate + List existingPrints = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailId, printType); + // 创建 Map,以 priority 为 key,方便快速查找 + Map existingPrintMap = existingPrints.stream() + .collect(Collectors.toMap(DesignItemDetailPrint::getPriority, print -> print, (old, newVal) -> old)); - DesignItemDetailPrint designItemDetailPrint = new DesignItemDetailPrint(); - designItemDetailPrint.setDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority())); + // 收集新 print 的 priority,用于后续删除不存在的旧记录 + Set newPrintPriorities = new HashSet<>(); + + if (!CollectionUtil.isEmpty(printObject.getPrints())) { + // 处理新的印花列表 + printObject.getPrints().forEach(print -> { + setUriToMinioPath(print); + + Integer priority = print.getPriority(); + newPrintPriorities.add(priority); + + DesignItemDetailPrint designItemDetailPrint; + // 如果存在相同 priority 的记录,则更新;否则创建新记录 + if (existingPrintMap.containsKey(priority)) { + // 更新现有记录 + designItemDetailPrint = existingPrintMap.get(priority); + designItemDetailPrint.setUpdateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } else { + // 创建新记录 + designItemDetailPrint = new DesignItemDetailPrint(); + designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); + } + + // 设置/更新字段 + designItemDetailPrint.setDesignItemDetailId(designItemDetailId); designItemDetailPrint.setPrintType(printType); designItemDetailPrint.setLevel2Type(print.getLevel2Type()); designItemDetailPrint.setPath(print.getMinIOPath()); designItemDetailPrint.setScale(print.getScale().toString()); designItemDetailPrint.setSingleOrOverall(printType.equals("print") ? print.getIfSingle() ? "single" : "overall" : "single"); - designItemDetailPrint.setCreateDate(LocalDateTime.now(ZoneId.of(timeZone))); // single、overall模式下都有position、angle和priority designItemDetailPrint.setPosition(print.getLocation().toString()); designItemDetailPrint.setAngle(print.getAngle()); - designItemDetailPrint.setPriority(print.getPriority()); + designItemDetailPrint.setPriority(priority); + designItemDetailPrints.add(designItemDetailPrint); }); } + + // 逻辑删除不在新列表中的旧记录 + existingPrints.forEach(existingPrint -> { + if (!newPrintPriorities.contains(existingPrint.getPriority())) { + // 该记录不在新列表中,需要逻辑删除 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", existingPrint.getId()); + updateWrapper.set("is_deleted", (byte) 1); + updateWrapper.set("update_date", LocalDateTime.now(ZoneId.of(timeZone))); + designItemDetailPrintService.update(null, updateWrapper); + } + }); } // 对印花类型为Generate的图片路径进行特殊处理 diff --git a/src/main/java/com/ai/da/service/impl/EmailServiceImpl.java b/src/main/java/com/ai/da/service/impl/EmailServiceImpl.java index 813746cf..a4fbc003 100644 --- a/src/main/java/com/ai/da/service/impl/EmailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/EmailServiceImpl.java @@ -586,7 +586,7 @@ public class EmailServiceImpl implements EmailService { try { String merchantEmail = "kimwong@code-create.com.hk"; String developer = "xupei3360@163.com"; - List merchantReceiver = Arrays.asList(merchantEmail, developer); + List merchantReceiver = Arrays.asList(/*merchantEmail,*/ developer); String merchantSubject = null; String merchantTemplate = null; @@ -730,7 +730,7 @@ public class EmailServiceImpl implements EmailService { jsonObject.put("quantity", quantity); jsonObject.put("totalFee", amount); - sendEmail(Arrays.asList(merchantEmail,developerEmail), jsonObject, CREDITS_PURCHASE_MERCHANT, "New Credit Purchase Order", null, null); + sendEmail(Arrays.asList(/*merchantEmail,*/ developerEmail), jsonObject, CREDITS_PURCHASE_MERCHANT, "New Credit Purchase Order", null, null); } private final static String COMMON_EXCEPTION_REMINDER = "135279_common-exception-reminder.html"; diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java index 5003523e..a7778835 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java @@ -45,6 +45,7 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl getDetailByDesignPythonOutfitId(Long designPythonOutfitId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("design_python_outfit_id", designPythonOutfitId); + queryWrapper.eq("is_deleted", 0); return baseMapper.selectList(queryWrapper); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8550475d..974fee23 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #spring.profiles.active=test #����application-prod�ļ�(��������) -spring.profiles.active=prod +#spring.profiles.active=prod #����application-dev�ļ�(��������) -#spring.profiles.active=dev +spring.profiles.active=dev diff --git a/src/main/resources/payment.properties b/src/main/resources/payment.properties index f4b98130..0f2800d6 100644 --- a/src/main/resources/payment.properties +++ b/src/main/resources/payment.properties @@ -27,9 +27,9 @@ paypal.webhook_id=1D107312EX592781K ##### Stripe # developer -#stripe.private-key=sk_test_51P4ZZL02n1TEydyN8qQHjOA9imsFU7Oxs2HMHGy2urHnnQgSHnZuu5vVP6pKhEACwUpsKNyrbZpdcg5TJWJLRHcY008dEO1fn2 +stripe.private-key=sk_test_51P4ZZL02n1TEydyN8qQHjOA9imsFU7Oxs2HMHGy2urHnnQgSHnZuu5vVP6pKhEACwUpsKNyrbZpdcg5TJWJLRHcY008dEO1fn2 # dev 端点 -#stripe.webhook-sign-secret=whsec_e0dBiJngx6qqgJj6yPyJ2A9ouh1Cjv5w +stripe.webhook-sign-secret=whsec_e0dBiJngx6qqgJj6yPyJ2A9ouh1Cjv5w # local 端点 #stripe.webhook-sign-secret=whsec_TJcMSnAkh4uktrNY1M6Iy8XaVze4Rzqm @@ -43,8 +43,8 @@ paypal.webhook_id=1D107312EX592781K #stripe.webhook-sign-secret=whsec_pX0pPMQm85PaUSWnFMEzoccb3MGNkjoL # kim - live -stripe.private-key=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 +#stripe.private-key=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 # prod 端点 -stripe.webhook-sign-secret=whsec_hhGDgdelQRHSg4LmChtQe41crj41eb11 +#stripe.webhook-sign-secret=whsec_hhGDgdelQRHSg4LmChtQe41crj41eb11 # dev 端点 #stripe.webhook-sign-secret=whsec_cFUtjUOo8wnrIKZmt4GNvt7ZY1bOfrYr