From 1a66508ad3d73dcc456162c553b03f2208570b51 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 31 Aug 2022 16:15:54 +0800 Subject: [PATCH] 20220822 --- src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java | 32 ++++ src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java | 19 ++ src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java | 2 src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java | 6 src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java | 32 ++-- src/main/resources/application-prod.yml | 1 src/main/resources/application-test.yml | 1 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java | 2 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 25 +++ src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java | 7 src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java | 107 +++++++++++++++ src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java | 6 src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java | 13 + src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java | 3 src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java | 32 ++++ src/main/resources/application-dev.yml | 1 src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java | 5 src/main/resources/mapper/modules/MallMoneyFlowMapper.xml | 5 src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html | 72 ++++++++++ src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java | 2 20 files changed, 350 insertions(+), 23 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java index 936282e..46fea59 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java @@ -14,6 +14,9 @@ //范围参数 RANGE_SWITCH("RANGE_SETTING", "RANGE_SWITCH"), RANGE_SIZE("RANGE_SETTING", "RANGE_SIZE"), + //团长返利参数 + BONUS_SWITCH("LEADERBONUS_SETTING", "BONUS_SWITCH"), + BONUS_PERCENT("LEADERBONUS_SETTING", "BONUS_PERCENT"), SCORE_SIGN_SETTING("SCORE_SETTING", "SCORE_SIGN_SETTING"), STATIC_BONUS("BONUS_TYPE", "STATIC_BONUS"), diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java index 7af4142..fde427e 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java @@ -88,7 +88,12 @@ /** * 抽奖 */ - PRIZE(17); + PRIZE(17), + + /** + * 充值 + */ + RECHARGE(18); private final int value; diff --git a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java index 1077d2d..a261795 100644 --- a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java +++ b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java @@ -16,6 +16,8 @@ private String xcxSecret; private String wecharPaynotifyUrl; + + private String wecharRechargePaynotifyUrl; //测试支付的开关,true:支付0.01元 private Boolean debug; //支付证书地址 diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java index f1ae202..add177a 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java @@ -4,14 +4,15 @@ import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.mall.dto.AdminLeaderAddDto; import cc.mrbird.febs.mall.dto.AdminLeaderUpdateDto; import cc.mrbird.febs.mall.dto.ApiApplayLeaderDto; -import cc.mrbird.febs.mall.entity.MallGoodsCategory; -import cc.mrbird.febs.mall.entity.MallLeaderStock; -import cc.mrbird.febs.mall.entity.MallMember; -import cc.mrbird.febs.mall.entity.MallTeamLeader; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.service.IAdminMallTeamLeaderService; +import cc.mrbird.febs.mall.vo.AdminLeaderBonusSettingVo; +import cc.mrbird.febs.mall.vo.AdminRangeSettingVo; import cc.mrbird.febs.mall.vo.AdminSelectListLeaderVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,6 +33,7 @@ private final IAdminMallTeamLeaderService iAdminMallTeamLeaderService; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; /** * 团长信息--列表 @@ -91,4 +93,26 @@ return new FebsResponse().success().data(dataTable); } + + + /** + * 团长每日分成设置 -- 更新 + */ + @PostMapping(value = "/leaderBonusSetUpdate") + public FebsResponse leaderBonusSetUpdate(AdminLeaderBonusSettingVo adminLeaderBonusSettingVo) { + Integer bonusSwitch = adminLeaderBonusSettingVo.getBonusSwitch(); + DataDictionaryCustom bonusSwitchDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_SWITCH.getType(), DataDictionaryEnum.BONUS_SWITCH.getCode()); + bonusSwitchDic.setValue(bonusSwitch.toString()); + dataDictionaryCustomMapper.updateById(bonusSwitchDic); + + Double bonusPercent = adminLeaderBonusSettingVo.getBonusPercent(); + if(1 <= bonusPercent || 0 >= bonusPercent){ + return new FebsResponse().fail().message("请输入合适的百分比小数"); + } + DataDictionaryCustom bonusPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode()); + bonusPercentDic.setValue(bonusPercent.toString()); + dataDictionaryCustomMapper.updateById(bonusPercentDic); + return new FebsResponse().success(); + } + } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java index 034e190..79d6d3f 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java @@ -186,4 +186,10 @@ return null; } + @ApiOperation(value = "充值余额") + @PostMapping(value = "/rechargeWallet") + public FebsResponse rechargeWallet(@RequestBody @Validated ApiRechargeWalletDto apiRechargeWalletDto) { + return memberService.rechargeWallet(apiRechargeWalletDto); + } + } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java index ed1ab23..18c4ba6 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java @@ -5,11 +5,10 @@ import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.utils.FebsUtil; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; -import cc.mrbird.febs.mall.service.IAdminMallOrderService; +import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.service.IAdminMallTeamLeaderService; -import cc.mrbird.febs.mall.vo.AdminMallOrderVo; +import cc.mrbird.febs.mall.vo.AdminLeaderBonusSettingVo; import cc.mrbird.febs.mall.vo.AdminMallTeamLeaderVo; -import cc.mrbird.febs.mall.vo.AdminRangeSettingVo; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -25,6 +24,7 @@ public class ViewMallTeamLeaderController extends BaseController { private final IAdminMallTeamLeaderService iAdminMallTeamLeaderService; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; /** * 团长信息--列表 @@ -71,20 +71,16 @@ */ @GetMapping("/leaderBonusSetting") public String deliverySetting(Model model) { -// AdminRangeSettingVo adminRangeSettingVo = new AdminRangeSettingVo(); -// DataDictionaryCustom deliverySetting = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.HOME_DELIVERY_AMOUNT.getType(), DataDictionaryEnum.HOME_DELIVERY_AMOUNT.getCode()); -// if (ObjectUtil.isNotNull(deliverySetting)) { -// adminRangeSettingVo.setHomeDeliveryAmount(Double.parseDouble(deliverySetting.getValue())); -// } -// DataDictionaryCustom rangeSwitch = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SWITCH.getType(), DataDictionaryEnum.RANGE_SWITCH.getCode()); -// if (ObjectUtil.isNotNull(rangeSwitch)) { -// adminRangeSettingVo.setRangeSwitch(Integer.parseInt(rangeSwitch.getValue())); -// } -// DataDictionaryCustom rangeSize = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SIZE.getType(), DataDictionaryEnum.RANGE_SIZE.getCode()); -// if (ObjectUtil.isNotNull(rangeSize)) { -// adminRangeSettingVo.setRangeSize(Integer.parseInt(rangeSize.getValue())); -// } -// model.addAttribute("deliverySetting", adminRangeSettingVo); - return FebsUtil.view("modules/goods/deliverySetting"); + AdminLeaderBonusSettingVo adminLeaderBonusSettingVo = new AdminLeaderBonusSettingVo(); + DataDictionaryCustom bonusSwitch = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_SWITCH.getType(), DataDictionaryEnum.BONUS_SWITCH.getCode()); + if (ObjectUtil.isNotNull(bonusSwitch)) { + adminLeaderBonusSettingVo.setBonusSwitch(Integer.parseInt(bonusSwitch.getValue())); + } + DataDictionaryCustom bonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode()); + if (ObjectUtil.isNotNull(bonusPercent)) { + adminLeaderBonusSettingVo.setBonusPercent(Double.parseDouble(bonusSwitch.getValue())); + } + model.addAttribute("leaderBonusSetting", adminLeaderBonusSettingVo); + return FebsUtil.view("modules/leader/leaderBonusSetting"); } } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java new file mode 100644 index 0000000..fc8ea85 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java @@ -0,0 +1,19 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(value = "ApiRechargeWalletDto", description = "余额充值接收类") +public class ApiRechargeWalletDto { + + @ApiModelProperty(value = "充值金额", example = "10") + private BigDecimal amount; + + @ApiModelProperty(hidden = true) + private Long memberId; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java index eaa05c6..01c7027 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java @@ -37,4 +37,6 @@ BigDecimal selectCommissionIncome(@Param("type") Integer type, @Param("date") Date date, @Param("memberId") Long memebrid); BigDecimal selectThankfulCommission(@Param("date") Date date, @Param("memberId") Long memberId); + + MallMoneyFlow selectOneByOrderNoAndMemberId(@Param("rechargeNo")String rechargeNo, @Param("memberId")Long memberId); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java index 02f6bb7..e07d737 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java @@ -73,4 +73,6 @@ FebsResponse xcxPhoneLogin(ApiXcxPhoneLoginDto apiXcxPhoneLoginDto); FebsResponse xcxOpen(ApiXcxOpenDto apiXcxOpenDto); + + FebsResponse rechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java index 2203ca0..fb65cc4 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java @@ -17,6 +17,8 @@ import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.mall.vo.*; +import cc.mrbird.febs.pay.model.BrandWCPayRequestData; +import cc.mrbird.febs.pay.service.IXcxPayService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; @@ -25,6 +27,7 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -730,6 +733,28 @@ return new FebsResponse().success().data(1); } + private final IXcxPayService iXcxPayService; + + @Override + @Transactional(rollbackFor = Exception.class) + public FebsResponse rechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + BigDecimal amount = apiRechargeWalletDto.getAmount(); + if(BigDecimal.ZERO.compareTo(amount)>0){ + return new FebsResponse().fail().message("请输入正确的充值金额"); + } + apiRechargeWalletDto.setMemberId(memberId); + BrandWCPayRequestData brandWCPayRequestData = null; + try { + brandWCPayRequestData = iXcxPayService.startRechargeWallet(apiRechargeWalletDto); + } catch (Exception e) { + throw new FebsException("支付失败"); + } + String wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); + String payResultStr = brandWCPayRequestData.getPrepay_id(); + return new FebsResponse().success().message("充值即将到账"); + } + private String getXcxLoginUrl(String code) { String wechatLoginUrl =xcxProperties.getWecharLoginUrl(); return String.format(wechatLoginUrl, xcxProperties.getXcxAppid(), xcxProperties.getXcxSecret(), code); diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java new file mode 100644 index 0000000..576ea5b --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java @@ -0,0 +1,13 @@ +package cc.mrbird.febs.mall.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(value = "AdminLeaderBonusSettingVo", description = "信息返回类") +public class AdminLeaderBonusSettingVo { + //团长返利开关1:开启2:关闭 + private Integer bonusSwitch; + //返利百分比 + private Double bonusPercent; +} diff --git a/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java b/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java index 3a74c5e..93b09e9 100644 --- a/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java +++ b/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java @@ -6,8 +6,13 @@ import cc.mrbird.febs.common.properties.XcxProperties; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextHolder; +import cc.mrbird.febs.mall.entity.MallMemberWallet; +import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.entity.MallOrderInfo; +import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper; +import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; +import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.pay.model.NotifyData; import cc.mrbird.febs.pay.model.OrderStateDto; import cc.mrbird.febs.pay.model.OrderStateMsgVo; @@ -18,6 +23,9 @@ import cc.mrbird.febs.pay.util.Signature; import cc.mrbird.febs.pay.util.Util; import cc.mrbird.febs.pay.util.WechatConfigure; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -48,13 +56,112 @@ @Autowired MallOrderInfoMapper mallOrderInfoMapper; @Autowired + MallMoneyFlowMapper mallMoneyFlowMapper; + @Autowired + MallMemberWalletMapper mallMemberWalletMapper; + @Autowired RedisUtils redisUtils; + @Autowired + private IApiMallMemberWalletService memberWalletService; @Autowired private IXcxPayService iXcxPayService; private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class); /** + * 微信充值回调接口 + */ + @Transactional(rollbackFor = Exception.class) + @RequestMapping(value = "/rechargeCallBack") + public void rechargeCallBack(HttpServletResponse response, HttpServletRequest request) throws IOException { + log.info("微信充值回调start...."); + + // 获取输入参数 + String inputLine; + StringBuffer notityXml = new StringBuffer(); + String resXml = ""; + +// String attrStr = "{'rechargeNo':"+rechargeNo+",'memberId':"+mallMember.getId()+"}"; + String attrStr = ""; + + FebsResponse threadResult = new FebsResponse(); + try { + while ((inputLine = request.getReader().readLine()) != null) { + notityXml.append(inputLine); + } + request.getReader().close(); + log.info("notityXml ---- :{} ", notityXml); + + + // XMl转对象 + Object bb = Util.getObjectFromXML(notityXml.toString(), NotifyData.class); + NotifyData data = new NotifyData(); + BeanUtils.copyProperties(bb,data); + log.info("----return_code = {}", data.getReturn_code()); + // 返回状态码 SUCCESS/FAIL + if (WechatConfigure.CODE_SUCCESS.equals(data.getReturn_code())) { + attrStr = data.getAttach(); + JSONObject jsonObject = JSONUtil.parseObj(attrStr); + String rechargeNo = (String) jsonObject.get("rechargeNo"); + Long memberId = (Long) jsonObject.get("memberId"); + // 检验订单状态 + MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectOneByOrderNoAndMemberId(rechargeNo,memberId); + // 校验签名 +// String paySecret = WechatConfigure.WECHARPAY_SECRET; + String paySecret = xcxProperties.getWecharpaySecret(); + if (Signature.checkIsSignValidFromResponseString(notityXml.toString(),paySecret)) { + // 校验业务结果 + if (WechatConfigure.CODE_SUCCESS.equals(data.getResult_code())) { + // 返回SUCCESS报文 + resXml = WechatConfigure.RESULT_XML_SUCCESS; + // 支付费用 + Double total_fee = Double.parseDouble(data.getTotal_fee()); + // 商户订单号 + String payNum = data.getOut_trade_no(); + + log.info("支付回调关键信息---total_fee:{},payNum:{},rechargeNo:{}", total_fee, payNum, rechargeNo); + // 订单ID + BigDecimal payMoney = new BigDecimal(total_fee).divide(new BigDecimal(100), 2, + RoundingMode.HALF_UP); + + if (ObjectUtil.isNotEmpty(mallMoneyFlow)) { + log.debug("检查支付金额payMoney={},mallMoneyFlow.getPayMoney()={}", payMoney, mallMoneyFlow.getAmount()); + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + if(ObjectUtil.isNotEmpty(mallMemberWallet)){ + memberWalletService.addBalance(payMoney,memberId); + } + threadResult.success().message("充值成功"); + } else { + log.info("充值失败", attrStr); + } + } else { + log.info("微信标识业务是失败"); + threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:001)"); +// resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败"); + } + } else { + log.info("无效签名"); + threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:002)"); +// resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败"); + } + } else { + log.info("通信标识失败"); + threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:003)"); +// resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "通信标识失败"); + } + } catch (Exception e) { + log.error("支付回调签名错误", e); + threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:004)"); +// resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "支付回调签名错误"); + } finally { + // 通知线程消息 +// PayThreadPool.notifyThread(Integer.valueOf(orderId), threadResult); + sendResultBack(response, resXml); + } + return; + + } + /** * 微信支付回调接口 */ @Transactional(rollbackFor = Exception.class) diff --git a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java index c4cd3f7..f582915 100644 --- a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java +++ b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java @@ -1,6 +1,7 @@ package cc.mrbird.febs.pay.service; import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.pay.model.BrandWCPayRequestData; import cc.mrbird.febs.pay.model.OrderStateDto; @@ -31,4 +32,9 @@ * 生成小程序二维码 */ FebsResponse generateQrCode(WxGenerateQrCodeDto wxGenerateQrCodeDto); + + /** + * 发起充值(创建预付订单) + */ + BrandWCPayRequestData startRechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) throws Exception; } diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java index d8c3a2f..794a2e3 100644 --- a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java @@ -2,10 +2,14 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; +import cc.mrbird.febs.common.enumerates.FlowTypeEnum; +import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.properties.XcxProperties; +import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.common.utils.OssUtils; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextHolder; +import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallOrderInfo; @@ -13,6 +17,7 @@ import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; +import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.pay.model.*; import cc.mrbird.febs.pay.service.IXcxPayService; import cc.mrbird.febs.pay.util.WechatConfigure; @@ -54,6 +59,7 @@ WeixinServiceUtil weixinServiceUtil; @Autowired private DataDictionaryCustomMapper dataDictionaryCustomMapper; + private final IMallMoneyFlowService mallMoneyFlowService; @Autowired RedisUtils redisUtils; @@ -62,6 +68,32 @@ private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class); @Override + public BrandWCPayRequestData startRechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) throws Exception { + BigDecimal unit = new BigDecimal("100"); + BigDecimal money = new BigDecimal(apiRechargeWalletDto.getAmount().toString()); + BrandWCPayRequestData payData; + String productNames = "小程序充值"; + MallMember mallMember = mallMemberMapper.selectById(apiRechargeWalletDto.getMemberId()); + String rechargeNo = "CZ_"+MallUtils.getOrderNum(); + Boolean debug = xcxProperties.getDebug(); + String attrStr = "{'rechargeNo':"+rechargeNo+",'memberId':"+mallMember.getId()+"}"; + if (debug) { + payData = weixinServiceUtil.createRechargeWallet("[测试]" + productNames, rechargeNo, + 1, mallMember.getOpenId(), attrStr); + } else { + payData = weixinServiceUtil.createRechargeWallet(productNames, rechargeNo, + unit.multiply(money).intValue(),mallMember.getOpenId(), attrStr); + } + mallMoneyFlowService.addMoneyFlow( + mallMember.getId(), + money, + MoneyFlowTypeEnum.RECHARGE.getValue(), + rechargeNo, + FlowTypeEnum.BALANCE.getValue()); + return payData; + } + + @Override public BrandWCPayRequestData startPayment(MallOrderInfo mallOrderInfo) throws Exception { BigDecimal unit = new BigDecimal("100"); BigDecimal money = new BigDecimal(mallOrderInfo.getAmount().toString()); diff --git a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java index 3c6d58d..8da26bb 100644 --- a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java +++ b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java @@ -40,6 +40,11 @@ return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharPaynotifyUrl); } + public BrandWCPayRequestData createRechargeWallet(String desc, String outTradeNo, int price, String openId, String attach) throws Exception { + String wecharRechargePaynotifyUrl = xcxProperties.getWecharRechargePaynotifyUrl(); + return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharRechargePaynotifyUrl); + } + private BrandWCPayRequestData buildBrandWCPayRequestData(String desc, String outTradeNo, int price, String openId, String attach, String notifyUrl) throws Exception { // 创建微信支付预付接口 JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 98fed55..ecd832d 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -69,6 +69,7 @@ xcx_secret: 8d3d3c14221f7dc37650b861dc0fc570 debug: false wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback + wecharRechargePaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/rechargeCallBack certLocalPath: /home/yyscCert/apiclient_cert.p12 wecharpayMchid: 1631084809 wecharpaySecret: YYSC13875978057YYSC13875978057SH diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 6e1a607..8f67763 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -65,6 +65,7 @@ xcx_secret: 8d3d3c14221f7dc37650b861dc0fc570 debug: false wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback + wecharRechargePaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/rechargeCallBack certLocalPath: /home/yyscCert/apiclient_cert.p12 wecharpayMchid: 1631084809 wecharpaySecret: YYSC13875978057YYSC13875978057SH diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index e494984..8e0da64 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -74,6 +74,7 @@ xcx_secret: 8d3d3c14221f7dc37650b861dc0fc570 debug: false wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback + wecharRechargePaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/rechargeCallBack certLocalPath: /home/yyscCert/apiclient_cert.p12 wecharpayMchid: 1631084809 wecharpaySecret: YYSC13875978057YYSC13875978057SH diff --git a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml index 33d93b7..f94d009 100644 --- a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml +++ b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml @@ -131,4 +131,9 @@ and date_format(created_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') and type in (2,3,4) </select> + + <select id="selectOneByOrderNoAndMemberId" resultType="cc.mrbird.febs.mall.entity.MallMoneyFlow"> + select a.* from mall_money_flow a + where a.order_no = #{} and a.member_id = #{memberId} + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html b/src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html new file mode 100644 index 0000000..ecd9588 --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html @@ -0,0 +1,72 @@ +<div class="layui-fluid layui-anim febs-anim" id="leader-bonus-setting" lay-title="团长返利设置"> + <div class="layui-row layui-col-space8 febs-container"> + <form class="layui-form" action="" lay-filter="leader-bonus-setting-form"> + <div class="layui-card"> + <div class="layui-card-body"> + <div class="layui-form-item"> + <label class="layui-form-label">返利开关:</label> + <div class="layui-input-block"> + <input type="radio" name="bonusSwitch" value="1" title="开启"> + <input type="radio" name="bonusSwitch" value="2" title="关闭"> + </div> + <div class="layui-form-mid layui-word-aux">返利开关,开启之后,团长按照每天按返利百分比,返还业绩</div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">返利百分比:</label> + <div class="layui-input-inline" style="width: 200px"> + <input type="text" name="bonusPercent" data-th-id="${leaderBonusSetting.bonusPercent}" + lay-verify="required" autocomplete="off" class="layui-input" > + <div class="layui-form-mid layui-word-aux">(填入0到1之间的小数)</div> + </div> + <div class="layui-form-mid">如0.15,表示返利百分比为15%</div> + </div> + </div> + <div class="layui-card-footer"> + <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="leader-bonus-setting-form-submit" id="submit">保存</button> + </div> + </div> + </form> + </div> +</div> +<style> + .layui-form-label { + width: 120px; + } + + .layui-form-item .layui-input-block { + margin-left: 150px; + } + + .layui-table-form .layui-form-item { + margin-bottom: 20px !important; + } +</style> +<script data-th-inline="javascript" type="text/javascript"> + layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree'], function () { + var $ = layui.jquery, + febs = layui.febs, + form = layui.form, + validate = layui.validate, + leaderBonusSetting = [[${leaderBonusSetting}]], + $view = $('#leader-bonus-setting'); + + form.verify(validate); + form.render(); + initUserValue(); + + function initUserValue() { + form.val("leader-bonus-setting-form", { + "bonusSwitch": leaderBonusSetting.bonusSwitch, + "bonusPercent": leaderBonusSetting.bonusPercent + }); + } + + form.on('submit(leader-bonus-setting-form-submit)', function (data) { + console.log(data); + febs.post(ctx + 'admin/leader/leaderBonusSetUpdate', data.field, function (res) { + febs.alert.success('设置成功'); + }); + return false; + }); + }); +</script> \ No newline at end of file -- Gitblit v1.9.1