Przeglądaj źródła

fix: 支付分完结/修改订单接口后付费项目post_payments改为必填

按微信支付分无人设备行业接口升级要求,完结和修改订单时强制回传
交易内容(post_payments),含多层fallback兜底,避免因缺失字段导致
服务ID新增签约权限被关停。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 tygodni temu
rodzic
commit
3916ec057f

+ 10 - 1
haha-service/src/main/java/com/haha/service/impl/HahaCallbackServiceImpl.java

@@ -1312,7 +1312,16 @@ public class HahaCallbackServiceImpl implements HahaCallbackService {
                             .eq(OrderGoods::getOrderId, orderId));
 
             if (goodsList == null || goodsList.isEmpty()) {
-                log.warn("未找到订单商品信息,无法构建post_payments - orderId: {}", orderId);
+                log.warn("未找到订单商品信息,使用订单金额构建fallback post_payments - orderId: {}", orderId);
+                Order order = orderService.getById(orderId);
+                if (order != null) {
+                    PayScoreCreateRequest.PostPayment payment = new PayScoreCreateRequest.PostPayment();
+                    payment.setName("商品信息");
+                    payment.setAmount(order.getTotalAmount() != null ? order.getTotalAmount() : BigDecimal.ZERO);
+                    payment.setDescription(order.getOrderName() != null ? order.getOrderName() : "商品");
+                    payment.setCount(1);
+                    payments.add(payment);
+                }
                 return payments;
             }
 

+ 10 - 1
haha-service/src/main/java/com/haha/service/impl/OrderServiceImpl.java

@@ -619,7 +619,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                             .eq(OrderGoods::getOrderId, orderId));
 
             if (goodsList == null || goodsList.isEmpty()) {
-                log.warn("未找到订单商品信息,无法构建post_payments - orderId: {}", orderId);
+                log.warn("未找到订单商品信息,使用订单金额构建fallback post_payments - orderId: {}", orderId);
+                Order order = this.getById(orderId);
+                if (order != null) {
+                    PayScoreCreateRequest.PostPayment payment = new PayScoreCreateRequest.PostPayment();
+                    payment.setName("商品信息");
+                    payment.setAmount(order.getTotalAmount() != null ? order.getTotalAmount() : BigDecimal.ZERO);
+                    payment.setDescription(order.getOrderName() != null ? order.getOrderName() : "商品");
+                    payment.setCount(1);
+                    payments.add(payment);
+                }
                 return payments;
             }
 

+ 22 - 5
haha-service/src/main/java/com/haha/service/payment/payscore/impl/WxPayScoreStrategy.java

@@ -193,9 +193,9 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
             body.put("appid", wxPayConfig.getAppId());
             body.put("service_id", wxPayConfig.getServiceId());
 
-            // 后付费项目(实际收费)
+            // 后付费项目(实际收费)- 必填,无人设备行业必须回传交易内容
+            ArrayNode postPayments = objectMapper.createArrayNode();
             if (request.getPostPayments() != null && !request.getPostPayments().isEmpty()) {
-                ArrayNode postPayments = objectMapper.createArrayNode();
                 for (PayScoreCreateRequest.PostPayment payment : request.getPostPayments()) {
                     ObjectNode paymentObj = objectMapper.createObjectNode();
                     paymentObj.put("name", payment.getName());
@@ -208,8 +208,16 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     }
                     postPayments.add(paymentObj);
                 }
-                body.set("post_payments", postPayments);
+            } else {
+                log.warn("[微信支付分] 完结订单未提供post_payments,使用fallback - orderNo: {}", request.getOutOrderNo());
+                ObjectNode paymentObj = objectMapper.createObjectNode();
+                paymentObj.put("name", "商品信息");
+                paymentObj.put("amount", yuanToFen(request.getTotalAmount()));
+                paymentObj.put("description", "商品");
+                paymentObj.put("count", 1);
+                postPayments.add(paymentObj);
             }
+            body.set("post_payments", postPayments);
 
             // 商户优惠
             if (request.getPostDiscounts() != null && !request.getPostDiscounts().isEmpty()) {
@@ -452,8 +460,9 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
             body.put("appid", wxPayConfig.getAppId());
             body.put("service_id", wxPayConfig.getServiceId());
 
+            // 后付费项目 - 必填,无人设备行业必须回传交易内容
+            ArrayNode postPayments = objectMapper.createArrayNode();
             if (request.getPostPayments() != null && !request.getPostPayments().isEmpty()) {
-                ArrayNode postPayments = objectMapper.createArrayNode();
                 for (PayScoreModifyRequest.PostPayment payment : request.getPostPayments()) {
                     ObjectNode paymentObj = objectMapper.createObjectNode();
                     paymentObj.put("name", payment.getName());
@@ -466,8 +475,16 @@ public class WxPayScoreStrategy implements PayScoreStrategy {
                     }
                     postPayments.add(paymentObj);
                 }
-                body.set("post_payments", postPayments);
+            } else {
+                log.warn("[微信支付分] 修改订单未提供post_payments,使用fallback - orderNo: {}", request.getOutOrderNo());
+                ObjectNode paymentObj = objectMapper.createObjectNode();
+                paymentObj.put("name", "商品信息");
+                paymentObj.put("amount", yuanToFen(request.getTotalAmount()));
+                paymentObj.put("description", "商品");
+                paymentObj.put("count", 1);
+                postPayments.add(paymentObj);
             }
+            body.set("post_payments", postPayments);
 
             body.put("total_amount", yuanToFen(request.getTotalAmount()));
             body.put("reason", request.getReason() != null ? request.getReason() : "金额调整");