Explorar el Código

fix: post_payments amount 修复 + applyPreAuthPayScore 诊断日志

- buildPostPayments: amount 改为行总金额(单价 × 数量),count 固定为 1,
  修复微信支付分完结时 "最终总金额计算非法" 的错误(amount 用单价未乘数量导致
  sum(post_payments) ≠ total_amount)
- applyPreAuthPayScore: 三个静默 return 路径增加 WARN 日志,方便排查
  支付分预授权信息关联失败的原因

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline hace 1 día
padre
commit
4d234eb4e6

+ 6 - 3
haha-service/src/main/java/com/haha/service/impl/HahaCallbackServiceImpl.java

@@ -1439,10 +1439,13 @@ public class HahaCallbackServiceImpl implements HahaCallbackService {
             for (OrderGoods goods : goodsList) {
                 PayScoreCreateRequest.PostPayment payment = new PayScoreCreateRequest.PostPayment();
                 payment.setName("商品信息");
-                payment.setAmount(goods.getPrice() != null ? goods.getPrice()
-                        : (goods.getMoney() != null ? goods.getMoney() : BigDecimal.ZERO));
+                // amount 为行总金额(单价 × 数量),微信校验: total_amount = sum(post_payments[].amount)
+                BigDecimal unitPrice = goods.getPrice() != null ? goods.getPrice()
+                        : (goods.getMoney() != null ? goods.getMoney() : BigDecimal.ZERO);
+                int quantity = goods.getProductNum() != null ? goods.getProductNum() : 1;
+                payment.setAmount(unitPrice.multiply(BigDecimal.valueOf(quantity)));
                 payment.setDescription(goods.getProductName() != null ? goods.getProductName() : "未知商品");
-                payment.setCount(goods.getProductNum() != null ? goods.getProductNum() : 1);
+                payment.setCount(1);
                 payments.add(payment);
             }
 

+ 5 - 0
haha-service/src/main/java/com/haha/service/payment/payscore/impl/PayScoreServiceImpl.java

@@ -989,12 +989,15 @@ public class PayScoreServiceImpl implements PayScoreService {
      */
     public void applyPreAuthPayScore(Order order) {
         if (stringRedisTemplate == null || order == null) {
+            log.warn("[支付分服务] 无法关联预授权 - stringRedisTemplate={}, order={}",
+                    stringRedisTemplate != null, order != null);
             return;
         }
 
         String redisKey = REDIS_KEY_PREFIX + order.getDeviceId() + ":" + order.getUserId();
         String jsonStr = stringRedisTemplate.opsForValue().get(redisKey);
         if (jsonStr == null) {
+            log.warn("[支付分服务] Redis中未找到预授权信息 - key: {}", redisKey);
             return;
         }
 
@@ -1017,6 +1020,8 @@ public class PayScoreServiceImpl implements PayScoreService {
                 // 从追踪 SET 中移除,订单已正常关联不再需要清理
                 stringRedisTemplate.opsForSet().remove(REDIS_TRACKING_KEY + order.getUserId(), payScoreOrderId);
                 log.info("[支付分服务] 预授权信息已关联到订单 - orderId: {}, payScoreOrderId: {}", order.getId(), payScoreOrderId);
+            } else {
+                log.warn("[支付分服务] 预授权JSON中payScoreOrderId为null - key: {}, json: {}", redisKey, jsonStr);
             }
         } catch (Exception e) {
             log.error("[支付分服务] 关联预授权信息失败 - orderId: {}", order.getId(), e);