ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java
@@ -90,6 +90,8 @@ String ACTIVITY_END = "活动已经结束"; String ACTIVITY_DEL = "活动已被删除"; String ACTIVITY_SE_ERROR = "开始时间不能大于结束时间"; String ACTIVITY_GOODS_NULL = "商品已被抢完"; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java
@@ -85,6 +85,11 @@ public R<MerMemberSimpleTotalVo> getMerMemberSimpleTotalVo(MerBaseDto merBaseDto) { return R.fail("获取商户会员订单统计失败:" + throwable.getMessage()); } @Override public R<List<String>> getActivityOrderGoods(String activityId) { return R.fail("获取活动订单商品id失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java
@@ -108,4 +108,13 @@ */ @PostMapping("/order/getMerMemberSimpleTotalVo") public R<MerMemberSimpleTotalVo> getMerMemberSimpleTotalVo(@RequestBody MerBaseDto merBaseDto); /** * 获取活动订单商品id * @param activityId * @return */ @PostMapping("/order/getActivityOrderGoods") R<List<String>> getActivityOrderGoods(@RequestBody String activityId); } ruoyi-auth/src/main/resources/bootstrap.yml
@@ -14,26 +14,31 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} #生产环境 qywx-inner: corpId: ww11400938eb1b91bc agentId: 1000024 @@ -44,3 +49,13 @@ encodingAESKey: "" #测试环境 #qywx-inner: # corpId: ww11400938eb1b91bc # agentId: 1000038 # agentSecret: vt0bmrBPWi1TrRu8lisv5IT5ZDOuxNNLNaGwcZkHLgc # authorizeState: HONGRUITANG # suiteSecret: "" # token: "" # encodingAESKey: "" ruoyi-gateway/src/main/resources/bootstrap.yml
@@ -14,20 +14,24 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置 @@ -43,8 +47,8 @@ datasource: ds1: nacos: # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 dataId: sentinel-ruoyi-gateway groupId: DEFAULT_GROUP data-type: json ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml
@@ -23,6 +23,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: @@ -31,6 +33,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java
@@ -1,8 +1,11 @@ package com.ruoyi.goods.service.impl.activity; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; @@ -24,14 +27,12 @@ import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.activity.ActivityGoods; import com.ruoyi.system.api.domain.poji.config.DelayTask; import com.ruoyi.system.api.domain.poji.goods.Goods; import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo; import com.ruoyi.system.api.domain.vo.MgtSimpleMemberVo; import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo; import com.ruoyi.system.api.domain.vo.MgtUserIdByKeywordVo; import com.ruoyi.system.api.service.RemoteConfigService; import com.ruoyi.system.api.service.RemoteFileService; import com.ruoyi.system.api.service.RemoteMemberService; import com.ruoyi.system.api.service.RemoteShopService; import com.ruoyi.system.api.service.*; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; @@ -81,6 +82,11 @@ @Resource private RedisService redisService; @Resource private RemoteOrderService remoteOrderService; @Resource private RemoteGoodsService remoteGoodsService; @Autowired private RedissonClient redissonClient; @@ -107,12 +113,97 @@ if (StringUtils.isNotBlank(mgtActivityEditDto.getActivityId())) { // 获取活动信息 activity = this.getById(mgtActivityEditDto.getActivityId()); // 如果活动状态不为0,则表示活动正在进行中,不能修改 if (activity.getActivityStatus() != 0) { throw new ServiceException(AppErrorConstant.ACTIVITY_ING_EDIT); if(activity.getDelFlag() == 1){ throw new ServiceException(AppErrorConstant.ACTIVITY_DEL); } // 删除活动商品信息 activityGoodsService.deleteByActivityId(activity.getActivityId()); if(activity.getActivityStatus() == 2){ throw new ServiceException(AppErrorConstant.ACTIVITY_END); } //校验可以修改的项 if(activity.getActivityStatus() == 1){ /** * 1、活动时间:已经开始活动开始时间不可修改,结束时间不能小于当前时间 * 2、是否限购 * - 不限购:无法修改。 * - 限购:只能增加 * 3、适用地区 * - 全部地区:无法修改。 * - 指定地区:只能新增 * 4、适用店铺 * - 全部店铺:无法修改 * - 指定店铺:只能新增 * 5、秒杀库存:只能增加 * 6、活动名称、宣传海报、是否推荐、活动简介:可直接修改 * 7、秒杀价和定金不能修改 */ if(activity.getActivityStartTime().getTime() != mgtActivityEditDto.getActivityStartTime().getTime()){ throw new ServiceException("活动开始后无法修改开始时间"); } if(System.currentTimeMillis() >= mgtActivityEditDto.getActivityEndTime().getTime()){ throw new ServiceException("活动结束时间必须大于当前时间"); } if(activity.getPurchaseLimitationFlag() == 0 && activity.getPurchaseLimitationFlag().compareTo(mgtActivityEditDto.getPurchaseLimitationFlag()) != 0){ throw new ServiceException("不能修改限购配置"); } if(activity.getPurchaseLimitationFlag() == 1 && mgtActivityEditDto.getLimitNumber().compareTo(activity.getLimitNumber()) < 0){ throw new ServiceException("限购数量不能小于原始数量"); } if(activity.getAreaFlag() == 1 && activity.getAreaFlag().compareTo(mgtActivityEditDto.getAreaFlag()) != 0){ throw new ServiceException("不能修改适用地区配置"); } if(activity.getAreaFlag() == 2){ List<String> list = Arrays.asList(activity.getDesignatedArea().split(",")); List<String> list1 = Arrays.asList(mgtActivityEditDto.getDesignatedArea().split(",")); for (String s : list) { if(!list1.contains(s)){ throw new ServiceException("适用地区只能增加"); } } } if(activity.getShopFlag() == 1 && activity.getShopFlag().compareTo(mgtActivityEditDto.getShopFlag()) != 0){ throw new ServiceException("不能修改适用店铺配置"); } if(activity.getShopFlag() == 2){ List<String> list = Arrays.asList(activity.getApplicableShop().split(",")); List<String> list1 = Arrays.asList(mgtActivityEditDto.getApplicableShop().split(",")); for (String s : list) { if(!list1.contains(s)){ throw new ServiceException("适用店铺只能增加"); } } } List<MgtActivityGoodsEditDto> mgtActivityGoodsEditDtoList = mgtActivityEditDto.getMgtActivityGoodsEditDtoList(); List<String> collect = mgtActivityGoodsEditDtoList.stream().map(MgtActivityGoodsEditDto::getGoodsId).collect(Collectors.toList()); List<ActivityGoods> list = activityGoodsService.list(new QueryWrapper<ActivityGoods>() .eq("del_flag", 0) .eq("activity_id", activity.getActivityId()) ); for (ActivityGoods activityGoods : list) { String goodsId = activityGoods.getGoodsId(); BigDecimal activitySubscription1 = activityGoods.getActivitySubscription(); BigDecimal activityPrice1 = activityGoods.getActivityPrice(); Integer activityNumber1 = activityGoods.getActivityNumber(); if(!collect.contains(goodsId)){ throw new ServiceException("只能新增商品数据"); } for (MgtActivityGoodsEditDto mgtActivityGoodsEditDto : mgtActivityGoodsEditDtoList) { String goodsId1 = mgtActivityGoodsEditDto.getGoodsId(); BigDecimal activityPrice = mgtActivityGoodsEditDto.getActivityPrice(); BigDecimal activitySubscription = mgtActivityGoodsEditDto.getActivitySubscription(); Integer activityNumber = mgtActivityGoodsEditDto.getActivityNumber(); if(goodsId.equals(goodsId1) && activitySubscription1.compareTo(activitySubscription) != 0){ throw new ServiceException("不能修改定金"); } if(goodsId.equals(goodsId1) && activityPrice1.compareTo(activityPrice) != 0){ throw new ServiceException("不能修改秒杀价"); } if(goodsId.equals(goodsId1) && activityNumber1.compareTo(activityNumber) > 0){ throw new ServiceException("只能增加商品库存"); } } } } } else { // 如果活动ID为空,则表示新增活动信息 activity = new Activity(); @@ -135,6 +226,7 @@ codeGetDto.setFileName("activity-"+activityId); String codeUrl = remoteFileService.getAppOrderTotal(codeGetDto).getData(); activity.setActivityCode(codeUrl); activity.setActivityStatus(0); } // 获取活动开始时间和结束时间 Date activityStartTime = mgtActivityEditDto.getActivityStartTime(); @@ -174,7 +266,6 @@ activity.setApplicableShop(result); } } activity.setActivityStatus(0); this.saveOrUpdate(activity); // 获取活动商品信息 List<MgtActivityGoodsEditDto> mgtActivityGoodsEditDtoList = mgtActivityEditDto.getMgtActivityGoodsEditDtoList(); @@ -182,7 +273,22 @@ if (!mgtActivityGoodsEditDtoList.isEmpty()) { List<ActivityGoods> activityGoodsList = mgtActivityGoodsEditDtoList.stream().map( dto -> { ActivityGoods activityGoods = new ActivityGoods(); ActivityGoods activityGoods = activityGoodsService.getOne(new LambdaQueryWrapper<ActivityGoods>() .eq(ActivityGoods::getActivityId, activity.getActivityId()) .eq(ActivityGoods::getGoodsId, dto.getGoodsId()) .eq(ActivityGoods::getDelFlag, 0) ); if(null != activityGoods){ activityGoods.setActivityId(activity.getActivityId()); activityGoods.setActivityPrice(dto.getActivityPrice()); activityGoods.setActivitySubscription(dto.getActivitySubscription()); activityGoods.setActivityNumber(dto.getActivityNumber()); activityGoods.setActivityStock(dto.getActivityNumber()); activityGoods.setActivityDeadline(activity.getActivityEndTime()); activityGoods.setPurchaseLimitationFlag(activity.getPurchaseLimitationFlag()); activityGoods.setLimitNumber(activity.getLimitNumber()); }else{ activityGoods = new ActivityGoods(); activityGoods.setDelFlag(0); activityGoods.setGoodsId(dto.getGoodsId()); activityGoods.setActivityId(activity.getActivityId()); @@ -195,11 +301,12 @@ activityGoods.setSellOutFlag(0); activityGoods.setPurchaseLimitationFlag(activity.getPurchaseLimitationFlag()); activityGoods.setLimitNumber(activity.getLimitNumber()); } return activityGoods; } ).collect(Collectors.toList()); if (!activityGoodsList.isEmpty()) { activityGoodsService.saveBatch(activityGoodsList); activityGoodsService.saveOrUpdateBatch(activityGoodsList); } } //如果活动在1小时内生成自动开始任务的延时任务 @@ -208,6 +315,7 @@ String activityId = activity.getActivityId(); long currentTimeMillis = System.currentTimeMillis(); long startTimeDifference = activityStartTime.getTime() - currentTimeMillis; startTimeDifference = startTimeDifference < 0 ? 3L : startTimeDifference; long endTimeDifference = activityEndTime.getTime() - currentTimeMillis; //判断任务是否已经开始,已经开始则3秒后立即开始 if(nowTime.compareTo(activityStartTime) > 0){ ruoyi-modules/ruoyi-goods/src/main/resources/bootstrap.yml
@@ -18,6 +18,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: @@ -26,6 +28,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/activity/ActivityGoodsMapper.xml
@@ -86,12 +86,7 @@ tag.goods_id goodsId, tg.goods_name goodsName, tg.goods_no goodsNo, CASE tg.goods_type WHEN 1 THEN "周期" WHEN 2 THEN "服务" WHEN 3 THEN "体验" WHEN 4 THEN "单品" END goodsType, tg.goods_type goodsType, tg.sales_price salesPrice, tag.activity_price activityPrice, tag.activity_subscription activitySubscription, ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtMemberPageVo.java
@@ -83,6 +83,8 @@ @Excel(name = "关联商户名称", width = 30, sort = 14) private Long relationShopId; private Integer bindingFlag; @ApiModelProperty(value = "关联商户名称") @Excel(name = "关联商户名称", width = 30, sort = 14) private String relationShopName; ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -625,8 +625,14 @@ String phoneNumber = merMemberAddDto.getPhonenumber(); Member oldMember = this.getByMobile(phoneNumber); // Check if the member already exists if (oldMember != null) { if (oldMember != null && oldMember.getBindingFlag() == 1) { throw new ServiceException(AppErrorConstant.MOBILE_USER_DOUBLE); } if (oldMember != null && oldMember.getBindingFlag() == 0) { oldMember.setRelationShopId(merMemberAddDto.getShopId()); oldMember.setBindingFlag(1); this.updateById(oldMember); return oldMember.getUserId(); } // Get the sysUser by mobile number SysUser sysUser = sysUserService.getSysUserByMobile(phoneNumber).getData(); @@ -943,7 +949,7 @@ //活跃度赋值 Date lastPayTime; for (MgtMemberPageVo mgtMemberPageVo : memberPageVoList) { if(null != mgtMemberPageVo.getRelationShopId()){ if(null != mgtMemberPageVo.getRelationShopId() && 1 == mgtMemberPageVo.getBindingFlag()){ R<Shop> shop_r = remoteShopService.getShop(mgtMemberPageVo.getRelationShopId()); if(shop_r.getCode() == 200){ Shop data = shop_r.getData(); @@ -1154,7 +1160,6 @@ mgtMemberGetVo.setRelationShopName(data.getShopName()); } } } mgtMemberGetVo.setIntegral(memberTotal.getTotalIntegral()); mgtMemberGetVo.setMemberFrom(member.getCustomerSource()); ruoyi-modules/ruoyi-member/src/main/resources/bootstrap.yml
@@ -18,6 +18,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: @@ -26,6 +28,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml
@@ -245,6 +245,7 @@ tm.goods_type goodsType, tm.relation_shop_id as relationShopId, CASE binding_flag WHEN 1 THEN tm.relation_shop_name ELSE "" END relationShopName, tm.binding_flag as bindingFlag, tmt.total_integral integral, tm.referrer referrer, tm.customer_source memberFrom, ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java
@@ -175,4 +175,15 @@ ProfitSharingResult result = orderService.queryBill(orderId); return R.ok(result); } /** * 获取活动订单商品id * @param activityId * @return */ @PostMapping("/getActivityOrderGoods") public R<List<String>> getActivityOrderGoods(@RequestBody String activityId){ List<String> activityOrderGoods = orderService.getActivityOrderGoods(activityId); return R.ok(activityOrderGoods); } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtActivityOrderPageVo.java
@@ -28,6 +28,10 @@ @ApiModelProperty(value="订单编号") private String orderNo; @Excel(name = "支付流水号", width = 30, sort = 1) @ApiModelProperty(value="支付流水号") private String outTradeNo; @Excel(name = "所属秒杀活动", width = 30, sort = 2) @ApiModelProperty(value="秒杀活动") private String activityName; ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtOrderDetailVo.java
@@ -44,6 +44,9 @@ @ApiModelProperty(value="订单编号") private String orderNo; @ApiModelProperty(value="支付流水号") private String outTradeNo; @ApiModelProperty(value="订单来源1.商城2.秒杀活动3.线下创建") private String orderFrom; ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -955,6 +955,41 @@ R<com.alibaba.fastjson.JSONObject> r = HuiFuTianXiaUtil.weixinPayment(outTradeNo, description, payMoney.doubleValue(), openid, request.getNotifyUrl()); if(r.getCode() != 200){ throw new ServiceException(r.getMsg()); }else{ new Thread(new Runnable() { @Override public void run() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); int time = 0; for (int i = 0; i < 13; i++) { try { time += (5000 * i); Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } R<WeixinPaymentNotifyVo> voR = HuiFuTianXiaUtil.queryPayment(outTradeNo, sdf.format(new Date())); if(voR.getCode() == 200){ WeixinPaymentNotifyVo data = voR.getData(); //P:处理中;S:成功;F:失败;I: 初始(初始状态很罕见,请联系汇付技术人员处理); String transStat = data.getTransStat(); if("S".equals(transStat)){ PartnerTransactionsResult transaction = new PartnerTransactionsResult(); transaction.setOutTradeNo(data.getReqSeqId()); payBack(transaction, data.getFeeFlag() == 1 ? BigDecimal.ZERO : new BigDecimal(data.getFeeAmount())); return; } if("P".equals(transStat) || "F".equals(transStat)){ continue; } log.error("支付失败,流水号:{}, 状态码:{}", outTradeNo, transStat); return; }else{ log.error("支付查询失败!流水号:{},结果:{}", outTradeNo, voR.getMsg()); } } } }).start(); } com.alibaba.fastjson.JSONObject data = r.getData(); String mainMchId = WxPayConfiguration.getPlatformTyMacId(); @@ -3191,8 +3226,6 @@ Order order = this.getById(orderId); // 获取会员信息 Member member = remoteMemberService.getMember(order.getUserId()).getData(); // 获取商店信息 Shop shop = remoteShopService.getShop(order.getShopId()).getData(); // 获取订单商品详细信息 List<MgtOrderGoodsDetailVo> orderGoodsDetailVoList = orderGoodsService.listMgtVoByOrderId(orderId); // 设置MgtOrderDetailVo属性 @@ -3222,6 +3255,7 @@ } // 设置订单编号 mgtOrderDetailVo.setOrderNo(order.getOrderNo()); mgtOrderDetailVo.setOutTradeNo(order.getOutTradeNo()); // 设置订单来源 switch (order.getOrderFrom()) { case 1: @@ -3252,10 +3286,12 @@ mgtOrderDetailVo.setCancelTime(order.getCancelTime()); mgtOrderDetailVo.setOrderRemark(order.getOrderRemark()); mgtOrderDetailVo.setShopId(order.getShopId()); if (shop != null) { if (3 == order.getOrderStatus()) { // 获取商店信息 Shop shop = remoteShopService.getShop(order.getShopId()).getData(); mgtOrderDetailVo.setShopName(shop.getShopName()); } else { mgtOrderDetailVo.setShopName("商户已被删除"); mgtOrderDetailVo.setShopName(""); } mgtOrderDetailVo.setVerifyTime(order.getUseTime()); //获取支付记录 @@ -6231,4 +6267,22 @@ ProfitSharingResult profitSharingResult = wxService.getEcommerceService().queryProfitSharing(request); return profitSharingResult; } @Override public List<String> getActivityOrderGoods(String activityId) { List<Order> orders = this.baseMapper.selectList(new QueryWrapper<Order>() .eq("del_flag", 0) .in("order_status", Arrays.asList(1, 2, 3)) .eq("activity_id", activityId) ); if(orders.size() > 0){ List<String> collect = orders.stream().map(Order::getOrderId).collect(Collectors.toList()); List<OrderGoods> list = orderGoodsService.list(new QueryWrapper<OrderGoods>() .eq("del_flag", 0) .in("order_id", collect) ); return list.stream().map(OrderGoods::getGoodsId).collect(Collectors.toList()); } return new ArrayList<>(); } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
@@ -589,4 +589,12 @@ ProfitSharingResult queryBill(String orderId) throws WxPayException; /** * 根据活动id获取订单商品id列表 * @param activityId * @return */ List<String> getActivityOrderGoods(String activityId); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/HuiFuTianXiaUtil.java
@@ -13,8 +13,11 @@ import com.ruoyi.order.domain.vo.PaymentDelaytransHFTXVo; import com.ruoyi.order.domain.vo.WeixinPaymentNotifyVo; import com.ruoyi.order.domain.vo.WeixinPaymentRefundVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.security.KeyFactory; import java.security.PrivateKey; @@ -31,6 +34,7 @@ * @Date 2023/10/12 0:02 */ public class HuiFuTianXiaUtil { private static Logger logger = LoggerFactory.getLogger(HuiFuTianXiaUtil.class); //私钥(Base64编码) private static String privateKeyBase64 = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCs658vv/6VdoSGyxr7gVNxlsFGKC2RE4I3S3C78f7t29t6oSm7tdRUr+B/I1VtV1Ps2SQMqG+gUpLiVbHEj+U8PjrvSht6cBNpqhnUjBASEhO0zeCJXNj3zqEDj7CnzDbUzuZWZDyLEaSLRaVb/DSW34D0GDsGWpIMLui/lnubXCYMNsUJBgRmV/tSv7vApVok3aKDoYkZMDhfnKrbxTtWkDfwNLDCInB300YbGeN7hhECRestktymHw0I78x3g+pdzOKOSofqdHyBCemVgOBt2h+oulVU65jc5ok0vwhx7sk2+i3Dw/S/hx3fpnOAToLhpFSTCqArG5wOhiOTX5RRAgMBAAECggEAT+uu7VDdh5L5eZtR40BIos08kwJq3QyZOJlDh3o3ixP8gtcOBNXrRyDqr5hTGXAtN+C8SqVmwkCn5rgYq3KeTpOshYBI5vP55PJbceMyYke8l+o3hwVEunPj81NsIIHALedaij9VxCjpVf1gif0tCTZP0YGJdkxSCBN+O15/zrOred2xkbAGXCNM2j+uIOZ5LTQ064jUAm9KWO4JvVnlNCQPiJCfe652i4RE9adgTlT7d9XffQ/oZDZcDkD1OVUO4ErsSgvjsjPW9Qk8zAVm/C+ycs27GUbVf6yh3zMoL4JDshzoMYAVDqP3VkpYGiW71PzcOZqktcjbtCom4/gpqQKBgQDgHrsQVzMwr18gRAWl8PsgHyMvhyivzk7uPvm6nK9mvEGg7wnrCMKHkpEOCi4mHWnW6H9ptrkeAQbHN7H8Qd6JZm/H0VN8N8fg4IFarlrLWXET6s7or9btCf4aq8DGrU9C+7fcngSfuqlrSxy9e+9InmzUFGKVLBtYIJbG1r00qwKBgQDFhHhhc4WC1MrWLSGhpaNp+swPstfzUBeX2MtZOIv6yXTYPvJ77AAZoLnW482eUZucltCAUucEtTsop25dKdhbdhbVJ/YRRnaklBL2rai4HX+fjoV29tepJhrOrq3Ey+vqvDEsqrBz2C6YyJ6d9aaPPwCFsnDRO+g7tK9S4ZfC8wKBgGlhKbXqOnCW1RSXx0waPgoBegrb816OlABj7go3qCWXOQiRvMkdilIysS+3y7EyPVTGZzpupyYbd3Nulaq10gwq9T4wB6Atnjb3ePsJZjmdKZUi3/z6yQUVoLwrq+3/CXjGYNJEHop4Ozbuz2ms/3rWuvcRSrU3UvgiAqMlzzsXAoGAJY7xDSbYZm5sO5nNYV2L22UzVHDfm4bJVbiFwmt8Qq34J/6gQWw5AKaNcA1VVhuSiY4sC5q4Dy8fFrXvyItidtHXuaSlp9dMTDNT/9A52vjRAdgqDNsXWzTBuDeDF37nV3V9rE6wyvZ6tdbAQq0phOeoA8RQq5jGqkPLauk24H0CgYEAn92Ru9UuloMmTrJbpeeLmMkwCzKff4SpYSY3WzidjdlfHpyNqBUMYb5Ym3OplrSONT9o2H5mEQipjatiu0teILBT7j+f9ZJYQ3vUurAXbmKtthHuEV4lueylNUgmkv+dm295n2x79w1mk/0emJ/Qr9tz43dpSV/kRCxc+lX+OFk="; //公钥(Base64编码) @@ -94,7 +98,7 @@ headers.put("Content-type","application/json; charset=utf-8"); headers.put("Accept", "application/json"); post.addHeaders(headers); System.err.println(JSON.toJSONString(body)); logger.info(JSON.toJSONString(body)); post.body(body.toJSONString()); HttpResponse execute = post.execute(); String result1 = execute.body(); @@ -147,6 +151,60 @@ } /** * 查询支付数据 * @param org_req_seq_id 请求流水号 * @param org_req_date 请求日期 * @return */ public static R<WeixinPaymentNotifyVo> queryPayment(String org_req_seq_id, String org_req_date){ String url = "https://api.huifu.com/v2/trade/payment/scanpay/query"; JSONObject data = new JSONObject(); data.put("huifu_id", huifu_id); data.put("org_req_seq_id", org_req_seq_id); data.put("org_req_date", org_req_date); JSONObject body = new JSONObject(); body.put("sys_id", huifu_id); body.put("product_id", product_id); body.put("sign", sign(data.toJSONString())); body.put("data", data); HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); headers.put("Content-type","application/json; charset=utf-8"); headers.put("Accept", "application/json"); post.addHeaders(headers); logger.info(JSON.toJSONString(body)); post.body(body.toJSONString()); HttpResponse execute = post.execute(); String result1 = execute.body(); execute.close(); if(StringUtils.hasLength(result1)){ JSONObject result = JSONObject.parseObject(result1); JSONObject resultData = result.getJSONObject("data"); String resp_code = resultData.getString("resp_code"); String resp_desc = resultData.getString("resp_desc"); //交易受理成功;注:交易状态以trans_stat为准; String success1 = "00000000"; if(success1.equals(resp_code)){ WeixinPaymentNotifyVo vo = new WeixinPaymentNotifyVo(); vo.setReqSeqId(resultData.getString("org_req_seq_id")); vo.setReqDate(resultData.getString("org_req_date")); vo.setTransAmt(resultData.getString("trans_amt")); vo.setPayAmt(resultData.getString("pay_amt")); vo.setEndTime(resultData.getString("end_time")); vo.setTransStat(resultData.getString("trans_stat")); String fee_type = resultData.getString("fee_type"); vo.setFeeFlag("INNER".equals(fee_type) ? 2 : 1); vo.setFeeAmount(resultData.getString("fee_amt")); return R.ok(vo); } return R.fail(resp_desc); } return R.fail("请求异常"); } /** @@ -181,7 +239,7 @@ headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); System.err.println(JSON.toJSONString(body)); logger.info(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result1 = execute.body(); execute.close(); @@ -349,7 +407,7 @@ headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); System.err.println(JSON.toJSONString(body)); logger.info(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result = execute.body(); execute.close(); @@ -378,12 +436,19 @@ public static void main(String[] args) { //174.91 //分账对象 JSONArray acctInfos = new JSONArray(); com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject(); jsonObject.put("div_amt", String.format("%.2f", 0.07D)); jsonObject.put("huifu_id", "6666000141251275"); jsonObject.put("div_amt", String.format("%.2f", 173.35)); jsonObject.put("huifu_id", "6666000141286934"); acctInfos.add(jsonObject); HuiFuTianXiaUtil.paymentDelaytrans(IdUtils.simpleUUID(), "20231020", "0479854e057547698be8b083f2fa550a", acctInfos); //平台商户 com.alibaba.fastjson2.JSONObject jsonObject1 = new com.alibaba.fastjson2.JSONObject(); jsonObject1.put("div_amt", String.format("%.2f", 1.56)); jsonObject1.put("huifu_id", "6666000141216769"); acctInfos.add(jsonObject1); R<PaymentDelaytransHFTXVo> paymentDelaytransHFTXVoR = HuiFuTianXiaUtil.paymentDelaytrans(IdUtils.simpleUUID(), "20231111", "57dbe646b14542ce8bce166490d3e46e", acctInfos); System.err.println(JSON.toJSONString(paymentDelaytransHFTXVoR)); } } ruoyi-modules/ruoyi-order/src/main/resources/bootstrap.yml
@@ -18,6 +18,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: @@ -26,6 +28,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -376,7 +376,7 @@ CASE toc.order_from WHEN 1 THEN '商城订单' WHEN 2 THEN CONCAT('平台秒杀活动(',toc.activity_name,')') WHEN 3 THEN '线下创建' END orderFromDesc, toc.activity_name activityName FROM t_order toc WHERE toc.del_flag = 0 AND toc.shop_id = #{param.shopId} WHERE toc.del_flag = 0 AND toc.shop_id = #{param.shopId} and if(toc.order_from = 1, 1 = 1, toc.order_status = 3)<!--临时增加过滤--> <if test="param.memberUserId != null and param.memberUserId != ''"> AND toc.user_id = #{param.memberUserId} </if> @@ -515,6 +515,7 @@ SELECT toc.order_id orderId, toc.order_no orderNo, toc.out_trade_no as outTradeNo, toc.user_id userId, toc.activity_name activityName, tog.goods_name goodsName, @@ -1724,7 +1725,7 @@ IFNULL(SUM(toc.change_receivable_money-IFNULL(CASE toc.pay_type WHEN 1 THEN toc.online_pay_money WHEN 2 THEN IFNULL(toc.offline_pay_money,0) END,0)),0) unpaidMoney, IFNULL(SUM(CASE toc.pay_type WHEN 2 THEN toc.online_pay_money ELSE 0 END),0) receivableDeposit FROM t_order toc WHERE toc.del_flag = 0 AND toc.shop_id = #{param.shopId} WHERE toc.del_flag = 0 AND toc.shop_id = #{param.shopId} and if(toc.order_from = 1, 1 = 1, toc.order_status = 3)<!--临时增加过滤--> <if test="param.memberUserId != null and param.memberUserId != ''"> AND toc.user_id = #{param.memberUserId} </if> ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java
@@ -364,6 +364,8 @@ } @RequestMapping(value = "/getMgtShopHFTXAuthInfo", method = RequestMethod.POST) @ApiOperation(value = "获取商户进件信息(汇付天下)") public R<MgtShopHFTXAuthGetVo> getMgtShopHFTXAuthInfo(@Validated @RequestBody MgtShopHFTXAuthGetDto mgtShopHFTXAuthGetDto){ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtShopHFTXAuthDto.java
@@ -140,4 +140,11 @@ private String legalMobileNo; @ApiModelProperty(value = "法人身份证地址", dataType = "string", required = true) private String legalAddr; @ApiModelProperty(value = "协议图片地址", dataType = "string", required = true) private String settleAgreePic; @ApiModelProperty(value = "协议图片地址20220606", dataType = "string", required = true) private String agreeBeginDate; @ApiModelProperty(value = "协议图片地址20220606", dataType = "string", required = true) private String agreeEndDate; } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopAuthenticationHftx.java
@@ -448,6 +448,26 @@ */ @TableField(value = "legal_addr") private String legalAddr; /** * 协议图片地址 */ @TableField(value = "settle_agree_pic") private String settleAgreePic; /** * 协议图片编号 */ @TableField(value = "settle_agree_pic_no") private String settleAgreePicNo; /** * 协议开始时间 */ @TableField(value = "agree_begin_date") private String agreeBeginDate; /** * 协议结束时间 */ @TableField(value = "agree_end_date") private String agreeEndDate; @Override ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopHFTXAuthGetVo.java
@@ -137,4 +137,12 @@ private String legalMobileNo; @ApiModelProperty(value = "法人身份证地址", dataType = "string", required = true) private String legalAddr; @ApiModelProperty(value = "协议图片地址", dataType = "string", required = true) private String settleAgreePic; @ApiModelProperty(value = "协议开始时间", dataType = "string", required = true) private String agreeBeginDate; @ApiModelProperty(value = "协议结束时间", dataType = "string", required = true) private String agreeEndDate; @ApiModelProperty(value = "审核结果;U:审核中,Y:审核通过,N:审核拒绝,F:失败", dataType = "string", required = true) private String auditStatus; } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -461,7 +461,7 @@ }else{ shop.setCooperativeFlag(0); } shop.setShopStatus(handelShopStatus(shop.getFrozenFlag(),shop.getCooperativeFlag(),shop.getAuthFlag(),shop.getAccountFlag())); shop.setShopStatus(handelShopStatus(shop.getFrozenFlag(),shop.getCooperativeFlag(),shop.getAuthFlag())); shop.setUpdateTime(new Date()); shop.setUpdateUserId(mgtTerminateCooperationDto.getUserId()); this.saveOrUpdate(shop); @@ -482,7 +482,7 @@ }else{ shop.setFrozenFlag(0); } shop.setShopStatus(handelShopStatus(shop.getFrozenFlag(),shop.getCooperativeFlag(),shop.getAuthFlag(),shop.getAccountFlag())); shop.setShopStatus(handelShopStatus(shop.getFrozenFlag(),shop.getCooperativeFlag(),shop.getAuthFlag())); this.saveOrUpdate(shop); } @@ -493,13 +493,13 @@ * @param * @return Integer */ private Integer handelShopStatus(Integer frozenFlag, Integer cooperativeFlag, Integer authFlag,Integer accountFlag){ private Integer handelShopStatus(Integer frozenFlag, Integer cooperativeFlag, Integer authFlag){ Integer shopStatus = 1; if(frozenFlag == 1){ shopStatus = 0; return shopStatus; } if(authFlag == 0 || accountFlag==0){ if(authFlag == 0){ shopStatus = 3; return shopStatus; } @@ -1123,7 +1123,7 @@ @Override public void mgtShopHFTXAuth(MgtShopHFTXAuthDto mgtShopHFTXAuthDto) { ShopAuthenticationHftx shopAuthenticationHftx = shopAuthenticationHftxService.getOne(new QueryWrapper<ShopAuthenticationHftx>().eq("shop_id", mgtShopHFTXAuthDto.getShopId())); if(null != shopAuthenticationHftx && "Y".equals(shopAuthenticationHftx.getAuditStatus())){ if(null != shopAuthenticationHftx && "U".equals(shopAuthenticationHftx.getAuditStatus())){ throw new ServiceException("不能重复进件"); } if(null == shopAuthenticationHftx){ @@ -1131,6 +1131,7 @@ shopAuthenticationHftx.setIsDelete(0); shopAuthenticationHftx.setInsertTime(new Date()); } String auditStatus = shopAuthenticationHftx.getAuditStatus(); BeanUtils.copyProperties(mgtShopHFTXAuthDto, shopAuthenticationHftx); shopAuthenticationHftx.setReqSeqId(IdUtils.simpleUUID()); shopAuthenticationHftx.setAuditStatus(""); @@ -1139,13 +1140,18 @@ * 开始调起进件接口 */ R<MerchantBasicdataVo> r = null; //用户 if(mgtShopHFTXAuthDto.getType() == 1){ //用户(重新提交) if((StringUtils.isEmpty(auditStatus) || "N".equals(auditStatus) || "F".equals(auditStatus)) && mgtShopHFTXAuthDto.getType() == 1){ r = HuiFuTianXiaUtil.merchantBasicdataIndv(mgtShopHFTXAuthDto, shopAuthenticationHftx, callback_path + "/shop/mgt/shop/merchantBasicdataNotify"); } //企业进件 if(mgtShopHFTXAuthDto.getType() == 2){ //企业进件(重新提交) if((StringUtils.isEmpty(auditStatus) || "N".equals(auditStatus) || "F".equals(auditStatus)) && mgtShopHFTXAuthDto.getType() == 2){ r = HuiFuTianXiaUtil.merchantBasicdataEnt(mgtShopHFTXAuthDto, shopAuthenticationHftx, callback_path + "/shop/mgt/shop/merchantBasicdataNotify"); } //修改资料 if("Y".equals(auditStatus)){ r = HuiFuTianXiaUtil.merchantBasicdataModify(mgtShopHFTXAuthDto, shopAuthenticationHftx, callback_path + "/shop/mgt/shop/merchantBasicdataNotify"); } if(null == r){ throw new ServiceException("参数异常"); @@ -1186,11 +1192,13 @@ if("Y".equals(data.getAuditStatus())){ Shop shop = this.getByShopId(shopAuthenticationHftx.getShopId()); shop.setShopStatus(1); shop.setAuthFlag(1); this.updateById(shop); } } return R.ok(data.getReqSeqId()); } /** * @description 获取平台商户统计 @@ -1651,13 +1659,17 @@ private void applySuccessUpdateShopStatus(Long shopId){ // 更新商户状态为正常 Shop shop = this.getById(shopId); Integer shopStatus = handelShopStatus(shop.getFrozenFlag(), shop.getCooperativeFlag(), 1,shop.getAccountFlag()); Integer shopStatus = handelShopStatus(shop.getFrozenFlag(), shop.getCooperativeFlag(), 1); LambdaUpdateWrapper<Shop> updateWrapper = Wrappers.lambdaUpdate(); updateWrapper.eq(Shop::getShopId, shopId) .set(Shop::getShopStatus, shopStatus) .set(Shop::getAuthFlag, 1); this.update(updateWrapper); } /** * @description @@ -1779,7 +1791,7 @@ ProfitSharingReceiverResult result = wechatPayUtils.addProfitSharingReceiver(request); if(StringUtils.isNotBlank(result.getAccount())){ shop.setAccountFlag(1); shop.setShopStatus(handelShopStatus(shop.getFrozenFlag(),shop.getCooperativeFlag(),shop.getAuthFlag(),1)); shop.setShopStatus(handelShopStatus(shop.getFrozenFlag(),shop.getCooperativeFlag(),shop.getAuthFlag())); this.saveOrUpdate(shop); } } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java
@@ -239,6 +239,8 @@ /** * @description 获取平台商户统计 * @author jqs ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java
@@ -20,6 +20,8 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.io.File; @@ -40,6 +42,7 @@ * @Date 2023/10/12 0:02 */ public class HuiFuTianXiaUtil { private static Logger logger = LoggerFactory.getLogger(HuiFuTianXiaUtil.class); //私钥(Base64编码) private static String privateKeyBase64 = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCs658vv/6VdoSGyxr7gVNxlsFGKC2RE4I3S3C78f7t29t6oSm7tdRUr+B/I1VtV1Ps2SQMqG+gUpLiVbHEj+U8PjrvSht6cBNpqhnUjBASEhO0zeCJXNj3zqEDj7CnzDbUzuZWZDyLEaSLRaVb/DSW34D0GDsGWpIMLui/lnubXCYMNsUJBgRmV/tSv7vApVok3aKDoYkZMDhfnKrbxTtWkDfwNLDCInB300YbGeN7hhECRestktymHw0I78x3g+pdzOKOSofqdHyBCemVgOBt2h+oulVU65jc5ok0vwhx7sk2+i3Dw/S/hx3fpnOAToLhpFSTCqArG5wOhiOTX5RRAgMBAAECggEAT+uu7VDdh5L5eZtR40BIos08kwJq3QyZOJlDh3o3ixP8gtcOBNXrRyDqr5hTGXAtN+C8SqVmwkCn5rgYq3KeTpOshYBI5vP55PJbceMyYke8l+o3hwVEunPj81NsIIHALedaij9VxCjpVf1gif0tCTZP0YGJdkxSCBN+O15/zrOred2xkbAGXCNM2j+uIOZ5LTQ064jUAm9KWO4JvVnlNCQPiJCfe652i4RE9adgTlT7d9XffQ/oZDZcDkD1OVUO4ErsSgvjsjPW9Qk8zAVm/C+ycs27GUbVf6yh3zMoL4JDshzoMYAVDqP3VkpYGiW71PzcOZqktcjbtCom4/gpqQKBgQDgHrsQVzMwr18gRAWl8PsgHyMvhyivzk7uPvm6nK9mvEGg7wnrCMKHkpEOCi4mHWnW6H9ptrkeAQbHN7H8Qd6JZm/H0VN8N8fg4IFarlrLWXET6s7or9btCf4aq8DGrU9C+7fcngSfuqlrSxy9e+9InmzUFGKVLBtYIJbG1r00qwKBgQDFhHhhc4WC1MrWLSGhpaNp+swPstfzUBeX2MtZOIv6yXTYPvJ77AAZoLnW482eUZucltCAUucEtTsop25dKdhbdhbVJ/YRRnaklBL2rai4HX+fjoV29tepJhrOrq3Ey+vqvDEsqrBz2C6YyJ6d9aaPPwCFsnDRO+g7tK9S4ZfC8wKBgGlhKbXqOnCW1RSXx0waPgoBegrb816OlABj7go3qCWXOQiRvMkdilIysS+3y7EyPVTGZzpupyYbd3Nulaq10gwq9T4wB6Atnjb3ePsJZjmdKZUi3/z6yQUVoLwrq+3/CXjGYNJEHop4Ozbuz2ms/3rWuvcRSrU3UvgiAqMlzzsXAoGAJY7xDSbYZm5sO5nNYV2L22UzVHDfm4bJVbiFwmt8Qq34J/6gQWw5AKaNcA1VVhuSiY4sC5q4Dy8fFrXvyItidtHXuaSlp9dMTDNT/9A52vjRAdgqDNsXWzTBuDeDF37nV3V9rE6wyvZ6tdbAQq0phOeoA8RQq5jGqkPLauk24H0CgYEAn92Ru9UuloMmTrJbpeeLmMkwCzKff4SpYSY3WzidjdlfHpyNqBUMYb5Ym3OplrSONT9o2H5mEQipjatiu0teILBT7j+f9ZJYQ3vUurAXbmKtthHuEV4lueylNUgmkv+dm295n2x79w1mk/0emJ/Qr9tz43dpSV/kRCxc+lX+OFk="; //公钥(Base64编码) @@ -101,7 +104,7 @@ body.put("product_id", product_id); body.put("sign", sign(data.toJSONString())); body.put("data", data); System.err.println(JSON.toJSONString(body)); logger.info(JSON.toJSONString(body)); HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); headers.put("Content-type","application/json; charset=utf-8"); @@ -526,7 +529,7 @@ headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); System.err.println(JSON.toJSONString(body)); logger.info(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result = execute.body(); execute.close(); @@ -716,7 +719,7 @@ body.put("product_id", product_id); body.put("sign", sign(data.toJSONString())); body.put("data", data); System.err.println(JSON.toJSONString(body)); logger.info(JSON.toJSONString(body)); HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); headers.put("Content-type","application/json; charset=utf-8"); @@ -752,6 +755,263 @@ /** * 修改商户信息 * @param dto * @param shopAuthenticationHftx * @param async_return_url * @return */ public static R<MerchantBasicdataVo> merchantBasicdataModify(MgtShopHFTXAuthDto dto, ShopAuthenticationHftx shopAuthenticationHftx, String async_return_url){ String url = "https://api.huifu.com/v2/merchant/basicdata/modify"; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); JSONObject data = new JSONObject(); data.put("req_seq_id", shopAuthenticationHftx.getReqSeqId()); data.put("req_date", sdf.format(new Date())); data.put("upper_huifu_id", channel_id); data.put("huifu_id", shopAuthenticationHftx.getHuifuId()); data.put("reg_name", dto.getRegName()); data.put("short_name", dto.getShortName()); data.put("ent_type", dto.getEntType()); data.put("license_code", dto.getLicenseCode()); data.put("license_validity_type", dto.getLicenseValidityType()); data.put("license_begin_date", dto.getLicenseBeginDate()); if("0".equals(dto.getLicenseValidityType())){ data.put("license_end_date", dto.getLicenseEndDate()); } data.put("reg_prov_id", dto.getRegProvId()); data.put("reg_area_id", dto.getRegAreaId()); data.put("reg_district_id", dto.getRegDistrictId()); data.put("reg_detail", dto.getRegDetail()); data.put("legal_name", dto.getLegalName()); data.put("legal_cert_type", dto.getLegalCertType()); data.put("legal_cert_no", dto.getLegalCertNo()); data.put("legal_cert_validity_type", dto.getLegalCertValidityType()); data.put("legal_cert_begin_date", dto.getLegalCertBeginDate()); if("0".equals(dto.getLegalCertValidityType())){ data.put("legal_cert_end_date", dto.getLegalCertEndDate()); } data.put("prov_id", dto.getProvId()); data.put("area_id", dto.getAreaId()); data.put("district_id", dto.getDistrictId()); data.put("detail_addr", dto.getDetailAddr()); data.put("contact_name", dto.getContactName()); data.put("contact_mobile_no", dto.getContactMobileNo()); data.put("contact_email", dto.getContactEmail()); data.put("service_phone", dto.getServicePhone()); data.put("busi_type", "1"); data.put("receipt_name", dto.getReceiptName()); data.put("mcc", "7297"); //结算卡信息配置 dto.setCertType("00"); dto.setCertValidityType("1"); if(StringUtils.hasLength(dto.getCertEndDate())){ dto.setCertValidityType("0"); } JSONObject card_info = new JSONObject(); card_info.put("card_type", dto.getCardType()); card_info.put("card_name", dto.getCardName()); card_info.put("card_no", dto.getCardNo()); if(!"0".equals(dto.getCardType())){ card_info.put("prov_id", dto.getJsProvId()); card_info.put("area_id", dto.getJsAreaId()); card_info.put("cert_type", dto.getCertType()); } if("0".equals(dto.getCardType())){ card_info.put("branch_code", dto.getBranchCode()); } card_info.put("cert_no", dto.getCertNo()); card_info.put("cert_validity_type", dto.getCertValidityType()); if("0".equals(dto.getCertValidityType())){ card_info.put("cert_end_date", dto.getCertEndDate()); } card_info.put("mp", dto.getMp()); data.put("card_info", card_info.toJSONString()); //取现信息配置 JSONArray jsonArray = new JSONArray(); JSONObject cash_config = new JSONObject(); cash_config.put("switch_state", "1"); cash_config.put("cash_type", "T1"); cash_config.put("fix_amt", "0.00"); jsonArray.add(cash_config); data.put("cash_config", jsonArray.toJSONString()); //结算规则配置 JSONObject settle_config = new JSONObject(); settle_config.put("settle_status", "1"); settle_config.put("settle_cycle", "T1"); settle_config.put("settle_pattern", "P0"); settle_config.put("settle_batch_no", "0"); settle_config.put("constant_amt", "0.00"); data.put("settle_config", settle_config.toJSONString()); //协议 JSONObject agreement_info = new JSONObject(); agreement_info.put("agreement_type", "1"); agreement_info.put("agree_begin_date", dto.getAgreeBeginDate()); agreement_info.put("agree_end_date", dto.getAgreeEndDate()); data.put("agreement_info", agreement_info.toJSONString()); //扩展资料包 JSONArray extended_material_list = new JSONArray(); data.put("async_return_url", async_return_url); // data.put("mer_icp", dto.getMerIcp()); data.put("mer_icp", ""); data.put("open_licence_no", dto.getOpenLicenceNo()); data.put("head_huifu_id", huifu_id); R<String> r = supplementaryPicture(dto.getRegAcctPic(), IdUtils.simpleUUID(), "F08"); if(r.getCode() == 200){ data.put("reg_acct_pic", r.getData()); shopAuthenticationHftx.setRegAcctPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } if(!"0".equals(dto.getCardType())){ r = supplementaryPicture(dto.getSettleCardFrontPic(), IdUtils.simpleUUID(), "F13"); if(r.getCode() == 200){ data.put("settle_card_front_pic", r.getData()); shopAuthenticationHftx.setSettleCardFrontPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } } r = supplementaryPicture(dto.getSettleCertBackPic(), IdUtils.simpleUUID(), "F56"); if(r.getCode() == 200){ data.put("settle_cert_back_pic", r.getData()); shopAuthenticationHftx.setSettleCertBackPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getSettleCertFrontPic(), IdUtils.simpleUUID(), "F55"); if(r.getCode() == 200){ data.put("settle_cert_front_pic", r.getData()); shopAuthenticationHftx.setSettleCertFrontPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getTaxRegPic(), IdUtils.simpleUUID(), "F58"); if(r.getCode() == 200){ data.put("tax_reg_pic", r.getData()); shopAuthenticationHftx.setTaxRegPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getLegalCertBackPic(), IdUtils.simpleUUID(), "F03"); if(r.getCode() == 200){ data.put("legal_cert_back_pic", r.getData()); shopAuthenticationHftx.setLegalCertBackPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getLegalCertFrontPic(), IdUtils.simpleUUID(), "F02"); if(r.getCode() == 200){ data.put("legal_cert_front_pic", r.getData()); shopAuthenticationHftx.setLegalCertFrontPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getLicensePic(), IdUtils.simpleUUID(), "F07"); if(r.getCode() == 200){ data.put("license_pic", r.getData()); shopAuthenticationHftx.setLicensePicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getSettleAgreePic(), IdUtils.simpleUUID(), "F116"); if(r.getCode() == 200){ JSONObject extended_material = new JSONObject(); extended_material.put("file_id", r.getData()); extended_material.put("file_type", "F480"); extended_material_list.add(extended_material); shopAuthenticationHftx.setSettleAgreePicNo(r.getData()); }else{ return R.fail(r.getMsg()); } if(!"0".equals(dto.getCardType()) && !dto.getLegalName().equals(dto.getCardName())){ r = supplementaryPicture(dto.getAuthEnturstPic(), IdUtils.simpleUUID(), "F15"); if(r.getCode() == 200){ data.put("auth_enturst_pic", r.getData()); shopAuthenticationHftx.setAuthEnturstPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } } data.put("extended_material_list", extended_material_list.toJSONString()); data.put("reg_capital", dto.getRegCapital()); data.put("business_scope", dto.getBusinessScope()); data.put("found_date", dto.getFoundDate()); data.put("scene_type", "OFFLINE"); r = supplementaryPicture(dto.getStoreHeaderPic(), IdUtils.simpleUUID(), "F22"); if(r.getCode() == 200){ data.put("store_header_pic", r.getData()); shopAuthenticationHftx.setStoreHeaderPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getStoreIndoorPic(), IdUtils.simpleUUID(), "F24"); if(r.getCode() == 200){ data.put("store_indoor_pic", r.getData()); shopAuthenticationHftx.setStoreIndoorPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getStoreCashierDeskPic(), IdUtils.simpleUUID(), "F105"); if(r.getCode() == 200){ data.put("store_cashier_desk_pic", r.getData()); shopAuthenticationHftx.setStoreCashierDeskPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } data.put("legal_mobile_no", dto.getLegalMobileNo()); data.put("legal_addr", dto.getLegalAddr()); JSONObject body = new JSONObject(); body.put("sys_id", huifu_id); body.put("product_id", product_id); body.put("sign", sign(data.toJSONString())); body.put("data", data); HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); headers.put("Content-type","application/json; charset=utf-8"); headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); logger.info(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result = execute.body(); execute.close(); if(!StringUtils.hasLength(result)){ return R.fail("请求异常"); } JSONObject jsonObject = JSON.parseObject(result); JSONObject resultData = jsonObject.getJSONObject("data"); String resp_code = resultData.getString("resp_code"); String resp_desc = resultData.getString("resp_desc"); //处理成功 String success1 = "00000000"; //交易正在处理中 String success2 = "00000100"; //审核中 String success3 = "90000000"; MerchantBasicdataVo vo = new MerchantBasicdataVo(); if(success1.equals(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){ vo.setStatus(success1.equals(resp_code) ? 1 : success3.equals(resp_code) ? 2 : 3); vo.setHuifuId(resultData.getString("huifu_id")); vo.setApplyNo(resultData.getString("apply_no")); vo.setTokenNo(resultData.getString("token_no")); return R.ok(vo); } return R.fail(resp_desc); } /** * 查询商户信息 * @param huifuId * @return @@ -775,7 +1035,7 @@ headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); System.err.println(JSON.toJSONString(body)); logger.info(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result = execute.body(); execute.close(); @@ -842,7 +1102,7 @@ if (statusCode == org.apache.http.HttpStatus.SC_OK) { HttpEntity resEntity = response.getEntity(); result = EntityUtils.toString(resEntity); System.err.println(result); logger.info(result); } if(!StringUtils.hasLength(result)){ return R.fail("请求异常"); @@ -990,6 +1250,7 @@ } public static void main(String[] args) { HuiFuTianXiaUtil.getMerchantBasicdataSettlement(IdUtils.simpleUUID(), "6666000141251275", "20231023", "20231023", "1", "10"); R<List<MerchantBasicdataSettlementVo>> merchantBasicdataSettlement = HuiFuTianXiaUtil.getMerchantBasicdataSettlement(IdUtils.simpleUUID(), "6666000141606205", "20231110", "20231116", "1", "10"); System.err.println(JSON.toJSONString(merchantBasicdataSettlement)); } } ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml
@@ -18,6 +18,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: @@ -26,6 +28,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 @@ -48,3 +52,4 @@ privateCertPath: /home/cert/apiclient_cert.pem callback_path: https://wxapp.hhhrt.cn #callback_path: http://8.137.105.173 ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
@@ -22,6 +22,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: @@ -30,6 +32,8 @@ # server-addr: 127.0.0.1:8848 #pro namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #test # namespace: e1a7e419-e8c7-4d7d-8a0a-c00ab6ccfccd #dev # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 @@ -42,6 +46,8 @@ max-file-size: 100MB max-request-size: 200MB location: /home/temp #生产环境 wx: cp: corpId: ww11400938eb1b91bc @@ -52,5 +58,16 @@ token: HaiHeng2023 encodingAESKey: jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C #测试环境 #wx: # cp: # corpId: ww11400938eb1b91bc # agentId: 1000038 # agentSecret: vt0bmrBPWi1TrRu8lisv5IT5ZDOuxNNLNaGwcZkHLgc # authorizeState: HONGRUITANG # addressSecret: D5rirpvzRnygC0RncaUdooxAwvXTA7In9dqvPHvnV4w # token: HaiHeng2023 # encodingAESKey: jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C