Browse Source

优化

feature-1.1
wuxicheng 3 years ago
parent
commit
bb1210b29e
  1. 4
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java
  2. 4
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java
  3. 2
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipInfoVo.java
  4. 33
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
  5. 7
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java
  6. 7
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java
  7. 96
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java
  8. 10
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java
  9. 8
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java
  10. 56
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java
  11. 3
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java
  12. 37
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumAliPayStatus.java
  13. 55
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/AliPayManager.java
  14. 4
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java
  15. 18
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java
  16. 80
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/InOrderVo.java
  17. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java
  18. 91
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdInOrderVo.java
  19. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java

4
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java

@ -3,7 +3,7 @@ package com.bnyer.img.api.factory;
import com.bnyer.common.core.domain.R;
import com.bnyer.img.api.dto.QueryUserVipDto;
import com.bnyer.img.api.remote.RemoteWxMiniService;
import com.bnyer.img.api.vo.UserVipVo;
import com.bnyer.img.api.vo.UserVipInfoVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@ -27,7 +27,7 @@ public class RemoteWxMiniFallbackFactory implements FallbackFactory<RemoteWxMini
log.error("api图文服务调用失败:{}", throwable.getMessage());
return new RemoteWxMiniService() {
@Override
public R<List<UserVipVo>> queryUserVipList(QueryUserVipDto dto) {
public R<List<UserVipInfoVo>> queryUserVipList(QueryUserVipDto dto) {
return R.fail("获取会员信息失败:+"+throwable.getMessage());
}

4
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java

@ -4,7 +4,7 @@ import com.bnyer.common.core.constant.ServiceNameConstants;
import com.bnyer.common.core.domain.R;
import com.bnyer.img.api.dto.QueryUserVipDto;
import com.bnyer.img.api.factory.RemoteWxMiniFallbackFactory;
import com.bnyer.img.api.vo.UserVipVo;
import com.bnyer.img.api.vo.UserVipInfoVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -23,5 +23,5 @@ public interface RemoteWxMiniService {
* @return
*/
@PostMapping(value = "/img/mini/fh/queryUserVipList")
R<List<UserVipVo>> queryUserVipList(@RequestBody QueryUserVipDto dto);
R<List<UserVipInfoVo>> queryUserVipList(@RequestBody QueryUserVipDto dto);
}

2
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java → bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipInfoVo.java

@ -12,7 +12,7 @@ import java.math.BigDecimal;
@Getter
@Setter
@ApiModel("会员vip响应类")
public class UserVipVo implements Serializable {
public class UserVipInfoVo implements Serializable {
@ApiModelProperty(value="主键Id")
private Long id;

33
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java

@ -16,7 +16,7 @@ import com.bnyer.common.rocketmq.config.RocketMqConstant;
import com.bnyer.common.security.utils.SecurityUtils;
import com.bnyer.img.api.dto.QueryUserVipDto;
import com.bnyer.img.api.remote.RemoteWxMiniService;
import com.bnyer.img.api.vo.UserVipVo;
import com.bnyer.img.api.vo.UserVipInfoVo;
import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.enums.EnumVipOrderStatus;
@ -29,7 +29,6 @@ import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
@ -100,21 +99,21 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
//查询会员信息
QueryUserVipDto queryUserVipDto = new QueryUserVipDto();
queryUserVipDto.setId(addVipOrderDto.getVipId());
R<List<UserVipVo>> userVipVoListResult = remoteWxMiniService.queryUserVipList(queryUserVipDto);
R<List<UserVipInfoVo>> userVipVoListResult = remoteWxMiniService.queryUserVipList(queryUserVipDto);
if (!userVipVoListResult.isSuccess()){
log.error("内部接口调用异常:url:{}request{},result{},error:{}","queryUserVipList", JSON.toJSONString(queryUserVipDto),JSON.toJSONString(userVipVoListResult),userVipVoListResult.getMsg());
throw new ServiceException(userVipVoListResult.getMsg());
}
List<UserVipVo> userVipVoList = userVipVoListResult.getData();
if (CollUtil.isEmpty(userVipVoList)){
List<UserVipInfoVo> userVipInfoVoList = userVipVoListResult.getData();
if (CollUtil.isEmpty(userVipInfoVoList)){
throw new ServiceException(ResponseEnum.NOT_EXIST,"会员信息");
}
UserVipVo userVipVo = userVipVoList.get(0);
UserVipInfoVo userVipInfoVo = userVipInfoVoList.get(0);
VipOrder vipOrder = null;
EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipVo.getVipTypeCode());
EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipInfoVo.getVipTypeCode());
switch (enumVipType){
case IMG_VIP:
vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto);
vipOrder = buildImgVipOrder(userVipInfoVo,addVipOrderDto);
break;
case VIDEO_VIP:
break;
@ -128,26 +127,26 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
/**
* 构建下图会员订单
* @param userVipVo
* @param userVipInfoVo
* @param addVipOrderDto
* @return
*/
private VipOrder buildImgVipOrder(UserVipVo userVipVo, AddVipOrderDto addVipOrderDto) {
private VipOrder buildImgVipOrder(UserVipInfoVo userVipInfoVo, AddVipOrderDto addVipOrderDto) {
Long userId = SecurityUtils.getUserId();
VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class);
VipOrder vipOrder = EntityConvertUtil.copy(userVipInfoVo, VipOrder.class);
vipOrder.setPhone(addVipOrderDto.getPhone());
vipOrder.setVipId(addVipOrderDto.getVipId());
vipOrder.setVipName(userVipVo.getVipName());
vipOrder.setVipTypeName(userVipVo.getVipTypeName());
vipOrder.setPayAmount(userVipVo.getPrice());
vipOrder.setVipTypeName(userVipVo.getVipTypeName());
vipOrder.setVipName(userVipInfoVo.getVipName());
vipOrder.setVipTypeName(userVipInfoVo.getVipTypeName());
vipOrder.setPayAmount(userVipInfoVo.getPrice());
vipOrder.setVipTypeName(userVipInfoVo.getVipTypeName());
vipOrder.setUserId(userId);
// vipOrder.setIsDelay("0");
Date nowDate = new Date();
vipOrder.setStartTime(nowDate);
EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit());
EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipInfoVo.getValidTimeUnit());
//计算会员结束时间
vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate,userVipVo.getValidTimeNum()));
vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipInfoVo.getValidTimeNum()));
//开通的天数
vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true));
vipOrder.setUserClientType(addVipOrderDto.getUserClientType());

7
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java

@ -15,5 +15,10 @@ public class AliPayConstant {
/***
* 接口地址
*/
public static final String aliUrl = "https://openapi.alipay.com/gateway.do";
// public static final String aliUrl = "https://openapi.alipay.com/gateway.do";
/**
* 沙箱地址
*/
public static final String aliUrl = "https://openapi.alipaydev.com/gateway.do";
}

7
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java

@ -4,6 +4,7 @@ import com.bnyer.common.core.domain.R;
import com.bnyer.pay.dto.InOrderDto;
import com.bnyer.pay.dto.QueryOrderDto;
import com.bnyer.pay.service.UnifiedPayService;
import com.bnyer.pay.vo.InOrderVo;
import com.bnyer.pay.vo.QueryOrderVo;
import com.bnyer.pay.vo.ThirdInOrderVo;
import io.swagger.annotations.Api;
@ -34,9 +35,9 @@ public class UnifiedPayController {
@PostMapping("/inOrder")
@Operation(summary = "统一下单,并生成支付订单" , description = "生成支付订单,返回前端支付所需参数")
public R<ThirdInOrderVo> inOrder(@Valid @RequestBody InOrderDto dto, HttpServletRequest request){
ThirdInOrderVo thirdInOrderVo = unifiedPayService.inOrder(dto,request);
return R.ok(thirdInOrderVo);
public R<InOrderVo> inOrder(@Valid @RequestBody InOrderDto dto, HttpServletRequest request){
InOrderVo inOrderVo = unifiedPayService.inOrder(dto,request);
return R.ok(inOrderVo);
}
@PostMapping("/queryOrder")

96
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java

@ -8,10 +8,13 @@ import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConstants;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.msg.MsgConstants;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.AlipayConfig;
import com.bnyer.common.core.enums.EnumPayType;
@ -19,6 +22,7 @@ import com.bnyer.common.core.enums.EnumTimeUnit;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils;
import com.bnyer.common.core.utils.SpringUtils;
import com.bnyer.common.core.utils.StringUtils;
import com.bnyer.pay.bo.QueryOrderBo;
import com.bnyer.pay.constant.AliPayConstant;
@ -27,6 +31,7 @@ import com.bnyer.pay.dto.PayNotifyCheckDto;
import com.bnyer.pay.bo.UnifiedOrderBo;
import com.bnyer.pay.enums.EnumPayChannel;
import com.bnyer.pay.enums.EnumPayConfigStatus;
import com.bnyer.pay.manager.AliPayManager;
import com.bnyer.pay.mapper.AlipayConfigMapper;
import com.bnyer.pay.service.PayInfoService;
import com.bnyer.pay.vo.ThirdInOrderVo;
@ -36,6 +41,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -49,20 +55,34 @@ import java.util.Map;
@Component
public class AliPayStrategy extends AbstractPayStrategy {
@Resource
private AlipayConfigMapper alipayConfigMapper;
private static AliPayManager aliPayManager;
private static PayInfoService payInfoService;
@Autowired
private PayInfoService payInfoService;
public void setUserServer(AliPayManager aliPayManager,PayInfoService payInfoService) {
AliPayStrategy.aliPayManager = aliPayManager;
AliPayStrategy.payInfoService = payInfoService;
}
// /**
// * 查询支付配置
// * @return
// */
// private AlipayConfig getAlipayConfig() {
// List<AlipayConfig> alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper<AlipayConfig>().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
// if (CollUtil.isEmpty(alipayConfigList)){
// throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR);
// }
// AlipayConfig alipayConfig = alipayConfigList.get(0);
// return alipayConfig;
// }
@Override
public ThirdInOrderVo unifiedOrder(UnifiedOrderBo bo) {
log.info("支付宝支付:统一下单接口调用开始,AliPayStrategy.unifiedOrder bo:{}", JSON.toJSONString(bo));
List<AlipayConfig> alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper<AlipayConfig>().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
if (CollUtil.isEmpty(alipayConfigList)){
throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR);
}
AlipayConfig alipayConfig = alipayConfigList.get(0);
AlipayConfig alipayConfig = aliPayManager.getAlipayConfig();
String appid = alipayConfig.getAppid();
String alipayPublicKey = alipayConfig.getAlipayPublicKey();
String appPrivateKey = alipayConfig.getAppPrivateKey();
@ -89,8 +109,9 @@ public class AliPayStrategy extends AbstractPayStrategy {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if(response.isSuccess()){
ThirdInOrderVo vo = new ThirdInOrderVo();
vo.setOutStr(response.getBody());
vo.setAppid(appid);
ThirdInOrderVo.AliThirdInOrderVo aliThirdInOrderVo = new ThirdInOrderVo.AliThirdInOrderVo();
aliThirdInOrderVo.setOutStr(response.getBody());
vo.setAliThirdInOrderVo(aliThirdInOrderVo);
vo.setOutOrderNo(bo.getPayId());
return vo;
}else{
@ -123,13 +144,13 @@ public class AliPayStrategy extends AbstractPayStrategy {
//订单金额(元)
String totalAmount = inMap.get("total_amount");
//通过appid查询配置的密钥:用于校验签名
List<AlipayConfig> alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper<AlipayConfig>()
.eq(AlipayConfig::getAppid,appId).eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
if (CollUtil.isEmpty(alipayConfigList)){
log.error(ResponseEnum.PAY_CONFIG_ERROR.getMsg());
return MsgConstants.FAIL;
}
AlipayConfig alipayConfig = alipayConfigList.get(0);
// List<AlipayConfig> alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper<AlipayConfig>()
// .eq(AlipayConfig::getAppid,appId).eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
// if (CollUtil.isEmpty(alipayConfigList)){
// log.error(ResponseEnum.PAY_CONFIG_ERROR.getMsg());
// return MsgConstants.FAIL;
// }
AlipayConfig alipayConfig = aliPayManager.getAlipayConfig(appId);
//-----------------------2.签名校验---------------------------
String alipayPublicKey = alipayConfig.getAlipayPublicKey();
boolean flag = AlipaySignature.rsaCheckV1(inMap, alipayPublicKey, AlipayConstants.CHARSET_UTF8,AlipayConstants.SIGN_TYPE_RSA2);
@ -172,7 +193,46 @@ public class AliPayStrategy extends AbstractPayStrategy {
@Override
public ThirdQueryOrderVo queryOrder(QueryOrderBo bo) {
return null;
AlipayConfig alipayConfig = aliPayManager.getAlipayConfig();
String appPrivateKey = alipayConfig.getAppPrivateKey();
String alipayPublicKey = alipayConfig.getAlipayPublicKey();
String signType = alipayConfig.getKeyType();
String appid = alipayConfig.getAppid();
//调用支付宝接口查询
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConstant.aliUrl, appid,appPrivateKey, AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8, alipayPublicKey, signType);
//查询
AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();
AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel();
alipayTradeQueryModel.setOutTradeNo(bo.getPayId());
alipayTradeQueryRequest.setBizModel(alipayTradeQueryModel);
try {
//通过alipayClient调用API,获得对应的response类
AlipayTradeQueryResponse response = alipayClient.execute(alipayTradeQueryRequest);
log.info("==================================");
log.info("支付宝订单查询result{}", response.getBody());
log.info("==================================");
// 签名认证了
if(response.isSuccess()){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String tradeStatus = response.getTradeStatus();
String totalAmount = response.getTotalAmount();
String payDate = sdf.format(response.getSendPayDate());
String tradeNo = response.getTradeNo();
ThirdQueryOrderVo alipayTradeQueryVo = new ThirdQueryOrderVo();
alipayTradeQueryVo.setOutOrderNo(bo.getPayId());
alipayTradeQueryVo.setPayTime(payDate);
alipayTradeQueryVo.setTotalAmount(totalAmount);
alipayTradeQueryVo.setThirdOrderNo(tradeNo);
alipayTradeQueryVo.setPayStatus(tradeStatus);
return alipayTradeQueryVo;
}else {
log.error("支付宝支付:订单查询异常,payId:{},error{}", bo.getPayId(),response.getSubMsg());
throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS);
}
} catch (Exception e) {
log.error("支付宝支付:订单查询异常,payId:{},error{}", bo.getPayId(),e.getMessage());
throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS);
}
}

10
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java

@ -93,7 +93,7 @@ public class DYPayStrategy extends AbstractPayStrategy{
//订单过期时间(秒) 5min-2day
params.put("valid_time", 1800);
//开发者自定义字段,回调原样回传。超过最大长度会被截断
params.put("cp_extra", "xx平台充值");
// params.put("cp_extra", "xx平台充值");
//通知地址
params.put("notify_url", backurl);
//签名,详见https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/server/ecpay/TE
@ -142,10 +142,12 @@ public class DYPayStrategy extends AbstractPayStrategy{
}
//保存预下单信息
ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo();
//把order_no和order_info_token返回前端用于调起收银台
ThirdInOrderVo.DyThirdInOrderVo dyThirdInOrderVo = new ThirdInOrderVo.DyThirdInOrderVo();
thirdInOrderVo.setOutOrderNo(bo.getPayId());
thirdInOrderVo.setThirdOrderNo(orderId);
thirdInOrderVo.setOrderToken(orderToken);
//把order_no和order_info_token返回前端用于调起收银台
dyThirdInOrderVo.setOrderId(orderId);
dyThirdInOrderVo.setOrderToken(orderToken);
thirdInOrderVo.setDyThirdInOrderVo(dyThirdInOrderVo);
return thirdInOrderVo;
}

8
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java

@ -147,10 +147,12 @@ public class KSPayStrategy extends AbstractPayStrategy{
}
//保存预下单信息
ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo();
//把order_no和order_info_token返回前端用于调起收银台
ThirdInOrderVo.KsThirdInOrderVo ksThirdInOrderVo = new ThirdInOrderVo.KsThirdInOrderVo();
thirdInOrderVo.setOutOrderNo(bo.getPayId());
thirdInOrderVo.setThirdOrderNo(orderNo);
thirdInOrderVo.setOrderToken(orderToken);
//把order_no和order_info_token返回前端用于调起收银台
ksThirdInOrderVo.setOrderNo(orderNo);
ksThirdInOrderVo.setOrderToken(orderToken);
thirdInOrderVo.setKsThirdInOrderVo(ksThirdInOrderVo);
return thirdInOrderVo;
}

56
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java

@ -8,24 +8,26 @@ import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.StringUtils;
import com.bnyer.pay.bo.QueryOrderBo;
import com.bnyer.pay.bo.UnifiedOrderBo;
import com.bnyer.pay.dto.EditPayInfoNotifyDto;
import com.bnyer.pay.dto.PayNotifyCheckDto;
import com.bnyer.pay.bo.UnifiedOrderBo;
import com.bnyer.pay.enums.EnumPayChannel;
import com.bnyer.pay.enums.EnumTradeType;
import com.bnyer.pay.enums.EnumWxPayStatus;
import com.bnyer.pay.manager.WxPayManager;
import com.bnyer.pay.service.PayInfoService;
import com.bnyer.pay.utils.WXPayUtil;
import com.bnyer.pay.vo.ThirdInOrderVo;
import com.bnyer.pay.vo.ThirdQueryOrderVo;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.extern.slf4j.Slf4j;
@ -76,28 +78,27 @@ public class WxPayStrategy extends AbstractPayStrategy {
WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig);
String openId = SecurityContextHolder.getWechatOpenId();
try {
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setOpenid(openId);
WxPayUnifiedOrderV3Request orderRequest = new WxPayUnifiedOrderV3Request();
WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
payer.setOpenid(openId);
orderRequest.setPayer(payer);
orderRequest.setDescription(bo.getGoodsDesc());
orderRequest.setOutTradeNo(bo.getPayId());
orderRequest.setBody(bo.getGoodsDesc());
orderRequest.setSpbillCreateIp(bo.getIp());
orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(bo.getPayAmount()));
WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
amount.setTotal(BaseWxPayRequest.yuanToFen(bo.getPayAmount()));
orderRequest.setAmount(amount);
//调用微信支付接口
WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(orderRequest);
String timestamp = String.valueOf(bo.getCurrDate().getTime());
if (timestamp.length() > 10) {
timestamp = timestamp.substring(0, 10);
}
WxPayUnifiedOrderV3Result wxPayUnifiedOrderV3Result = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, orderRequest);
WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = wxPayUnifiedOrderV3Result.getPayInfo(TradeTypeEnum.JSAPI, wxPayConfig.getAppid(), wxPayConfig.getMchid(), wxPayService.getConfig().getPrivateKey());
//返回数据
ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo();
ThirdInOrderVo.WxThirdInOrderVo wxThirdInOrderVo = new ThirdInOrderVo.WxThirdInOrderVo();
wxThirdInOrderVo.setPackageValue(jsapiResult.getPackageValue());
wxThirdInOrderVo.setTimeStamp(jsapiResult.getTimeStamp());
wxThirdInOrderVo.setNonceStr(jsapiResult.getNonceStr());
wxThirdInOrderVo.setPaySign(jsapiResult.getPaySign());
thirdInOrderVo.setOutOrderNo(bo.getPayId());
thirdInOrderVo.setAppid(wxPayConfig.getAppid());
thirdInOrderVo.setMchid(wxPayConfig.getMchid());
thirdInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId());
thirdInOrderVo.setNoncestr(wxPayUnifiedOrderResult.getNonceStr());
thirdInOrderVo.setTimestamp(timestamp);
thirdInOrderVo.setSign(wxPayUnifiedOrderResult.getSign());
thirdInOrderVo.setTradeType(wxPayUnifiedOrderResult.getTradeType());
thirdInOrderVo.setAppId(jsapiResult.getAppId());
return thirdInOrderVo;
} catch (WxPayException e) {
log.error("微信支付:统一下单接口调用失败,payId:{},error{}", bo.getPayId(), e.getMessage());
@ -125,7 +126,8 @@ public class WxPayStrategy extends AbstractPayStrategy {
WxPayService wxPayService = wxPayManager.getWxPayService(wxpayConfig);
try {
//解析支付结果通知
WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(params);
WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(params, null);
WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult();
//appid
String appid = result.getAppid();
//支付订单号
@ -133,10 +135,14 @@ public class WxPayStrategy extends AbstractPayStrategy {
//微信支付流水号
String transactionId = result.getTransactionId();
//支付金额
String fenToYuan = BaseWxPayResult.fenToYuan(result.getTotalFee());
String fenToYuan = BaseWxPayResult.fenToYuan(result.getAmount().getPayerTotal());
//支付时间
String timeEnd = result.getTimeEnd();
String timeEnd = result.getSuccessTime();
//支付状态
String tradeState = result.getTradeState();
if (!EnumWxPayStatus.SUCCESS.getStatus().equals(tradeState)){
return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,false,"交易失败");
}
//校验是否已支付避免重复调用
PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto();
payNotifyCheckDto.setPayType(EnumPayType.WX_PAY);

3
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java

@ -7,6 +7,7 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author :WXC
@ -22,7 +23,7 @@ public class InOrderDto {
@ApiModelProperty(value="业务主订单号:关联内部业务订单表",required = true)
private String orderNo;
@NotBlank(message = "支付场景不能为空")
@NotNull(message = "支付场景不能为空")
@ApiModelProperty(value="支付场景:1.会员充值",required = true)
private Integer sceneCode;

37
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumAliPayStatus.java

@ -0,0 +1,37 @@
package com.bnyer.pay.enums;
import com.bnyer.common.core.enums.EnumPayStatus;
import com.bnyer.common.core.exception.ServiceException;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author :WXC
* @Date :2023/05/05
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumAliPayStatus {
WAIT_BUYER_PAY("WAIT_BUYER_PAY",EnumPayStatus.NO_PAY),
TRADE_SUCCESS("TRADE_SUCCESS",EnumPayStatus.SUCCESS),
TRADE_FINISHED("TRADE_FINISHED",EnumPayStatus.SUCCESS),
TRADE_CLOSED("TRADE_CLOSED",EnumPayStatus.FAILS),
;
private final String status;
private final EnumPayStatus enumPayStatus;
public static EnumPayStatus getEnumPayStatusByStatus(String status) {
for (EnumAliPayStatus s : EnumAliPayStatus.values()) {
if (Objects.equals(status, s.getStatus())) {
return s.getEnumPayStatus();
}
}
throw new ServiceException("status 未匹配上对应的支付状态");
}
}

55
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/AliPayManager.java

@ -0,0 +1,55 @@
package com.bnyer.pay.manager;
import cn.hutool.core.collection.CollUtil;
import com.alipay.api.msg.MsgConstants;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.AlipayConfig;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.SpringUtils;
import com.bnyer.pay.enums.EnumPayConfigStatus;
import com.bnyer.pay.mapper.AlipayConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* @author :WXC
* @Date :2023/05/06
* @description :
*/
@Slf4j
@Component
public class AliPayManager {
@Resource
private AlipayConfigMapper alipayConfigMapper;
/**
* 查询支付配置
* @return
*/
public AlipayConfig getAlipayConfig() {
List<AlipayConfig> alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper<AlipayConfig>().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
if (CollUtil.isEmpty(alipayConfigList)){
throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR);
}
AlipayConfig alipayConfig = alipayConfigList.get(0);
return alipayConfig;
}
/**
* 查询支付配置
* @return
*/
public AlipayConfig getAlipayConfig(String appId){
List<AlipayConfig> alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper<AlipayConfig>()
.eq(AlipayConfig::getAppid,appId).eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
if (CollUtil.isEmpty(alipayConfigList)){
throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR);
}
return alipayConfigList.get(0);
}
}

4
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java

@ -2,8 +2,8 @@ package com.bnyer.pay.service;
import com.bnyer.pay.dto.InOrderDto;
import com.bnyer.pay.dto.QueryOrderDto;
import com.bnyer.pay.vo.InOrderVo;
import com.bnyer.pay.vo.QueryOrderVo;
import com.bnyer.pay.vo.ThirdInOrderVo;
import javax.servlet.http.HttpServletRequest;
@ -20,7 +20,7 @@ public interface UnifiedPayService {
* @param request
* @return
*/
ThirdInOrderVo inOrder(InOrderDto dto, HttpServletRequest request);
InOrderVo inOrder(InOrderDto dto, HttpServletRequest request);
/**
* 统一订单查询

18
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java

@ -20,15 +20,13 @@ import com.bnyer.pay.design.strategy.IPayStrategy;
import com.bnyer.pay.dto.AddPayInfoDto;
import com.bnyer.pay.dto.InOrderDto;
import com.bnyer.pay.dto.QueryOrderDto;
import com.bnyer.pay.enums.EnumAliPayStatus;
import com.bnyer.pay.enums.EnumDyPayStatus;
import com.bnyer.pay.enums.EnumKsPayStatus;
import com.bnyer.pay.enums.EnumWxPayStatus;
import com.bnyer.pay.service.PayInfoService;
import com.bnyer.pay.service.UnifiedPayService;
import com.bnyer.pay.vo.QueryOrderVo;
import com.bnyer.pay.vo.ThirdInOrderVo;
import com.bnyer.pay.vo.PayInfoDetailsVo;
import com.bnyer.pay.vo.ThirdQueryOrderVo;
import com.bnyer.pay.vo.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -61,7 +59,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
* @return
*/
@Override
public ThirdInOrderVo inOrder(InOrderDto dto, HttpServletRequest request) {
public InOrderVo inOrder(InOrderDto dto, HttpServletRequest request) {
//支付金额
String payAmount = "";
//商品类型:快手支付需要
@ -99,7 +97,8 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
//构建支付订单完成入库
AddPayInfoDto addPayInfoDto = buildPayInfo(thirdInOrderVo, unifiedOrderBo,dto);
payInfoService.addPayInfo(addPayInfoDto);
return thirdInOrderVo;
InOrderVo inOrderVo = EntityConvertUtil.copy(thirdInOrderVo, InOrderVo.class);
return inOrderVo;
}
/**
@ -118,10 +117,10 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
addPayInfoDto.setPayType(dto.getPayType());
addPayInfoDto.setPayId(unifiedOrderBo.getPayId());
addPayInfoDto.setPayAmount(new BigDecimal(unifiedOrderBo.getPayAmount()));
addPayInfoDto.setAppid(thirdInOrderVo.getAppid());
addPayInfoDto.setAppid(thirdInOrderVo.getAppId());
addPayInfoDto.setGoodsSubject(unifiedOrderBo.getGoodsSubject());
addPayInfoDto.setGoodsDesc(unifiedOrderBo.getGoodsDesc());
addPayInfoDto.setThirdNo(thirdInOrderVo.getPrepayid());
// addPayInfoDto.setThirdNo(thirdInOrderVo.getPrepayid());
addPayInfoDto.setIp(unifiedOrderBo.getIp());
return addPayInfoDto;
}
@ -200,7 +199,8 @@ public class UnifiedPayServiceImpl implements UnifiedPayService {
EnumPayStatus enumPayStatusDy = EnumDyPayStatus.getEnumPayStatusByStatus(thirdPayStatus);
return enumPayStatusDy.getStatus();
case ALI_PAY:
EnumPayStatus enumPayStatusAli = EnumAliPayStatus.getEnumPayStatusByStatus(thirdPayStatus);
return enumPayStatusAli.getStatus();
default:
throw new ServiceException("payType 参数参数传递错误");
}

80
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/InOrderVo.java

@ -0,0 +1,80 @@
package com.bnyer.pay.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author :WXC
* @Date :2023/05/06
* @description :
*/
@Data
@NoArgsConstructor
public class InOrderVo {
@ApiModelProperty(value = "应用id")
private String appId;
@ApiModelProperty(value = "内部系统支付单号/开发者测单号")
private String outOrderNo;
@ApiModelProperty(value = "微信下单返回")
private ThirdInOrderVo.WxThirdInOrderVo wxThirdInOrderVo;
@ApiModelProperty(value = "支付宝下单返回")
private ThirdInOrderVo.AliThirdInOrderVo aliThirdInOrderVo;
@ApiModelProperty(value = "快手下单返回")
private ThirdInOrderVo.KsThirdInOrderVo ksThirdInOrderVo;
@ApiModelProperty(value = "抖音下单返回")
private ThirdInOrderVo.DyThirdInOrderVo dyThirdInOrderVo;
@Data
public static class WxThirdInOrderVo {
@ApiModelProperty(value = "应用id")
private String appId;
@ApiModelProperty(value = "时间戳")
private String timeStamp;
@ApiModelProperty(value = "随机串")
private String nonceStr;
@ApiModelProperty(value = "会话标识")
private String packageValue;
@ApiModelProperty(value = "微信返回的字段")
private String signType;
@ApiModelProperty(value = "签名")
private String paySign;
}
@Data
public static class AliThirdInOrderVo {
@ApiModelProperty(value = "支付宝")
private String outStr;
}
@Data
public static class DyThirdInOrderVo {
@ApiModelProperty(value = "抖音侧订单号")
private String orderId;
@ApiModelProperty(value = "抖音订单token")
private String orderToken;
}
@Data
public static class KsThirdInOrderVo {
@ApiModelProperty(value = "快手侧订单号")
private String orderNo;
@ApiModelProperty(value = "快手订单token")
private String orderToken;
}
}

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java

@ -1,6 +1,5 @@
package com.bnyer.pay.vo;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@ -13,7 +12,6 @@ import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PayInfoDetailsVo extends PayInfoVo {
}

91
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdInOrderVo.java

@ -1,50 +1,85 @@
package com.bnyer.pay.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author :WXC
* @Date :2023/04/03
* @description :统一第三方支付下单返回参数
*/
@Getter
@Setter
@Data
@NoArgsConstructor
public class ThirdInOrderVo {
public class ThirdInOrderVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "appid")
private String appid;
@ApiModelProperty(value = "应用id")
private String appId;
@ApiModelProperty(value = "商户号")
private String mchid;
@ApiModelProperty(value = "内部系统支付单号/开发者测单号")
private String outOrderNo;
@ApiModelProperty(value = "交易类型:JSAPI等")
private String tradeType;
@ApiModelProperty(value = "微信下单返回")
private WxThirdInOrderVo wxThirdInOrderVo;
@ApiModelProperty(value = "微信返回的字段")
private String prepayid;
@ApiModelProperty(value = "支付宝下单返回")
private AliThirdInOrderVo aliThirdInOrderVo;
@ApiModelProperty(value = "随机串")
private String noncestr;
@ApiModelProperty(value = "快手下单返回")
private KsThirdInOrderVo ksThirdInOrderVo;
@ApiModelProperty(value = "时间戳")
private String timestamp;
@ApiModelProperty(value = "抖音下单返回")
private DyThirdInOrderVo dyThirdInOrderVo;
@ApiModelProperty(value = "签名")
private String sign;
@Data
public static class WxThirdInOrderVo {
@ApiModelProperty(value = "应用id")
private String appId;
@ApiModelProperty(value = "时间戳")
private String timeStamp;
@ApiModelProperty(value = "随机串")
private String nonceStr;
@ApiModelProperty(value = "会话标识")
private String packageValue;
@ApiModelProperty(value = "微信返回的字段")
private String signType;
@ApiModelProperty(value = "签名")
private String paySign;
@ApiModelProperty(value = "支付宝")
private String outStr;
}
@ApiModelProperty(value = "内部系统支付单号/开发者测单号")
private String outOrderNo;
@Data
public static class AliThirdInOrderVo {
@ApiModelProperty(value = "支付宝")
private String outStr;
}
@Data
public static class DyThirdInOrderVo {
@ApiModelProperty(value = "抖音侧订单号")
private String orderId;
@ApiModelProperty(value = "抖音订单token")
private String orderToken;
}
@Data
public static class KsThirdInOrderVo {
@ApiModelProperty(value = "快手侧订单号")
private String orderNo;
@ApiModelProperty(value = "快手订单token")
private String orderToken;
}
@ApiModelProperty(value = "第三方返回支付单号,抖音快手支付需要用到")
private String thirdOrderNo;
@ApiModelProperty(value = "快手、抖音支付")
private String orderToken;
}

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java

@ -28,7 +28,7 @@ public class ThirdQueryOrderVo {
private String payTime;
//快手支付渠道。取值:UNKNOWN - 未知|WECHAT-微信 |ALIPAY-支付宝。(注:如果用户还未支付,这里返回的是UNKNOWN.)
private String ksPayChannel;
//抖音支付渠道
//抖音支付渠道。1-微信支付,2-支付宝支付,10-抖音支付
private Integer dyPayChannel;
//第三方平台订单号:抖音快手平台订单号
private String thirdOrderNo;

Loading…
Cancel
Save