Bläddra i källkod

一个月内同一买家id只能购买两次midjourney

zoujiajian 2 år sedan
förälder
incheckning
23b9705642

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -37,6 +37,11 @@ public class OrderDon extends BaseEntity implements Serializable {
 
     private Long goodsId;
 
+    /**
+     * 买家支付id
+     */
+    private String buyerId;
+
     /**
      * 微信订单号
      */

+ 3 - 7
netflix-service/src/main/java/com/cyksj/service/mange/CmsOrderDonService.java

@@ -1,7 +1,9 @@
 package com.cyksj.service.mange;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.cyksj.model.entity.*;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.OrderDonTransport;
+import com.cyksj.model.entity.OrderDonWaybill;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.request.ChangeRelationReq;
@@ -9,7 +11,6 @@ import com.cyksj.model.request.ClickOutReq;
 import com.cyksj.model.request.OrderBalanceRefundReq;
 import com.cyksj.model.request.OrderRefundReq;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -45,11 +46,6 @@ public interface CmsOrderDonService extends IService<OrderDon> {
 	 */
 	void changeRelation(ChangeRelationReq req) throws Exception;
 
-	/**
-	 * 退款记录
-	 */
-	void refundRecord(OrderDon orderDon, BigDecimal refundMoney, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType);
-
 	/**
 	 *
 	 * @param orderRefundReq

+ 7 - 55
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -51,13 +51,12 @@ import com.cyksj.service.mange.CmsOrderDonService;
 import com.cyksj.service.mange.stock.GoodsDonStockService;
 import com.cyksj.service.market.MarketFrontService;
 import com.cyksj.service.order.OrderCommonService;
+import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
-import com.cyksj.service.paypal.PayPalService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.cyksj.service.shop.YhShopDistributeService;
-import com.cyksj.service.stripe.StripeService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.wechat.WeChatService;
 import com.ejlchina.searcher.BeanSearcher;
@@ -140,9 +139,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final WorkOrderMapper workOrderMapper;
 
-    private final PayPalService payPalService;
-
-    private final StripeService stripeService;
+    private final OrderRefundService orderRefundService;
 
     private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
 
@@ -332,7 +329,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             return;
         }
         //调用第三方接口退款
-        String outNo = centerRefund(refundReq, orderDon);
+        String outNo = orderRefundService.centerRefund(refundReq, orderDon);
         orderDon.setRefundDesc(refundReq.getRefundDesc());
         //记录退款信息
 	    commonRefund(orderDon, refundReq.getRefundMoney(), goodsDon, sku, outNo, refundType);
@@ -700,7 +697,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
      */
     public void commonRefund(OrderDon orderDon, BigDecimal refundMoney, GoodsDon goodsDon, GoodsDonSku sku, String outNo, String refundType) {
         TASK_POOL.execute(() -> {
-            refundRecord(orderDon, refundMoney, goodsDon, sku, outNo, refundType);
+            orderRefundService.refundRecord(orderDon, refundMoney, goodsDon, sku, outNo, refundType);
             //退款一次
             goodsDonStockService.upStockRelate(null, orderDon.getId(), "refund");
             try {
@@ -903,33 +900,6 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         }
     }
 
-    /**
-     * 记录退款信息
-     */
-    @Override
-    public void refundRecord(OrderDon orderDon, BigDecimal refundMoney, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType) {
-        RefundOrderDon refund = new RefundOrderDon();
-        refund.setOrderId(orderDon.getId());
-        refund.setOutRefundNo(outRefundNo);
-        refund.setTotalFee(orderDon.getMoney());
-        refund.setRefundDesc(orderDon.getRefundDesc());
-        //退款金额
-        refund.setRefundFee(refundMoney);
-        refund.setUserId(orderDon.getUserId());
-        refund.setGoodsId(orderDon.getGoodsId());
-        refund.setGoodsTitle(goodsDon == null ? null : goodsDon.getTitle());
-        refund.setSkuId(orderDon.getSkuId());
-        refund.setSpecVal(sku == null ? null : String.format("%s%s", sku.getSpecVal(), sku.getPrice().divide(BigDecimal.valueOf(100))));
-        refund.setRefundMethod(orderDon.getType().name());
-        refund.setGoodsType(goodsDon == null ? 0 : goodsDon.getType());
-        //退款方式
-        if (StrUtil.isNotBlank(refundType) && refundType.equals(OrderDon.Type.BALANCE.getType())) {
-            refund.setRefundMethod(refundType);
-            refund.setRefundFee(orderDon.getRefundBalance());
-        }
-        refundOrderDonMapper.insert(refund);
-    }
-
     @Override
     public void refundPriceDiffer(OrderRefundReq orderRefundReq) throws Exception {
         Long orderId = orderRefundReq.getOrderId();
@@ -966,7 +936,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 throw BusinessRuntimeException.getInstance("补差价金额应不大于订单金额");
             }
             //退款
-            outNo = centerRefund(orderRefundReq, orderDon);
+            outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
             orderDon.setRefundMoney(orderRefundMoney.add(refundMoney));
             orderDonMapper.updateById(orderDon);
 
@@ -986,7 +956,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             orderDonMapper.updateById(orderDon);
         }
 
-        refundRecord(orderDon, refundMoney, goodsDon, sku, outNo, refundType);
+        orderRefundService.refundRecord(orderDon, refundMoney, goodsDon, sku, outNo, refundType);
     }
 
     @Override
@@ -1032,7 +1002,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         orderRefundReq.setRefundMoney(refundFee);
         orderRefundReq.setRefundType("money");
 
-        String outNo = centerRefund(orderRefundReq, orderDon);
+        String outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
 
         orderDon.setRefundBalance(orderDon.getRefundBalance().subtract(refundFee));
         BigDecimal orderRefundMoney = Optional.ofNullable(orderDon.getRefundMoney()).orElse(BigDecimal.ZERO);
@@ -1089,22 +1059,4 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         }
         return relation;
     }
-
-	public String centerRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception {
-		OrderDon.Type type = orderDon.getType();
-		String refundType = refundReq.getRefundType();
-		if (type == OrderDon.Type.WeChat && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
-			return wxRefund(refundReq, orderDon);
-		}
-		if (type == OrderDon.Type.ALI_PAY && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
-			return zfbRefund(refundReq, orderDon);
-		}
-		if (type == OrderDon.Type.PAYPAL && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
-			payPalService.refund(refundReq, orderDon);
-		}
-		if (type == OrderDon.Type.STRIPE && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
-			stripeService.refund(refundReq, orderDon);
-		}
-		return StrUtil.EMPTY;
-	}
 }

+ 24 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderRefundService.java

@@ -0,0 +1,24 @@
+package com.cyksj.service.order;
+
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.request.OrderRefundReq;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderRefundService
+ * 创建者: JavaZou
+ * 创建时间:2023/12/4 14:36
+ */
+public interface OrderRefundService {
+
+	String centerRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception;
+
+	/**
+	 * 退款记录
+	 */
+	void refundRecord(OrderDon orderDon, BigDecimal refundMoney, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType);
+}

+ 62 - 16
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -72,6 +72,7 @@ import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.order.OrderCommonService;
 import com.cyksj.service.order.OrderDonPostService;
 import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.pay.AliPayCommonService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.relation.GroupRelationFrontService;
@@ -250,6 +251,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final UserPlatSkuDistributeRateMapper userPlatSkuDistributeRateMapper;
 
+	private final OrderRefundService orderRefundService;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -793,22 +796,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						}
 						//throw new BusinessRuntimeException("订单用户与车位用户不匹配!");
 					} else {
-						if (GroupsRelation.Status.locking == groupsRelation.getStatus()) {
-							log.info("清理用户userId:{}未支付订单", orderDon.getUserId());
-							groupsRelation.setUserId(0L);
-							Long groupsId = groupsRelation.getGroupsId();
-							GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
-							if (groupsRelation.getNum() > groupsTrips.getNum()) {
-								groupsRelation.setStatus(GroupsRelation.Status.outside);
-
-								redisService.del(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getNameFormat(groupsId, groupsRelation.getNum()));
-							} else {
-								groupsRelation.setStatus(GroupsRelation.Status.none);
-							}
-							groupsRelation.setYhsId(0l);
-							groupsRelationMapper.updateById(groupsRelation);
-							orderCommonService.delRelation(groupsRelation);
-						}
+						clearUserLockingRelation(groupsRelation, orderDon);
 					}
 				}
 				//返还优惠券
@@ -1045,6 +1033,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		String transactionId = params.get("trade_no");
 		String payTimeStr = params.get("gmt_payment");
+		//买家支付宝账号
+		String buyerId = params.get("buyer_id");
+		log.info("支付宝回调信息:{}", Jsons.toJson(params));
 		if (!orderDon.getStatus().equals(OrderDon.Status.noPayment) && !orderDon.getStatus().equals(OrderDon.Status.close)) {
 			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
 			return;
@@ -1068,6 +1059,39 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setShopId(appId);
 		orderDon.setType(OrderDon.Type.ALI_PAY);
 
+		orderDon.setBuyerId(buyerId);
+		if (orderDon.getOrderType() == 1 && StrUtil.isNotEmpty(buyerId)) {
+			//近一个月同一买家id 只能购买一次 多人
+			if (orderDon.getGoodsId() == 26l && sku.getNum() != 1) {
+				Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+						.ne(OrderDon::getId, orderDon.getId())
+						.eq(OrderDon::getGoodsId, orderDon.getGoodsId())
+						.eq(OrderDon::getBuyerId, buyerId)
+						.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+						.ge(OrderDon::getCreatedTime, DateUtil.offsetMonth(DateTime.now(), -1)));
+				if (count > 1) {
+					//退款
+					log.info("一个月内同一买家id购买过Midjourney账号,对订单号:{}进行退款", orderDon.getOrderNo());
+					OrderRefundReq orderRefundReq = new OrderRefundReq();
+					orderRefundReq.setOrderId(orderDon.getId());
+					;
+					orderRefundReq.setRefundType("ALI_PAY");
+					orderRefundReq.setRefundMoney(orderDon.getMoney());
+					orderDon.setRefundDesc("近一个月内购买过Midjourney账号");
+					String outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
+
+					orderDon.setStatus(OrderDon.Status.refund);
+					orderDonMapper.updateById(orderDon);
+
+					clearUserLockingRelation(groupsRelationMapper.selectById(orderDon.getRelationId()), orderDon);
+
+					//记录退款
+					orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), goodsDon, sku, outNo, orderDon.getType().getType());
+					return;
+				}
+			}
+		}
+		//回调
 		unifiedHandlerOrderNotify(orderDon, goodsDon, sku);
 	}
 
@@ -2611,4 +2635,26 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		userPlatDistributeRate.setSecondRate(secondRate);
 		return userPlatDistributeRate;
 	}
+
+	private void clearUserLockingRelation(GroupsRelation groupsRelation, OrderDon orderDon) {
+		if (groupsRelation == null) {
+			return;
+		}
+		if (GroupsRelation.Status.locking == groupsRelation.getStatus()) {
+			log.info("清理用户userId:{}未支付订单", orderDon.getUserId());
+			groupsRelation.setUserId(0L);
+			Long groupsId = groupsRelation.getGroupsId();
+			GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
+			if (groupsRelation.getNum() > groupsTrips.getNum()) {
+				groupsRelation.setStatus(GroupsRelation.Status.outside);
+
+				redisService.del(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getNameFormat(groupsId, groupsRelation.getNum()));
+			} else {
+				groupsRelation.setStatus(GroupsRelation.Status.none);
+			}
+			groupsRelation.setYhsId(0l);
+			groupsRelationMapper.updateById(groupsRelation);
+			orderCommonService.delRelation(groupsRelation);
+		}
+	}
 }

+ 215 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java

@@ -0,0 +1,215 @@
+package com.cyksj.service.order.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.domain.AlipayTradeRefundModel;
+import com.alipay.api.request.AlipayTradeRefundRequest;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Codec;
+import com.cyksj.config.WeChatConfig;
+import com.cyksj.config.zfb.AliPayClientFactory;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.PaypalPayConfigMapper;
+import com.cyksj.mapper.RefundOrderDonMapper;
+import com.cyksj.mapper.StripePayConfigMapper;
+import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.request.OrderRefundReq;
+import com.cyksj.service.order.OrderRefundService;
+import com.cyksj.service.wechat.WeChatService;
+import com.paypal.api.payments.Amount;
+import com.paypal.api.payments.Refund;
+import com.paypal.api.payments.Sale;
+import com.paypal.base.rest.APIContext;
+import com.paypal.base.rest.OAuthTokenCredential;
+import com.paypal.base.rest.PayPalRESTException;
+import com.stripe.Stripe;
+import com.stripe.exception.StripeException;
+import com.stripe.param.RefundCreateParams;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderRefundServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/12/4 14:36
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class OrderRefundServiceImpl implements OrderRefundService {
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final PaypalPayConfigMapper paypalPayConfigMapper;
+
+	private final WeChatService weChatService;
+
+	private final WeChatConfig weChatConfig;
+
+	private final StripePayConfigMapper stripePayConfigMapper;
+
+	private final ShopConfigMapper shopConfigMapper;
+
+	private final RefundOrderDonMapper refundOrderDonMapper;
+
+	@Override
+	public String centerRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception {
+		OrderDon.Type type = orderDon.getType();
+		String refundType = refundReq.getRefundType();
+		if (type == OrderDon.Type.WeChat && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
+			return wxRefund(refundReq, orderDon);
+		}
+		if (type == OrderDon.Type.ALI_PAY && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
+			return zfbRefund(refundReq, orderDon);
+		}
+		if (type == OrderDon.Type.PAYPAL && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
+			paypalRefund(refundReq, orderDon);
+		}
+		if (type == OrderDon.Type.STRIPE && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
+			stripeRefund(refundReq, orderDon);
+		}
+		return StrUtil.EMPTY;
+	}
+
+	@Override
+	public void refundRecord(OrderDon orderDon, BigDecimal refundMoney, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType) {
+		RefundOrderDon refund = new RefundOrderDon();
+		refund.setOrderId(orderDon.getId());
+		refund.setOutRefundNo(outRefundNo);
+		refund.setTotalFee(orderDon.getMoney());
+		refund.setRefundDesc(orderDon.getRefundDesc());
+		//退款金额
+		refund.setRefundFee(refundMoney);
+		refund.setUserId(orderDon.getUserId());
+		refund.setGoodsId(orderDon.getGoodsId());
+		refund.setGoodsTitle(goodsDon == null ? null : goodsDon.getTitle());
+		refund.setSkuId(orderDon.getSkuId());
+		refund.setSpecVal(sku == null ? null : String.format("%s%s", sku.getSpecVal(), sku.getPrice().divide(BigDecimal.valueOf(100))));
+		refund.setRefundMethod(orderDon.getType().name());
+		refund.setGoodsType(goodsDon == null ? 0 : goodsDon.getType());
+		//退款方式
+		if (StrUtil.isNotBlank(refundType) && refundType.equals(OrderDon.Type.BALANCE.getType())) {
+			refund.setRefundMethod(refundType);
+			refund.setRefundFee(orderDon.getRefundBalance());
+		}
+		refundOrderDonMapper.insert(refund);
+	}
+
+
+	public String wxRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception {
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) <=0){
+			return StrUtil.EMPTY;
+		}
+		long time = System.currentTimeMillis();
+		//退款订单号
+		String outRefundNo = Codec.DoDigest.custom()
+				.setAlgorithm(Codec.DoDigest.Algorithm.MD5)
+				.setStringData(time + String.valueOf(orderDon.getId()))
+				.toHexString();
+		weChatService.refundWxOrder(weChatConfig.getAppid(),
+				Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.WX_DEFAULT_APP_ID),
+				orderDon.getTransactionId(),
+				outRefundNo,
+				orderDon.getMoney(),
+				refundReq.getRefundMoney(),
+				weChatConfig.getDomain() + "manage/order/wx/refund/notify");
+		//记录退款信息
+		return outRefundNo;
+	}
+
+	public String zfbRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception {
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) <=0){
+			return StrUtil.EMPTY;
+		}
+		AlipayTradeRefundResponse response;
+		//支付宝退款
+		AlipayClient alipayClient = AliPayClientFactory.getAlipayClient(Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.ZFB_DEFAULT_APP_ID));
+		AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+		AlipayTradeRefundModel model = new AlipayTradeRefundModel();
+		//支付宝交易号
+		model.setTradeNo(orderDon.getTransactionId());
+		model.setRefundAmount(refundReq.getRefundMoney().divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_EVEN).toString());
+		model.setQueryOptions(List.of("gmt_refund_pay"));
+		long time = System.currentTimeMillis();
+		//退款订单号
+		String outRefundNo = Codec.DoDigest.custom()
+				.setAlgorithm(Codec.DoDigest.Algorithm.MD5)
+				.setStringData(time + String.valueOf(orderDon.getId()))
+				.toHexString();
+		//退款请求号
+		model.setOutRequestNo(outRefundNo);
+		request.setBizModel(model);
+		String shopId = orderDon.getShopId();
+		ShopConfig shopConfig = shopConfigMapper.selectOne(Wrappers.lambdaQuery(ShopConfig.class).eq(ShopConfig::getAppId, orderDon.getShopId()));
+		if (shopId != null && shopConfig != null && shopConfig.getIsCert()) {
+			response = alipayClient.certificateExecute(request);
+		} else {
+			response = alipayClient.execute(request);
+		}
+		if (!response.isSuccess()) throw BusinessRuntimeException.getInstance("退款失败,e:{0}", response.getSubMsg());
+//			AliPayRefundRep aliPayRefundRep = Jsons.parseObject(response.getBody(), AliPayRefundRep.class);
+//			AliPayRefundRep.AlipayTradeRefundResponse res = aliPayRefundRep.getResponse();
+//			orderDon.setRefundMoney(res.getRefundFee().multiply(BigDecimal.valueOf(100)));
+		return outRefundNo;
+	}
+
+
+	public Boolean paypalRefund(OrderRefundReq refundReq, OrderDon orderDon) throws PayPalRESTException {
+		BigDecimal net = refundReq.getRefundMoney().divide(new BigDecimal(7),2,RoundingMode.HALF_DOWN).subtract(orderDon.getAbroadTransactionFee());;
+		log.info("paypal return order:{},money:{}",orderDon.getId(),net);
+		PaypalPayConfig paypalPayConfig = paypalPayConfigMapper.selectById(1);
+		APIContext apiContext = getAPIContext(paypalPayConfig.getClientId(), paypalPayConfig.getClientSecret(),paypalPayConfig.getMode());
+		Sale sale = Sale.get(apiContext, orderDon.getTransactionId());
+		Refund refund = new Refund();
+		refund.setAmount(new Amount("USD", net.divide(new BigDecimal(100),2,RoundingMode.HALF_DOWN).toString()));
+		refund = sale.refund(apiContext, refund);
+		log.info("paypal return refund:{}",refund);
+		if ("completed".equals(refund.getState())){
+			orderDon.setStatus(OrderDon.Status.refund);
+			orderDonMapper.updateById(orderDon);
+			return true;
+		}
+		return false;
+	}
+
+	public Boolean stripeRefund(OrderRefundReq refundReq, OrderDon orderDon) throws StripeException {
+		BigDecimal net = refundReq.getRefundMoney().divide(new BigDecimal(7),2, RoundingMode.HALF_DOWN).subtract(orderDon.getAbroadTransactionFee());
+		log.info("stripe return order:{},money:{}",orderDon.getId(),net);
+		StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
+		Stripe.apiKey = stripePayConfig.getApiKey();
+		RefundCreateParams params =
+				RefundCreateParams.builder()
+						.setCharge(orderDon.getTransactionId())
+						.setAmount(net.longValue())
+						.build();
+		com.stripe.model.Refund refund = com.stripe.model.Refund.create(params);
+		log.info("stripe return refund:{}",refund);
+		if ("succeeded".equals(refund.getStatus())){
+			orderDon.setStatus(OrderDon.Status.refund);
+			orderDonMapper.updateById(orderDon);
+			return true;
+		}
+		return false;
+	}
+
+	private APIContext getAPIContext(String clientId,String clientSecret,String mode) throws PayPalRESTException {
+		Map<String, String> sdkConfig = new HashMap<>();
+		sdkConfig.put("mode", mode);
+		OAuthTokenCredential authTokenCredential = new OAuthTokenCredential(clientId,clientSecret,sdkConfig);
+		APIContext apiContext = new APIContext(authTokenCredential.getAccessToken());
+		apiContext.setConfigurationMap(sdkConfig);
+		return apiContext;
+	}
+}

+ 4 - 1
netflix-service/src/main/java/com/cyksj/service/scheduler/impl/SchedulerServiceImpl.java

@@ -16,6 +16,7 @@ import com.cyksj.redis.RedisService;
 import com.cyksj.service.error.UserRelationChangeErrorRecordService;
 import com.cyksj.service.groups.GroupsFuncService;
 import com.cyksj.service.mange.CmsOrderDonService;
+import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.scheduler.SchedulerService;
 import com.cyksj.service.user.UserBenefitsService;
@@ -60,6 +61,8 @@ public class SchedulerServiceImpl implements SchedulerService {
 
 	private final GroupsFuncService groupsFuncService;
 
+	private final OrderRefundService orderRefundService;
+
 	private final CmsOrderDonService cmsOrderDonService;
 
 	private final UserRelationChangeErrorRecordService changeErrorRecordService;
@@ -217,7 +220,7 @@ public class SchedulerServiceImpl implements SchedulerService {
 							if (sku == null) return;
 							skuMap.putIfAbsent(orderDon.getSkuId(), sku);
 						}
-						cmsOrderDonService.refundRecord(orderDon, orderDon.getRefundMoney(), goodsDon, sku, StrUtil.EMPTY, "balance");
+						orderRefundService.refundRecord(orderDon, orderDon.getRefundMoney(), goodsDon, sku, StrUtil.EMPTY, "balance");
 						return;
 					}
 					changeTickerRelation(item_groupsId, relationView, source, relationView.getYhsId());