Explorar el Código

fix(payment): 修复支付金额类型及泛型使用问题

- 将amount_fee方法返回类型由Integer改为String,解决金额精度问题
- 修改amount_fee内部实现,避免金额向下取整为整数
- 更新WFTOrderService中总金额设置逻辑,调用amount_fee获取正确金额字符串
- 修正PayUtill中Map泛型使用,移除参数化类型以匹配需求
- 调整返回结果中状态码的设置方式,统一使用字符串形式"200"
wzq hace 2 días
padre
commit
9b76a50919

+ 2 - 2
src/main/java/com/zsElectric/boot/business/model/form/applet/AppUserPayForm.java

@@ -1,12 +1,12 @@
 package com.zsElectric.boot.business.model.form.applet;
 package com.zsElectric.boot.business.model.form.applet;
 
 
+import com.zsElectric.boot.business.model.vo.applet.WechatPayParamsVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import lombok.experimental.Accessors;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
-import java.util.Map;
 
 
 @Data
 @Data
 @Accessors(chain = true)
 @Accessors(chain = true)
@@ -23,5 +23,5 @@ public class AppUserPayForm implements Serializable {
     private String orderNo;
     private String orderNo;
 
 
     @Schema(description = "JsApi参数")
     @Schema(description = "JsApi参数")
-    private Map<String,Object> params;
+    private WechatPayParamsVO params;
 }
 }

+ 42 - 0
src/main/java/com/zsElectric/boot/business/model/vo/applet/WechatPayParamsVO.java

@@ -0,0 +1,42 @@
+package com.zsElectric.boot.business.model.vo.applet;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 微信支付参数视图对象
+ *
+ * @author wzq
+ * @since 2025/12/29
+ */
+@Data
+@Schema(description = "微信支付参数")
+public class WechatPayParamsVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "小程序APPID")
+    private String appId;
+
+    @Schema(description = "时间戳")
+    private String timeStamp;
+
+    @Schema(description = "随机字符串")
+    private String nonceStr;
+
+    @Schema(description = "预支付交易会话标识", example = "prepay_id=wx201410272009395522657a690389285100")
+    @JsonProperty("package")
+    private String packageValue;
+
+    @Schema(description = "签名")
+    private String paySign;
+
+    @Schema(description = "签名类型", example = "RSA")
+    private String signType;
+
+    @Schema(description = "商户订单号")
+    private String outTradeNo;
+}

+ 3 - 5
src/main/java/com/zsElectric/boot/business/service/WFTOrderService.java

@@ -7,6 +7,7 @@ import com.zsElectric.boot.business.model.entity.RechargeLevel;
 import com.zsElectric.boot.business.model.entity.UserOrderInfo;
 import com.zsElectric.boot.business.model.entity.UserOrderInfo;
 import com.zsElectric.boot.business.model.form.applet.AppLevelOrderForm;
 import com.zsElectric.boot.business.model.form.applet.AppLevelOrderForm;
 import com.zsElectric.boot.business.model.form.applet.AppUserPayForm;
 import com.zsElectric.boot.business.model.form.applet.AppUserPayForm;
+import com.zsElectric.boot.business.model.vo.applet.WechatPayParamsVO;
 import com.zsElectric.boot.core.pay.WFT.WFTConstants;
 import com.zsElectric.boot.core.pay.WFT.WFTConstants;
 import com.zsElectric.boot.core.pay.swiftpass.config.SwiftpassConfig;
 import com.zsElectric.boot.core.pay.swiftpass.config.SwiftpassConfig;
 import com.zsElectric.boot.core.pay.swiftpass.util.PayUtill;
 import com.zsElectric.boot.core.pay.swiftpass.util.PayUtill;
@@ -111,7 +112,7 @@ public class WFTOrderService {
             log.debug("通知第三开始支付:");
             log.debug("通知第三开始支付:");
             // 通知第三方支付----------------------------------------------------------
             // 通知第三方支付----------------------------------------------------------
 
 
-            SortedMap map = new TreeMap<>();
+            SortedMap<String,String> map = new TreeMap<String,String>();
             // 订单编号
             // 订单编号
             map.put("out_trade_no", orderNo);
             map.put("out_trade_no", orderNo);
             // 商品描述
             // 商品描述
@@ -142,14 +143,11 @@ public class WFTOrderService {
             // --------微信支付请求
             // --------微信支付请求
             Map<String, Object> wxMap = wx.pay(map, userOpenId,swiftpassConfig);
             Map<String, Object> wxMap = wx.pay(map, userOpenId,swiftpassConfig);
             if (wxMap.get("status").toString().equals("200")) {
             if (wxMap.get("status").toString().equals("200")) {
-                Map accountMap = new HashMap();
-                accountMap.put("wx", wxMap);
-                payForm.setParams(accountMap);
+                payForm.setParams((WechatPayParamsVO) wxMap);
                 return payForm;
                 return payForm;
             } else {
             } else {
                 throw new RuntimeException("请求支付失败。");
                 throw new RuntimeException("请求支付失败。");
             }
             }
-
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
         }
         }

+ 17 - 16
src/main/java/com/zsElectric/boot/business/service/impl/UserOrderInfoServiceImpl.java

@@ -13,6 +13,7 @@ import com.zsElectric.boot.business.model.form.applet.AppLevelOrderForm;
 import com.zsElectric.boot.business.model.form.applet.AppUserPayForm;
 import com.zsElectric.boot.business.model.form.applet.AppUserPayForm;
 import com.zsElectric.boot.business.model.query.applet.AppUserOrderInfoQuery;
 import com.zsElectric.boot.business.model.query.applet.AppUserOrderInfoQuery;
 import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
 import com.zsElectric.boot.business.model.vo.applet.AppUserInfoVO;
+import com.zsElectric.boot.business.model.vo.applet.WechatPayParamsVO;
 import com.zsElectric.boot.business.service.*;
 import com.zsElectric.boot.business.service.*;
 import com.zsElectric.boot.common.constant.SystemConstants;
 import com.zsElectric.boot.common.constant.SystemConstants;
 import com.zsElectric.boot.core.exception.BusinessException;
 import com.zsElectric.boot.core.exception.BusinessException;
@@ -189,7 +190,7 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
         //查询档位
         //查询档位
         RechargeLevel level = rechargeLevelMapper.selectById(appLevelOrderForm.getLevelId());
         RechargeLevel level = rechargeLevelMapper.selectById(appLevelOrderForm.getLevelId());
 
 
-        Map<String, Object> result = payment(userOpenId, orderNo, level.getMoney());
+        WechatPayParamsVO result = payment(userOpenId, orderNo, level.getMoney());
         payForm.setParams(result);
         payForm.setParams(result);
         return payForm;
         return payForm;
     }
     }
@@ -210,7 +211,7 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
         //查询档位
         //查询档位
         RechargeLevel level = rechargeLevelMapper.selectById(orderInfo.getLevelId());
         RechargeLevel level = rechargeLevelMapper.selectById(orderInfo.getLevelId());
 
 
-        Map<String, Object> result = payment(orderInfo.getOpenid(), orderInfo.getOrderNo(), level.getMoney());
+        WechatPayParamsVO result = payment(orderInfo.getOpenid(), orderInfo.getOrderNo(), level.getMoney());
         payForm.setParams(result);
         payForm.setParams(result);
         return payForm;
         return payForm;
     }
     }
@@ -672,7 +673,7 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
      * @param amount
      * @param amount
      * @return
      * @return
      */
      */
-    private Map<String, Object> payment(String openId, String orderNo, BigDecimal amount) {
+    private WechatPayParamsVO payment(String openId, String orderNo, BigDecimal amount) {
         //15分钟超时限制
         //15分钟超时限制
         Calendar calendar = Calendar.getInstance();
         Calendar calendar = Calendar.getInstance();
         calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 15);
         calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 15);
@@ -714,7 +715,7 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
      * @return
      * @return
      * @throws ServiceException
      * @throws ServiceException
      */
      */
-    public Map<String, Object> wechatPay(JsonObject params) throws ServiceException {
+    public WechatPayParamsVO wechatPay(JsonObject params) throws ServiceException {
 
 
         //发起请求
         //发起请求
         JsonObject res = wechatPayV3Utils.sendPost(WechatUrlConstants.PAY_V3_JSAPI, params);
         JsonObject res = wechatPayV3Utils.sendPost(WechatUrlConstants.PAY_V3_JSAPI, params);
@@ -725,19 +726,19 @@ public class UserOrderInfoServiceImpl extends ServiceImpl<UserOrderInfoMapper, U
 
 
         StringBuilder sb = new StringBuilder();
         StringBuilder sb = new StringBuilder();
         //返回给小程序拉起微信支付的参数
         //返回给小程序拉起微信支付的参数
-        Map<String, Object> result = new HashMap<>();
-        result.put("appId", WechatConstants.WECHAT_APPID); //小程序appid
-        sb.append(result.get("appId")).append("\n");
-        result.put("timeStamp", (new Date().getTime() / 1000) + ""); //时间戳
-        sb.append(result.get("timeStamp")).append("\n");
-        result.put("nonceStr", RandomStringUtils.randomAlphanumeric(32)); //32位随机字符串
-        sb.append(result.get("nonceStr")).append("\n");
-        result.put("package", "prepay_id=" + res.get("prepay_id").getAsString()); //预支付id 格式为 prepay_id=xxx
-        sb.append(result.get("package")).append("\n");
+        WechatPayParamsVO result = new WechatPayParamsVO();
+        result.setAppId(WechatConstants.WECHAT_APPID); //小程序appid
+        sb.append(result.getAppId()).append("\n");
+        result.setTimeStamp((new Date().getTime() / 1000) + ""); //时间戳
+        sb.append(result.getTimeStamp()).append("\n");
+        result.setNonceStr(RandomStringUtils.randomAlphanumeric(32)); //32位随机字符串
+        sb.append(result.getNonceStr()).append("\n");
+        result.setPackageValue("prepay_id=" + res.get("prepay_id").getAsString()); //预支付id 格式为 prepay_id=xxx
+        sb.append(result.getPackageValue()).append("\n");
         //签名
         //签名
-        result.put("paySign", wechatPayV3Utils.signRSA(sb.toString()));
-        result.put("signType", "RSA"); //加密方式 固定RSA
-        result.put("out_trade_no", params.get("out_trade_no").getAsString()); //商户订单号 此参数不是小程序拉起支付所需的参数 因此不参与签名
+        result.setPaySign(wechatPayV3Utils.signRSA(sb.toString()));
+        result.setSignType("RSA"); //加密方式 固定RSA
+        result.setOutTradeNo(params.get("out_trade_no").getAsString()); //商户订单号 此参数不是小程序拉起支付所需的参数 因此不参与签名
 
 
         return result;
         return result;
     }
     }