12
0

5 Commity 01015e578e ... 72e4f01dc6

Autor SHA1 Správa Dátum
  刘云鑫 72e4f01dc6 feat:合并代码 3 dní pred
  刘云鑫 abc1d3d79b feat:支付宝支付 6 dní pred
  刘云鑫 8e1e61f35a feat:支付宝支付 6 dní pred
  刘云鑫 409c9b144c feat:新增合并后缺少的方法 6 dní pred
  刘云鑫 74b603f181 feat:微信绑定 1 týždeň pred

+ 3 - 3
alien-dining/src/main/java/shop/alien/dining/strategy/payment/impl/WeChatPartnerPaymentMininProgramStrategyImpl.java

@@ -14,6 +14,7 @@ import okhttp3.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
+import shop.alien.dining.constants.OrderMenuConstants;
 import shop.alien.dining.service.StoreOrderService;
 import shop.alien.dining.strategy.payment.PaymentStrategy;
 import shop.alien.dining.util.WXPayUtility;
@@ -51,7 +52,6 @@ import java.util.concurrent.CompletableFuture;
  * 子商户小程序 {@code sub_appid} 优先取门店 {@link StorePaymentConfig},否则取配置项 {@code payment.wechatPartnerPay.business.subAppId}。
  * </p>
  *
- * @see shop.alien.store.strategy.payment.impl.WeChatPartnerPaymentStrategyImpl
  * @see WeChatPaymentMininProgramStrategyImpl
  */
 @Slf4j
@@ -238,7 +238,7 @@ public class WeChatPartnerPaymentMininProgramStrategyImpl implements PaymentStra
             log.info("[WeChatPartnerMinin] 换新商户单号 orderNo={}, payTradeNo={}", orderNo, newPayTradeNo);
             storeOrder.setCouponId(couponId);
             storeOrder.setPayUserId(payerId);
-            storeOrder.setServiceFee(new BigDecimal(serviceFee));
+//            storeOrder.setServiceFee(new BigDecimal(serviceFee));
             storeOrder.setDiscountAmount(new BigDecimal(discountAmount));
             storeOrder.setPayAmount(new BigDecimal(payAmount));
             if (!storeOrderService.updateById(storeOrder)) {
@@ -447,7 +447,7 @@ public class WeChatPartnerPaymentMininProgramStrategyImpl implements PaymentStra
                         }
                     }
                     try {
-                        storeOrderService.resetTableAfterPayment(storeOrder.getTableId(), storeOrder.getMenuType());
+                        storeOrderService.resetTableAfterPayment(storeOrder.getTableId(), OrderMenuConstants.MENU_TYPE_CUISINE);
                         log.info("[WeChatPartnerMinin] 支付后重置餐桌 tableId={}", storeOrder.getTableId());
                     } catch (Exception e) {
                         log.error("[WeChatPartnerMinin] 重置餐桌失败 tableId={}", storeOrder.getTableId(), e);

+ 9 - 5
alien-job/src/main/java/shop/alien/job/feign/AlienStoreFeign.java

@@ -2,11 +2,7 @@ package shop.alien.job.feign;
 
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 
 import java.util.Map;
@@ -95,6 +91,14 @@ public interface AlienStoreFeign {
     R<Integer> retryRefundFailed();
 
     /**
+     * 特约商户进件:申请单号查询申请状态(转发微信 GET .../applyment_id/{applyment_id})。
+     * 需在配置中提供 {@code feign.alienStore.url} 指向 alien-store 根地址。
+     *
+     * @param applymentId 微信支付申请单号
+     */
+    @GetMapping("/payment/wechatPartner/v3/applyment4sub/applyment/applyment_id/{applyment_id}")
+    R<Map<String, Object>> queryWechatPartnerApplymentState(@PathVariable("applyment_id") Long applymentId);
+    /**
      * 服务费规则定时任务:自动关闭已过期的自定义日期规则
      *
      * @return R.data 为本次关闭数量

+ 2 - 2
alien-lawyer/src/main/java/shop/alien/lawyer/service/impl/LawyerConsultationOrderServiceImpl.java

@@ -565,9 +565,9 @@ public class LawyerConsultationOrderServiceImpl extends ServiceImpl<LawyerConsul
 
         // 生成订单编号:LAW + 年月日(8位数字)+ 随机5位数字
         String orderNumber = generateOrderNumber();
-        order.setOrderNumber(orderNumber);
+        order.setOrderNumber(!StringUtils.isEmpty(lawyerConsultationOrder.getOrderNumber())?lawyerConsultationOrder.getOrderNumber():orderNumber);
         log.info("生成订单编号:orderNumber={}", orderNumber);
-
+        order.setAlipayNo(lawyerConsultationOrder.getOrderNumber());
         // 计算本单收益(平台收益)
         Integer consultationFee = calculateConsultationFee(lawyerUserId, orderAmount);
         order.setConsultationFee(consultationFee);

+ 7 - 0
alien-store/src/main/java/shop/alien/store/feign/DiningServiceFeign.java

@@ -673,4 +673,11 @@ public interface DiningServiceFeign {
      */
     @PostMapping(value = "/dining/file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     R<String> uploadFile(@RequestPart("file") MultipartFile file);
+
+    /**
+     * 支付成功后重置餐桌与购物车(与 alien-dining {@code StoreOrderService.resetTableAfterPayment} 一致),供微信回调等业务使用。
+     */
+    @PostMapping("/payment/internal/resetTableAfterPayment")
+    R<Void> resetTableAfterPaymentInternal(
+            @RequestParam("tableId") Integer tableId);
 }

+ 94 - 19
alien-store/src/main/java/shop/alien/store/strategy/payment/impl/AlipayPartnerPaymentStrategyImpl.java

@@ -2,23 +2,19 @@ package shop.alien.store.strategy.payment.impl;
 
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
-import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.AlipayConfig;
+import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.domain.*;
 import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.request.AlipayTradeQueryRequest;
 import com.alipay.api.response.AlipayTradeAppPayResponse;
-
-import com.alipay.api.FileItem;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.alipay.api.response.AlipayTradeQueryResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.map.HashedMap;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.AlipayZftCreateRecord;
 import shop.alien.mapper.AlipayZftCreateRecordMapper;
-import shop.alien.store.AlienStoreApplication;
 import shop.alien.store.strategy.payment.PaymentStrategy;
 import shop.alien.util.common.constant.PaymentEnum;
 
@@ -26,6 +22,10 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Base64;
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
 import java.util.List;
 import java.util.Map;
 
@@ -52,11 +52,13 @@ public class AlipayPartnerPaymentStrategyImpl implements PaymentStrategy {
         AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
 
         // 设置商户订单号
+        // 生成随机订单号
+        orderNo = "alipay_zft_" + System.currentTimeMillis() + new Random().nextInt(999999);
         model.setOutTradeNo(orderNo);
 
         // 设置订单总金额
         // 除以100
-        BigDecimal total = new BigDecimal(amount).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+        BigDecimal total = new BigDecimal(amount);
         model.setTotalAmount(total.toPlainString());
 
         // 设置订单标题
@@ -67,15 +69,6 @@ public class AlipayPartnerPaymentStrategyImpl implements PaymentStrategy {
         // 【关键】设置二级商户信息(直付通必传)
         model.setSubMerchant(subMerchant);
 
-        SettleInfo settleInfo = new SettleInfo();
-        SettleDetailInfo settleDetailInfo = new SettleDetailInfo();
-        settleDetailInfo.setTransIn("defaultSettle");
-        settleDetailInfo.setAmount(total.toString());
-        List<SettleDetailInfo>  settleDetailInfos = new ArrayList<>();
-        settleDetailInfos.add(settleDetailInfo);
-        settleInfo.setSettleDetailInfos(settleDetailInfos);
-        model.setSettleInfo(settleInfo);
-
         // 设置产品码
 //        model.setProductCode("QUICK_MSECURITY_PAY");
 
@@ -128,13 +121,21 @@ public class AlipayPartnerPaymentStrategyImpl implements PaymentStrategy {
 //        queryOptions.add("hyb_amount");
 //        queryOptions.add("enterprise_pay_info");
 //        model.setQueryOptions(queryOptions);
+        SettleInfo settleInfo = new SettleInfo();
+        SettleDetailInfo settleDetailInfo = new SettleDetailInfo();
+        settleDetailInfo.setTransInType("defaultSettle");
+        settleDetailInfo.setAmount(total.toString());
+        List<SettleDetailInfo>  settleDetailInfos = new ArrayList<>();
+        settleDetailInfos.add(settleDetailInfo);
+        settleInfo.setSettleDetailInfos(settleDetailInfos);
+        model.setSettleInfo(settleInfo);
 
         request.setNotifyUrl("https://frp-off.com:40279/alienStore/alipayPartnerNotify");
         request.setBizModel(model);
 
         // 第三方代调用模式下请设置app_auth_token
         // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
-
+//        model.setProductCode("QUICK_MSECURITY_PAY");
         AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
         String orderStr = response.getBody();
         System.out.println(orderStr);
@@ -142,6 +143,7 @@ public class AlipayPartnerPaymentStrategyImpl implements PaymentStrategy {
         if (response.isSuccess()) {
             Map<String, Object> analyzeRequest = new HashedMap<>();
             analyzeRequest.put("orderStr", orderStr);
+            analyzeRequest.put("orderNumber", orderNo);
             return R.data(analyzeRequest);
         } else {
             return R.fail("调用失败");
@@ -186,7 +188,80 @@ public class AlipayPartnerPaymentStrategyImpl implements PaymentStrategy {
 
     @Override
     public R searchOrderByOutTradeNoPath(String transactionId) throws Exception {
-        return null;
+        try {
+            AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
+            AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
+            AlipayTradeQueryModel model = new AlipayTradeQueryModel();
+            model.setOutTradeNo(transactionId);
+            List<String> queryOptions = new ArrayList<>();
+            queryOptions.add("trade_settle_info");
+            model.setQueryOptions(queryOptions);
+            request.setBizModel(model);
+
+            AlipayTradeQueryResponse response = alipayClient.execute(request);
+            log.debug("支付宝订单查询 rawBody 长度={}", response.getBody() != null ? response.getBody().length() : 0);
+
+            Map<String, Object> data = buildAlipayTradeQueryData(response);
+            if (response.isSuccess()) {
+                return R.success("订单状态:" + data.get("tradeStatus"));
+            }
+            String sub = response.getSubMsg() != null ? response.getSubMsg() : "";
+            return R.fail("订单查询失败:" + response.getMsg() + "(" + sub + ")");
+        } catch (AlipayApiException e) {
+            log.error("支付宝订单查询异常, transactionId={}", transactionId, e);
+            return R.fail("查询异常:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 将 {@link AlipayTradeQueryResponse} 转为与前端约定一致的 Map(与支付宝网关返回字段对齐,便于序列化为示例 JSON 结构)。
+     */
+    private static Map<String, Object> buildAlipayTradeQueryData(AlipayTradeQueryResponse response) {
+        Map<String, Object> data = new LinkedHashMap<>();
+        data.put("code", response.getCode());
+        data.put("msg", response.getMsg());
+        data.put("body", response.getBody());
+        if (response.getParams() != null && !response.getParams().isEmpty()) {
+            data.put("params", response.getParams());
+        }
+        data.put("buyerLogonId", response.getBuyerLogonId());
+        data.put("buyerPayAmount", response.getBuyerPayAmount());
+        data.put("buyerUserId", response.getBuyerUserId());
+
+        List<TradeFundBill> fundBillList = response.getFundBillList();
+        if (fundBillList != null && !fundBillList.isEmpty()) {
+            List<Map<String, String>> bills = new ArrayList<>();
+            for (TradeFundBill fb : fundBillList) {
+                if (fb == null) {
+                    continue;
+                }
+                Map<String, String> row = new LinkedHashMap<>();
+                row.put("amount", fb.getAmount());
+                row.put("fundChannel", fb.getFundChannel());
+                bills.add(row);
+            }
+            data.put("fundBillList", bills);
+        }
+
+        data.put("invoiceAmount", response.getInvoiceAmount());
+        data.put("outTradeNo", response.getOutTradeNo());
+        data.put("pointAmount", response.getPointAmount());
+        data.put("receiptAmount", response.getReceiptAmount());
+        data.put("sendPayDate", response.getSendPayDate());
+        data.put("totalAmount", response.getTotalAmount());
+        data.put("tradeNo", response.getTradeNo());
+
+        TradeSettleInfo tradeSettleInfo = response.getTradeSettleInfo();
+        if (tradeSettleInfo != null) {
+            Map<String, String> settle = new LinkedHashMap<>();
+            settle.put("tradeUnsettledAmount", tradeSettleInfo.getTradeUnsettledAmount());
+            data.put("tradeSettleInfo", settle);
+        }
+
+        data.put("tradeStatus", response.getTradeStatus());
+        data.put("errorCode", response.getCode());
+        data.put("success", response.isSuccess());
+        return data;
     }
 
     @Override