瀏覽代碼

fix: 模板消息金额格式化浮点精度丢失,导致微信 API 返回 47003

formatAmount 用 amount / 100.00 做浮点运算,转为字符串时出现
如 20.830000000000002 的值,微信模板消息 API 拒绝该格式。
改为纯整数运算 String.format("%d.%02d元", ...) 彻底避免精度问题。
同时修复 RefundApplyParamBuilder 中 refund / 100 整数除法截断的 bug。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 天之前
父節點
當前提交
887b7eec96

+ 1 - 1
car-wash-service/src/main/java/com/kym/service/wechat/TemplateParamBuilder.java

@@ -9,7 +9,7 @@ import java.util.Map;
 public interface TemplateParamBuilder {
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     default String formatAmount(int amount) {
-        return (amount / 100.00) + "元";
+        return String.format("%d.%02d元", amount / 100, amount % 100);
     }
     Map<String, String> buildParams(Object... args);
 }

+ 2 - 2
car-wash-service/src/main/java/com/kym/service/wechat/impl/OrderCompletedParamBuilder.java

@@ -26,8 +26,8 @@ public class OrderCompletedParamBuilder implements TemplateParamBuilder {
         return Map.of(
                 ORDER_ID, washOrder.getOrderId(),
                 STATION_NAME, KymCache.INSTANCE.getStationNameById(washOrder.getStationId()),
-                ORDER_AMOUNT, washOrder.getAmountReceived() * 0.01 + "元",
-                BALANCE, Integer.parseInt(args[1].toString()) * 0.01 + "元",
+                ORDER_AMOUNT, formatAmount(washOrder.getAmountReceived()),
+                BALANCE, formatAmount(Integer.parseInt(args[1].toString())),
                 ENT_TIME, washOrder.getEndTime().format(formatter)
         );
     }

+ 1 - 1
car-wash-service/src/main/java/com/kym/service/wechat/impl/ParkingCouponParamBuilder.java

@@ -25,7 +25,7 @@ public class ParkingCouponParamBuilder implements TemplateParamBuilder {
         return Map.of(
                 ORDER_ID, washOrder.getOrderId(),
                 STATION_NAME, KymCache.INSTANCE.getStationNameById(washOrder.getStationId()),
-                ORDER_AMOUNT, washOrder.getAmountReceived() * 0.01 + "元",
+                ORDER_AMOUNT, formatAmount(washOrder.getAmountReceived()),
                 SERVICE_NAME, "消费已达标,【点击本消息】领取停车优惠券"
         );
     }

+ 1 - 1
car-wash-service/src/main/java/com/kym/service/wechat/impl/RefundApplyParamBuilder.java

@@ -22,7 +22,7 @@ public class RefundApplyParamBuilder implements TemplateParamBuilder {
         }
         return Map.of(
                 REFUND_ID, refundLog.getRefundId(),
-                REFUND_AMOUNT, refundLog.getRefund() / 100 + "元",
+                REFUND_AMOUNT, formatAmount(refundLog.getRefund()),
                 CREATE_TIME, refundLog.getCreateTime().format(formatter),
                 USER_STATION, KymCache.INSTANCE.getUserStationName(refundLog.getUserId())
         );