Sfoglia il codice sorgente

zyp --红包修改

zyp 2 mesi fa
parent
commit
1dc0fca274

+ 4 - 6
fs-service-system/pom.xml

@@ -16,11 +16,9 @@
     </description>
 
     <properties>
-        <weixin-java-cp.version>4.4.0</weixin-java-cp.version>
-        <weixin-java-miniapp.version>4.4.0</weixin-java-miniapp.version>
-        <weixin-java-cp.version>4.4.0</weixin-java-cp.version>
-        <weixin-java-miniapp.version>4.4.0</weixin-java-miniapp.version>
-        <weixin-java-mp.version>4.4.0</weixin-java-mp.version>
+        <weixin-java-cp.version>4.7.0</weixin-java-cp.version>
+        <weixin-java-miniapp.version>4.7.0</weixin-java-miniapp.version>
+        <weixin-java-mp.version>4.7.0</weixin-java-mp.version>
     </properties>
     <dependencies>
         <!-- 通用工具-->
@@ -89,7 +87,7 @@
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-pay</artifactId>
-            <version>4.6.5.B</version>
+            <version>4.7.2.B</version>
         </dependency>
         <dependency>
             <groupId>com.github.binarywang</groupId>

+ 1 - 0
fs-service-system/src/main/java/com/fs/course/config/CourseConfig.java

@@ -16,5 +16,6 @@ public class CourseConfig implements Serializable {
     private String realLinkDomainName;//真链域名
     private String courseDomainName;//链接域名
     private Integer rewardType; // 奖励类型 1红包 2积分
+    private Integer redPacketMode;//红包模式 1总公司 2销售公司
 
 }

+ 3 - 1
fs-service-system/src/main/java/com/fs/course/config/RedPacketConfig.java

@@ -6,7 +6,9 @@ import java.io.Serializable;
 
 @Data
 public class RedPacketConfig implements Serializable {
-    private String appId;
+    private String appId;//公众号appId
+
+    private String miniappId;//小程序appId
     /**
      * 商户号.
      */

+ 109 - 84
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.course.service.impl;
 
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.BeanCopyUtils;
@@ -561,110 +562,134 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Override
     @Transactional
     public R sendReward(FsCourseSendRewardUParam param) {
+        // 获取用户信息
         FsUser user = fsUserMapper.selectFsUserByUserId(param.getUserId());
-        if (StringUtils.isEmpty(user.getMpOpenId())){
-            return R.error("未识别到领取信息");
-        }
+//        if (StringUtils.isEmpty(user.getMpOpenId())){
+//            return R.error("未识别到领取信息");
+//        }
         FsCourseWatchLog log = new FsCourseWatchLog();
 
-        //判断链接类型
-        if (param.getLinkType()!=null&&param.getLinkType()==1){
-            FsCourseRedPacketLog packetLog = redPacketLogMapper.selectFsCourseRedPacketLogByTemporary(param.getVideoId(),param.getUserId());
-            if (packetLog!=null){
+        // 根据链接类型判断是否已发放奖励
+        if (param.getLinkType() != null && param.getLinkType() == 1) {
+            FsCourseRedPacketLog packetLog = redPacketLogMapper.selectFsCourseRedPacketLogByTemporary(param.getVideoId(), param.getUserId());
+            if (packetLog != null) {
                 return R.error("奖励已发放");
             }
-        }else {
-            log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(),param.getVideoId(),param.getQwUserId(),param.getQwExternalId());
-            if (log==null){
+        } else {
+            log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(), param.getVideoId(), param.getQwUserId(), param.getQwExternalId());
+            if (log == null) {
                 return R.error("无记录");
             }
-            if (log.getRewardType()!=null){
+            if (log.getRewardType() != null) {
                 return R.error("奖励已发放");
             }
         }
 
+        // 获取视频信息
         FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(param.getVideoId());
 
-        // 获取配置
+        // 获取配置信息
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
 
-        //发放奖励
-        switch (config.getRewardType()){
-            //红包奖励
+        // 根据奖励类型发放不同奖励
+        switch (config.getRewardType()) {
+            // 红包奖励
             case 1:
-                BigDecimal amount = BigDecimal.ZERO;
-                FsUserCourseVideoRedPackage redPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyId(param.getVideoId(), param.getCompanyId());
-                WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
-
-                if (redPackage!=null){
-                    amount = redPackage.getRedPacketMoney();
-                }else if (video!=null){
-                    amount = new BigDecimal(video.getRedPacketMoney());
-                }
-                packetParam.setOpenId(user.getMpOpenId());
-                packetParam.setAmount(amount);
-                R sendRedPacket = paymentService.sendRedPacket(packetParam);
-                if (sendRedPacket.get("code").equals(200)){
-                    //添加红包记录
-                    FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
-                    redPacketLog.setCourseId(param.getCourseId());
-                    redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
-                    redPacketLog.setCompanyId(param.getCompanyId());
-                    redPacketLog.setUserId(param.getUserId());
-                    redPacketLog.setVideoId(param.getVideoId());
-                    redPacketLog.setStatus(0);
-                    redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null );
-                    redPacketLog.setCompanyUserId(param.getCompanyUserId());
-                    redPacketLog.setCreateTime(new Date());
-                    redPacketLog.setAmount(amount);
-                    redPacketLog.setWatchLogId(log.getLogId() !=null ? log.getLogId() : null);
-                    redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
-                    if (param.getLinkType()==null || param.getLinkType()==0){
-                        log.setRewardType(config.getRewardType());
-                        courseWatchLogMapper.updateFsCourseWatchLog(log);
-                    }
-                    return R.ok("奖励发放成功");
-                }else {
-                    return R.error("奖励发送失败,请联系客服");
-                }
-            //积分奖励
+                return sendRedPacketReward(param, user, log, video, config);
+            // 积分奖励
             case 2:
-                //增加积分
-                FsUser userMap=new FsUser();
-                userMap.setUserId(user.getUserId());
-//                userMap.setIntegral(user.getIntegral()+config.getAnswerIntegral());
-                fsUserMapper.updateFsUser(userMap);
-                FsUserIntegralLogs integralLogs = new FsUserIntegralLogs();
-//                integralLogs.setIntegral(config.getAnswerIntegral().longValue());
-                integralLogs.setUserId(user.getUserId());
-                integralLogs.setBalance(userMap.getIntegral());
-                integralLogs.setLogType(17);
-                integralLogs.setBusinessId(StringUtils.isNotEmpty(log.getLogId().toString()) ? log.getLogId().toString() : null);
-                integralLogs.setCreateTime(new Date());
-                fsUserIntegralLogsMapper.insertFsUserIntegralLogs(integralLogs);
-                if (param.getLinkType()==null || param.getLinkType()==0 ){
-                    log.setRewardType(config.getRewardType());
-                    courseWatchLogMapper.updateFsCourseWatchLog(log);
-                    //转换红包
-                    FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
-                    redPacketLog.setCourseId(param.getCourseId());
-                    redPacketLog.setOutBatchNo(integralLogs.getId().toString());
-                    redPacketLog.setCompanyId(param.getCompanyId());
-                    redPacketLog.setUserId(param.getUserId());
-                    redPacketLog.setVideoId(param.getVideoId());
-                    redPacketLog.setStatus(1);
-                    redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null );
-                    redPacketLog.setCompanyUserId(param.getCompanyUserId());
-                    redPacketLog.setCreateTime(new Date());
-                    redPacketLog.setAmount(BigDecimal.valueOf(config.getAnswerIntegral()).divide(BigDecimal.valueOf(1000)));
-                    redPacketLog.setRemark("点播答题领取积分转");
-                    redPacketLog.setWatchLogId(log.getLogId() !=null ? log.getLogId() : null);
-                    redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
-                }
-                return R.ok("奖励发放成功");
+                return sendIntegralReward(user, log, config);
             default:
                 return R.error("参数错误!");
         }
     }
+    
+    /**
+     * 发放红包奖励
+     * 
+     * @param param 请求参数
+     * @param user 用户信息
+     * @param log 观看日志
+     * @param video 视频信息
+     * @param config 配置信息
+     * @return 处理结果
+     */
+    private R sendRedPacketReward(FsCourseSendRewardUParam param, FsUser user, FsCourseWatchLog log, FsUserCourseVideo video, CourseConfig config) {
+        // 确定红包金额
+        BigDecimal amount = BigDecimal.ZERO;
+        FsUserCourseVideoRedPackage redPackage = fsUserCourseVideoRedPackageMapper.selectRedPacketByCompanyId(param.getVideoId(), param.getCompanyId());
+        
+        if (redPackage != null) {
+            amount = redPackage.getRedPacketMoney();
+        } else if (video != null) {
+            amount = new BigDecimal(video.getRedPacketMoney());
+        }
+        
+        // 准备发送红包参数
+        WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
+        packetParam.setOpenId(user.getMpOpenId());
+        // 来源是小程序切换openId
+        if (param.getSource() == 2) {
+            packetParam.setOpenId(user.getCourseMaOpenId());
+        }
+        packetParam.setAmount(amount);
+        packetParam.setSource(param.getSource());
+        
+        // 发送红包
+        R sendRedPacket = paymentService.sendRedPacket(packetParam);
+        if (sendRedPacket.get("code").equals(200)) {
+            // 添加红包记录
+            FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+            redPacketLog.setCourseId(param.getCourseId());
+            redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+            redPacketLog.setCompanyId(param.getCompanyId());
+            redPacketLog.setUserId(param.getUserId());
+            redPacketLog.setVideoId(param.getVideoId());
+            redPacketLog.setStatus(0);
+            redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
+            redPacketLog.setCompanyUserId(param.getCompanyUserId());
+            redPacketLog.setCreateTime(new Date());
+            redPacketLog.setAmount(amount);
+            redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+            redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+            
+            // 更新观看记录的奖励类型
+            if (param.getLinkType() == null || param.getLinkType() == 0) {
+                log.setRewardType(config.getRewardType());
+                courseWatchLogMapper.updateFsCourseWatchLog(log);
+            }
+            return R.ok("奖励发放成功");
+        } else {
+            return R.error("奖励发送失败,请联系客服");
+        }
+    }
+    
+    /**
+     * 发放积分奖励
+     * 
+     * @param user 用户信息
+     * @param log 观看日志
+     * @param config 配置信息
+     * @return 处理结果
+     */
+    private R sendIntegralReward(FsUser user, FsCourseWatchLog log, CourseConfig config) {
+        // 更新用户积分
+        FsUser userMap = new FsUser();
+        userMap.setUserId(user.getUserId());
+        userMap.setIntegral(NumberUtil.add(user.getIntegral(), config.getAnswerIntegral()));
+        fsUserMapper.updateFsUser(userMap);
+        
+        // 记录积分日志
+        FsUserIntegralLogs integralLogs = new FsUserIntegralLogs();
+        integralLogs.setIntegral(new BigDecimal(config.getAnswerIntegral()));
+        integralLogs.setUserId(user.getUserId());
+        integralLogs.setBalance(userMap.getIntegral());
+        integralLogs.setLogType(17);
+        integralLogs.setBusinessId(StringUtils.isNotEmpty(log.getLogId().toString()) ? log.getLogId().toString() : null);
+        integralLogs.setCreateTime(new Date());
+        fsUserIntegralLogsMapper.insertFsUserIntegralLogs(integralLogs);
+        
+        return R.ok("奖励发放成功");
+    }
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/his/param/WxSendRedPacketParam.java

@@ -14,5 +14,7 @@ public class WxSendRedPacketParam implements Serializable {
 
     private Long companyId;
 
+    private Integer source=1;//来源 1:h5  2:看课小程序
+
 
 }

+ 10 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsUser.java

@@ -137,6 +137,16 @@ public class FsUser extends BaseEntity
 
     private Integer isShow;//是否展示购买以及订单状态
 
+    private String courseMaOpenId;//看课小程序openId
+
+    public String getCourseMaOpenId() {
+        return courseMaOpenId;
+    }
+
+    public void setCourseMaOpenId(String courseMaOpenId) {
+        this.courseMaOpenId = courseMaOpenId;
+    }
+
     public Integer getIsAddQw() {
         return isAddQw;
     }

+ 8 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsStorePaymentService.java

@@ -13,6 +13,8 @@ import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.store.vo.FsStorePaymentStatisticsVO;
 import com.fs.store.vo.FsStorePaymentVO;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 支付明细Service接口
  *
@@ -100,4 +102,10 @@ public interface IFsStorePaymentService
     FsStorePayment selectFsStorePaymentByTradeNo(String tradeNo);
 
     R sendRedPacket(WxSendRedPacketParam param);
+
+    R sendRedPacketV3(WxSendRedPacketParam param);
+
+    String transferNotify(String notifyData, HttpServletRequest request);
+
+    String v3TransferNotify(String notifyData, HttpServletRequest request);
 }

+ 143 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsStorePaymentServiceImpl.java

@@ -19,6 +19,7 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.course.config.RedPacketConfig;
+import com.fs.course.service.IFsCourseRedPacketLogService;
 import com.fs.pay.pay.config.PayConfig;
 import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.dto.WxJspayDTO;
@@ -38,14 +39,18 @@ import com.fs.pay.service.IPayService;
 import com.fs.pay.service.dto.CreatePayDTO;
 import com.fs.pay.service.dto.PayDTO;
 import com.fs.pay.service.dto.TradeOrder;
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayTransferBatchesNotifyV3Result;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
-import com.github.binarywang.wxpay.bean.transfer.TransferBatchesRequest;
-import com.github.binarywang.wxpay.bean.transfer.TransferBatchesResult;
+import com.github.binarywang.wxpay.bean.transfer.*;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.TransferService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -54,6 +59,8 @@ import com.fs.store.domain.FsStorePayment;
 import com.fs.store.service.IFsStorePaymentService;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 支付明细Service业务层处理
  *
@@ -63,7 +70,7 @@ import org.springframework.transaction.annotation.Transactional;
 @Service
 public class FsStorePaymentServiceImpl implements IFsStorePaymentService
 {
-
+    Logger logger = LoggerFactory.getLogger(getClass());
     @Autowired
     private WxMaProperties properties;
     @Autowired
@@ -85,6 +92,9 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
     PayService ybPayService;
     @Autowired
     private ISysConfigService configService;
+
+    @Autowired
+    private IFsCourseRedPacketLogService redPacketLogService;
     /**
      * 查询支付明细
      *
@@ -384,4 +394,134 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
             return R.error("发送失败");
         }
     }
+
+
+    @Override
+    public String transferNotify(String notifyData, HttpServletRequest request) {
+        logger.info("zyp \n【收到转账回调】:{}",notifyData);
+        try {
+            String json = configService.selectConfigByKey("redPacket.config");
+            RedPacketConfig config = JSONUtil.toBean(json, RedPacketConfig.class);
+            //创建微信订单
+            WxPayConfig payConfig = new WxPayConfig();
+            BeanUtils.copyProperties(config,payConfig);
+            WxPayService wxPayService = new WxPayServiceImpl();
+            wxPayService.setConfig(payConfig);
+            SignatureHeader signatureHeader = new SignatureHeader();
+            signatureHeader.setTimeStamp(request.getHeader("Wechatpay-Timestamp"));
+            signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce"));
+            signatureHeader.setSerial(request.getHeader("Wechatpay-Serial"));
+            signatureHeader.setSignature(request.getHeader("Wechatpay-Signature"));
+            WxPayTransferBatchesNotifyV3Result result = wxPayService.parseTransferBatchesNotifyV3Result(notifyData,signatureHeader);
+            logger.info("到零钱回调:{}",result.getResult());
+            if (result.getResult().getBatchStatus().equals("FINISHED")) {
+                R r = redPacketLogService.syncRedPacket(result.getResult().getOutBatchNo());
+                logger.info("result:{}",r);
+                if (r.get("code").equals(200)){
+                    return WxPayNotifyResponse.success("处理成功");
+                }else {
+                    return WxPayNotifyResponse.fail("");
+                }
+            }else {
+                return WxPayNotifyResponse.fail("");
+            }
+        } catch (WxPayException e) {
+            logger.error("zyp \n【转账回调异常】:{}", e.getReturnMsg());
+            return WxPayNotifyResponse.fail(e.getMessage());
+        }
+    }
+
+    @Override
+    public R sendRedPacketV3(WxSendRedPacketParam param) {
+        String json = configService.selectConfigByKey("redPacket.config");
+        RedPacketConfig config = JSONUtil.toBean(json, RedPacketConfig.class);
+
+        //创建微信订单
+        WxPayConfig payConfig = new WxPayConfig();
+        BeanUtils.copyProperties(config,payConfig);
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        TransferService transferService = wxPayService.getTransferService();
+
+        //商家转账请求
+        TransferBillsRequest request = new TransferBillsRequest();
+        request.setAppid(config.getAppId());
+        request.setOpenid(param.getOpenId());
+
+//        String code =  OrderCodeUtils.getH5RedPacketOrderSn();
+//        if(StringUtils.isEmpty(code)){
+//            return R.error("订单生成失败,请重试");
+//        }
+        String code = String.valueOf(IdUtil.getSnowflake(0, 0).nextId());
+        request.setOutBillNo("fsCourse"+code);
+        //转账金额
+        Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount()!=null ? param.getAmount().toString() : "0.1");
+        request.setTransferAmount(amount);
+        request.setTransferRemark("活动奖励");
+        //用户感知
+        request.setUserRecvPerception("活动奖励");
+        request.setNotifyUrl(config.getNotifyUrl());
+        request.setTransferSceneId("1000");
+        List<TransferBillsRequest.TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<>();
+        // 添加第一条数据
+        TransferBillsRequest.TransferSceneReportInfo info1 = new TransferBillsRequest.TransferSceneReportInfo();
+        info1.setInfoType("活动名称");
+        info1.setInfoContent("新会员有礼");
+        transferSceneReportInfos.add(info1);
+
+        // 添加第二条数据
+        TransferBillsRequest.TransferSceneReportInfo info2 = new TransferBillsRequest.TransferSceneReportInfo();
+        info2.setInfoType("奖励说明");
+        info2.setInfoContent("注册会员抽奖一等奖");
+        transferSceneReportInfos.add(info2);
+        request.setTransferSceneReportInfos(transferSceneReportInfos);
+
+        //发起商家转账API(新)
+        TransferBillsResult transferBillsResult=null;
+        try {
+            transferBillsResult = transferService.transferBills(request);
+            logger.info("商家转账支付完成:[msg:{}]",transferBillsResult);
+            return R.ok("发送红包成功").put("data",transferBillsResult);
+        } catch (WxPayException e) {
+            e.printStackTrace();
+            logger.info("商家转账支付失败:[msg:{}]",e.getMessage());
+            return R.error("发送失败");
+        }
+    }
+
+
+    @Override
+    public String v3TransferNotify(String notifyData, HttpServletRequest request) {
+        logger.info("zyp \n【收到转账回调】:{}",notifyData);
+        try {
+            String json = configService.selectConfigByKey("redPacket.config");
+            RedPacketConfig config = JSONUtil.toBean(json, RedPacketConfig.class);
+            //创建微信订单
+            WxPayConfig payConfig = new WxPayConfig();
+            BeanUtils.copyProperties(config,payConfig);
+            WxPayService wxPayService = new WxPayServiceImpl();
+            wxPayService.setConfig(payConfig);
+            SignatureHeader signatureHeader = new SignatureHeader();
+            signatureHeader.setTimeStamp(request.getHeader("Wechatpay-Timestamp"));
+            signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce"));
+            signatureHeader.setSerial(request.getHeader("Wechatpay-Serial"));
+            signatureHeader.setSignature(request.getHeader("Wechatpay-Signature"));
+            TransferBillsNotifyResult result = wxPayService.parseTransferBillsNotifyV3Result(notifyData,signatureHeader);
+            logger.info("到零钱回调:{}",result.getResult());
+            if (result.getResult().getState().equals("SUCCESS")) {
+                R r = redPacketLogService.syncRedPacket(result.getResult().getOutBillNo());
+                logger.info("result:{}",r);
+                if (r.get("code").equals(200)){
+                    return WxPayNotifyResponse.success("处理成功");
+                }else {
+                    return WxPayNotifyResponse.fail("");
+                }
+            }else {
+                return WxPayNotifyResponse.fail("");
+            }
+        } catch (WxPayException e) {
+            logger.error("zyp \n【转账回调异常】:{}", e.getReturnMsg());
+            return WxPayNotifyResponse.fail(e.getMessage());
+        }
+    }
 }