处理企业付款

This commit is contained in:
朱耘稷
2020-12-08 22:14:37 +08:00
parent e9a7a2052f
commit b9ed5775eb
4 changed files with 124 additions and 69 deletions

View File

@ -25,5 +25,9 @@ public class TemplateBean {
private String deliveryId;
private String payType;
private Long uid;
/**
* 提现申请ID
*/
private Long extractId;
}

View File

@ -20,7 +20,8 @@ public enum TemplateListenEnum {
TYPE_4("4","充值成功通知"),
TYPE_5("5","在线买单/收款成功通知"),
TYPE_6("6","商家收款通知"),
TYPE_7("7","用户下单未支付通知");
TYPE_7("7","用户下单未支付通知"),
TYPE_8("8","用户体现通知");
private String value;
private String desc;

View File

@ -9,6 +9,7 @@
package co.yixiang.modules.activity.service.impl;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import co.yixiang.api.YshopException;
import co.yixiang.common.service.impl.BaseServiceImpl;
@ -17,6 +18,9 @@ import co.yixiang.dozer.service.IGenerator;
import co.yixiang.enums.BillDetailEnum;
import co.yixiang.enums.PayTypeEnum;
import co.yixiang.enums.ShopCommonEnum;
import co.yixiang.event.TemplateBean;
import co.yixiang.event.TemplateEvent;
import co.yixiang.event.TemplateListenEnum;
import co.yixiang.exception.BadRequestException;
import co.yixiang.modules.activity.domain.YxUserExtract;
import co.yixiang.modules.activity.param.UserExtParam;
@ -27,9 +31,14 @@ import co.yixiang.modules.activity.service.mapper.YxUserExtractMapper;
import co.yixiang.modules.user.domain.YxUser;
import co.yixiang.modules.user.service.YxUserBillService;
import co.yixiang.modules.user.service.YxUserService;
import co.yixiang.modules.user.service.dto.WechatUserDto;
import co.yixiang.modules.user.service.dto.YxWechatUserDto;
import co.yixiang.utils.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
@ -58,7 +67,7 @@ public class YxUserExtractServiceImpl extends BaseServiceImpl<YxUserExtractMappe
private final YxUserExtractMapper yxUserExtractMapper;
private final YxUserService userService;
private final YxUserBillService billService;
private final ApplicationEventPublisher publisher;
/**
* 开始提现
@ -222,29 +231,14 @@ public class YxUserExtractServiceImpl extends BaseServiceImpl<YxUserExtractMappe
userService.incBrokeragePrice(resources.getExtractPrice(),resources.getUid());
resources.setFailTime(new Date());
}else{
//模板消息支付成功发布事件
TemplateBean templateBean = TemplateBean.builder()
.extractId( resources.getId())
.templateType(TemplateListenEnum.TYPE_8.getValue())
.build();
publisher.publishEvent(new TemplateEvent(this,templateBean));
}
//todo 此处为企业付款,没经过测试
/**
boolean isTest = true;
if(!isTest){
YxWechatUserDto wechatUser = generator.convert(wechatUserService.getOne(new LambdaQueryWrapper<YxWechatUser>().eq("uid",resources.getUid())),YxWechatUserDto.class);
if(ObjectUtil.isNotNull(wechatUser)){
try {
payService.entPay(wechatUser.getOpenid(),resources.getId().toString(),
resources.getRealName(),
resources.getExtractPrice().multiply(new BigDecimal(100)).intValue());
} catch (WxPayException e) {
throw new BadRequestException(e.getMessage());
}
}else{
throw new BadRequestException("不是微信用户无法退款");
}
}
**/
this.saveOrUpdate(resources);
}
}

View File

@ -9,14 +9,26 @@
package co.yixiang.modules.mp.listener;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import co.yixiang.enums.BillDetailEnum;
import co.yixiang.enums.PayTypeEnum;
import co.yixiang.event.TemplateBean;
import co.yixiang.event.TemplateEvent;
import co.yixiang.event.TemplateListenEnum;
import co.yixiang.exception.BadRequestException;
import co.yixiang.message.rocketmq.MqProducer;
import co.yixiang.modules.activity.domain.YxUserExtract;
import co.yixiang.modules.activity.service.YxUserExtractService;
import co.yixiang.modules.mp.service.WeiXinSubscribeService;
import co.yixiang.modules.mp.service.WeixinPayService;
import co.yixiang.modules.mp.service.WeixinTemplateService;
import co.yixiang.modules.user.domain.YxUser;
import co.yixiang.modules.user.service.YxUserBillService;
import co.yixiang.modules.user.service.YxUserService;
import co.yixiang.modules.user.service.dto.WechatUserDto;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.binarywang.wxpay.exception.WxPayException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEvent;
@ -25,6 +37,8 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Date;
import java.util.UUID;
/**
* @author hupeng
@ -33,64 +47,106 @@ import java.math.BigDecimal;
@Slf4j
@Component
public class TemplateListener implements SmartApplicationListener {
@Autowired
private WeixinTemplateService weixinTemplateService;
@Autowired
private WeixinPayService weixinPayService;
@Autowired
private WeiXinSubscribeService weiXinSubscribeService;
@Autowired
private YxUserService userService;
@Autowired
private WeixinTemplateService weixinTemplateService;
@Autowired
private WeixinPayService weixinPayService;
@Autowired
private WeiXinSubscribeService weiXinSubscribeService;
@Autowired
private YxUserExtractService yxUserExtractService;
@Autowired
private WeixinPayService payService;
@Autowired
private YxUserBillService billService;
//@Autowired
//private MqProducer mqProducer;
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> aClass) {
return aClass == TemplateEvent.class;
}
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> aClass) {
return aClass == TemplateEvent.class;
}
@Async
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
//转换事件类型
TemplateEvent templateEvent = (TemplateEvent) applicationEvent;
//获取注册用户对象信息
TemplateBean templateBean = templateEvent.getTemplateBean();
log.info("模板事件类型:{}",templateBean.getTemplateType());
switch (TemplateListenEnum.toType(templateBean.getTemplateType())){
case TYPE_1:
weixinTemplateService.paySuccessNotice(templateBean.getOrderId()
,templateBean.getPrice(),templateBean.getUid());
weiXinSubscribeService.paySuccessNotice(templateBean.getOrderId()
,templateBean.getPrice(),templateBean.getUid());
break;
case TYPE_2:
//处理退款与消息
if(PayTypeEnum.WEIXIN.getValue().equals(templateBean.getPayType())){
BigDecimal bigDecimal = new BigDecimal("100");
int payPrice = bigDecimal.multiply(new BigDecimal(templateBean.getPrice())).intValue();
weixinPayService.refundOrder(templateBean.getOrderId(),payPrice);
}
@Async
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
//转换事件类型
TemplateEvent templateEvent = (TemplateEvent) applicationEvent;
//获取注册用户对象信息
TemplateBean templateBean = templateEvent.getTemplateBean();
log.info("模板事件类型:{}", templateBean.getTemplateType());
switch (TemplateListenEnum.toType(templateBean.getTemplateType())) {
case TYPE_1:
weixinTemplateService.paySuccessNotice(templateBean.getOrderId()
, templateBean.getPrice(), templateBean.getUid());
weiXinSubscribeService.paySuccessNotice(templateBean.getOrderId()
, templateBean.getPrice(), templateBean.getUid());
break;
case TYPE_2:
//处理退款与消息
if (PayTypeEnum.WEIXIN.getValue().equals(templateBean.getPayType())) {
BigDecimal bigDecimal = new BigDecimal("100");
int payPrice = bigDecimal.multiply(new BigDecimal(templateBean.getPrice())).intValue();
weixinPayService.refundOrder(templateBean.getOrderId(), payPrice);
}
weixinTemplateService.refundSuccessNotice(templateBean.getOrderId(),templateBean.getPrice(),
templateBean.getUid(),templateBean.getTime());
break;
case TYPE_3:
weixinTemplateService.deliverySuccessNotice(templateBean.getOrderId(),templateBean.getDeliveryName(),
templateBean.getDeliveryId(),templateBean.getUid());
break;
case TYPE_4:
weixinTemplateService.rechargeSuccessNotice(templateBean.getTime(),templateBean.getPrice(),
templateBean.getUid());
break;
weixinTemplateService.refundSuccessNotice(templateBean.getOrderId(), templateBean.getPrice(),
templateBean.getUid(), templateBean.getTime());
break;
case TYPE_3:
weixinTemplateService.deliverySuccessNotice(templateBean.getOrderId(), templateBean.getDeliveryName(),
templateBean.getDeliveryId(), templateBean.getUid());
break;
case TYPE_4:
weixinTemplateService.rechargeSuccessNotice(templateBean.getTime(), templateBean.getPrice(),
templateBean.getUid());
break;
case TYPE_7:
//使用MQ延时消息
//mqProducer.sendMsg("yshop-topic", templateBean.getOrderId());
log.info("投递延时订单id [{}]", templateBean.getOrderId());
break;
case TYPE_8:
YxUserExtract resources = yxUserExtractService.getById(templateBean.getExtractId());
Boolean success = false;
YxUser user = userService.getById(resources.getUid());
if (user != null) {
WechatUserDto wechatUser = user.getWxProfile();
if (ObjectUtil.isNotNull(wechatUser)) {
try {
String nonce_str = UUID.randomUUID().toString().replace("-", "");
payService.entPay(wechatUser.getOpenid(), nonce_str,
resources.getRealName(),
resources.getExtractPrice().multiply(new BigDecimal(100)).intValue());
success = true;
} catch (WxPayException e) {
log.error("退款失败,原因:{}",e.getMessage());
}
}
}
if (!success) {
String mark = "提现失败,退回佣金" + resources.getExtractPrice() + "";
double balance = NumberUtil.add(user.getBrokeragePrice(), resources.getExtractPrice()).doubleValue();
//插入流水
billService.income(resources.getUid(), "提现失败", BillDetailEnum.CATEGORY_1.getValue(),
BillDetailEnum.TYPE_4.getValue(), resources.getExtractPrice().doubleValue(), balance,
mark, resources.getId().toString());
//返回提现金额
userService.incBrokeragePrice(resources.getExtractPrice(), resources.getUid());
resources.setFailTime(new Date());
yxUserExtractService.updateById(resources);
}
break;
default:
//todo
}
}
}
}