From d4c3427bbd111f4a005c77a9cc1f131b455fc6cf Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期一, 30 十月 2023 11:30:40 +0800
Subject: [PATCH] 新增加腾讯地图工具类

---
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java |  261 ++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 240 insertions(+), 21 deletions(-)

diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
index 383a92c..8eaf64d 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -1,5 +1,7 @@
 package com.ruoyi.order.service.impl.order;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -39,6 +41,7 @@
 import com.ruoyi.order.service.account.PaymentMessageService;
 import com.ruoyi.order.service.account.ProfitSharingService;
 import com.ruoyi.order.service.order.*;
+import com.ruoyi.order.util.HuiFuTianXiaUtil;
 import com.ruoyi.system.api.constant.AppErrorConstant;
 import com.ruoyi.system.api.constant.DelayTaskEnum;
 import com.ruoyi.system.api.constant.SecurityConstant;
@@ -60,12 +63,14 @@
 import lombok.extern.log4j.Log4j2;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.NumberFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -145,6 +150,9 @@
 
     @Resource
     private OrderRefundService orderRefundService;
+
+    @Value("${wx.pay.callbackPath}")
+    private String callbackPath;
 
 
     /**
@@ -781,8 +789,13 @@
             if (null != goodsNameList) {
                 goodsName = String.join(",", goodsNameList);
             }
-            // 小程序微信下单支付
-            createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo,
+//            // 小程序微信下单支付
+//            createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo,
+//                    orderId, order.getPayMoney(), appPlaceOrderDto.getOpenid(),
+//                    appPlaceOrderDto.getSpbillCreateIp());
+
+            // 小程序微信下单支付 TODO 更换支付渠道(汇付天下)
+            createWxPayInfo1(appPlaceOrderVo, userId, order.getShopId(), goodsName, outTradeNo,
                     orderId, order.getPayMoney(), appPlaceOrderDto.getOpenid(),
                     appPlaceOrderDto.getSpbillCreateIp());
             //生成自动取消订单延时任务
@@ -921,31 +934,45 @@
      * @param payerClientIp
      */
 
-    private void createWxPayInfo(AppPlaceOrderVo appPlaceOrderVo, Long userId, Long shopId,
+    private void createWxPayInfo1(AppPlaceOrderVo appPlaceOrderVo, Long userId, Long shopId,
                                  String goodsName, String outTradeNo,
                                  String orderId, BigDecimal payMoney,
                                  String openid, String payerClientIp){
         try {
+            WxPayConfig config = wxService.getConfig();
+            PartnerTransactionsRequest request = new PartnerTransactionsRequest();
+            request.setSpAppid(config.getAppId());
+            request.setSpMchid(config.getMchId());
+            request.setSubMchid(config.getSubMchId());
+            //  商品描述	body
+            String description = goodsName + "-商品购买";
 
+            request.setDescription(description);
+            request.setOutTradeNo(outTradeNo);
+            request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentCallback");
 
-
+            R<com.alibaba.fastjson.JSONObject> r = HuiFuTianXiaUtil.weixinPayment(outTradeNo, description, payMoney.doubleValue(), openid, request.getNotifyUrl());
+            if(r.getCode() != 200){
+                throw new ServiceException(r.getMsg());
+            }
+            com.alibaba.fastjson.JSONObject data = r.getData();
+            String mainMchId = WxPayConfiguration.getPlatformTyMacId();
             // 支付相关信息返回
-            appPlaceOrderVo.setAppId(result.getAppId());
+            appPlaceOrderVo.setAppId(data.getString("appId"));
             appPlaceOrderVo.setMchId(config.getMchId());
-            appPlaceOrderVo.setTimeStamp(result.getTimeStamp());
-            appPlaceOrderVo.setNonceStr(result.getNonceStr());
-            appPlaceOrderVo.setPackageStr(result.getPackageValue());
-            appPlaceOrderVo.setSignType(result.getSignType());
-            appPlaceOrderVo.setPaySign(result.getPaySign());
-            appPlaceOrderVo.setPrepayId(result.getPackageValue());
+            appPlaceOrderVo.setTimeStamp(data.getString("timeStamp"));
+            appPlaceOrderVo.setNonceStr(data.getString("nonceStr"));
+            appPlaceOrderVo.setPackageStr(data.getString("package"));
+            appPlaceOrderVo.setSignType(data.getString("signType"));
+            appPlaceOrderVo.setPaySign(data.getString("paySign"));
 
             // 保存支付订单统一下单日志
-            paymentMessageService.savePaymentMessage("1", orderId, payRequestJson, payResponseJson);
+            paymentMessageService.savePaymentMessage("1", orderId, JSON.toJSONString(request), data.toJSONString());
 
             // 保存支付订单统一下单支付记录
             orderPaymentService.saveOrderPayment(userId, shopId, mainMchId, orderId, outTradeNo, payMoney,
                     appPlaceOrderVo.getEndTime(), "Y", openid,
-                    goodsName, result.getPackageValue());
+                    goodsName, appPlaceOrderVo.getPackageStr());
         }catch (Exception e){
             e.printStackTrace();
         }
@@ -1202,7 +1229,12 @@
                 }
                 appPlaceOrderVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(), delayTime));
                 // 小程序微信下单支付
-                createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo,
+//                createWxPayInfo(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo,
+//                        orderId, order.getPayMoney(), appPlaceActivityDto.getOpenid(),
+//                        appPlaceActivityDto.getSpbillCreateIp());
+
+                // 小程序微信下单支付 TODO 更换支付渠道(汇付天下)
+                createWxPayInfo1(appPlaceOrderVo, userId, order.getShopId(), orderGoods.getGoodsName(), outTradeNo,
                         orderId, order.getPayMoney(), appPlaceActivityDto.getOpenid(),
                         appPlaceActivityDto.getSpbillCreateIp());
                 //生成自动取消订单延时任务
@@ -1480,11 +1512,6 @@
         Order order = this.getById(orderId);
         if (order.getOrderStatus() != 2) {
             throw new ServiceException(AppErrorConstant.VERIFY_USED);
-        }
-        //判断商户是否有分账权限
-        Shop shop = remoteShopService.getShop(shopId).getData();
-        if(shop.getAccountFlag()!=1){
-            throw new ServiceException(AppErrorConstant.SHOP_NO_VERIFY);
         }
         // 根据订单用户ID获取用户信息
         Member member = remoteMemberService.getMember(order.getUserId()).getData();
@@ -1871,7 +1898,9 @@
         this.saveOrUpdate(order);
         // 订单金额大于0时进行分账
         if (order.getOnlinePayMoney().compareTo(BigDecimal.ZERO)>0) {
-            submitProfitSharing(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom());
+            // TODO: 2023/10/17  更换分账渠道(汇付天下)
+//            submitProfitSharing(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom());
+            submitProfitSharing1(orderId, order.getOrderNo(), order.getShopId(), order.getOnlinePayMoney(),order.getOrderFrom());
         }
         //创建支付记录
         if(merVerifyOrderDto.getRelPayMoney().compareTo(BigDecimal.ZERO)>0){
@@ -1994,6 +2023,131 @@
         // 保存分账信息
         paymentMessageService.savePaymentMessage("4", orderId, sendMessage, resultMessage);
     }
+
+
+
+
+    /**
+     * @description  分账实现
+     * @author  jqs
+     * @date    2023/9/8 11:56
+     * @param orderId
+     * @param orderNo
+     * @param shopId
+     * @param orderMoney
+     * @param orderFrom
+     * @return  void
+     */
+    private void submitProfitSharing1(String orderId, String orderNo, Long shopId, BigDecimal orderMoney, Integer orderFrom) {
+        String sendMessage = "";
+        String resultMessage = "";
+        try {
+            // 核销完成 开始分账(平台收取服务费)
+            OrderPayment payment = orderPaymentService.getByOrderId(orderId);
+            String transactionId = payment.getTransactionId();
+            String outTradeNo = payment.getOutTradeNo();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            String org_req_date = sdf.format(payment.getCreateTime());
+            R<ShopAuthenticationHftxVo> resultMch = remoteShopService.getShopHFTXSubMchId(shopId);
+            ShopAuthenticationHftxVo vo = resultMch.getData();
+            if (StringUtils.isEmpty(vo.getHuifuId())) {
+                throw new ServiceException("获取商户号失败");
+            }
+            // 平台特约商户号,用户平台收取服务费 2023-09-05改变分账方式
+            String platformTyMacId = WxPayConfiguration.getPlatformTyMacId();
+            if (!StringUtils.isEmpty(platformTyMacId)) {
+                WxPayConfig config = wxService.getConfig();
+                ShopProportionVo shopProportion = null;
+                BigDecimal proportionPercent = null;
+                //商户订单获取统一分成 活动订单获取活动分成
+                if(orderFrom==1){
+                    if(null == vo.getShareRatio()){
+                        proportionPercent = new BigDecimal(redisService.getCacheObject(SecurityConstant.SHOP_COMMON_PROPORTION).toString());
+                    }else{
+                        proportionPercent = new BigDecimal(vo.getShareRatio());
+                    }
+                }else{
+                    R<ShopProportionVo> resultShopProportion = remoteShopService.getShopProportion(shopId);
+                    shopProportion = resultShopProportion.getData();
+                    proportionPercent = shopProportion.getProportionPercent();
+                }
+                if (null != proportionPercent) {
+                    ProfitSharingRequest request = new ProfitSharingRequest();
+                    request.setAppid(config.getAppId());
+                    request.setSubMchid(platformTyMacId);
+                    request.setTransactionId(transactionId);
+                    request.setOutOrderNo(IdUtils.simpleUUID());
+                    List<ProfitSharingRequest.Receiver> receiverList = new ArrayList<>();
+                    String description = "订单:" + orderNo + " 平台分账";
+                    //商户分成
+                    if(proportionPercent.compareTo(BigDecimal.ZERO)>0){
+                        PaymentDelaytransHFTXVo result = new PaymentDelaytransHFTXVo();
+                        // 计算分成金额
+                        int amount = orderMoney.multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).intValue();
+                        BigDecimal multiply = orderMoney.multiply(proportionPercent.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_EVEN);
+                        log.info("订单分账:{} 分账金额: {}", orderNo, amount);
+                        if (amount > 0) {
+                            // 分账创建
+                            ProfitSharingRequest.Receiver receiver = new ProfitSharingRequest.Receiver();
+                            receiver.setType("MERCHANT_ID");
+                            receiver.setReceiverAccount(vo.getHuifuId());
+                            receiver.setAmount(amount);
+                            receiver.setDescription(description);
+                            receiverList.add(receiver);
+                            request.setReceivers(receiverList);
+                            // 分账完成
+                            request.setFinish(true);
+
+                            //分账对象
+                            JSONArray acctInfos = new JSONArray();
+                            if(multiply.compareTo(BigDecimal.ZERO) > 0){
+                                JSONObject jsonObject = new JSONObject();
+                                jsonObject.put("div_amt", String.format("%.2f", multiply.doubleValue()));
+                                jsonObject.put("huifu_id", vo.getHuifuId());
+                                acctInfos.add(jsonObject);
+                            }
+                            //平台商户
+                            BigDecimal pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN);
+                            if(pt_amount.compareTo(BigDecimal.ZERO) > 0){
+                                JSONObject jsonObject1 = new JSONObject();
+                                jsonObject1.put("div_amt", String.format("%.2f", pt_amount.doubleValue()));
+                                jsonObject1.put("huifu_id", "6666000141216769");
+                                acctInfos.add(jsonObject1);
+                            }
+
+                            R<PaymentDelaytransHFTXVo> hftxVoR = HuiFuTianXiaUtil.paymentDelaytrans(request.getOutOrderNo(), org_req_date, outTradeNo, acctInfos);
+                            if(hftxVoR.getCode() != 200){
+                                throw new ServiceException(hftxVoR.getMsg());
+                            }
+                            result = hftxVoR.getData();
+                            // 创建分账记录
+                            profitSharingService.saveProfitSharing1(shopId, orderId, orderMoney, vo.getHuifuId(), multiply.doubleValue(), result);
+                        }
+                        // 保存请求信息
+                        sendMessage = JSONObject.toJSONString(request);
+                        resultMessage = JSONObject.toJSONString(result);
+                    }
+                } else {
+                    resultMessage = String.format("订单分账:%s 获取商户分成失败", orderNo);
+                    log.info(resultMessage);
+                }
+            } else {
+                resultMessage = String.format("订单分账:%s 获取微信商户号失败", orderNo);
+                log.info(resultMessage);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            resultMessage = String.format("订单分账:%s 分账失败:%s", orderNo, e.getMessage());
+            log.info(resultMessage);
+            throw new ServiceException(resultMessage);
+        }
+
+        // 保存分账信息
+        paymentMessageService.savePaymentMessage("4", orderId, sendMessage, resultMessage);
+    }
+
+
+
 
     /**
      * @param merVerifyCouponDto
@@ -4974,6 +5128,9 @@
         // 更新订单状态 outTradeNo
         String outTradeNo = transaction.getOutTradeNo();
         Order order = this.getByOutTradeNo(outTradeNo);
+        if(order.getOrderStatus() != 1){
+            return;
+        }
         String orderId = order.getOrderId();
         order.setOrderStatus(2);
         order.setPayTime(new Date());
@@ -5307,7 +5464,9 @@
         if(BigDecimal.ZERO.compareTo(onlinePayMoney) < 0){
             log.info("订单支付金额大于0,可发起退款");
             // 订单支付金额大于0,可发起退款
-            orderWxApplyRefund(orderId, refundId, onlinePayMoney, orderRefund);
+//            orderWxApplyRefund(orderId, refundId, onlinePayMoney, orderRefund);
+            // 订单支付金额大于0,可发起退款 todo 修改渠道(汇付天下)
+            orderWxApplyRefund1(orderId, refundId, onlinePayMoney, orderRefund);
         }
 
         orderRefund.setRefundStatus(1);
@@ -5364,6 +5523,66 @@
         }
     }
 
+
+
+    /**
+     * 申请退款API
+     */
+    private void orderWxApplyRefund1(String orderId, String outRefundNo, BigDecimal payMoney, OrderRefund orderRefund){
+        try {
+            // 创建支付订单
+            OrderPayment orderPayment = orderPaymentService.getByOrderId(orderId);
+            if (null == orderPayment) {
+                return;
+            }
+
+            log.info("调用微信退款---发起退款");
+
+            String subMchId = orderPayment.getSubMchId();
+//            WxPayConfig config = wxService.getConfig();
+
+            RefundsRequest request = new RefundsRequest();
+//            request.setSpAppid(config.getAppId());
+            request.setSubMchid(subMchId);
+            request.setTransactionId(orderPayment.getTransactionId());
+            request.setOutRefundNo(outRefundNo);
+            request.setReason("用户取消订单");
+            // 订单金额
+            int total = orderPayment.getPayMoney().multiply(new BigDecimal(100)).intValue();
+
+            RefundsRequest.Amount amount = RefundsRequest.Amount.builder().refund(total).total(total).currency("CNY").build();
+            request.setAmount(amount);
+            request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentRefundCallback");
+
+//            RefundsResult result = wxService.getEcommerceService().refunds(request);
+
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            String org_req_date = sdf.format(orderPayment.getCreateTime());
+            String outTradeNo = orderPayment.getOutTradeNo();
+            R<String> r = HuiFuTianXiaUtil.weixinPaymentRefund(outRefundNo, orderPayment.getPayMoney().doubleValue(), org_req_date, outTradeNo, request.getNotifyUrl());
+            if(r.getCode() != 200){
+                throw new ServiceException(r.getMsg());
+            }
+
+            // 微信退款id
+            orderRefund.setWxRefundId(r.getData());
+
+            // 请求参数
+            Gson gson = new Gson();
+            String refundRequestJson = gson.toJson(request);
+            // 返回参数
+//            String refundResponseJson = gson.toJson(result);
+
+//            log.info("调用微信退款返回参数---{}", refundResponseJson);
+
+            // 保存支付订单统一下单日志
+//            paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson);
+
+        } catch (Exception e) {
+            throw new ServiceException(e.getMessage());
+        }
+    }
+
     /**
      * @param staffTotalDto
      * @return StaffActivityOrderTotalVo

--
Gitblit v1.7.1